チェンジログ
何が新しいの?
プラットフォームのすべての改良 それが出荷される
· kamo-internal
ワイヤー可用性 PresenceWrapper プロバイダー
· kamo-internal
UseAvailabilityWebSocket hook と AvailabilityContext を追加
· SecurityService
自動設定メンバーの可用性 ログイン時に利用可能
· MediaService
NATS→STOMP リレーを追加して、メンバーの可用性状況を確認できます
· SecurityService
MemberAvailabilityを使用する可用性エンドポイントを更新する ステータス列
· SecurityService
会員のステータス更新のためのAnavalationPublisherを追加
· InitializerService
Migrate Member.is available status 列挙
· kamo-shared-library
置換 isAvailable boolean with MemberAvailability ステータス列
· kamo-asterisk-support
Enrich upload manifests with Asterisk CDR caller-ID data
Adds optional MySQL CDR enrichment so the softphone history tab can display who called (or was called). When ASTERISK_CDR_DSN is configured as a Forgejo repo secret, the helper: - Queries asteriskcdrdb.cdr for the call's uniqueId before uploading - Parses CLID into callerIdNum and callerIdName - Derives call direction (inbound/outbound) from src/dst vs extension - Includes a cdr{} block in the upload manifest CDR enrichment is opt-in and gracefully degraded: if the DSN is absent or the lookup fails, uploads proceed without caller-ID (existing behaviour). Adds go-sql-driver/mysql v1.7.1; Dockerfile runs go mod tidy to populate go.sum during the Docker build so no local Go installation is needed.
· ConversionService
Parse CDR caller-ID fields from upload manifest
When kamo-asterisk-support includes a cdr{} section in the upload manifest (populated when ASTERISK_CDR_DSN is configured), ConversionService extracts callerIdNum, callerIdName, callDirection, and disposition and passes them through RecordingMetadata so the Recording row is stored with full caller-ID context.
· InitializerService
Add CDR caller-ID columns to recordings table (order 40)
Adds caller_id_num, caller_id_name, call_direction, and call_result columns to the recordings table so the softphone history tab can display who called without relying on the FreePBX CDR pipeline being available.
· kamo-shared-library
Add CDR caller-ID fields to Recording entity
Adds callerIdNum, callerIdName, callDirection, and callResult columns to the Recording entity so kamo-asterisk-support can store Asterisk CDR metadata alongside the audio file. RecordingMetadata gains matching fields; a backwards-compatible constructor lets existing callers pass null for all four without change.
· kamo-internal
Add COMP payment method option to subscription order wizard
COMP is a valid backend PaymentMethod enum value for complimentary platform-admin grants, but was missing from the frontend type and wizard UI — only INVOICE and AUTO_BILL were offered. Added COMP to the SubscriptionPaymentMethod union and exposed it as a radio option.
· kamo-internal
Show platform kamocrm domain on custom domain entry
Surface the active *.kamocrm.com hostname on the add-domain flow and detect custom domains by excluding kamocrm URLs instead of default-flag alone.
· kamo-internal
上位レベルのオーガナイザーとシステムメンバーのためのドメイン ボタンを管理する
· kamo-internal
セットアップを表示 請求ボタン なしのアカウントを持つorgの所有者
Orgの所有者が計画ビルティングタブを開き、請求アカウントを開くとき 存在し、ジェネリックの代わりにbootstrapプロンプトを表示 "あなたの連絡先 orgの所有者"メッセージ。 ボタンは POST /api/security/account/ を呼び出します。 boottrap-billing (idempotent) はアカウントを成功にリロードします.
· SecurityService
既存のorgsにbootstrap-billingエンドポイントを追加
メニュー 同じトリガー サブオーガニゼーション・ホック(BillingSetupService)としての意図的なセットアップ .setupForSubOrgCreation はオーガナイザーのオーナーがオンデマンドと呼ぶことができます。 課金レファクタの前に作成されたorgsを扱います。 そのため、アカウント+アカウントサブスクリプションを受け取ることはありません.
· kamo-internal
ウェーブ3変換、フォールバック修正、自動翻訳CI
- すべてのハードコードされた英語の文字列をt()の呼び出しを波3を渡して置き換える コンポーネント(チャット、クラブハウス、サポート、メモ、パイプライン、リード、ナビゲーションなど) - メッセージ/en.json (+19 キー) に 3 つのフラグメントをマージします。 - en.json(welcome、tagline)のホームセクションプレースホルダーの値を修正し、 フッターのテキスト、counterDesc/networkDesc ICUの補間 - ハードコードされた文字列ではなく、t() を使用するために page.tsx のモバイル歓迎テキストを修正 - Fix. リクエスト:すべてのローカルファイルのためのベースとしてディープマージ英語 locale ファイルが不足している (pre-translate-CI) は、クラッシュするのではなく、英語に役立ちます。 そして部分的に翻訳されたロケールは欠落キーのために英語に戻って落ちます - 更新 **************** kamo-marketing's translate-and-rebuild パターン: 初期デプロイ → TranslateService ポートフォワード → locale ファイルをコミット → 翻訳でイメージを再構築 → redeploy
· kamo-register
法的な名前の行に名前のサフィックスの後のニックネームのインラインを置く
· kamo-internal
Locale のソースとして、Member.language と次の intl のワイヤ
URLなしでカモインタナル全体で次のインテルベースの国際化を追加します。 locale プレフィックス。 アクティブなロケールは、kamo-locale Cookie から読み込まれます。 認証されたメンバーの「言語設定」をミラーリングします。 地域設定カード************************ インフラ: - i18n/locales.ts、i18n/request.ts: kamo-marketing マッチングするローカル 22 のサポート - /api/i18n/set-locale: kamo-locale Cookie を記述 - LocaleBootstrap:CookieをMember.languageに最初の認証負荷に同期 - I18nProviders:MUIコア、x-data-grid、x-date-pickersロケールを適用し、 date-fns アダプター locale をアクティブ言語に - useFormatters: locale-aware 日付/番号/パーセント/相対時間ヘルパー - MyAccountTab 地域設定保存: Cookie + Router.refresh() を書き込みます。 ユーザーが自分の言語を変更するとき - スクリプト/translate.ts:TranslateServiceに対するビルドタイム・デルタの翻訳 (ミラーカモマーケティングのパターン) - スクリプト/マージfragments.ts、**************************** ツール per-area キーのフラグメントをメッセージ/en.json に集計する 適用範囲: - 共有common.*, nav.*, auth.* キーとメッセージ/en.json が参照 〜67ページとコンポーネント(ダッシュボード、リード、 コマース、設定、アカウント、連絡先、設定/フィード、設定/メンバー、 コンポーネント/セッティング、コンポーネント/ツール/チャットなど。 多くの特徴 表面はまだフォローアップ抽出パスが必要です.
· VOIPService
Fall back to imaging recordings for call history + voicemails
FreePBX 17 doesn't expose voicemail messages over REST or GraphQL on this install (the GraphQL voiceMail type returns mailbox config, not messages, and /admin/api/api/rest/voicemail 404s), and Asterisk's CDR pipeline is also non-functional here (ODBC DSN misconfig handled separately in KlusterServices). Without these the softphone tabs render empty even when call/VM recordings exist on the imaging side. When provider.getCallHistory or provider.getVoicemails returns nothing, fall back to listing rows from the kamo.recordings table scoped by (providerInstanceId, extension, isVm). Caller-ID metadata isn't carried on Recording today so we leave from/fromNumber blank — the row still plays back through the media-player tool via recordingId. Archive filtering is preserved across both paths so a row archived via the cache stays hidden in the fallback too.
· kamo-shared-library
Paginated Recording lookup by (instance, extension, isVm)
Used by the softphone tabs as the canonical source of truth for call recordings and voicemails when the upstream provider can't list them — e.g. FreePBX 17 has no REST/GraphQL voicemail-message API, and on this install Asterisk's CDR pipeline is also broken (separate ODBC misconfig fix in KlusterServices).
· SecurityService
サブオーガニ作成のオートプロビジョンKamoCRMシート; 推進ビルリングオーナーエンドポイント
EntitlementService は、サブスクリプションメンバー (アカウントメンバーではなく) を計算する 会員資格 — アクティブ・ライセンシー・サブを横断する機能の連合、プラス 無料ベースライン。 Redis のリスナーが SUBSCRIPTION:<uid> ハンドラを獲得しました。 新しい BillingSetupService は 2 つのフローで動作します。 - createOrganization(カモCRMのサブオーガム):カモCRM-orgを自動生成 absent なら作成者のためのメンバー、KamoCRM のアカウントを検索または作成 そのメンバーをプライマリとして、フリー層のアカウントサブスクリプションを開きます。 新しいサブオーガニターをターゲティングし、クリエイターをライセンシー+サブマネージャーとしてシートします。 メニュー 新鮮なものを収穫 カモCRM 既存のサブ組織のメンバーのためのアカウント/サブ 名前付きライセンスの転送。 オラグ所有者のみ。 AccountController ルートのドロップ isLicensee / canManageSubscription から 口座レベルの顧客ペイロード — それらのフラグは現在、サブスクリプションメンバーに住んでいます.
· InitializerService
メンバ言語 + default currency カラムを追加
新規をバックアップするメンバーテーブルに2つのNOT NULLカラムを追加 Member.language (VARCHAR DEFAULT 'English') と Member.defaultCurrency (VARCHAR(10) DEFAULT 'USD') フィールド。 既存の行がバックフィルされます デフォルトでは、NOT NULL 制約がダウンタイムなしで満たされるため ウィンドウ.
· kamo-register
言語ステップ、国タイムゾーンピッカー、スクロール+ *の修正を追加
- 新しい「私の言語のステップは、国を映すウィザードに調製 ステップのレイアウト。 フラグタイルとして22のマーケティング支援局をリスト ネイティブネーム+英語ツールチップ、navigator.languagesから事前に選択します。 - 「私の国」のステップは、デフォルトで国と一緒にタイムゾーンを収集します ******************** より前に編集可能 次へ。 どちらのフィールドも事前に必要です。 - 登録機関は、言語/タイムゾーン(既存の国)を送信します。 /register エンドポイントにすると、新しいメンバーに主張されます。 - 修正:セキュリティの質問のステップ内容が垂直にスクロールできるようになりました — ステップは、オーバーフローコンテナなしで唯一のものだったので、長いカタログ 3番目の質問をオフスクリーンで押しました。 - 修正: フィニッシュボタンは、自動検証時に無効にとどまりません リスナーが装着する前に。 100ms setTimeout レースを 100 ms で置換 poll-until-mounted 添付ファイルでウィジェットの現在の状態をドレイントする レイトリスナーを取り付けます.
· kamo-internal
ローカル設定カードに言語 + デフォルト通貨を追加
メンバープロファイルの地域設定カードが編集可能な言語を公開 (22 は、マーケティングサイトをミラーリングするローカルをサポート) および デフォルト通貨 (検索可能なオートコンプリート) 3つすべて一緒に保存 PUT /api/security/members/{id} です。 モードを見ると、ネイティブ言語名が表示されます。 括弧の英語と、通貨記号とフルネーム.
· SecurityService
パーシストメンバーの言語/タイムゾーン/通貨のサインアップ
/register エンドポイントは、言語、タイムゾーン、デフォルト通貨を受け付けます。 既存の国のフィールドと共に。 登録サービスセット 国 新規ユーザのタイムゾーンと、すべての4つの地域フィールドを適用する 新しく作成されたメンバーは、国の通貨からデフォルトの通貨を導きます 1 が供給されていない場合の主流マッピング (そして USD に戻って落ちる).
· kamo-shared-library
Map external customer address blocks into AccountAddress on pull
Add AdapterAddressMapper helper that converts a JSON address node from any provider into an EmbAddress and attaches it to an Account as a typed AccountAddress (SHIPPING/BILLING). Wire the helper into the four adapters whose customer endpoints expose address blocks: - ShopifyCustomerAdapter: default_address goes to both shipping+billing, remaining addresses[] become shipping records - WooCommerceCustomerAdapter: billing block -> BILLING, shipping block -> SHIPPING - BigCommerceCustomerAdapter: addresses[] split by address_type field - MagentoCustomerAdapter: addresses[] split by **************** ids Adapters with no address data in their customer payloads (Ecwid, Wix, Shift4Shop, PrestaShop, OpenCart, Squarespace) continue to compile unchanged.
· kamo-internal
/account/new copy-from-lead UX, フルネームフィールド, デュアル電話, アドレス; アカウントレベルのアドレス管理
フロントエンド: - /account/new: セクションごとに「リードからコピー」ボタン+ヘッダ "Copy all from Lead"ボタン(リードId paramの場合) - 名前セクション:プレフィックス、最初、中間、最後、サフィックス - 二重電話(個人+仕事)と延長と「許可テキスト」トグル - EmbAddress シェイプ(line1、詳細、市、サブディビジョン、郵便、国)を使用してアドレスセクションを「請求として使用」トグル(デフォルト) - ネストされた名前/電子メール/電話番号のペイロードのマッチングバックエンドを提出 - accountApi: typed AccountName, AccountPhoneNumbers, AccountAddress; 新しいメソッド: getAddresses, addAddress, updateAddress, deleteAddress, setPrimaryAddress - AccountViewClient:新しいアドレス配列からプライマリ配送アドレスをレンダリングする
· SecurityService
ネストされた名前/メール/電話番号+アドレス管理エンドポイントをサポート
- AccountController は POST/PUT でネストされた名前/電子メール/phoneNumbers JSON を受け入れます - POST の初期アドレスは SHIPPING (および BILLING を useAsBillingToo セット) を作成しましたり、第一次ポインタを置きます - 5つのアドレスエンドポイントを追加します。GET、POST、PUT、DELETEアドレス、PUT /addresses/{id}/primary - 口座の要約/詳細は、名前オブジェクト、phoneNumbersオブジェクト、出荷/ビルアドレスリスト、プライマリポインタを調べます - アカウントレベルのメモフィールド参照をドロップします(Account.notesは以前削除されました)
