chainlesschain 0.166.36 → 0.166.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/package.json +2 -2
  2. package/src/assets/web-panel/assets/{AIOps-Zs-zPwVG.js → AIOps-B_Nt1Qe4.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-HZlxM6H0.js → ActionButton-CHQbie4X.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CXyThRDb.js → Analytics-Bm9364Lw.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DeyYh_EF.js → AppLayout-DTwlIh2v.js} +4 -4
  6. package/src/assets/web-panel/assets/{Artifacts-BQDtMwkx.js → Artifacts-OibP0qB4.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-DNH4UOux.js → Audit-B8Fwavkg.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BkKdIxE6.js → BackgroundAgents-p1Vb2K2B.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DYy4aJom.js → Backup-BI3QT-wI.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-DjoyGVYm.js → BaseInput-BW_VRWWu.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-D86ZYgOD.js → Chat-CUEhDQfq.js} +5 -5
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-RxI_YYth.js → ChatBubbleRenderer-C5UVXdVE.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-C7p8UY99.js → Checkbox-URYsaaxv.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-DnapqgV5.js → Codegen-DJAwC80a.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-C29J2DBT.js → Col-DfRKFzc9.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-Bf3KeLCr.js → Community-GOkGHuly.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-DA83wB48.js → Compact-CIMs13NC.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CXXVgRFG.js → Compliance-BE-TQIxV.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-B28Ftuqv.js → Cowork-CYmbJiWw.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-CO-BcnDf.js → Cron-Be3OIWyM.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BmgPMFCs.js → Crosschain-2xB2HS2D.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-CYW9WslA.js → DID-B_lJO2yF.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CWWhVWds.js → Dashboard-DnVWqUER.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CjTuc1-n.js → Dropdown-C7ZJvHVa.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-BrROAu4d.js → EmailListRenderer-DLevT-0F.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Ci8Lmk8W.js → FamilyGuardDashboard-BwhQ5BRU.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-CKzKVLE_.js → Federation-BkGI-Xkq.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CC2CK5PQ.js → FormItemContext-BgIIbMd7.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-BYa3ElyT.js → GenericCardRenderer-qL-qN8Nb.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-Bmn3ucA4.js → Git-BTzgrC4U.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DqEOXitg.js → Governance-p28vdCN4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BjfeExba.js → Inference-Cqephrur.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-CBTyIFlJ.js → KnowledgeGraph-C3v5Q4Zp.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-KZfA_M9Q.js → Logs-T6f0w32w.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BG7vi3V4.js → MarkdownRenderer-Dj5XPm3S.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-BFeK4he0.js → Marketplace-ClDsvHDH.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Brg7uUoK.js → McpTools-C4P-_snx.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-Ce4AmyX3.js → Memory-BZZfG6y6.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-Dx1VBL_E.js → MobileBridge-DpIv_BLs.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-DPyRr2Xl.js → MobileProjects-Buz3NIQg.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BzRmtDQU.js → Mtc-HS2PJB79.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-DvZ5kLvJ.js → MtcAudit-UmBrcU27.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-D8uGUjX1.js → Multisig-C00sXiZf.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-igc-TQE5.js → NLProgramming-Dj1ng_ph.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CTqDYlek.js → Notes-C4LEVKlk.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-CkcLa2rb.js → NotificationSettings-BWXwnekv.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BfScYvnH.js → OrderTableRenderer-CZHfK8Nn.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BjKK9SdB.js → Organization-CFEtFPrV.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-BkcghTPE.js → Overflow-DSz4MJK1.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-l9f34Xu8.js → P2P-DyTEytwG.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-yVXWmwWe.js → PdhVaultBrowser-B5QNGLVx.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-DeSYs0VV.js → Permissions-wEC_X7x4.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-CmKmhy0q.js → PersonalDataHub-If5GZlGZ.js} +3 -3
  54. package/src/assets/web-panel/assets/{Pipeline-DBxS4R_r.js → Pipeline-LB4gqqmX.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CKngdGw3.js → Privacy-QVLhoxcN.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-0Pso0jXN.js → ProjectInit-FaAbTYTo.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-BHrqWQ6r.js → ProjectSettings-DhMeNA21.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-B8wIh9PK.js → Projects-5L4lkWAZ.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-CXFTOHRV.js → Providers-DhZFp8fO.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DfN0c_BN.js → QrScannerModal-BZuJ7_xi.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-v1Z5hty_.js → QuickAsk-TXddPYYb.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DOaVmZUi.js → Recommend-DDuXIKYt.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession--EWcPBY1.js → RemoteSession-CDrTXImv.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DUWFSNvV.js → Reputation-B2xKaKzt.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-0-bFnXWF.js → Row-DzAjWAOX.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-B_uTfubW.js → RssFeed-CKH38BLF.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-CqxiTLfB.js → Search-CuPqJYoQ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CGoHOz5B.js → Security-DmAd2hxz.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-COhAbS45.js → Services-Bt3nljnY.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-B97crp6v.js → Skeleton-CP7RH093.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-er_XdavV.js → Skills-DKNeMBTx.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-RpkWkzOL.js → Sla-CbpM8Nrd.js} +1 -1
  73. package/src/assets/web-panel/assets/SpeechSettings-DTk-vTzF.js +1 -0
  74. package/src/assets/web-panel/assets/{SyncSettings-Bbiw6ohw.js → SyncSettings-DKiplwmc.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-CRghr7lo.js → Tasks-z-lOm8fx.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-BUQkfydG.js → Templates-Rb-Q0DGX.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-CfUFOsZu.js → Tenant-C2sqDUnR.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BGY7gi4M.js → Terminal-DcyzskEE.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-B3Len0l7.js → TimelineRenderer-lg0Eam7N.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-BjeHn2zI.js → Tokens-D9USIMIA.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-ctcZ2mcv.js → Trigger-BQpaQJ5k.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-oncF3TpO.js → Trust-C-Mik04s.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-BwKbVYCd.js → UkeySign-DrnZ_o56.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-D1dgL-3U.js → VideoEditing-BDOsoZi0.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-4hXAfjBL.js → Wallet-Ct_bleI7.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-C8p3cotb.js → WebAuthn-B6b6FDao.js} +3 -3
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BnrjG77E.js → WorkflowEditor-ZUJMaIHr.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-B-YNK7EI.js → chat-BII20OJy.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-B9HYvK-e.js → colors-DEsJRV3n.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-BJr0quBA.js → compact-item-DoDYAzN9.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CXfbQEWD.js → createContext-o_nofnVW.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-0tgDCszN.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-B7Q02hdZ.js → hasIn-CAsABTHC.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-DsV1HA0Z.js → index-B0ApxOMw.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Gjegl5Ig.js → index-B4SfcwZA.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BoNVnnAq.js → index-B9Z75LfA.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-C7IZWdoB.js → index-B9hYHPhs.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DPUg6cVc.js → index-BDRh3v44.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DutYFyC0.js → index-BcYbQoY7.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-D1GP2MQz.js → index-Bmwo5wQG.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-kAggAkrB.js → index-Bn2ZPUXO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DMoUa3dF.js → index-BnbnmRqg.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BmvpVSmM.js → index-Bqyg3PME.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BmCD1_HC.js → index-BrIIJ2s-.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-G7Z_On_n.js → index-BxT8yTwS.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BClzZrmx.js → index-Bycj011d.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-4gZEpDAG.js → index-BzMA6Ra3.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CEujQqdl.js → index-C1YDdyQ1.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BvRqE3Un.js → index-CE2J04dA.js} +1 -1
  110. package/src/assets/web-panel/assets/index-CFF8XEFE.js +1 -0
  111. package/src/assets/web-panel/assets/{index-D5g5_oua.js → index-CQE-WMEU.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CQ7qYZS4.js → index-CVQSl1uY.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BleXwr2w.js → index-CeJSTcXw.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BU_adeUp.js → index-CeWJqXNX.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BNL9lmWL.js → index-Cf3sFEoE.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BtunVZuS.js → index-D5Fd4tdL.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CXgHZ_HG.js → index-DDQzBK3l.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-C3M8M9_U.js → index-DQmX_-hk.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B6h86qjh.js → index-DRAA2McB.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BB4KIBso.js → index-DU2Rpx1m.js} +1 -1
  121. package/src/assets/web-panel/assets/index-DVUEISry.js +1 -0
  122. package/src/assets/web-panel/assets/{index-cq5Q-RHa.js → index-DWZNYecl.js} +3 -3
  123. package/src/assets/web-panel/assets/{index-COdAugDt.js → index-D_CMB_wC.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-iCKFl_jt.js → index-Dbb34cAr.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Bf0OxvOh.js → index-DciLb_Ww.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D0zuXz4s.js → index-Dgt1mKby.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CcyxVqzn.js → index-Dhnau6uw.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CU7cBzr9.js → index-DrsAF-Ar.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-D_UneDq3.js → index-DsoFTdA2.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-6wWd08X-.js → index-TSwbtCYG.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-HzCaU25O.js → index-kIyLNyoF.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Bd3nX6aj.js → index-tCeNfxv4.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DrzGM6fO.js → initDefaultProps-CNjeeoKE.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-SE_xFnGL.js → motion-CBT8IZDm.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-CrPjKNiG.js → move-h1MOxjqv.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CpcyFPK6.js → mtc-parser-C_3pqNmn.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-BV0g7vf4.js → omit-CMUnPFDk.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-lWpsc-k6.js → pickAttrs-p8_c1xq0.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CiewvU4X.js → placementArrow-D6O67r23.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DbF8pamO.js → responsiveObserve-DquhepAK.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-Bn82Ip9-.js → slide-CZ-m6gmS.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-J76gk_-G.js → statusUtils-k9ejZFtd.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-BL95J74a.js → styleChecker-NX6_137R.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-BUzhdQsv.js → useFlexGapSupport-bCqR70lP.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-B2Fppepb.js → useFs-2l0vSqyY.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-DjTASfYE.js → usePersonalDataHub-1yccm4O7.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BwrOgBqP.js → vnode-CxQzajDo.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B6MeT_Gw.js → zoom-CrTKwFyb.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/hub.js +21 -6
  151. package/src/commands/stream.js +28 -7
  152. package/src/commands/ui.js +10 -2
  153. package/src/data/changelog.json +13 -0
  154. package/src/gateways/ws/chat-intent-protocol.js +4 -1
  155. package/src/gateways/ws/llm-chat-protocol.js +29 -3
  156. package/src/gateways/ws/message-dispatcher.js +3 -1
  157. package/src/gateways/ws/personal-data-hub-protocol.js +24 -10
  158. package/src/gateways/ws/session-core-protocol.js +23 -6
  159. package/src/gateways/ws/session-protocol.js +1 -0
  160. package/src/lib/__tests__/provider-stream.test.js +6 -8
  161. package/src/lib/chat-core.js +67 -9
  162. package/src/lib/chat-intent-service.js +138 -39
  163. package/src/lib/evolution/evolution-deployment-loader.js +7 -1
  164. package/src/lib/evolution/governed-hub-llm.js +56 -0
  165. package/src/lib/evolution/governed-hub-resolver.js +65 -0
  166. package/src/lib/evolution/governed-hub-skill.js +36 -0
  167. package/src/lib/evolution/governed-model-turn.js +88 -0
  168. package/src/lib/personal-data-hub-wiring.js +49 -0
  169. package/src/lib/provider-stream.js +94 -45
  170. package/src/lib/ws-chat-handler.js +19 -2
  171. package/src/assets/web-panel/assets/SpeechSettings-DDVXmT5y.js +0 -1
  172. package/src/assets/web-panel/assets/devWarning-DNpXMZaQ.js +0 -1
  173. package/src/assets/web-panel/assets/index-2hcdmWpb.js +0 -1
  174. package/src/assets/web-panel/assets/index-DbQCUG4D.js +0 -1
@@ -0,0 +1,88 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { types } from "node:util";
3
+ import { captureAgentEvolutionRuntimeComposition } from "./agent-evolution-runtime-composition-brand.js";
4
+ import { captureAgentEvolutionIngress } from "./agent-evolution-ingress.js";
5
+
6
+ export function readEvolutionCompositionFactory(dependencies = {}) {
7
+ if (
8
+ !dependencies ||
9
+ typeof dependencies !== "object" ||
10
+ Array.isArray(dependencies) ||
11
+ types.isProxy(dependencies)
12
+ ) {
13
+ throw new TypeError("Model turn dependencies must be a plain object");
14
+ }
15
+ const property = Object.getOwnPropertyDescriptor(
16
+ dependencies,
17
+ "evolutionCompositionFactory",
18
+ );
19
+ if (
20
+ property &&
21
+ (!Object.hasOwn(property, "value") || typeof property.value !== "function")
22
+ ) {
23
+ throw new TypeError(
24
+ "evolutionCompositionFactory must be a function data property",
25
+ );
26
+ }
27
+ return property?.value ?? null;
28
+ }
29
+
30
+ // Only a host-owned factory can supply authority. Client messages supply input,
31
+ // never a run identifier or composition to borrow from another request.
32
+ export async function prepareGovernedModelTurn(
33
+ factory,
34
+ { mode, messages, signal },
35
+ ) {
36
+ signal?.throwIfAborted();
37
+ if (factory === null)
38
+ return {
39
+ governed: false,
40
+ messages,
41
+ complete: async () => {
42
+ signal?.throwIfAborted();
43
+ },
44
+ };
45
+ if (typeof factory !== "function")
46
+ throw new TypeError("Invalid evolution composition factory");
47
+ const runId = `${mode}-${randomUUID()}`;
48
+ const composition = captureAgentEvolutionRuntimeComposition(
49
+ await factory(
50
+ Object.freeze({ mode, runId, taskId: runId, cwd: process.cwd() }),
51
+ ),
52
+ );
53
+ const ingress = captureAgentEvolutionIngress(composition.evolutionIngress);
54
+ if (
55
+ composition.runId !== runId ||
56
+ ingress.runId !== runId ||
57
+ composition.tenantId !== ingress.tenantId
58
+ ) {
59
+ throw new Error(
60
+ "Model evolution composition is not bound to the requested Run",
61
+ );
62
+ }
63
+ signal?.throwIfAborted();
64
+ await ingress.start();
65
+ await ingress.ingestUserPrompt({ messages, source: mode });
66
+ const prepared = await ingress.prepareModelRequest({ messages, tools: [] });
67
+ signal?.throwIfAborted();
68
+ return Object.freeze({
69
+ governed: true,
70
+ messages: prepared.messages,
71
+ async complete(content) {
72
+ signal?.throwIfAborted();
73
+ await ingress.ingestAgentEvent({ type: "response-complete", content });
74
+ signal?.throwIfAborted();
75
+ await ingress.complete();
76
+ },
77
+ });
78
+ }
79
+
80
+ export async function* governModelTokenSource(source, turn, signal) {
81
+ let content = "";
82
+ for await (const delta of source) {
83
+ signal?.throwIfAborted();
84
+ content += delta;
85
+ yield delta;
86
+ }
87
+ await turn.complete(content);
88
+ }
@@ -467,6 +467,7 @@ async function initHub() {
467
467
 
468
468
  // Phase 8 — EntityResolver pipeline
469
469
  const entityResolver = new EntityResolver({ vault });
470
+ let resolverEmbeddingStage = null;
470
471
  // Plan A v0.1 — in-APK Android cc has no Ollama on localhost:11434.
471
472
  // Every embedding call would TCP-timeout (measured: ~60s extra per sync
472
473
  // on Xiaomi 24115RA8EC 2026-05-21). Detect Termux $PREFIX for our APK
@@ -504,6 +505,7 @@ async function initHub() {
504
505
  vault,
505
506
  });
506
507
  entityResolver._embeddingStage = embeddingStage.asStageFn();
508
+ resolverEmbeddingStage = embeddingStage;
507
509
  }
