콘텐츠로 건너뛰기
KAMOUniverse

변경 로그

무슨 일이야?

플랫폼에 대한 모든 개선 사항, 그것이 선적.

  1. · kamo-marketing

    Add Flowroute to INTEGRATED WITH banner

  2. · kamo-internal

    Show accurate provider connection status from isConnected field

    Replaces the old logic that showed "Connected" for any provider with no sync error (including brand-new providers that were never tested). New three-state badge driven by isConnected (null/true/false): - null / never tested → grey "Not tested" (HelpOutlineIcon) - false → red "Not connected" (ErrorOutlineIcon) - true + sync error → amber "Sync error" (WarningAmberIcon) - true → green "Connected" (CheckCircleIcon) - RingCentral no OAuth → amber "Needs reauth" (unchanged)

  3. · VOIPService

    Persist connection test result to isConnected field

    - test() endpoint saves isConnected=true/false to DB after every health check - update() resets isConnected to null when configJson changes (credentials may have changed, requiring a re-test before showing Connected) - toDto() exposes isConnected so the frontend can distinguish: never tested / connected / not connected

  4. · kamo-shared-library

    Add isConnected field to VoipProviderInstance

    Nullable Boolean: null = never tested, true = last test passed, false = failed. Requires KamoInitializerService schema migration to add IS_CONNECTED column.

  5. · kamo-marketing

    라이브 밀리 초 카운트 다운과 활성 제안 배너보기

    Home 페이지에 활성 프로모션 서버 측을 Fetches하고 렌더링합니다. HeroOfferBanner는 하위 헤드 라인과 무료 통화 중입니다. 배너는 할인 금액, 기간 및 라이브 카운트 다운을 보여줍니다. *********** at 50ms) 애니메이션 gradient-glow 국경과 shimmer 청소. 활동이 없을 때 렌더링 또는 non-expired 프로모션이 존재합니다.

  6. · kamo-internal

    와이어 사용 가능 / 사용 가능한 스위치 백엔드 및 수정 OFFLINE 존재 버그

    - Paused/Active 칩을 NavTop에서 사용 가능 / 사용 가능 - 새로운 me/availability API를 통해 산과 persist toggles에 대한 초기 가용성 - 회원 인터페이스 및 MemberItem prop에 isAvailable 필드 추가 - MemberList 패스는 회원정보에 대한 등록 응답에서 유효합니다. - MemberItem는 unavailable를 위한 주황색 색깔을 가진 온라인/OFFLINE/UNAVAILABLE 상표를 보여줍니다 - OffLINE 버그 수정 : 가시 교환 심박수 및 120s 정기 대량 재 그림 추가

  7. · SecurityService

    Add isAvailable 에 의해 출발 응답 및 me/availability endpoints

  8. · InitializerService

    Backfill is available = 기존 회원을위한 TRUE

  9. · kamo-shared-library

    Add isAvailable 필드에 대한 회원 가용성 toggle

  10. · kamo-internal

    Access & Domains 탭 및 DomainManager 구성 제거

  11. · kamo-marketing

    Live 읽지 않은 배지 + 새로운 에이전트 메시지에 반송

    - 위젯이 최소화되는 동안 LiveSupportPanel 마운트 오프 스크린 유지 (지원 세션이 존재하는 경우) 그래서 STOMP 구독은 살아있고 onUnreadMessage 화재가 들어오는 에이전트 메시지 방문자가 채팅을 찾고 있지 않습니다. - 모든 카운트 변경에 스프링 스케일을 가진 배지를 기대합니다 (key 속임수 re-mounts the element) plus 연속 테일 윈드 핑 링 동안 > · - 쾌감과 틸트는 카운트가 올라갈 때마다 극소화 된 탭을 기울입니다. 그리고 팅그러운 빨간색으로 페이지를 통해 관심을 잡아. - handleExpand는 이미 열리게, 그래서 필요 변화 없음 있습니다.

  12. · MediaService

    방송 종료 수 + 읽지 않은 에이전트 읽기 & 방문자 보내기

    - *********** 이제 위임 *********** 그래서 조사 읽지 않은 방문자 메시지와 decrements로 세션을 반영합니다. 에이전트 호출 MarkAsRead. - 새로운 대중 *********** 헬퍼. - *********** 현재 (a) 재방송 에이전트 per-session 읽지 않은 payload after lastViewed advances and (b) 호출 helper 그래서 navtop supportButton은 기다리지 않고 동기화에 머물 다음 60s 투표. - *********** 또한 헬퍼를 호출 navtop 범프는 방문자가 보낼 때 살고있다. navtop 카운트는 이제 per-row 배지 상태를 즉시 일치합니다. 브라우저가 새로 고침한 후, 클릭 후.

  13. · kamo-shared-library

    Unread-based count + 보류바이저

    추가 *********** 그래서 navtop SupportButton 배지는 실제로 필요로 하는 지원 표 수 있습니다 주의 (읽지 않은 방문자 메시지) 대신 PRE TICKET/NEW 이름 * 카운트는 DB에서 똑똑히 읽습니다 그래서 그것은 새로 살아남습니다. 또한 추가 *********** 그래서 MediaService MarkAsRead 후 세션 GUID에서 org 소유자를 해결할 수 있습니다.

  14. · KlusterServices

    하위 도메인 cert 프로비저닝 리스트에 미디어 추가

  15. · kamo-internal

    필요한 DNS aliases에 미디어 하위 도메인 추가

  16. · kamo-internal

    위치 열을 티켓 datagrid에 추가

    지원하다 *************** SupportTicketDTO (지금은 티켓 엔터티에 스냅샷 창조 시간 - 여분의 왕복 없음. + 도시/지역/국가 렌더링 도구 끝에서 보이는 IP로; 지위 데이터가 없을 때 em-dash로 돌아갑니다. 티켓에 있습니다. 에이전트 보기만. TicketHeader는 이미 같은 DTO 필드를 소비하므로 팝업 도구 지금 창은 스냅샷을 보여줍니다 — GeoLite 또는 방문자 테이블 읽기 에 렌더링.

  17. · kamo-shared-library

    티켓 엔터티에 Snapshot 방문자 지

    VISITOR IP ADDRESS, VISITOR COUNTRY CODE, VISITOR COUNTRY NAME에 추가하십시오. VISITOR CITY, VISITOR SUBDIVISION 열. 티켓 작성 그래서 목록/세부 끝점은 GeoLite 범위 검사 또는 할 필요가 없습니다 자주 묻는 질문 KamoInitializerService (hibernate.ddl-auto : 업데이트) 추가 다음 실행할 때 열; 기존의 행은 방문자 기록에 다시 떨어졌다 toDTO에 저장된 countryCode.

  18. · MediaService

    SockJS와 함께 /ws/public-chat-native 일반 WebSocket 엔드포인트 추가

    /ws/public-chat-native에 SockJS 없이 두번째 STOMP endpoint를 등록하십시오 frontend는 필요 없이 native WebSocket (brokerURL)과 연결할 수 있습니다. sockjs-client library를 사용하여 unload 핸들러를 등록합니다. 사이트 권한 정책. 원래 /ws/public-chat SockJS 엔드포인트는 유지 backwards 호환성을 위해.

  19. · kamo-internal

    Per-ticket 읽지 않은 배지 + '새 메시지 만 필터

    - 티켓 목록은 다음에 읽지 않은 읽지 않은 수를 가진 채찍 배지를 보여줍니다 세션이 에이전트보다 더 새로운 메시지를 보낼 때마다 ticket# 마지막 메시지. - 필터 바에 '새 메시지 만' 필터 스위치를 추가합니다. - TicketChat은 지금 전화합니다. *********** 로드 및 인바운드 메시지가 도착하면 배지가 명확합니다. 에이전트는 대화를 읽습니다. kamo-shared-library 변화에 의존 findChatMembershipsByMemberId는 SUPPORT TICKET 세션을 포함, 플러스 미디어 서비스에서 방송 ****************

  20. · MediaService

    방송 읽지 않은 조사에 에이전트에 방문자 메시지

    방문자가 지원 메시지를 보낸 후, 최신 읽지 않은 통화를 밀어 ****************에 페이로드 그래서 에이전트의 티켓 목록 실시간 배지 및 navtop 카운터 업데이트. Mirrors 에서 방송 MediaController.sendMessage 회원 가입 채팅.

  21. · kamo-shared-library

    읽지 않은 회원 쿼리에 SUPPORT TICKET 세션 포함

    findChatMembershipsByMemberId 이제 CHAT에 대한 회원을 반환하고 SUPPORT TICKET 세션 유형이므로 기존의 읽지 않은 계정 인프라 (getUnreadCountsByMember, /topic/chat/unread/{memberId} 방송, GET *********** 자동 커버 티켓도 지원합니다. 에이전트는 티켓 new-message 표시기를 참조하십시오. 티켓 목록 및 navtop에서 결합 된 총 읽지 않은 배지.

  22. · KlusterServices

    생산 실패 PJSIP 감옥과 지속 상태

    - [asterisk] 및 [freepbx-web] 감옥과 함께 실패2ban-configmap.yaml를 추가하십시오. 증가 금지 에스컬레이션 (1h→24h→30d 천장), LAN 무시, 및 사용자 정의 asterisk-security.conf 필터 대상 PJSIP SecurityEvent 레코드 - 마운트 실패2ban 구성 ConfigMap 및 hostPath /var/lib/pbx/fail2ban (ban) pod restarts 전역의 state persists) k1m1 및 k2m1 배포 모두 - 실패하기 전에 start.sh의 유선 구성2ban-client 모두 노드에서 시작

  23. · kamo-shared-library

    Add resetHasAttachmentsForFolder query to ConversationRepository

    Allows sync to reset stale has_attachments flags before re-indexing so corrected MIME detection can rebuild the field from actual attachment data.

  24. · KlusterServices

    Integrate Coqui TTS with norman voice (VCTK p267)

    - Deploy coqui-tts server (VCTK VITS model, CPU-only) as ClusterIP service on port 5002 with model cache at /var/lib/coqui-tts on k1m1 - Inject coqui_tts.agi into /var/lib/asterisk/agi-bin on each boot: calls HTTP API, caches 8 kHz mono WAV under sounds/coqui-tts/, streams via AGI STREAM FILE — use AGI(coqui_tts.agi,text) in any dialplan context - Write say.conf on each boot to route all Asterisk built-in say functions (digits, numbers, dates, times) through Coqui TTS

  25. · KlusterServices

    Add LAN DNS pod for split-DNS on k1m1

    Deploys a dnsmasq pod with hostNetwork on k1m1 that listens on 192.168.4.22:53. Overrides pbx.k1.kluster.kamocrm.com -> 192.168.4.22 so LAN phones reach the PBX directly without NAT hairpin. All other queries are forwarded to 8.8.8.8/8.8.4.4. Router DHCP must be pointed to 192.168.4.22 as the primary DNS server for LAN clients to pick this up.

  26. · kamo-internal

    플랫폼 구성 탭 (일반 / VOIP & SMS / 시스템 사용자 / 고급)

    기타 제품 *********** 4개의 탭을 가진 SettingsView에서: - 일반 : 읽기 전용 플랫폼 개요 - 총 orgs, 활성 전화 서버 인스턴스 수, 활성 SMS-provider 인스턴스 수, 마지막 글로벌 VOIP 동기화 타임 스탬프. 새로운에서 읽음 **************** - VOIP & SMS: voipSyncIntervalMinutes (1.1440) 및 voipSyncEnabled 편집, 표면 lastGlobalVoipSyncAt, 플러스 "Run global sync now" 버튼 호출 SecurityService → VOIPService /internal/voip/sync-global. - 시스템 사용자 : 기존 시스템 사용자 액세스 보조 UI, 리프트 ConfigurationClient verbatim 을 탭 구성 요소로 (작동 변경 없음). - 고급: 평행한 “Trigger global VOIP sync now” ops를 위한 단추, 플러스 미래의 제어에 대한 명시된 빈 상태 메시지. ConfigurationClient는 이제 얇은 탭 오케스트라입니다. usePlatformAdminGuard 사용 관현악 수준에 남아있다 그래서 모든 4 개의 탭이 문질러.

  27. · DaemonService

    글로벌 VOIP 동기화 작업 (admin-tunable interval)

    VoipGlobalSyncJob는 매 분마다 진드기에, 읽습니다 SystemConfiguration Singleton은 글로벌 동기화가 이루어져 있는지 결정합니다. - voipSyncEnabled가 false인 경우 → 건너뛰기. - LastGlobalVoipSyncAt + voipSyncIntervalMinutes > 이제 → 건너뛰기. - 기타: POST /internal/voip/sync-global to VOIPService 와 InternalAuthFilter 헤더; LastGlobalVoipSyncAt를 성공에 업데이트하십시오. 이 플랫폼 연산자는 런타임에서 cadence를 조정합니다. *************** → DaemonService를 재시작하지 않고 VOIP 및 SMS 또는 터치 크론 표현. 기존 작업과 함께 QuartzConfig에 등록. k8s/configmap.yaml의 경우 tick cron (1 분 기본) 및 kamo.services.voip.base-url +를 추가 internal.auth.secret 그래서 아웃 바운드 HTTP 호출을 인증 할 수 있습니다.

  28. · SecurityService

    시스템 구성 + 플랫폼 오버뷰 엔드포인트

    Platform-wide 구성 표면, 기존의 최고 수준의 guard (matches SystemUserConfigController의 requireTopLevelOwner 패턴). 엔드포인트: - GET /api/security/system-config — 싱글턴 행을 반환 - PUT /api/security/system-config - 업데이트 voipSyncIntervalMinutes / voipSync사용 가능 Partial 업데이트 지원되는; 유효성능 간격 1..1440 분. - GET /api/security/platform-overview - 집단 통계 (총 orgs, Active Phone/SMS 인스턴스 수, 마지막 sync 타임스탬프, 현재 간격 + 활성화 깃발). - POST *********** 내부AuthFilter를 통해 VOIPService /internal/voip/sync-global 호출 (내부 auth secret) 그래서 플랫폼 통신수는에서 수요에 세계적인 VOIP sync를 불을 수 있습니다 새로운 플랫폼 구성 → VOIP & SMS 탭 / 고급 탭. 지불 조건: - kamo.services.voip.base-url (VIPService 클러스터 로컬 서비스 URL에 대한 기본). - 기존 내부.auth.secret를 재사용합니다.

  29. · VOIPService

    Per-instance 자원 관제사 + org 집계 + 내부 sync

    Per-instance 자원 CRUD (확장 / 사용자 / 장치 / 음성 메일) : - VoipExtensionsController at *********** - VoipUsersController at /api/voip/instances/{id}/users 에서 - VoipDevicesController at ****************에 - VoipVoicemailController at *********** - 모든 GET은 공급자에게서 힘 표피에 ?refresh=true를 받아들이고 캐시를 상쾌하게 합니다; 그렇지 않으면 snappy UI에 대한 로컬 캐시에서 봉사합니다. - 모든 쓰기 경로 호출 공급자 및 로컬 캐시를 upserts 그래서 집계 다음 예정된 동기화를 기다리지 않고 일관성을 유지하십시오. - Voicemail GET /{vmId}/audio는 공급자로부터 원시 오디오를 스트리밍합니다. StreamingResponseBody 그래서 UI는 <audio src=...>를 직접 할 수 있습니다. Org 집단 (VoipOrgAggregateController at /api/voip/org): - /extensions, /users, /devices, /voicemails는 각 인스턴스에서 행합니다. {instanceId, 인스턴스 이름} 약으로. UI는 집계로 이어집니다. /settings/features/phone에 있는 탭. - /health는 평행한 per-instance에 있는 각 활동적인 인스턴스에 checkHealth ()를 달립니다 (InstanceSyncService의 캐시 수를 통해), InstanceHealthDto[]를 반환합니다. - POST /sync는 InstanceSyncService를 실행합니다. 현재 org. Tenant-level "Sync this org now" 버튼을 UI로 출력합니다. 내부 동기화 (VoipInternalSyncController): - POST /internal/voip/sync-global 루프 모든 활성 인스턴스 플랫폼 전체. DaemonService의 예정된 석영 작업에 의해 호출. 기존의 보호 VOIPService의 InternalAuthFilter. 녹색을 만듭니다.

  30. · VOIPService

    Multi-instance provider refactor + full FreePBX + Flowroute SMS

    Core model change: one org → many VoipProviderInstances (was: one per org). Every provider API call is now instance-scoped. PhoneProvider interface: - New methods for extension/user/device CRUD + voicemail audio/transcription. - New capability flags (extensionManagement, userManagement, deviceManagement, voicemailTranscription). Defaults throw **************** (HTTP 501) so stub providers don't break. Frontend checks getCapabilities() to hide/disable actions per provider. - ProviderException (HTTP 502) for external-dependency failures. PhoneProviderFactory: - getInstance(UUID) / **************** replace legacy getProvider(Long orgId); getPrimaryForOrg(Long) kept for legacy call sites (CallController, CapabilitiesController, SipController, webhook inbound). - RingCentral OAuth tokens now scoped by (orgId, provider, instanceId) so one org can authenticate multiple independent RingCentral deployments. - FreePBX construction reads config_json → {baseUrl, clientId, clientSecret, ignoreSslErrors} and instantiates a dedicated FreePBXGraphQLClient. RingCentral (RingCentralProvider): - Constructor takes instanceId for log context. - New methods: listExtensions / createExtension / updateExtension / deleteExtension; listUsers / createUser / updateUser / deleteUser (RC models both as type=User extensions); listDevices / createDevice / updateDevice / deleteDevice; fetchVoicemailAudio (streams attachment content) and fetchVoicemailTranscription. FreePBX (FreePBXProvider) — full implementation replaces placeholder: - Client-credentials OAuth2 token caching via FreePBXTokenCache (~1h TTL, auto-refresh on 401, per-instance). - FreePBXGraphQLClient: GraphQL + REST transports with optional skip-SSL-verification for self-signed on-prem PBXes. - Extensions, User Manager users, Endpoint Manager devices, voicemail list/mark-read/delete + audio stream, CDR call history, SIP credentials derived from the extension's pjsip secret, health via fetchAsteriskInfo. - SMS explicitly unsupported (capability sms=false) — FreePBX doesn't handle carrier SMS. Flowroute SMS (FlowrouteTextProvider): - Messages v2.1 API with HTTP Basic (accessKey, secretKey). - Health probe hits GET /numbers?limit=1. - Registered with BulkTextProviderFactory via new FLOWROUTE enum value. Controllers: - VoipInstanceController (renamed from ProviderConfigController) — full CRUD at /api/voip/instances with per-instance test/sync. Secrets redacted in GET responses ('***'); merge-update lets UI round-trip redacted fields without clobbering stored credentials. - BulkTextInstanceController (renamed from BulkTextConfigController) — mirror CRUD at /api/bulktext/instances with test / test-send / send. - OAuthController rewritten for instance-scoped OAuth: start, callback, status, disconnect all take instanceId. - SmsController resolves instance from member.instanceId → org primary, attaches to upserted conversations. - CallController / CapabilitiesController / SipController fall back to the org's primary active instance for legacy single-instance endpoints. Services: - InstanceSyncService: pull-through cache sync — extensions/users/devices/ voicemails copied from provider to local tables, missing rows soft-marked UNKNOWN. Each sub-step wrapped so one unsupported capability doesn't fail the entire sync (e.g. FreePBX no-SMS + has-extensions). - VoipMessageService: all conversation/message paths propagate instanceId. Tests: pre-existing VoipProviderConfig-specific tests removed (covered the renamed types; rewriting is out of scope per design spec §10 — no TDD infrastructure is being added in this refactor). Builds green with updated kamo-shared-library.

당신의 우주는 기다리고 있습니다.

몇 분 안에 무료로 시작하세요. 준비가 되면 언제든지 제품을 추가할 수 있습니다.

영원히 무료 - 신용 카드 필요 없음