チェンジログ
何が新しいの?
プラットフォームのすべての改良 それが出荷される
· kamo-marketing
Add Flowroute to INTEGRATED WITH banner
· 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)
· 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
· 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.
· kamo-marketing
ライブミリ秒カウントダウンでアクティブなオファーバナーを表示
アクティブなプロモーションサーバー側をホームページでフェッチし、 HeroOfferBanner は、サブヘッドラインとフリーフォワーバーのコールアウトの間です。 バナーは割引額、期間、およびライブカウントダウンを示しています アニメーション付き**************** グラデーション・グローのボーダーとシマー・スイープ。 アクティブな時に何もレンダリングしない または非公開のプロモーションが存在します.
· kamo-internal
ワイヤー 利用できる/不利用できるスイッチはバックエンドに転換し、オフラインの存在のバグを修理します
- NavTopで利用可能な/使用不能にPaused/Activeチップの名前を変更 - 新しいme/availability APIを介してマウントおよびパージストトグルの初期可用性をフェッチ - 会員インターフェイスおよびメンバー項目のpropにisAvailable分野を加えて下さい - 会員リストパスは、別部署の応答からMemberItemに利用可能 - メンバーアイテムは、利用可能なオレンジ色のオンライン/オフライン/UNAVAILABLEラベルを表示 - オフラインのバグを修正:可視性の交換ハートビートと120年代の定期的なバルク再フェッチを追加します
· SecurityService
別々の応答と私/availability エンドポイントに isAvailable を追加
· InitializerService
Backfillは available = 既存のメンバーのTRUE
· kamo-shared-library
追加する isAvailable フィールド メンバーの可用性 トグル
· kamo-internal
Access & Domains タブと DomainManager コンポーネントを削除します
· kamo-marketing
ライブ未読バッジ+新しいエージェントメッセージのバウンス
- ウィジェットが最小限に抑えられる間、LiveSupportPanel搭載の画面を維持 (サポートセッションが存在する場合のみ) STOMP サブスクリプションの滞在 alive と onUnreadMessage は、エージェントのメッセージをいつでも受信するのを防ぎます。 訪問者はチャットを見ていません。 - すべてのカウント変更(キートリック)上の春のスケールでバッジをアニメーション化 要素を再マウントする)と、連続的なTailwind pingリングを同時に > 0。 - カウントが上がると、最小限のタブ自体をバウンスし、チルトします。 ページの全体から注意をつかむので、それを赤く染めます。 - handleExpandは既に開いているのカウントをクリアするので、変更は必要ありません お問い合わせ.
· MediaService
エージェントの読み込みと訪問者の送信で配信停止数+未読
-************************ に委任されました **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** 未読の訪問者メッセージと決定のセッションを反映する エージェントはMarkAsReadを呼び出します。 - 新しい公共 ******************** ヘルパー。 -************************ エージェントの再放送 per-session は lastViewed の進歩の後のペイロードを未読にし、(b)は呼び出します ヘルパーなので、navtop SupportButtonは待つことなく同期にとどまります 次の60秒の投票。 -********************はヘルパーを呼びますので、 訪問者が送るときnavtopのバンプは住んでいます。 navtop カウントは、両方の右バッジの状態に即座にマッチします。 ブラウザがリフレッシュした後、クリックした後に.
· kamo-shared-library
未読ベースカウント+ルックアップバイセッションヘルパー
**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** サポートボタンバッジは、実際に必要なサポートチケットをカウントすることができます PRE TICKET/NEW ではなく、注目(未読ビジターメッセージ) ステータス。 カウントは DB から直接読み込まれるので、リフレッシュを余儀なくされます。 また、**************************************** を追加して、メディアサービス markAsRead の後のセッション GUID から org の所有者を解決できます.
· KlusterServices
サブドメインの証明書の暫定リストにメディアを追加する
· kamo-internal
必要なDNSエイリアスにメディアサブドメインを追加
· kamo-internal
チケットのデータグリッドに場所の列を追加する
フィードバック メニュー SupportTicketDTO を直進 (現在のチケットの実体をスナップショット) 作成時間 — 往復なし レンダリングの旗+都市/地域/国 ツールチップに示す IP で、ジオデータがない場合、em-dash に戻ります。 チケットは当日券となります。 エージェントビューのみ。 TicketHeader は既に同じ DTO フィールドを消費するので、ポップアップツール ウィンドウはスナップショットも表示されます。ジオライトや訪問者テーブルの読み込みはありません。 レンダリング.
· kamo-shared-library
チケットエンティティの訪問者ジオをスナップショット
VISITOR IP ADDRESS、VisitOR COUNTRY CODE、VisitOR COUNTRY NAME、 VISITOR CITY、VisitOR SUBDIVISION 列。 チケット作成時に回収 そのため、リスト/詳細エンドポイントは GeoLite 範囲のスキャンや 別の訪問者テーブルのルックアップを読み取り時間で見ます。 KamoInitializerService(hibernate.ddl-auto:update)は、 次の実行時に列; 既存の行が訪問者レコードに戻る toDTOに格納されたcounterCode.
· MediaService
SockJS と一緒に /ws/public-chat-native plain WebSocket エンドポイントを追加
/ws/public-chat-nativeでSockJSなしで2番目のSTOMPエンドポイントを登録する フロントエンドは、必要に応じてネイティブWebSocket(brokerURL)と接続できます sockjs-client ライブラリは、アンロードハンドラを登録し、 サイトマップ 元の /ws/public-chat SockJS エンドポイントは保持されます 後方互換性のため.
· kamo-internal
パーチケット未読バッジ+「新しいメッセージのみ」フィルタ
- チケットリストには、次の未読カウントでチャットバブルバッジが表示されます セッションがエージェントよりも新しいメッセージを持つときのticket# 最後に表示されたメッセージ。 - フィルタバーに「新しいメッセージのみ」フィルタスイッチを追加します。 - チケットチャットは、初期の****************を呼び出します ロードとインバウンドメッセージが到着するたびに、バッジはそのままクリア エージェントは会話を読み込みます。 拡大するkamo-shared-library変更に依存 findChatMembershipsByMemberId は、サポートチケットセッション、プラスを含む メディアサービス放送 ****************************
· MediaService
訪問者メッセージのエージェントに未読のカウントをブロードキャスト
訪問者がサポートメッセージを送信した後、最新の未読アカウントを押します **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************** リアルタイムでバッジとnvtopのカウンター更新。 放送中のミラー MediaController.send会員向けチャットのメッセージ.
· kamo-shared-library
未読のメンバーシップクエリでサポートチケットセッションを含める
findChatMembershipsByMemberId は、CHAT と CAT の両方のメンバーシップを返すようになりました。 Support TICKET セッションタイプなので、既存のパーメンバーの未読アカウント インフラ(getUnreadCountsByMember、/topic/chat/unread/{memberId}) 放送, GET ************************************ 自動カバー チケットサポート エージェントは、パーチケットの新しいメッセージインジケーターを参照してください チケットリストと、 navtop の合計未読バッジの結合.
· KlusterServices
生産はPJSIPの刑務所およびpersistentの状態と2ban失敗します
- [asterisk] と [freepbx-web] の jails で、fail2ban-configmap.yaml を追加します。 増分禁止エスカレーション(1h→24h→30d天井)、LAN無視、およびa PJSIP SecurityEvent レコードをターゲットとするカスタム asterisk-security.conf フィルター - マウントfail2ban-config ConfigMapとhostPath /var/lib/pbx/fail2ban(禁止) k1m1 と k2m1 の両方の展開で pod restarts を渡る state の persists - 両方のノードでfail2ban-client startの前にstartup.shでWire configs
· 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.
· 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
· 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.
· kamo-internal
プラットホーム構成タブ(一般/VOIP及びSMS/システム ユーザー/高度)
ラップ ************************ で 設定ビュー 4 タブ: - 概要:読み取り専用プラットフォームの概要 — 全オーガニゼーション電話サーバ インスタンス数、アクティブな SMS provider インスタンス数、最後のグローバル VOIP 同期 タイムスタンプ。 最新情報 - VOIP及びSMS: 編集のvoipSyncIntervalMinutes (1.1440)およびvoipSyncEnabled、 表面 lastGlobalVoipSyncAt, プラス “今の実行” ボタン その SecurityService → VOIPService /internal/voip/sync-global を呼び出します。 - システム ユーザー: 既存のシステム ユーザー アクセス は UI を、持ち上げましたから付与します ConfigurationClient はタブコンポーネント(動作変更なし)に動詞します。 - 高度な並列:「Triggerグローバル VOIP が今同期する」ボタン、プラス 将来のコントロールのための明示的な空のメッセージ。 ConfigurationClient は薄いタブオーケストです。 使用プラットフォーム管理者 オーケストラレベルでは残っているので、4つのタブはすべてゲートされます.
· DaemonService
グローバル VOIP 同期ジョブ (admin 調整可能な間隔)
VoipGlobalSyncJob は、毎分チェックを行い、各ティックで読み込みます。 システムコンフィギュレーションのシングルトンは、グローバル・シンクが原因であるかを決定します。 - voipSyncEnabled が false → skip の場合。 - 最後のGlobalVoipSyncAt + voipSyncIntervalMinutes の場合 → スキップします。 - それ以外の場合: VOIPService への POST /internal/voip/sync-global 内部AuthFilter ヘッダー; 更新 lastGlobalVoipSyncAt 成功に. これにより、プラットフォーム演算子はランタイムでアカデミーを調節できます メニュー → DaemonServiceを再起動せずにVOIP&SMS または cron 式に触れる。 既存のジョブと一緒にQuotesConfigに登録します。 k8s/configmap.yamlの一覧です。 ティック cron (1 分デフォルト) と kamo.services.voip.base-url + を追加します。 内部.auth.secret なので、アウトバウンド HTTP コールは認証できます.
· SecurityService
System-config + プラットフォーム・オーバービューエンドポイント
プラットフォーム全体の構成面、既存のトップレベルの所有者によってゲート ガード(SystemUserConfigControllerのrequireTopLevelOwnerパターンにマッチ)。 エンドポイント: - GET /api/security/system-config — シングルトン行を返す - PUT /api/security/system-config — 更新 voipSyncIntervalMinutes / voipSyncEnabled ディレクティブ 部分的な更新 サポート; 検証の執行 間隔 1..1440 分。 - GET /api/security/platform-overview — 集計された統計 (total orgs) アクティブな電話/SMS インスタンスのカウント, 最後の同期タイムスタンプ, 現在の 間隔+有効な旗)。 メニュー VOIPService /internal/voip/sync-globalをInternalAuthFilter経由で呼び出します。 auth の秘密)従ってプラットホームのオペレータはからの要求の全体的な VOIP の同期を始動できます 新しいプラットフォーム構成 → VOIP & SMS タブ / アドバンストタブ。 設定: - kamo.services.voip.base-url (デフォルトは VOIPService クラスターローカルサービス URL) です。 - 既存の内部.auth.secret を再利用します.
· VOIPService
パーインスタンスリソースコントローラ + org集計 + 内部同期
インスタンスリソースCRUD(拡張/ユーザー/デバイス/ボイスメール): - VoipExtensionsController(@************************************************************************************************************************************************************************************************************************************ - /api/voip/instances/{id}/usersのVoipUsersController - VoipDevicesController(@**************************************************************************************************************************************************************************************************************************** - VoipVoicemailController(@******************************************************************************************************************************************************************************** - すべての GET は ?refresh=true を受け付け、プロバイダーから強制フェッチし、キャッシュを更新します。 それ以外の場合は、ローカルキャッシュからsnappy UIを実行します。 - すべての書き込みパスコールプロバイダは、集計されるように、ローカルキャッシュを補う 次のスケジュールされた同期を待つことなく、ビューは一貫性を維持します。 - ボイスメールGET /{vmId}/audio は、プロバイダからの生のオーディオを経由してストリーミングします StreamingResponseBody なので、UI は <audio src=...> に直接できます。 Org-aggregate (VoipOrgAggregateController at /api/voip/org): - /extensions、/users、/devices、/voicemails は、すべてのインスタンス間で行を返します。 {instanceId、インスタンス名}の丸薬を使って。 UI はこれらを総計にレンダリングします /settings/features/phone のタブ。 - /health は、並列の per-instance のすべてのアクティブなインスタンスで checkHealth() を実行します (InstanceSyncService のキャッシュされたカウント経由)、InstanceHealthDto[] を返します。 - POST /sync は、すべてのアクティブなインスタンスに対して InstanceSyncService を実行します。 現在のorg。 テナントレベルの「今すぐこのorgを同期」ボタンをUIに出力します。 内部同期(VoipInternalSyncController): - POST /internal/voip/sync-global は、すべてのアクティブなインスタンスをプラットフォーム全体でループします。 DaemonServiceのスケジュールされたクォーツジョブで呼び出されます。 既存の保護 VOIPService の内部AuthFilter。 緑のビルド.
· VOIPService
マルチインスタンスプロバイダレファクタ+フルFreePBX +フロールートSMS
コアモデルの変更: 1 つの org → 多くの VoipProviderInstances (was: 1 つの org). プロバイダーの API 呼び出しは、インスタンススコープ化されます。 PhoneProviderインターフェイス: - エクステンション/ユーザー/デバイスCRUD +ボイスメールオーディオ/転送の新しい方法。 - 新しい機能の旗(拡張管理、ユーザー管理、デバイス管理)、 ボイスメール配信 デフォルトスロー************************ (HTTP 501) なので、スタブプロバイダは壊れません。 Frontend チェック getCapabilities() プロバイダーごとの非表示/無効なアクション。 - 外部依存性障害に対するproviderException(HTTP 502)。 PhoneProviderFactory: - getInstance(UUID)/**************************************** レガシーを交換する getProvider(Long orgId); getPrimaryForOrg(Long) は、レガシーコールサイトに保管 (CallController、CapabilitiesController、SipController、webhookインバウンド)。 - RingCentral OAuth トークンは (orgId, Provider, instanceId) でスコープ付けされるようになりました。 org は、複数の独立した RingCentral デプロイメントを認証できます。 - FreePBX 構造は config json → {baseUrl, clientId, clientSecret を読みます。 ignoreSslErrors} は、専用の FreePBXGraphQLClient をインスタンス化します。 RingCentral(RingCentralProvider): - Constructor は log コンテキストで exampleId をとります。 - 新しい方法: listExtensions/createExtension/updateExtension/ deleteExtension; listUser / createUser / updateUser / deleteUser(RCモデル) type=User の拡張子と同じ。listDevices/createDevice/updateDevice/ deleteDevice; fetchVoicemailAudio (ストリーム添付コンテンツ) および fetchVoicemailTranscription. FreePBX (FreePBXProvider) — 完全な実装はプレースホルダーを置き換えます: - FreePBXTokenCache によるクライアント認証 OAuth2 トークンキャッシュ (~1h TTL, 401、per-instanceのオートリフレッシュ。 - FreePBXGraphQLClient:任意のGraphQL + RESTの輸送 自己署名されたオンプレミスPBXesのためのsp-SSL-verification。 - 拡張機能、ユーザーマネージャーユーザー、エンドポイントマネージャデバイス、ボイスメール list/mark-read/delete + オーディオストリーム、CDR 呼び出し履歴、SIP 認証情報 fetchAsteriskInfo による拡張子の pjsip シークレット、健康から派生。 - 明示的にサポートされていないSMS(機能sms=false) — FreePBXは処理しません キャリアSMS。 フロールートSMS(FlowrouteTextProvider): - HTTP 基本 (accessKey, secretKey) でメッセージ v2.1 API 。 - 健康プローブは、GET /numbers?limit=1 をヒットしました。 - 新規のFLOWROUTE列の値でバルクTextProviderFactoryに登録。 コントローラー: - VoipInstanceController(providerConfigControllerから名前を変更) — 完全なCRUD /api/voip/instances では、per-instance test/sync で動作します。 GETで赤字の秘密 応答 ('***'); merge-update は、UI の往復の赤字フィールドを無数に割り当てます 保存された認証情報をクローブ。 - BulkTextInstanceController(BulkTextConfigControllerから名前を変更) — ミラー /api/bulktext/instances でテスト/test-send/送信します。 - OAuthController はインスタンススコープの OAuth: 起動、コールバック、ステータス、 全てをdisconnectする exampleId. - SmsController は、メンバーからインスタンスを解決します。 instanceId → org プライマリ、アタッチ 会話をアップしました。 - CallController / CapabilitiesController / SipController が org にフォールバック 従来の単一インスタンスエンドポイントのプライマリアクティブインスタンス。 サービス: - InstanceSyncService:プルスルーキャッシュ同期 — エクステンション/ユーザー/デバイス/ 提供者からローカルテーブルにコピーされたボイスメール、ソフトマークの行目がない UNKNOWN(ノウン) 各サブステップは包まれたので、サポートされていない機能が失敗しません 同期全体(例:FreePBX no-SMS + has-extensions) - VoipMessageService:すべての会話/メッセージパスの propagate instanceId. テスト: 既存の VoipProviderConfig 固有のテストを削除 (カバーされた) renamed 型; rewriting は設計spec §10 — TDD のスコープから このリファクターにインフラを追加しています。 更新されたkamo-shared-libraryで緑を構築します.