508
510
  } catch (_err) {
509
511
  // Fall back to rule-only — registry still works
@@ -1071,6 +1073,23 @@ async function initHub() {
1071
1073
  alipayAccountsPath,
1072
1074
  entityResolver,
1073
1075
  aichatAccountsStore,
1076
+ async drainResolver(options = {}, factory = null) {
1077
+ if (factory === null) return entityResolver.drain(options);
1078
+ const { createGovernedHubResolver } =
1079
+ await import("./evolution/governed-hub-resolver.js");
1080
+ const scoped = createGovernedHubResolver(
1081
+ {
1082
+ resolver: entityResolver,
1083
+ llm,
1084
+ embeddingStage: resolverEmbeddingStage,
1085
+ EntityResolver,
1086
+ EmbeddingStage: EntityResolverEmbeddingStage,
1087
+ LLMStage: EntityResolverLLMStage,
1088
+ },
1089
+ factory,
1090
+ );
1091
+ return scoped.drain(options);
1092
+ },
1074
1093
  aiChatAdapter,
1075
1094
  aichatWizard,
1076
1095
  aichatHealthChecker,
@@ -2091,6 +2110,36 @@ export async function getHub() {
2091
2110
  return _initPromise;
2092
2111
  }
2093
2112
 
2113
+ export async function getGovernedAnalysisHub(evolutionCompositionFactory) {
2114
+ const hub = await getHub();
2115
+ const { createGovernedHubLlm } =
2116
+ await import("./evolution/governed-hub-llm.js");
2117
+ const llm = createGovernedHubLlm(hub.engine.llm, evolutionCompositionFactory);
2118
+ const engine = new AnalysisEngine({
2119
+ vault: hub.engine.vault,
2120
+ llm,
2121
+ ragRetriever: hub.engine.ragRetriever,
2122
+ maxFacts: hub.engine.maxFacts,
2123
+ maxQueryLimit: hub.engine.maxQueryLimit,
2124
+ systemPrompt: hub.engine.systemPrompt,
2125
+ });
2126
+ const { runGovernedHubSkill } =
2127
+ await import("./evolution/governed-hub-skill.js");
2128
+ return Object.freeze({
2129
+ ...hub,
2130
+ llm,
2131
+ engine,
2132
+ runSkill: (name, options = {}) =>
2133
+ runGovernedHubSkill(
2134
+ hub,
2135
+ evolutionCompositionFactory,
2136
+ runAnalysisSkill,
2137
+ name,
2138
+ options,
2139
+ ),
2140
+ });
2141
+ }
2142
+
2094
2143
  // ─── Minimal hub bootstrap for read-only / LLM-free commands ────────────
2095
2144
  //
2096
2145
  // 2026-05-27 — `cc hub retrieve-context` cold-start was 90s+ on Android
@@ -6,37 +6,77 @@
6
6
 
7
7
  import { BUILT_IN_PROVIDERS } from "./llm-providers.js";
8
8
 
9
- export async function* ollamaTokenStream({ baseUrl, model, prompt, signal }) {
10
- const res = await fetch(`${baseUrl}/api/generate`, {
9
+ async function* responseLines(body) {
10
+ const reader = body.getReader();
11
+ const decoder = new TextDecoder();
12
+ let buffer = "";
13
+ let ended = false;
14
+ try {
15
+ while (true) {
16
+ const { value, done } = await reader.read();
17
+ if (done) {
18
+ ended = true;
19
+ buffer += decoder.decode();
20
+ if (buffer) yield buffer;
21
+ return;
22
+ }
23
+ buffer += decoder.decode(value, { stream: true });
24
+ let newline;
25
+ while ((newline = buffer.indexOf("\n")) >= 0) {
26
+ const line = buffer.slice(0, newline);
27
+ buffer = buffer.slice(newline + 1);
28
+ yield line;
29
+ }
30
+ }
31
+ } finally {
32
+ try {
33
+ if (!ended) await reader.cancel();
34
+ } catch {
35
+ // Preserve the original parser/transport failure during cleanup.
36
+ } finally {
37
+ reader.releaseLock();
38
+ }
39
+ }
40
+ }
41
+
42
+ export async function* ollamaTokenStream({
43
+ baseUrl,
44
+ model,
45
+ prompt,
46
+ messages,
47
+ signal,
48
+ requireCompletion = false,
49
+ }) {
50
+ const res = await fetch(`${baseUrl}/api/${messages ? "chat" : "generate"}`, {
11
51
  method: "POST",
12
52
  headers: { "Content-Type": "application/json" },
13
- body: JSON.stringify({ model, prompt, stream: true }),
53
+ body: JSON.stringify(
54
+ messages
55
+ ? { model, messages, stream: true }
56
+ : { model, prompt, stream: true },
57
+ ),
14
58
  signal,
15
59
  });
16
60
  if (!res.ok || !res.body) {
17
61
  throw new Error(`Ollama ${res.status} ${res.statusText}`);
18
62
  }
19
- const reader = res.body.getReader();
20
- const decoder = new TextDecoder();
21
- let buf = "";
22
- while (true) {
23
- const { value, done } = await reader.read();
24
- if (done) break;
25
- buf += decoder.decode(value, { stream: true });
26
- let nl;
27
- while ((nl = buf.indexOf("\n")) >= 0) {
28
- const line = buf.slice(0, nl).trim();
29
- buf = buf.slice(nl + 1);
30
- if (!line) continue;
31
- try {
32
- const obj = JSON.parse(line);
33
- if (obj.response) yield obj.response;
34
- if (obj.done) return;
35
- } catch {
36
- /* skip malformed */
37
- }
63
+ for await (const raw of responseLines(res.body)) {
64
+ const line = raw.trim();
65
+ if (!line) continue;
66
+ try {
67
+ const obj = JSON.parse(line);
68
+ if (requireCompletion && obj.error)
69
+ throw new Error("Ollama stream returned an error");
70
+ const delta = messages ? obj.message?.content : obj.response;
71
+ if (delta) yield delta;
72
+ if (obj.done) return;
73
+ } catch (error) {
74
+ if (requireCompletion) throw error;
75
+ /* skip malformed */
38
76
  }
39
77
  }
78
+ if (requireCompletion)
79
+ throw new Error("Ollama stream ended before its completion marker");
40
80
  }
41
81
 
42
82
  export async function* openAIStream({
@@ -44,7 +84,9 @@ export async function* openAIStream({
44
84
  apiKey,
45
85
  model,
46
86
  prompt,
87
+ messages,
47
88
  signal,
89
+ requireCompletion = false,
48
90
  }) {
49
91
  const res = await fetch(`${baseUrl}/chat/completions`, {
50
92
  method: "POST",
@@ -54,7 +96,7 @@ export async function* openAIStream({
54
96
  },
55
97
  body: JSON.stringify({
56
98
  model,
57
- messages: [{ role: "user", content: prompt }],
99
+ messages: messages ?? [{ role: "user", content: prompt }],
58
100
  stream: true,
59
101
  }),
60
102
  signal,
@@ -62,29 +104,24 @@ export async function* openAIStream({
62
104
  if (!res.ok || !res.body) {
63
105
  throw new Error(`${res.status} ${res.statusText}`);
64
106
  }
65
- const reader = res.body.getReader();
66
- const decoder = new TextDecoder();
67
- let buf = "";
68
- while (true) {
69
- const { value, done } = await reader.read();
70
- if (done) break;
71
- buf += decoder.decode(value, { stream: true });
72
- const lines = buf.split("\n");
73
- buf = lines.pop() || "";
74
- for (const raw of lines) {
75
- const line = raw.trim();
76
- if (!line || !line.startsWith("data:")) continue;
77
- const payload = line.slice(5).trim();
78
- if (payload === "[DONE]") return;
79
- try {
80
- const obj = JSON.parse(payload);
81
- const delta = obj?.choices?.[0]?.delta?.content;
82
- if (delta) yield delta;
83
- } catch {
84
- /* skip */
85
- }
107
+ for await (const raw of responseLines(res.body)) {
108
+ const line = raw.trim();
109
+ if (!line || !line.startsWith("data:")) continue;
110
+ const payload = line.slice(5).trim();
111
+ if (payload === "[DONE]") return;
112
+ try {
113
+ const obj = JSON.parse(payload);
114
+ if (requireCompletion && obj.error)
115
+ throw new Error("OpenAI stream returned an error");
116
+ const delta = obj?.choices?.[0]?.delta?.content;
117
+ if (delta) yield delta;
118
+ } catch (error) {
119
+ if (requireCompletion) throw error;
120
+ /* skip */
86
121
  }
87
122
  }
123
+ if (requireCompletion)
124
+ throw new Error("OpenAI stream ended before its completion marker");
88
125
  }
89
126
 
90
127
  /**
@@ -92,13 +129,23 @@ export async function* openAIStream({
92
129
  * Throws on unsupported provider / missing API key.
93
130
  */
94
131
  export function buildProviderSource(provider, opts = {}) {
95
- const { model, baseUrl, apiKey, prompt, signal } = opts;
132
+ const {
133
+ model,
134
+ baseUrl,
135
+ apiKey,
136
+ prompt,
137
+ messages,
138
+ signal,
139
+ requireCompletion,
140
+ } = opts;
96
141
  if (provider === "ollama") {
97
142
  return ollamaTokenStream({
98
143
  baseUrl: baseUrl || "http://localhost:11434",
99
144
  model: model || "qwen2:7b",
100
145
  prompt,
146
+ messages,
101
147
  signal,
148
+ requireCompletion,
102
149
  });
103
150
  }
104
151
  const def = BUILT_IN_PROVIDERS[provider];
@@ -115,7 +162,9 @@ export function buildProviderSource(provider, opts = {}) {
115
162
  apiKey: finalKey,
116
163
  model: model || def.models[0],
117
164
  prompt,
165
+ messages,
118
166
  signal,
167
+ requireCompletion,
119
168
  });
120
169
  }
121
170
 
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { chatWithStreaming } from "./chat-core.js";
9
+ import { prepareGovernedModelTurn } from "./evolution/governed-model-turn.js";
9
10
 
10
11
  export class WSChatHandler {
11
12
  /**
@@ -13,7 +14,14 @@ export class WSChatHandler {
13
14
  * @param {import("./ws-session-manager.js").Session} options.session
14
15
  * @param {import("./interaction-adapter.js").WebSocketInteractionAdapter} options.interaction
15
16
  */
16
- constructor({ session, interaction }) {
17
+ constructor({ session, interaction, evolutionCompositionFactory = null }) {
18
+ if (
19
+ evolutionCompositionFactory !== null &&
20
+ typeof evolutionCompositionFactory !== "function"
21
+ ) {
22
+ throw new TypeError("evolutionCompositionFactory must be a function");
23
+ }
24
+ this._evolutionCompositionFactory = evolutionCompositionFactory;
17
25
  this.session = session;
18
26
  this.interaction = interaction;
19
27
  this._processing = false;
@@ -56,6 +64,13 @@ export class WSChatHandler {
56
64
  });
57
65
  runRecorded = true;
58
66
 
67
+ const turn = await prepareGovernedModelTurn(
68
+ this._evolutionCompositionFactory,
69
+ {
70
+ mode: "ws-chat-session",
71
+ messages: session.messages,
72
+ },
73
+ );
59
74
  const options = {
60
75
  provider: session.provider,
61
76
  model: session.model,
@@ -64,10 +79,11 @@ export class WSChatHandler {
64
79
  // Phase J — pipe WS session id so chat-core records token_usage
65
80
  // into the JSONL session store; visible via `cc session usage`.
66
81
  sessionId: session.sessionId || session.id,
82
+ requireCompletion: turn.governed,
67
83
  };
68
84
 
69
85
  const fullContent = await chatWithStreaming(
70
- session.messages,
86
+ turn.messages,
71
87
  options,
72
88
  (event) => {
73
89
  if (event.type === "response-token") {
@@ -79,6 +95,7 @@ export class WSChatHandler {
79
95
  },
80
96
  );
81
97
 
98
+ await turn.complete(fullContent);
82
99
  session.messages.push({ role: "assistant", content: fullContent });
83
100
  this.interaction.emit("response-complete", {
84
101
  requestId,
@@ -1 +0,0 @@
1
- import{I as u,J,U as b,R as c,c as a,K as i,a as R,r as k,o as F,b as E,P as O,Q as p,S as z,V as C}from"./vendor-Bn1JzzAn.js";import{t as M,_ as Q,b as K,u as T,d as S}from"./index-cq5Q-RHa.js";import{i as X,R as q}from"./icons-DG5UD-6K.js";const v=Object.freeze({defaultEngine:"webspeech",webSpeech:{lang:"zh-CN"},whisperAPI:{apiKey:"",baseURL:"https://api.openai.com/v1",model:"whisper-1",language:"zh",timeout:6e4},whisperLocal:{serverUrl:"http://localhost:8002",modelSize:"base",device:"auto",timeout:12e4}}),Y=["webspeech","whisper-api","whisper-local"];function B(g,t){if(typeof g=="number"&&Number.isFinite(g))return g;const s=parseFloat(g);return Number.isFinite(s)?s:t}function Z(g){return JSON.parse(JSON.stringify(g))}function D(g){const t=Z(v);if(!g)return t;const s=g.trim();if(!s||/key not found/i.test(s))return t;const e=M(s);if(!e||typeof e!="object"||Array.isArray(e))return t;if(typeof e.defaultEngine=="string"&&Y.includes(e.defaultEngine)&&(t.defaultEngine=e.defaultEngine),e.webSpeech&&typeof e.webSpeech=="object"&&typeof e.webSpeech.lang=="string"&&e.webSpeech.lang&&(t.webSpeech.lang=e.webSpeech.lang),e.whisperAPI&&typeof e.whisperAPI=="object"){const l=e.whisperAPI;typeof l.apiKey=="string"&&(t.whisperAPI.apiKey=l.apiKey),typeof l.baseURL=="string"&&l.baseURL&&(t.whisperAPI.baseURL=l.baseURL),typeof l.model=="string"&&l.model&&(t.whisperAPI.model=l.model),typeof l.language=="string"&&l.language&&(t.whisperAPI.language=l.language),l.timeout!==void 0&&(t.whisperAPI.timeout=B(l.timeout,v.whisperAPI.timeout))}if(e.whisperLocal&&typeof e.whisperLocal=="object"){const l=e.whisperLocal;typeof l.serverUrl=="string"&&l.serverUrl&&(t.whisperLocal.serverUrl=l.serverUrl),typeof l.modelSize=="string"&&l.modelSize&&(t.whisperLocal.modelSize=l.modelSize),typeof l.device=="string"&&l.device&&(t.whisperLocal.device=l.device),l.timeout!==void 0&&(t.whisperLocal.timeout=B(l.timeout,v.whisperLocal.timeout))}return t}function j(g,t){const s={};g.defaultEngine!==t.defaultEngine&&(s.defaultEngine=t.defaultEngine);for(const e of["webSpeech","whisperAPI","whisperLocal"]){const l=g[e]||{},w=t[e]||{};for(const o of Object.keys(v[e]))l[o]!==w[o]&&(s[`${e}.${o}`]=w[o])}return s}const $={__name:"SpeechSettings",setup(g,{expose:t}){t();const{t:s}=K(),e=T(),l=k(!1),w=k(!1),o=R(JSON.parse(JSON.stringify(v))),h=k(JSON.parse(JSON.stringify(v))),y=E(()=>[{value:"webspeech",label:s("speechSettings.engineOptions.webspeech")},{value:"whisper-api",label:s("speechSettings.engineOptions.whisper-api")},{value:"whisper-local",label:s("speechSettings.engineOptions.whisper-local")}]),f=E(()=>{const d=`speechSettings.engineHint.${o.defaultEngine}`,n=s(d);return n===d?"":n}),_=E(()=>Object.keys(j(h.value,o)).length>0);function m(d){o.defaultEngine=d.defaultEngine,Object.assign(o.webSpeech,d.webSpeech),Object.assign(o.whisperAPI,d.whisperAPI),Object.assign(o.whisperLocal,d.whisperLocal),h.value=JSON.parse(JSON.stringify(d))}async function r(){l.value=!0;try{const{output:d}=await e.execute("config get speech",1e4);m(D(d))}catch(d){/key not found/i.test(d.message)?m(JSON.parse(JSON.stringify(v))):S.error(s("speechSettings.messages.loadFailed",{err:d.message}))}finally{l.value=!1}}function N(){m(h.value)}async function x(){const d=j(h.value,o),n=Object.keys(d);if(n.length===0){S.info(s("speechSettings.messages.noChanges"));return}w.value=!0;let P=0,I=0;for(const A of n){const H=d[A],V=String(H).replace(/"/g,'\\"'),W=`config set speech.${A} "${V}"`;try{const{output:U,exitCode:G}=await e.execute(W,1e4);G!==0||/error|failed|失败/i.test(U)?(I++,S.error(s("speechSettings.messages.saveItemFailed",{key:A,err:U.slice(0,80)}))):P++}catch(U){I++,S.error(s("speechSettings.messages.saveItemFailed",{key:A,err:U.message}))}}w.value=!1,I===0?(S.success(s("speechSettings.messages.saveOk",{count:P})),h.value=JSON.parse(JSON.stringify(o))):P>0&&(S.warning(s("speechSettings.messages.savePartial",{ok:P,fail:I})),await r())}F(()=>{r()});const L={t:s,ws:e,loading:l,saving:w,form:o,baseline:h,engineOptions:y,engineHint:f,isDirty:_,applyConfig:m,loadConfig:r,resetForm:N,saveConfig:x,reactive:R,ref:k,computed:E,onMounted:F,get useI18n(){return K},get ReloadOutlined(){return q},get SoundOutlined(){return X},get message(){return S},get useWsStore(){return T},get parseSpeechConfig(){return D},get diffSpeechConfig(){return j},get SPEECH_DEFAULTS(){return v}};return Object.defineProperty(L,"__isScriptSetup",{enumerable:!1,value:!0}),L}},ee={style:{display:"flex","align-items":"center","justify-content":"space-between","margin-bottom":"24px"}},te={class:"page-title"},ae={class:"page-sub"},ie={style:{color:"var(--text-primary)"}},le={style:{color:"var(--text-muted)","font-size":"11px"}},ne={style:{color:"var(--text-primary)"}},se={style:{color:"var(--text-primary)"}},oe={style:{color:"var(--text-primary)"}},re={style:{display:"flex",gap:"12px","align-items":"center"}},de={key:0,style:{color:"#faad14","font-size":"12px"}};function pe(g,t,s,e,l,w){const o=u("a-button"),h=u("a-alert"),y=u("a-select"),f=u("a-form-item"),_=u("a-form"),m=u("a-card"),r=u("a-select-option"),N=u("a-input-password"),x=u("a-input"),L=u("a-input-number"),d=u("a-spin");return O(),J("div",null,[b("div",ee,[b("div",null,[b("h2",te,c(e.t("speechSettings.title")),1),b("p",ae,c(e.t("speechSettings.subtitle")),1)]),a(o,{loading:e.loading,onClick:e.loadConfig},{icon:i(()=>[a(e.ReloadOutlined)]),default:i(()=>[p(" "+c(e.t("speechSettings.refresh")),1)]),_:1},8,["loading"])]),a(h,{message:e.t("speechSettings.alert.message"),description:e.t("speechSettings.alert.description"),type:"info","show-icon":"",closable:"",style:{"margin-bottom":"16px"}},null,8,["message","description"]),a(d,{spinning:e.loading},{default:i(()=>[a(m,{style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",ie,[a(e.SoundOutlined,{style:{"margin-right":"8px"}}),p(c(e.t("speechSettings.engineCardTitle")),1)])]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.engineLabel")},{extra:i(()=>[b("span",le,c(e.engineHint),1)]),default:i(()=>[a(y,{value:e.form.defaultEngine,"onUpdate:value":t[0]||(t[0]=n=>e.form.defaultEngine=n),style:{width:"320px"},disabled:e.saving,options:e.engineOptions},null,8,["value","disabled","options"])]),_:1},8,["label"])]),_:1})]),_:1}),e.form.defaultEngine==="webspeech"?(O(),z(m,{key:0,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",ne,c(e.t("speechSettings.webSpeech.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.webSpeech.langLabel")},{default:i(()=>[a(y,{value:e.form.webSpeech.lang,"onUpdate:value":t[1]||(t[1]=n=>e.form.webSpeech.lang=n),style:{width:"240px"},disabled:e.saving},{default:i(()=>[a(r,{value:"zh-CN"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.zh-CN")),1)]),_:1}),a(r,{value:"zh-TW"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.zh-TW")),1)]),_:1}),a(r,{value:"en-US"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.en-US")),1)]),_:1}),a(r,{value:"en-GB"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.en-GB")),1)]),_:1}),a(r,{value:"ja-JP"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.ja-JP")),1)]),_:1}),a(r,{value:"ko-KR"},{default:i(()=>[p(c(e.t("speechSettings.webSpeech.langOptions.ko-KR")),1)]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),e.form.defaultEngine==="whisper-api"?(O(),z(m,{key:1,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",se,c(e.t("speechSettings.whisperAPI.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.whisperAPI.apiKeyLabel")},{default:i(()=>[a(N,{value:e.form.whisperAPI.apiKey,"onUpdate:value":t[2]||(t[2]=n=>e.form.whisperAPI.apiKey=n),placeholder:"sk-...",disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.baseUrlLabel")},{default:i(()=>[a(x,{value:e.form.whisperAPI.baseURL,"onUpdate:value":t[3]||(t[3]=n=>e.form.whisperAPI.baseURL=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.modelLabel")},{default:i(()=>[a(x,{value:e.form.whisperAPI.model,"onUpdate:value":t[4]||(t[4]=n=>e.form.whisperAPI.model=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.languageLabel")},{default:i(()=>[a(x,{value:e.form.whisperAPI.language,"onUpdate:value":t[5]||(t[5]=n=>e.form.whisperAPI.language=n),disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperAPI.timeoutLabel")},{default:i(()=>[a(L,{value:e.form.whisperAPI.timeout,"onUpdate:value":t[6]||(t[6]=n=>e.form.whisperAPI.timeout=n),min:1e3,max:6e5,step:1e3,style:{width:"200px"},disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),e.form.defaultEngine==="whisper-local"?(O(),z(m,{key:2,style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-bottom":"16px"}},{title:i(()=>[b("span",oe,c(e.t("speechSettings.whisperLocal.cardTitle")),1)]),default:i(()=>[a(_,{"label-col":{span:6},"wrapper-col":{span:18},style:{"max-width":"720px"}},{default:i(()=>[a(f,{label:e.t("speechSettings.whisperLocal.serverUrlLabel")},{default:i(()=>[a(x,{value:e.form.whisperLocal.serverUrl,"onUpdate:value":t[7]||(t[7]=n=>e.form.whisperLocal.serverUrl=n),placeholder:"http://localhost:8002",disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.modelSizeLabel")},{default:i(()=>[a(y,{value:e.form.whisperLocal.modelSize,"onUpdate:value":t[8]||(t[8]=n=>e.form.whisperLocal.modelSize=n),style:{width:"180px"},disabled:e.saving},{default:i(()=>[a(r,{value:"tiny"},{default:i(()=>[...t[11]||(t[11]=[p("tiny",-1)])]),_:1}),a(r,{value:"base"},{default:i(()=>[...t[12]||(t[12]=[p("base",-1)])]),_:1}),a(r,{value:"small"},{default:i(()=>[...t[13]||(t[13]=[p("small",-1)])]),_:1}),a(r,{value:"medium"},{default:i(()=>[...t[14]||(t[14]=[p("medium",-1)])]),_:1}),a(r,{value:"large"},{default:i(()=>[...t[15]||(t[15]=[p("large",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.deviceLabel")},{default:i(()=>[a(y,{value:e.form.whisperLocal.device,"onUpdate:value":t[9]||(t[9]=n=>e.form.whisperLocal.device=n),style:{width:"180px"},disabled:e.saving},{default:i(()=>[a(r,{value:"auto"},{default:i(()=>[...t[16]||(t[16]=[p("auto",-1)])]),_:1}),a(r,{value:"cpu"},{default:i(()=>[...t[17]||(t[17]=[p("cpu",-1)])]),_:1}),a(r,{value:"cuda"},{default:i(()=>[...t[18]||(t[18]=[p("cuda",-1)])]),_:1})]),_:1},8,["value","disabled"])]),_:1},8,["label"]),a(f,{label:e.t("speechSettings.whisperLocal.timeoutLabel")},{default:i(()=>[a(L,{value:e.form.whisperLocal.timeout,"onUpdate:value":t[10]||(t[10]=n=>e.form.whisperLocal.timeout=n),min:1e3,max:6e5,step:1e3,style:{width:"200px"},disabled:e.saving},null,8,["value","disabled"])]),_:1},8,["label"])]),_:1})]),_:1})):C("v-if",!0),b("div",re,[a(o,{onClick:e.resetForm,disabled:e.saving||e.loading},{default:i(()=>[p(c(e.t("speechSettings.buttons.reset")),1)]),_:1},8,["disabled"]),a(o,{type:"primary",loading:e.saving,disabled:!e.isDirty,onClick:e.saveConfig},{default:i(()=>[p(c(e.t("speechSettings.buttons.save")),1)]),_:1},8,["loading","disabled"]),e.isDirty?(O(),J("span",de,c(e.t("speechSettings.dirtyHint")),1)):C("v-if",!0)])]),_:1},8,["spinning"])])}const ue=Q($,[["render",pe],["__scopeId","data-v-2b18ccaa"],["__file","/tmp/cc-web-panel-xkj8eX/repo/packages/web-panel/src/views/SpeechSettings.vue"]]);export{ue as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-cq5Q-RHa.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-0-bFnXWF.js";import{a0 as t}from"./index-cq5Q-RHa.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-DbF8pamO.js";import"./useFlexGapSupport-BUzhdQsv.js";import"./styleChecker-BL95J74a.js";import"./index-G7Z_On_n.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-C29J2DBT.js";import{a0 as t}from"./index-cq5Q-RHa.js";import"./vendor-Bn1JzzAn.js";import"./index-G7Z_On_n.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};