chainlesschain 0.166.112 → 0.166.114

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 (169) hide show
  1. package/README.md +12 -6
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-sOceeExN.js → AIOps-CVac3rIN.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-BQs-vRUr.js → ActionButton-ChM9GxMl.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-sfAHHMhA.js → Analytics-CV5399Js.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-0gAvE0c8.js → AppLayout-CuonVXhg.js} +4 -4
  10. package/src/assets/web-panel/assets/{Artifacts-Dh9s2Qmd.js → Artifacts-D9qKfgb6.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-CITm26SU.js → Audit-DUvLysQc.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-BiMbBOh0.js → BackgroundAgents-DfKohQeT.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-CNpnhI3h.js → Backup-CohoEI8R.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-BI_lltkp.js → BaseInput-BwdoA3xv.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-BgfB88xY.js → Chat-DRkuz1d2.js} +5 -5
  16. package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
  17. package/src/assets/web-panel/assets/{Checkbox-4xy9rS3j.js → Checkbox-B-GNGpKv.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-D93h9ihS.js → Codegen-Bs2lAsoZ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-BRf3STY-.js → Col-Bk1mJKDZ.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-f187ziSL.js → Community-B_FDSCOo.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-D4hXWuo1.js → Compact-No1qSLLH.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-C6cYKI6H.js → Compliance-CcrG43-d.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-C1i1f8LD.js → Cowork-DLkj2ywK.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-BacCE4LA.js → Cron-sQHELVEz.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-DXztxOoH.js → Crosschain-CRTZ3GZg.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-rpf4HN8x.js → DID-Ds2bjvxE.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-h4bgtH7L.js → Dashboard-DOONG2NX.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-CyQnoHmu.js → Dropdown-Br3PNA2L.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-FCtp4AcB.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{EvolutionSettings-JbISHTWR.js → EvolutionSettings-BSLuEjlT.js} +1 -1
  31. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DCIQLyfK.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
  32. package/src/assets/web-panel/assets/{Federation-DDbFpwja.js → Federation-D3B0tlQU.js} +1 -1
  33. package/src/assets/web-panel/assets/{FormItemContext-CXF0jtXb.js → FormItemContext-DTVkVVQP.js} +1 -1
  34. package/src/assets/web-panel/assets/{GenericCardRenderer-CUaNfAM0.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
  35. package/src/assets/web-panel/assets/{Git-Bhoz2gDf.js → Git-3t71m6Xd.js} +2 -2
  36. package/src/assets/web-panel/assets/{Governance-FiiXHe8e.js → Governance-DS7WvlaX.js} +1 -1
  37. package/src/assets/web-panel/assets/{Inference-brpTW2Q3.js → Inference-CeT-xWrI.js} +1 -1
  38. package/src/assets/web-panel/assets/{KnowledgeGraph-BCWP-f6k.js → KnowledgeGraph-BQzMncp5.js} +1 -1
  39. package/src/assets/web-panel/assets/{Logs-CxYcduoK.js → Logs-CC5DOKhV.js} +2 -2
  40. package/src/assets/web-panel/assets/MarkdownRenderer-5jYM4kYG.js +1 -0
  41. package/src/assets/web-panel/assets/{Marketplace-DANdmW7l.js → Marketplace-CpYDyy3o.js} +1 -1
  42. package/src/assets/web-panel/assets/{McpTools-Bi_EKkb5.js → McpTools-DRdAZPMr.js} +3 -3
  43. package/src/assets/web-panel/assets/{Memory-DecoMbYw.js → Memory-CBLRr-l8.js} +2 -2
  44. package/src/assets/web-panel/assets/{MobileBridge-DrOhFKp0.js → MobileBridge-Bnj9veNN.js} +1 -1
  45. package/src/assets/web-panel/assets/MobileProjects-lYFPD24p.js +1 -0
  46. package/src/assets/web-panel/assets/{Mtc-SLPII1iw.js → Mtc-BMU_C9vD.js} +2 -2
  47. package/src/assets/web-panel/assets/{MtcAudit-DWoVORYy.js → MtcAudit-DQV-zumU.js} +4 -4
  48. package/src/assets/web-panel/assets/{Multisig-Dxpnmq-m.js → Multisig-LpqpqV1d.js} +3 -3
  49. package/src/assets/web-panel/assets/{NLProgramming-kNTpNqCP.js → NLProgramming-C4OMklSO.js} +1 -1
  50. package/src/assets/web-panel/assets/{Notes-D1uXCfVd.js → Notes-Cg0QCinP.js} +3 -3
  51. package/src/assets/web-panel/assets/{NotificationSettings-D3Qt8Gkl.js → NotificationSettings-amoZoMna.js} +1 -1
  52. package/src/assets/web-panel/assets/{OrderTableRenderer-qvaah2-m.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
  53. package/src/assets/web-panel/assets/{Organization-EhRl4JoJ.js → Organization-BetJmyX5.js} +4 -4
  54. package/src/assets/web-panel/assets/{Overflow-BTt5C_5W.js → Overflow-DbeoPtVD.js} +1 -1
  55. package/src/assets/web-panel/assets/{P2P-CeR2jyb0.js → P2P-B5sitQWT.js} +2 -2
  56. package/src/assets/web-panel/assets/{PdhVaultBrowser-BzD3OHWq.js → PdhVaultBrowser-AP9SG2ic.js} +3 -3
  57. package/src/assets/web-panel/assets/{Permissions-BOPyeRlz.js → Permissions-Bc7fgNKx.js} +4 -4
  58. package/src/assets/web-panel/assets/{PersonalDataHub-DcmNNsfO.js → PersonalDataHub-BwdGMcWZ.js} +4 -4
  59. package/src/assets/web-panel/assets/{Pipeline-DuL3kwWC.js → Pipeline-DVuJA9BA.js} +1 -1
  60. package/src/assets/web-panel/assets/{Privacy-CkQRdlSU.js → Privacy-BGzwOYRG.js} +1 -1
  61. package/src/assets/web-panel/assets/{ProjectInit-moE_vQ1P.js → ProjectInit-BpHcC5br.js} +2 -2
  62. package/src/assets/web-panel/assets/{ProjectSettings-PnTWi4NQ.js → ProjectSettings-BI5G5gsc.js} +2 -2
  63. package/src/assets/web-panel/assets/{Projects-DZvbT3D7.js → Projects-Ce92-l1V.js} +1 -1
  64. package/src/assets/web-panel/assets/{Providers-CkcrHYy9.js → Providers-CRHCcLFS.js} +1 -1
  65. package/src/assets/web-panel/assets/{QrScannerModal-nYNFGf_H.js → QrScannerModal-qSeg5xag.js} +1 -1
  66. package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
  67. package/src/assets/web-panel/assets/{Recommend-CmYN_NaS.js → Recommend-DMvPodNo.js} +1 -1
  68. package/src/assets/web-panel/assets/{RemoteSession-BuOdNEjA.js → RemoteSession-BWsapEyN.js} +2 -2
  69. package/src/assets/web-panel/assets/{Reputation-BgkheZou.js → Reputation-BZJETVmC.js} +1 -1
  70. package/src/assets/web-panel/assets/{Row-DvA3klj1.js → Row-CUE1OSMp.js} +1 -1
  71. package/src/assets/web-panel/assets/{RssFeed-CgkIL3PG.js → RssFeed-DvMazcUD.js} +3 -3
  72. package/src/assets/web-panel/assets/{Search-Cv2twJdL.js → Search-e1c-NXWv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Security-XrD2UNU6.js → Security-Dc9GZsx2.js} +3 -3
  74. package/src/assets/web-panel/assets/{Services-LujCntCK.js → Services-AFz6ke-4.js} +2 -2
  75. package/src/assets/web-panel/assets/{Skeleton-ZZCOsxPX.js → Skeleton-gow6MYcY.js} +1 -1
  76. package/src/assets/web-panel/assets/{Skills-BEXGkOrU.js → Skills-h6AxYjUP.js} +1 -1
  77. package/src/assets/web-panel/assets/{Sla-CIqmCgdD.js → Sla-Cr4CkJ0O.js} +1 -1
  78. package/src/assets/web-panel/assets/{SpeechSettings-DkVbwJox.js → SpeechSettings-Bd5yuBtH.js} +1 -1
  79. package/src/assets/web-panel/assets/{SyncSettings-BVGgUs0p.js → SyncSettings-1t4QZMLW.js} +2 -2
  80. package/src/assets/web-panel/assets/{Tasks-C1lh68l5.js → Tasks-u-DrjLRM.js} +1 -1
  81. package/src/assets/web-panel/assets/{Templates-BG4zNAFx.js → Templates-C0yLUC9b.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tenant-t2o6i5fY.js → Tenant-ds1YT5iS.js} +1 -1
  83. package/src/assets/web-panel/assets/{Terminal-CH8UDdVO.js → Terminal-BoIskW2m.js} +2 -2
  84. package/src/assets/web-panel/assets/{TimelineRenderer-B5sYY1IO.js → TimelineRenderer-BkdVK24X.js} +1 -1
  85. package/src/assets/web-panel/assets/{Tokens-D0y7QkG5.js → Tokens-djyDgmfk.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trigger-BA2nKko0.js → Trigger-CYefDS3H.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trust-CrFKCQIs.js → Trust-CE_dbep_.js} +1 -1
  88. package/src/assets/web-panel/assets/{UkeySign-B3x_-Zun.js → UkeySign-DwVs_fey.js} +1 -1
  89. package/src/assets/web-panel/assets/{VideoEditing-TEwxbLH6.js → VideoEditing-BTUqMHAV.js} +1 -1
  90. package/src/assets/web-panel/assets/{Wallet-Larp5rrt.js → Wallet-Bu_E7Rrc.js} +4 -4
  91. package/src/assets/web-panel/assets/{WebAuthn-DfWbEIZe.js → WebAuthn-DTbre5AB.js} +4 -4
  92. package/src/assets/web-panel/assets/{WorkflowEditor-8LKiKExY.js → WorkflowEditor-BsBzd3gt.js} +1 -1
  93. package/src/assets/web-panel/assets/{chat-ByxYOvYW.js → chat-tdifQQvu.js} +1 -1
  94. package/src/assets/web-panel/assets/{colors-Dh4yAClh.js → colors-D3SNW2Vx.js} +1 -1
  95. package/src/assets/web-panel/assets/{compact-item-f5n2j1WZ.js → compact-item-UBlCjrAW.js} +1 -1
  96. package/src/assets/web-panel/assets/{createContext-DIprYuXL.js → createContext-DKsnEnFt.js} +1 -1
  97. package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
  98. package/src/assets/web-panel/assets/{hasIn-CvYeap2I.js → hasIn-BkeySXWe.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DGyTzElU.js → index-6Nvzgytx.js} +1 -1
  100. package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
  101. package/src/assets/web-panel/assets/{index-DshB3-Up.js → index-BEiHKah0.js} +25 -25
  102. package/src/assets/web-panel/assets/{index-DI8jC7gQ.js → index-BIeFLaMV.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BlImvgb7.js → index-BV2zQteq.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BoayvJ48.js → index-BVvz3ntc.js} +1 -1
  105. package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
  106. package/src/assets/web-panel/assets/{index-CIZQtz8G.js → index-Bw0k3VgD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CzabQZ7I.js → index-C-KTHSUE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CJjc8ObW.js → index-C9ImNw5O.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-uDiVjYrS.js → index-CG_b1xyX.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BS_dpgzu.js → index-CUjyL0ZS.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DUj-sL9U.js → index-CXkn77ZN.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-7eG1J-GT.js → index-CZ6JUooI.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-3ROY-lYB.js → index-Cuz2QCFT.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-bt-0zMmH.js → index-D5Umd_Z-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BsU46c7D.js → index-D6es7MSG.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-xU0eHLIH.js → index-D93iSDUw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DlJCDpeN.js → index-D9m1HQzl.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BaXSBxy-.js → index-D9um0YVl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DmcAL4hd.js → index-DD6dD3LV.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bk8oWRk6.js → index-DFMrIEIt.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-B0AXUhiJ.js → index-DSCiZJXb.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-c_CxUQl3.js → index-DSe_7MSy.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CTqJNul4.js → index-DYFjOyTH.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Du435yzt.js → index-DdyTv6yc.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DaZVtafQ.js → index-DfrW-iVs.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BvyFQF8I.js → index-Dg8-Duze.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DlTwZIeX.js → index-DiDgwRty.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-6VEWxOyC.js → index-DlEIp1gJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-C2RGykST.js → index-DlO6HdD9.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-fpWv4u3Z.js → index-DtxUSZSS.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CpR0zD38.js → index-DugZRCiI.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CD0s5ESV.js → index-P-ailFQY.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CcvA1nae.js → index-PWScrdlX.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DjvON8oh.js → index-SpQ26gD6.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-C5aH2Pj2.js → index-TLBpgN30.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DlULGx8u.js → index-bOIcWW8F.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-hwbaD3Nk.js → index-pgGKNvmm.js} +1 -1
  138. package/src/assets/web-panel/assets/{initDefaultProps-DRuE92W6.js → initDefaultProps-CVCXG2Hv.js} +1 -1
  139. package/src/assets/web-panel/assets/{motion-6Sgma5Vd.js → motion-Dv00jw87.js} +1 -1
  140. package/src/assets/web-panel/assets/{move-BbQsH8sb.js → move-BFz51iHf.js} +1 -1
  141. package/src/assets/web-panel/assets/{mtc-parser-BdC4INal.js → mtc-parser-BK2woIDE.js} +1 -1
  142. package/src/assets/web-panel/assets/{omit-DeC5m_bi.js → omit-D2X_Gwoo.js} +1 -1
  143. package/src/assets/web-panel/assets/{pickAttrs-DuehpBws.js → pickAttrs-CLmFyJ1q.js} +1 -1
  144. package/src/assets/web-panel/assets/{placementArrow-CJEhv2ij.js → placementArrow-CCzPddQm.js} +1 -1
  145. package/src/assets/web-panel/assets/{responsiveObserve-Dyw3lDGr.js → responsiveObserve-hcm_Zlxd.js} +1 -1
  146. package/src/assets/web-panel/assets/{slide-BMaLXTbS.js → slide-BxfZEFVp.js} +1 -1
  147. package/src/assets/web-panel/assets/{statusUtils-c1K_SdJH.js → statusUtils-kzB9pT-t.js} +1 -1
  148. package/src/assets/web-panel/assets/{styleChecker-CefBry8k.js → styleChecker-CDFd7YCI.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFlexGapSupport-Dj2IsZpo.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFs-RLfB3yqb.js → useFs-y0SAzirG.js} +1 -1
  151. package/src/assets/web-panel/assets/{usePersonalDataHub-DbRVH_NA.js → usePersonalDataHub-BvdPznrA.js} +1 -1
  152. package/src/assets/web-panel/assets/{vnode-DTn_QVJz.js → vnode-D8mNbyZ7.js} +1 -1
  153. package/src/assets/web-panel/assets/{zoom-DuFR0E7i.js → zoom-_hun6w9W.js} +1 -1
  154. package/src/assets/web-panel/index.html +1 -1
  155. package/src/data/changelog.json +29 -3
  156. package/src/gateways/ws/llm-chat-protocol.js +124 -41
  157. package/src/gateways/ws/message-dispatcher.js +2 -0
  158. package/src/lib/evolution/evolution-deployment-config.js +15 -6
  159. package/src/lib/evolution/evolution-deployment-loader.js +63 -5
  160. package/src/lib/evolution/local-ui-evolution-deployment.js +139 -53
  161. package/src/lib/evolution/local-ui-evolution-host.mjs +26 -8
  162. package/src/lib/evolution/local-ui-evolution-runtime.js +42 -19
  163. package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +0 -1
  164. package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +0 -1
  165. package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +0 -1
  166. package/src/assets/web-panel/assets/QuickAsk-53WNo7xT.js +0 -1
  167. package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +0 -1
  168. package/src/assets/web-panel/assets/index-Bq24rTYx.js +0 -1
  169. package/src/assets/web-panel/assets/index-D2f18WsK.js +0 -1
@@ -43,6 +43,35 @@ export const LOCAL_UI_EVOLUTION_SCHEMA =
43
43
  "chainlesschain.local-ui-evolution-host/v1";
44
44
  const LOCAL_UI_BOOTSTRAP_STATE_SCHEMA =
45
45
  "chainlesschain.local-ui-evolution-bootstrap-state/v1";
46
+ export const LOCAL_EVOLUTION_COMMANDS = Object.freeze([
47
+ "agent",
48
+ "ask",
49
+ "chat",
50
+ "ui",
51
+ ]);
52
+ const LEGACY_UI_HOST_DIGESTS = new Set([
53
+ "sha256:1bf2aa3c68ff65eaf42423e28e0ba17d4cb1393c3bf7358eb901cff454e7abec",
54
+ "sha256:fbf9cab066ee700e7881b5e0bceab58f175c19ee1806dd2126e7217d48991efd",
55
+ ]);
56
+
57
+ function identityFiles(generation = 1) {
58
+ if (![1, 2].includes(generation))
59
+ throw new Error("Invalid local host generation");
60
+ const suffix = generation === 1 ? "" : "-v2";
61
+ return {
62
+ descriptor: `deployment${suffix}.json`,
63
+ module: `ui-host${suffix}.mjs`,
64
+ manifest: `local-host-manifest${suffix}.json`,
65
+ state: `local-ui-host${suffix}.state.json`,
66
+ };
67
+ }
68
+
69
+ function profileGeneration(profile) {
70
+ const name = path.basename(profile.descriptorPath);
71
+ if (name === "deployment.json") return 1;
72
+ if (name === "deployment-v2.json") return 2;
73
+ throw new Error("Local Evolution profile has an unknown identity generation");
74
+ }
46
75
 
47
76
  const LOCAL_UI_HOST_MODULE_PATH = fileURLToPath(
48
77
  new URL("./local-ui-evolution-host.mjs", import.meta.url),
@@ -200,8 +229,12 @@ function readKeys(directory) {
200
229
  keys[name] = Object.freeze({ privateKey, publicKey });
201
230
  }
202
231
  for (const name of SECRET_KEY_NAMES) {
203
- const raw = Buffer.from(readPrivateFile(paths.secrets[name]).trim(), "base64");
204
- if (raw.length !== 32) throw new Error("Local Evolution secret key is invalid");
232
+ const raw = Buffer.from(
233
+ readPrivateFile(paths.secrets[name]).trim(),
234
+ "base64",
235
+ );
236
+ if (raw.length !== 32)
237
+ throw new Error("Local Evolution secret key is invalid");
205
238
  keys[name] = raw;
206
239
  }
207
240
  return Object.freeze({ paths, keys: Object.freeze(keys) });
@@ -231,9 +264,11 @@ function keyBindings(keys) {
231
264
  }
232
265
 
233
266
  function signedValue(privateKeyPem, value) {
234
- return sign(null, Buffer.from(canonical(value), "utf8"), privateKeyPem).toString(
235
- "base64url",
236
- );
267
+ return sign(
268
+ null,
269
+ Buffer.from(canonical(value), "utf8"),
270
+ privateKeyPem,
271
+ ).toString("base64url");
237
272
  }
238
273
 
239
274
  function verifySignedValue(publicKeyPem, value, signature) {
@@ -282,8 +317,8 @@ function secureLocalPaths(paths) {
282
317
  }
283
318
  }
284
319
 
285
- function bootstrapStatePath(profilePath) {
286
- return path.join(path.dirname(profilePath), "local-ui-host.state.json");
320
+ function bootstrapStatePath(profilePath, generation = 1) {
321
+ return path.join(path.dirname(profilePath), identityFiles(generation).state);
287
322
  }
288
323
 
289
324
  function bootstrapStateValue(deployment, phase) {
@@ -296,45 +331,52 @@ function bootstrapStateValue(deployment, phase) {
296
331
  };
297
332
  return {
298
333
  ...core,
299
- signature: signedValue(
300
- deployment.keys["deployment-root"].privateKey,
301
- core,
302
- ),
334
+ signature: signedValue(deployment.keys["deployment-root"].privateKey, core),
303
335
  };
304
336
  }
305
337
 
306
338
  function writeBootstrapState(profilePath, deployment, phase) {
307
339
  writePrivateFile(
308
- bootstrapStatePath(profilePath),
340
+ bootstrapStatePath(profilePath, deployment.generation || 1),
309
341
  `${JSON.stringify(bootstrapStateValue(deployment, phase), null, 2)}\n`,
310
342
  );
311
343
  }
312
344
 
313
- function writeDeployment(directory, finalDirectory, tenantId) {
314
- const { keys } = writeKeys(directory);
345
+ function writeDeployment(
346
+ directory,
347
+ finalDirectory,
348
+ tenantId,
349
+ { identity = null, generation = 1 } = {},
350
+ ) {
351
+ const { keys } = identity || writeKeys(directory);
352
+ const names = identityFiles(generation);
315
353
  const publicRoot = keys["deployment-root"].publicKey;
316
354
  const publicRootPath = path.join(finalDirectory, "deployment-public.pem");
317
- const descriptorPath = path.join(finalDirectory, "deployment.json");
318
- const modulePath = path.join(finalDirectory, "ui-host.mjs");
355
+ const descriptorPath = path.join(finalDirectory, names.descriptor);
356
+ const modulePath = path.join(finalDirectory, names.module);
319
357
  const moduleBytes = fs.readFileSync(LOCAL_UI_HOST_MODULE_PATH);
320
- writePrivateFile(path.join(directory, "ui-host.mjs"), moduleBytes);
358
+ writePrivateFile(path.join(directory, names.module), moduleBytes);
321
359
  const descriptor = {
322
360
  schema: EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA,
323
- revision: 1,
361
+ revision: identity ? identity.descriptor.revision + 1 : 1,
324
362
  modulePath,
325
363
  moduleDigest: computeEvolutionDeploymentDigest(moduleBytes),
326
364
  trustRootDigest: computeEvolutionDeploymentDigest(publicRoot),
327
- commands: ["ui"],
365
+ commands: [...LOCAL_EVOLUTION_COMMANDS],
328
366
  };
329
367
  descriptor.signature = sign(
330
368
  null,
331
- Buffer.from(serializeEvolutionDeploymentDescriptorPayload(descriptor), "utf8"),
369
+ Buffer.from(
370
+ serializeEvolutionDeploymentDescriptorPayload(descriptor),
371
+ "utf8",
372
+ ),
332
373
  keys["deployment-root"].privateKey,
333
374
  ).toString("base64");
334
375
 
335
- writePrivateFile(path.join(directory, "deployment-public.pem"), publicRoot);
376
+ if (!identity)
377
+ writePrivateFile(path.join(directory, "deployment-public.pem"), publicRoot);
336
378
  writePrivateFile(
337
- path.join(directory, "deployment.json"),
379
+ path.join(directory, names.descriptor),
338
380
  `${JSON.stringify(descriptor, null, 2)}\n`,
339
381
  );
340
382
  const core = {
@@ -353,11 +395,12 @@ function writeDeployment(directory, finalDirectory, tenantId) {
353
395
  signature: signedValue(keys["deployment-root"].privateKey, core),
354
396
  };
355
397
  writePrivateFile(
356
- path.join(directory, "local-host-manifest.json"),
398
+ path.join(directory, names.manifest),
357
399
  `${JSON.stringify(manifest, null, 2)}\n`,
358
400
  );
359
401
  const deployment = Object.freeze({
360
- descriptorPath: path.join(finalDirectory, "deployment.json"),
402
+ descriptorPath,
403
+ generation,
361
404
  trustRootPath: publicRootPath,
362
405
  tenantId,
363
406
  moduleDigest: descriptor.moduleDigest,
@@ -375,16 +418,18 @@ function writeDeployment(directory, finalDirectory, tenantId) {
375
418
  async function verifyLocalDeployment(
376
419
  directory,
377
420
  expectedDirectory,
378
- { repairPermissions = true } = {},
421
+ { repairPermissions = true, generation = 1 } = {},
379
422
  ) {
380
- const descriptorPath = path.join(directory, "deployment.json");
423
+ const names = identityFiles(generation);
424
+ const descriptorPath = path.join(directory, names.descriptor);
381
425
  const trustRootPath = path.join(directory, "deployment-public.pem");
382
- const manifestPath = path.join(directory, "local-host-manifest.json");
426
+ const manifestPath = path.join(directory, names.manifest);
383
427
  const paths = keyPaths(directory);
384
- const modulePath = path.join(expectedDirectory, "ui-host.mjs");
385
- const storedModulePath = path.join(directory, "ui-host.mjs");
428
+ const modulePath = path.join(expectedDirectory, names.module);
429
+ const storedModulePath = path.join(directory, names.module);
386
430
  const statePath = bootstrapStatePath(
387
431
  path.join(path.dirname(expectedDirectory), "deployment-profile.json"),
432
+ generation,
388
433
  );
389
434
  const protectedPaths = [
390
435
  directory,
@@ -411,7 +456,9 @@ async function verifyLocalDeployment(
411
456
  sign(null, keyChallenge, rootPrivate),
412
457
  )
413
458
  ) {
414
- throw new Error("Local Evolution root signing key does not match its trust root");
459
+ throw new Error(
460
+ "Local Evolution root signing key does not match its trust root",
461
+ );
415
462
  }
416
463
  const manifest = JSON.parse(readPrivateFile(manifestPath));
417
464
  const { signature, ...core } = manifest;
@@ -468,17 +515,24 @@ async function verifyLocalDeployment(
468
515
  manifest.modulePath !== modulePath ||
469
516
  manifest.moduleDigest !== moduleDigest ||
470
517
  manifest.trustRootDigest !== descriptor.trustRootDigest ||
471
- canonical(manifest.keyBindings) !== canonical(keyBindings(loadedKeys.keys)) ||
472
- manifest.descriptorDigest !== computeEvolutionDeploymentDigest(descriptorBytes) ||
518
+ canonical(manifest.keyBindings) !==
519
+ canonical(keyBindings(loadedKeys.keys)) ||
520
+ manifest.descriptorDigest !==
521
+ computeEvolutionDeploymentDigest(descriptorBytes) ||
473
522
  descriptor.modulePath !== modulePath ||
474
523
  descriptor.moduleDigest !== moduleDigest ||
475
- descriptor.commands.length !== 1 ||
476
- descriptor.commands[0] !== "ui"
524
+ !(
525
+ canonical(descriptor.commands) === canonical(LOCAL_EVOLUTION_COMMANDS) ||
526
+ (generation === 1 && canonical(descriptor.commands) === '["ui"]')
527
+ )
477
528
  ) {
478
- throw new Error("Local Evolution host files do not match their signed identity");
529
+ throw new Error(
530
+ "Local Evolution host files do not match their signed identity",
531
+ );
479
532
  }
480
533
  return Object.freeze({
481
534
  descriptorPath,
535
+ generation,
482
536
  trustRootPath,
483
537
  tenantId: manifest.tenantId,
484
538
  descriptor,
@@ -517,8 +571,10 @@ function removeIncompleteStage(stagePath, expectedParent) {
517
571
  flushDeploymentDirectory(resolvedParent);
518
572
  }
519
573
 
520
- /** Create a per-user, locally signed UI host only for a genuinely empty profile. */
521
- export async function initializeDefaultLocalUiEvolutionDeployment(options = {}) {
574
+ /** Initialize a local model host or upgrade an authenticated built-in UI host. */
575
+ export async function initializeDefaultLocalUiEvolutionDeployment(
576
+ options = {},
577
+ ) {
522
578
  const env = options.env || process.env;
523
579
  const cwd = options.cwd || process.cwd();
524
580
  if (hasDeploymentOverrides(env)) return null;
@@ -527,14 +583,6 @@ export async function initializeDefaultLocalUiEvolutionDeployment(options = {})
527
583
  if (profileResult.profile) {
528
584
  if (profileResult.profile.deploymentMode !== "local") return null;
529
585
  if (!profileResult.profile.enabled) return null;
530
- const current = await loadLocalUiEvolutionDeployment(
531
- localDirectory(profileResult.filePath),
532
- { env, cwd },
533
- );
534
- return Object.freeze({
535
- status: await getEvolutionDeploymentStatus({ env, cwd }),
536
- deployment: current,
537
- });
538
586
  }
539
587
 
540
588
  const profilePath = profileResult.filePath;
@@ -554,10 +602,41 @@ export async function initializeDefaultLocalUiEvolutionDeployment(options = {})
554
602
  !latest.profile.enabled
555
603
  )
556
604
  return null;
557
- const current = await loadLocalUiEvolutionDeployment(destination, {
605
+ let current = await loadLocalUiEvolutionDeployment(destination, {
558
606
  env,
559
607
  cwd,
560
608
  });
609
+ if (canonical(current.descriptor.commands) === '["ui"]') {
610
+ // Only migrate the authenticated, built-in UI-only host. Retain its
611
+ // keys, state and all old identity files until the profile CAS commits.
612
+ if (!LEGACY_UI_HOST_DIGESTS.has(current.moduleDigest))
613
+ throw new Error(
614
+ "Local Evolution UI host is not a supported built-in version",
615
+ );
616
+ writeDeployment(destination, destination, current.tenantId, {
617
+ identity: current,
618
+ generation: 2,
619
+ });
620
+ const upgraded = await verifyLocalDeployment(
621
+ destination,
622
+ destination,
623
+ { generation: 2 },
624
+ );
625
+ await configureEvolutionDeployment(
626
+ {
627
+ descriptorPath: upgraded.descriptorPath,
628
+ trustRootPath: upgraded.trustRootPath,
629
+ deploymentMode: "local",
630
+ enabled: true,
631
+ },
632
+ { env, cwd, expectedProfile: latest.profile },
633
+ );
634
+ writeBootstrapState(profilePath, upgraded, "active");
635
+ current = await loadLocalUiEvolutionDeployment(destination, {
636
+ env,
637
+ cwd,
638
+ });
639
+ }
561
640
  return Object.freeze({
562
641
  status: await getEvolutionDeploymentStatus({ env, cwd }),
563
642
  deployment: current,
@@ -595,7 +674,9 @@ export async function initializeDefaultLocalUiEvolutionDeployment(options = {})
595
674
  deployment.descriptorPath !== paths.descriptorPath ||
596
675
  deployment.trustRootPath !== paths.trustRootPath
597
676
  ) {
598
- throw new Error("Local Evolution deployment paths changed during initialization");
677
+ throw new Error(
678
+ "Local Evolution deployment paths changed during initialization",
679
+ );
599
680
  }
600
681
  }
601
682
  if (deployment.bootstrapPhase !== "prepared") return null;
@@ -613,9 +694,7 @@ export async function initializeDefaultLocalUiEvolutionDeployment(options = {})
613
694
  );
614
695
  flushDeploymentDirectory(parent);
615
696
  } catch (error) {
616
- if (
617
- error?.code === "EVOLUTION_DEPLOYMENT_PROFILE_ALREADY_CONFIGURED"
618
- ) {
697
+ if (error?.code === "EVOLUTION_DEPLOYMENT_PROFILE_ALREADY_CONFIGURED") {
619
698
  return null;
620
699
  }
621
700
  throw error;
@@ -649,7 +728,9 @@ export async function loadLocalUiEvolutionDeployment(
649
728
  if (path.resolve(directory) !== path.resolve(expectedDirectory)) {
650
729
  throw new Error("Local Evolution profile points to another host directory");
651
730
  }
652
- const deployment = await verifyLocalDeployment(directory, expectedDirectory);
731
+ const deployment = await verifyLocalDeployment(directory, expectedDirectory, {
732
+ generation: profileGeneration(saved.profile),
733
+ });
653
734
  const [
654
735
  profileDescriptorPath,
655
736
  profileTrustRootPath,
@@ -667,9 +748,14 @@ export async function loadLocalUiEvolutionDeployment(
667
748
  saved.profile.activeTrustRootDigest !==
668
749
  deployment.descriptor.trustRootDigest
669
750
  ) {
670
- throw new Error("Local Evolution profile identity does not match its signed host");
751
+ throw new Error(
752
+ "Local Evolution profile identity does not match its signed host",
753
+ );
671
754
  }
672
- assertEvolutionDeploymentActiveTrustRoot(saved.profile, deployment.descriptor);
755
+ assertEvolutionDeploymentActiveTrustRoot(
756
+ saved.profile,
757
+ deployment.descriptor,
758
+ );
673
759
  assertEvolutionDeploymentDescriptorNotRevoked(
674
760
  saved.profile,
675
761
  deployment.descriptor,
@@ -1,23 +1,41 @@
1
- // This entrypoint is signed into a per-user local deployment on first `cc ui`.
2
- // Its only command capability is the interactive UI model-egress path.
1
+ // This single-file entrypoint is signed into a per-user local deployment.
2
+ // Command scopes remain explicit; a UI composition cannot borrow agent modes.
3
3
  export async function createChainlessChainCommandDependencies({
4
4
  commandName,
5
5
  descriptor,
6
6
  factories,
7
7
  }) {
8
- if (commandName !== "ui") {
9
- throw new Error("Local Evolution host only admits the ui command");
10
- }
8
+ const modes = {
9
+ ui: [
10
+ "ws-llm-chat",
11
+ "ws-stream",
12
+ "ws-chat-session",
13
+ "legacy-websocket",
14
+ "intent-understand",
15
+ "intent-understand-stream",
16
+ "intent-classify",
17
+ ],
18
+ agent: ["interactive", "headless", "headless-stream"],
19
+ ask: ["ask"],
20
+ chat: ["chat", "chat-agent"],
21
+ };
22
+ if (
23
+ !Object.hasOwn(modes, commandName) ||
24
+ !descriptor.commands.includes(commandName)
25
+ )
26
+ throw new Error("Local Evolution host does not admit this command");
11
27
  const createComposition = factories?.createLocalUiEvolutionComposition;
12
28
  if (typeof createComposition !== "function") {
13
29
  throw new Error("Local UI Evolution host factory is unavailable");
14
30
  }
15
31
  return Object.freeze({
16
32
  evolutionCompositionFactory: async (context) => {
17
- if (context?.mode !== "ws-llm-chat") {
18
- throw new Error("Local Evolution host only admits Quick Ask model turns");
19
- }
33
+ if (!modes[commandName].includes(context?.mode))
34
+ throw new Error(
35
+ "Local Evolution host does not admit this command mode",
36
+ );
20
37
  return createComposition({
38
+ commandName,
21
39
  context,
22
40
  handlerArtifactDigest: descriptor.moduleDigest,
23
41
  });
@@ -12,9 +12,7 @@ import {
12
12
  import fs from "node:fs";
13
13
  import { join, resolve } from "node:path";
14
14
  import { resolveConfigDataRoot } from "../paths.js";
15
- import {
16
- EVOLUTION_ARTIFACT_AUTHORITY_DECISION_SCHEMA,
17
- } from "./evolution-artifact-ports.js";
15
+ import { EVOLUTION_ARTIFACT_AUTHORITY_DECISION_SCHEMA } from "./evolution-artifact-ports.js";
18
16
  import {
19
17
  EVOLUTION_KEYED_COMMITMENT_SCHEMA,
20
18
  EVOLUTION_PROJECTION_ATTESTATION_SCHEMA,
@@ -268,10 +266,14 @@ export function createLocalUiEvolutionAuthorities(identity, runId) {
268
266
  body.evidenceDigest !== expectedInputDigest ||
269
267
  expectedInputDigest !== request.sourceInputDigest
270
268
  ) {
271
- throw new Error("Local UI source envelope is not bound to this evidence");
269
+ throw new Error(
270
+ "Local UI source envelope is not bound to this evidence",
271
+ );
272
272
  }
273
273
  const sourceKind =
274
- body.kind === "response-completed" ? "model-inference" : "user-statement";
274
+ body.kind === "response-completed"
275
+ ? "model-inference"
276
+ : "user-statement";
275
277
  const requestedAt = request.requestedAt;
276
278
  const core = {
277
279
  schema: EVOLUTION_SOURCE_VERIFICATION_SCHEMA,
@@ -343,9 +345,7 @@ export function createLocalUiEvolutionAuthorities(identity, runId) {
343
345
  requestedAt: request.requestedAt,
344
346
  checkedAt: request.requestedAt,
345
347
  decisionExpiresAt: dateAfter(request.requestedAt),
346
- policyDigest: sha256(
347
- "chainlesschain.local-ui.commitment.policy/v1",
348
- ),
348
+ policyDigest: sha256("chainlesschain.local-ui.commitment.policy/v1"),
349
349
  policyRevision: TRUST_POLICY_REVISION,
350
350
  };
351
351
  return {
@@ -378,7 +378,9 @@ export function createLocalUiEvolutionAuthorities(identity, runId) {
378
378
  request.sourceVerificationReceiptDigest,
379
379
  sensitivity: request.sensitivity,
380
380
  retention: {
381
- expiresAt: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),
381
+ expiresAt: new Date(
382
+ Date.now() + 365 * 24 * 60 * 60 * 1000,
383
+ ).toISOString(),
382
384
  deletionClass: "user-delete",
383
385
  },
384
386
  acl: [request.principalId, "service-evolution"],
@@ -546,28 +548,48 @@ export function createLocalUiEvolutionAuthorities(identity, runId) {
546
548
 
547
549
  export async function createLocalUiEvolutionComposition({
548
550
  context,
551
+ commandName = "ui",
549
552
  handlerArtifactDigest,
550
553
  localDirectory,
551
554
  env = process.env,
552
555
  cwd = process.cwd(),
553
556
  } = {}) {
554
557
  if (
555
- context?.mode !== "ws-llm-chat" ||
558
+ !(
559
+ {
560
+ ui: [
561
+ "ws-llm-chat",
562
+ "ws-stream",
563
+ "ws-chat-session",
564
+ "legacy-websocket",
565
+ "intent-understand",
566
+ "intent-understand-stream",
567
+ "intent-classify",
568
+ ],
569
+ agent: ["interactive", "headless", "headless-stream"],
570
+ ask: ["ask"],
571
+ chat: ["chat", "chat-agent"],
572
+ }[commandName] || []
573
+ ).includes(context?.mode) ||
556
574
  typeof context.runId !== "string" ||
557
- !context.runId.startsWith("ws-llm-chat-")
575
+ !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/u.test(context.runId)
558
576
  ) {
559
- throw new Error("Local Evolution host only admits Quick Ask model turns");
577
+ throw new Error(
578
+ "Local Evolution host does not admit this command mode or Run",
579
+ );
560
580
  }
561
- const root = localDirectory ||
581
+ const root =
582
+ localDirectory ||
562
583
  join(resolveConfigDataRoot().path, "evolution", "local-ui-host");
563
584
  const deployment = await loadLocalUiEvolutionDeployment(root, { env, cwd });
585
+ if (!deployment.descriptor.commands.includes(commandName))
586
+ throw new Error("Local Evolution deployment does not admit this command");
564
587
  if (deployment.moduleDigest !== handlerArtifactDigest) {
565
- throw new Error("Local Evolution handler digest does not match its signed deployment");
588
+ throw new Error(
589
+ "Local Evolution handler digest does not match its signed deployment",
590
+ );
566
591
  }
567
- const identity = createLocalUiEvolutionAuthorities(
568
- deployment,
569
- context.runId,
570
- );
592
+ const identity = createLocalUiEvolutionAuthorities(deployment, context.runId);
571
593
  const ledger = ed25519Authority(
572
594
  "ledger",
573
595
  deployment.tenantId,
@@ -583,7 +605,8 @@ export async function createLocalUiEvolutionComposition({
583
605
  return createAgentEvolutionRuntimeComposition({
584
606
  tenantId: identity.tenantId,
585
607
  runId: context.runId,
586
- audience: "local-ui-quick-ask",
608
+ audience:
609
+ commandName === "ui" ? "local-ui-quick-ask" : `local-${commandName}`,
587
610
  stateRootDir,
588
611
  witnessId: `local-ui-witness-${identity.tenantId}`,
589
612
  authorities: {
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as n,S as y,K as C,Q as x,V as w,_ as k,b as a}from"./vendor-Bn1JzzAn.js";import{_ as B}from"./index-DshB3-Up.js";import"./icons-DG5UD-6K.js";const M={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=a(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=a(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=a(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=a(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=a(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:a};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},N={class:"bubble"},T={class:"meta"},R={class:"actor"},V={class:"time"},q={class:"body"};function D(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:k(["chat-row",{mine:r.isMine}])},[s("div",N,[s("div",T,[s("span",R,n(r.actorLabel),1),s("span",V,n(r.formattedTime),1)]),s("div",q,n(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(n(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=B(M,[["render",D],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-kMaoaS/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as a}from"./vendor-Bn1JzzAn.js";import{r as s}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-DshB3-Up.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=a(()=>s(e.content||"")),n={props:e,rendered:r,computed:a,get renderMarkdown(){return s}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const M=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-kMaoaS/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{M};
@@ -1 +0,0 @@
1
- import{I as n,J as g,c as l,K as r,N as u,P as h,U as o,R as t,Q as b}from"./vendor-Bn1JzzAn.js";import{_ as v,b as m}from"./index-DshB3-Up.js";import{a8 as M,M as y}from"./icons-DG5UD-6K.js";const B={__name:"MobileProjects",setup(p,{expose:i}){i();const c=u(),{t:e}=m();function a(){c.push("/projects")}function _(){c.push("/mobile-bridge")}const s={router:c,t:e,goToProjects:a,goToMobileBridge:_,get useRouter(){return u},get useI18n(){return m},get MobileOutlined(){return y},get FolderOutlined(){return M}};return Object.defineProperty(s,"__isScriptSetup",{enumerable:!1,value:!0}),s}},x={class:"mobile-projects-placeholder"},O={class:"title"},k={class:"subtitle"},w={class:"explainer"};function T(p,i,c,e,a,_){const s=n("a-alert"),d=n("a-button"),f=n("a-space"),P=n("a-empty"),j=n("a-card");return h(),g("div",x,[l(j,null,{default:r(()=>[l(P,{description:!1},{image:r(()=>[l(e.MobileOutlined,{style:{fontSize:"64px",color:"#bfbfbf"}})]),default:r(()=>[o("h2",O,t(e.t("mobileProjects.title")),1),o("p",k,t(e.t("mobileProjects.subtitle")),1),l(s,{message:e.t("mobileProjects.v02Banner"),type:"info","show-icon":"",class:"banner"},null,8,["message"]),o("div",w,[o("h3",null,t(e.t("mobileProjects.currentDirection")),1),o("p",null,t(e.t("mobileProjects.currentDirectionBody")),1),o("ul",null,[o("li",null,t(e.t("mobileProjects.stepPhone")),1),o("li",null,t(e.t("mobileProjects.stepTap")),1),o("li",null,t(e.t("mobileProjects.stepPull")),1)]),o("h3",null,t(e.t("mobileProjects.reverseDirection")),1),o("p",null,t(e.t("mobileProjects.reverseDirectionBody")),1)]),l(f,{class:"actions"},{default:r(()=>[l(d,{type:"primary",onClick:e.goToProjects},{default:r(()=>[l(e.FolderOutlined),b(" "+t(e.t("mobileProjects.viewLocalProjects")),1)]),_:1}),l(d,{onClick:e.goToMobileBridge},{default:r(()=>[l(e.MobileOutlined),b(" "+t(e.t("mobileProjects.checkBridge")),1)]),_:1})]),_:1})]),_:1})]),_:1})])}const I=v(B,[["render",T],["__scopeId","data-v-9262cc45"],["__file","/tmp/cc-web-panel-kMaoaS/repo/packages/web-panel/src/views/MobileProjects.vue"]]);export{I as default};
@@ -1 +0,0 @@
1
- import{I as _,J as m,U as v,R as l,c as p,K as u,S as w,V as k,r as h,P as i,a1 as P,a2 as Q,Q as b}from"./vendor-Bn1JzzAn.js";import{u as B,_ as D}from"./index-DshB3-Up.js";import{b as E,f as K,S as N,am as T}from"./icons-DG5UD-6K.js";function L(){const n=[];let a=null,d=!1,e=null;return{push(o){if(n.push(o),a){const t=a;a=null,t()}},finish(o){if(d=!0,e=o||null,a){const t=a;a=null,t()}},async*iterate(){for(;;){for(;n.length>0;)yield n.shift();if(d){if(e)throw e;return}await new Promise(o=>{a=o})}}}}function V(){const n=B();function a(e){if(!e||!Array.isArray(e.messages))throw new Error("messages array is required");const o=L(),t=new AbortController;e.signal&&(e.signal.aborted?t.abort(e.signal.reason):e.signal.addEventListener("abort",()=>t.abort(e.signal.reason),{once:!0}));const s=n.sendStream({type:"llm.chat",messages:e.messages,options:e.options||{}},{onChunk:r=>o.push(r),idleMs:e.idleMs??6e4,signal:t.signal}).then(r=>(o.finish(null),r),r=>{throw o.finish(r),r});function c(){t.signal.aborted||t.abort(new Error("aborted"))}return{stream:o.iterate(),result:s,cancel:c}}async function d(e){const o=typeof e.onDelta=="function"?e.onDelta:()=>{},{stream:t,result:s}=a(e);try{for await(const c of t)o(c)}catch{}return s}return{chat:a,chatTo:d}}const U={__name:"QuickAsk",setup(n,{expose:a}){a();const d=V(),e=h(""),o=h(""),t=h(""),s=h(!1),c=h(""),r=h(null);let f=null;async function C(){if(!(s.value||!e.value.trim())){s.value=!0,t.value="",c.value="",r.value=null;try{const y=[{role:"user",content:e.value}],M={},z=o.value.trim();z&&(M.model=z);const x=d.chat({messages:y,options:M});f=x;try{for await(const S of x.stream)S?.content?t.value=S.content:S?.delta&&(t.value+=S.delta)}catch{}const A=await x.result;r.value={model:A?.model||null,tokens:A?.tokens??null},!t.value&&A?.message?.content&&(t.value=A.message.content)}catch(y){c.value=y?.message||String(y)}finally{s.value=!1,f=null}}}function q(){f?.cancel&&f.cancel()}function g(){t.value="",c.value="",r.value=null}const O={llm:d,prompt:e,model:o,answer:t,running:s,error:c,finalMeta:r,get activeChat(){return f},set activeChat(y){f=y},run:C,cancel:q,reset:g,ref:h,get SendOutlined(){return T},get SyncOutlined(){return N},get CheckCircleOutlined(){return K},get CloseOutlined(){return E},get useLlmChat(){return V}};return Object.defineProperty(O,"__isScriptSetup",{enumerable:!1,value:!0}),O}},j={style:{"margin-bottom":"24px"}},F={class:"page-title"},I={class:"page-sub"},J={style:{display:"flex","justify-content":"space-between","align-items":"center","margin-top":"12px"}},R={style:{display:"flex",gap:"8px","align-items":"center",color:"var(--text-muted)","font-size":"11px"}},W={key:0},G={key:1},H={key:2},X={key:0,style:{color:"#1677ff","font-size":"11px"}},Y={key:1,style:{color:"#52c41a","font-size":"11px"}},Z={key:0,style:{margin:"0","white-space":"pre-wrap","font-family":"var(--font-body, system-ui)","font-size":"13px"}},$={key:2,style:{background:"#2a1517",border:"1px solid #5c2426",padding:"8px","border-radius":"4px","margin-top":"8px"}},ee={style:{color:"#ff7875","font-size":"11px",margin:"0","white-space":"pre-wrap"}};function ne(n,a,d,e,o,t){const s=_("a-textarea"),c=_("a-input"),r=_("a-button"),f=_("a-space"),C=_("a-card"),q=_("a-empty");return i(),m("div",null,[v("div",j,[v("h2",F,l(n.$t("quickAsk.title")),1),v("p",I,l(n.$t("quickAsk.subtitle")),1)]),p(C,{style:{background:"var(--bg-card)","border-color":"var(--border-color)"}},{default:u(()=>[p(s,{value:e.prompt,"onUpdate:value":a[0]||(a[0]=g=>e.prompt=g),rows:4,placeholder:n.$t("quickAsk.promptPlaceholder"),disabled:e.running,onKeydown:[P(Q(e.run,["ctrl","prevent"]),["enter"]),P(Q(e.run,["meta","prevent"]),["enter"])]},null,8,["value","placeholder","disabled","onKeydown"]),v("div",J,[v("div",R,[p(c,{value:e.model,"onUpdate:value":a[1]||(a[1]=g=>e.model=g),placeholder:n.$t("quickAsk.modelPlaceholder"),size:"small",style:{width:"200px"},disabled:e.running,"allow-clear":""},null,8,["value","placeholder","disabled"]),e.answer?(i(),m("span",W,l(e.answer.length)+" "+l(n.$t("quickAsk.charsSuffix")),1)):k("v-if",!0),e.finalMeta?(i(),m("span",G,"· "+l(e.finalMeta.tokens??0)+" "+l(n.$t("quickAsk.tokensSuffix")),1)):k("v-if",!0),e.finalMeta?.model?(i(),m("span",H,"· "+l(e.finalMeta.model),1)):k("v-if",!0)]),p(f,null,{default:u(()=>[e.answer||e.error?(i(),w(r,{key:0,disabled:e.running,onClick:e.reset},{default:u(()=>[b(l(n.$t("quickAsk.clear")),1)]),_:1},8,["disabled"])):k("v-if",!0),e.running?(i(),w(r,{key:1,danger:"",onClick:e.cancel},{icon:u(()=>[p(e.CloseOutlined)]),default:u(()=>[b(" "+l(n.$t("quickAsk.cancel")),1)]),_:1})):(i(),w(r,{key:2,type:"primary",disabled:!e.prompt.trim(),onClick:e.run},{icon:u(()=>[p(e.SendOutlined)]),default:u(()=>[b(" "+l(n.$t("quickAsk.send")),1)]),_:1},8,["disabled"]))]),_:1})])]),_:1}),e.answer||e.running||e.error?(i(),w(C,{key:0,title:n.$t("quickAsk.answerCardTitle"),style:{background:"var(--bg-card)","border-color":"var(--border-color)","margin-top":"16px"}},{extra:u(()=>[e.running?(i(),m("span",X,[p(e.SyncOutlined,{spin:!0}),b(" "+l(n.$t("quickAsk.streaming")),1)])):e.finalMeta?(i(),m("span",Y,[p(e.CheckCircleOutlined),b(" "+l(n.$t("quickAsk.done")),1)])):k("v-if",!0)]),default:u(()=>[e.answer?(i(),m("pre",Z,l(e.answer),1)):e.running?(i(),w(q,{key:1,description:n.$t("quickAsk.waitingFirstToken")},null,8,["description"])):k("v-if",!0),e.error?(i(),m("div",$,[v("pre",ee,l(e.error),1)])):k("v-if",!0)]),_:1},8,["title"])):k("v-if",!0)])}const re=D(U,[["render",ne],["__file","/tmp/cc-web-panel-kMaoaS/repo/packages/web-panel/src/views/QuickAsk.vue"]]);export{re as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-DshB3-Up.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-BRf3STY-.js";import{a0 as t}from"./index-DshB3-Up.js";import"./vendor-Bn1JzzAn.js";import"./index-DGyTzElU.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-DvA3klj1.js";import{a0 as t}from"./index-DshB3-Up.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-Dyw3lDGr.js";import"./useFlexGapSupport-Dj2IsZpo.js";import"./styleChecker-CefBry8k.js";import"./index-DGyTzElU.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};