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.
- package/README.md +12 -6
- package/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-sOceeExN.js → AIOps-CVac3rIN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BQs-vRUr.js → ActionButton-ChM9GxMl.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-sfAHHMhA.js → Analytics-CV5399Js.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-0gAvE0c8.js → AppLayout-CuonVXhg.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-Dh9s2Qmd.js → Artifacts-D9qKfgb6.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CITm26SU.js → Audit-DUvLysQc.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BiMbBOh0.js → BackgroundAgents-DfKohQeT.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CNpnhI3h.js → Backup-CohoEI8R.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BI_lltkp.js → BaseInput-BwdoA3xv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BgfB88xY.js → Chat-DRkuz1d2.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-v3pzeHNC.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-4xy9rS3j.js → Checkbox-B-GNGpKv.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D93h9ihS.js → Codegen-Bs2lAsoZ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BRf3STY-.js → Col-Bk1mJKDZ.js} +1 -1
- package/src/assets/web-panel/assets/{Community-f187ziSL.js → Community-B_FDSCOo.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D4hXWuo1.js → Compact-No1qSLLH.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-C6cYKI6H.js → Compliance-CcrG43-d.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C1i1f8LD.js → Cowork-DLkj2ywK.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BacCE4LA.js → Cron-sQHELVEz.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DXztxOoH.js → Crosschain-CRTZ3GZg.js} +1 -1
- package/src/assets/web-panel/assets/{DID-rpf4HN8x.js → DID-Ds2bjvxE.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-h4bgtH7L.js → Dashboard-DOONG2NX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-CyQnoHmu.js → Dropdown-Br3PNA2L.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-FCtp4AcB.js → EmailListRenderer-DT6UUqjZ.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-JbISHTWR.js → EvolutionSettings-BSLuEjlT.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DCIQLyfK.js → FamilyGuardDashboard-2aEM9avE.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DDbFpwja.js → Federation-D3B0tlQU.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CXF0jtXb.js → FormItemContext-DTVkVVQP.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-CUaNfAM0.js → GenericCardRenderer-BgFEgP4y.js} +1 -1
- package/src/assets/web-panel/assets/{Git-Bhoz2gDf.js → Git-3t71m6Xd.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-FiiXHe8e.js → Governance-DS7WvlaX.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-brpTW2Q3.js → Inference-CeT-xWrI.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-BCWP-f6k.js → KnowledgeGraph-BQzMncp5.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-CxYcduoK.js → Logs-CC5DOKhV.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-5jYM4kYG.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DANdmW7l.js → Marketplace-CpYDyy3o.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bi_EKkb5.js → McpTools-DRdAZPMr.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DecoMbYw.js → Memory-CBLRr-l8.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DrOhFKp0.js → MobileBridge-Bnj9veNN.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-lYFPD24p.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-SLPII1iw.js → Mtc-BMU_C9vD.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DWoVORYy.js → MtcAudit-DQV-zumU.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-Dxpnmq-m.js → Multisig-LpqpqV1d.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-kNTpNqCP.js → NLProgramming-C4OMklSO.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-D1uXCfVd.js → Notes-Cg0QCinP.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-D3Qt8Gkl.js → NotificationSettings-amoZoMna.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-qvaah2-m.js → OrderTableRenderer-CxNvhf5n.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-EhRl4JoJ.js → Organization-BetJmyX5.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BTt5C_5W.js → Overflow-DbeoPtVD.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CeR2jyb0.js → P2P-B5sitQWT.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BzD3OHWq.js → PdhVaultBrowser-AP9SG2ic.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-BOPyeRlz.js → Permissions-Bc7fgNKx.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DcmNNsfO.js → PersonalDataHub-BwdGMcWZ.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DuL3kwWC.js → Pipeline-DVuJA9BA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CkQRdlSU.js → Privacy-BGzwOYRG.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-moE_vQ1P.js → ProjectInit-BpHcC5br.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-PnTWi4NQ.js → ProjectSettings-BI5G5gsc.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DZvbT3D7.js → Projects-Ce92-l1V.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CkcrHYy9.js → Providers-CRHCcLFS.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-nYNFGf_H.js → QrScannerModal-qSeg5xag.js} +1 -1
- package/src/assets/web-panel/assets/QuickAsk-CA8oSceR.js +1 -0
- package/src/assets/web-panel/assets/{Recommend-CmYN_NaS.js → Recommend-DMvPodNo.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BuOdNEjA.js → RemoteSession-BWsapEyN.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-BgkheZou.js → Reputation-BZJETVmC.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DvA3klj1.js → Row-CUE1OSMp.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CgkIL3PG.js → RssFeed-DvMazcUD.js} +3 -3
- package/src/assets/web-panel/assets/{Search-Cv2twJdL.js → Search-e1c-NXWv.js} +1 -1
- package/src/assets/web-panel/assets/{Security-XrD2UNU6.js → Security-Dc9GZsx2.js} +3 -3
- package/src/assets/web-panel/assets/{Services-LujCntCK.js → Services-AFz6ke-4.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ZZCOsxPX.js → Skeleton-gow6MYcY.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BEXGkOrU.js → Skills-h6AxYjUP.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CIqmCgdD.js → Sla-Cr4CkJ0O.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DkVbwJox.js → SpeechSettings-Bd5yuBtH.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BVGgUs0p.js → SyncSettings-1t4QZMLW.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-C1lh68l5.js → Tasks-u-DrjLRM.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-BG4zNAFx.js → Templates-C0yLUC9b.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-t2o6i5fY.js → Tenant-ds1YT5iS.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CH8UDdVO.js → Terminal-BoIskW2m.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-B5sYY1IO.js → TimelineRenderer-BkdVK24X.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-D0y7QkG5.js → Tokens-djyDgmfk.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BA2nKko0.js → Trigger-CYefDS3H.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CrFKCQIs.js → Trust-CE_dbep_.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-B3x_-Zun.js → UkeySign-DwVs_fey.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-TEwxbLH6.js → VideoEditing-BTUqMHAV.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Larp5rrt.js → Wallet-Bu_E7Rrc.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-DfWbEIZe.js → WebAuthn-DTbre5AB.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-8LKiKExY.js → WorkflowEditor-BsBzd3gt.js} +1 -1
- package/src/assets/web-panel/assets/{chat-ByxYOvYW.js → chat-tdifQQvu.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Dh4yAClh.js → colors-D3SNW2Vx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-f5n2j1WZ.js → compact-item-UBlCjrAW.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIprYuXL.js → createContext-DKsnEnFt.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BBnVfJHh.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CvYeap2I.js → hasIn-BkeySXWe.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGyTzElU.js → index-6Nvzgytx.js} +1 -1
- package/src/assets/web-panel/assets/index-B2w_3mtS.js +1 -0
- package/src/assets/web-panel/assets/{index-DshB3-Up.js → index-BEiHKah0.js} +25 -25
- package/src/assets/web-panel/assets/{index-DI8jC7gQ.js → index-BIeFLaMV.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlImvgb7.js → index-BV2zQteq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoayvJ48.js → index-BVvz3ntc.js} +1 -1
- package/src/assets/web-panel/assets/index-BoHurydC.js +1 -0
- package/src/assets/web-panel/assets/{index-CIZQtz8G.js → index-Bw0k3VgD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzabQZ7I.js → index-C-KTHSUE.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJjc8ObW.js → index-C9ImNw5O.js} +1 -1
- package/src/assets/web-panel/assets/{index-uDiVjYrS.js → index-CG_b1xyX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BS_dpgzu.js → index-CUjyL0ZS.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUj-sL9U.js → index-CXkn77ZN.js} +1 -1
- package/src/assets/web-panel/assets/{index-7eG1J-GT.js → index-CZ6JUooI.js} +1 -1
- package/src/assets/web-panel/assets/{index-3ROY-lYB.js → index-Cuz2QCFT.js} +1 -1
- package/src/assets/web-panel/assets/{index-bt-0zMmH.js → index-D5Umd_Z-.js} +1 -1
- package/src/assets/web-panel/assets/{index-BsU46c7D.js → index-D6es7MSG.js} +1 -1
- package/src/assets/web-panel/assets/{index-xU0eHLIH.js → index-D93iSDUw.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlJCDpeN.js → index-D9m1HQzl.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaXSBxy-.js → index-D9um0YVl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmcAL4hd.js → index-DD6dD3LV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bk8oWRk6.js → index-DFMrIEIt.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0AXUhiJ.js → index-DSCiZJXb.js} +1 -1
- package/src/assets/web-panel/assets/{index-c_CxUQl3.js → index-DSe_7MSy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTqJNul4.js → index-DYFjOyTH.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du435yzt.js → index-DdyTv6yc.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaZVtafQ.js → index-DfrW-iVs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BvyFQF8I.js → index-Dg8-Duze.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlTwZIeX.js → index-DiDgwRty.js} +1 -1
- package/src/assets/web-panel/assets/{index-6VEWxOyC.js → index-DlEIp1gJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2RGykST.js → index-DlO6HdD9.js} +1 -1
- package/src/assets/web-panel/assets/{index-fpWv4u3Z.js → index-DtxUSZSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpR0zD38.js → index-DugZRCiI.js} +1 -1
- package/src/assets/web-panel/assets/{index-CD0s5ESV.js → index-P-ailFQY.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcvA1nae.js → index-PWScrdlX.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjvON8oh.js → index-SpQ26gD6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5aH2Pj2.js → index-TLBpgN30.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlULGx8u.js → index-bOIcWW8F.js} +1 -1
- package/src/assets/web-panel/assets/{index-hwbaD3Nk.js → index-pgGKNvmm.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DRuE92W6.js → initDefaultProps-CVCXG2Hv.js} +1 -1
- package/src/assets/web-panel/assets/{motion-6Sgma5Vd.js → motion-Dv00jw87.js} +1 -1
- package/src/assets/web-panel/assets/{move-BbQsH8sb.js → move-BFz51iHf.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BdC4INal.js → mtc-parser-BK2woIDE.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DeC5m_bi.js → omit-D2X_Gwoo.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DuehpBws.js → pickAttrs-CLmFyJ1q.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CJEhv2ij.js → placementArrow-CCzPddQm.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-Dyw3lDGr.js → responsiveObserve-hcm_Zlxd.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BMaLXTbS.js → slide-BxfZEFVp.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-c1K_SdJH.js → statusUtils-kzB9pT-t.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CefBry8k.js → styleChecker-CDFd7YCI.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Dj2IsZpo.js → useFlexGapSupport-Czl7NNhS.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-RLfB3yqb.js → useFs-y0SAzirG.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DbRVH_NA.js → usePersonalDataHub-BvdPznrA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DTn_QVJz.js → vnode-D8mNbyZ7.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-DuFR0E7i.js → zoom-_hun6w9W.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +29 -3
- package/src/gateways/ws/llm-chat-protocol.js +124 -41
- package/src/gateways/ws/message-dispatcher.js +2 -0
- package/src/lib/evolution/evolution-deployment-config.js +15 -6
- package/src/lib/evolution/evolution-deployment-loader.js +63 -5
- package/src/lib/evolution/local-ui-evolution-deployment.js +139 -53
- package/src/lib/evolution/local-ui-evolution-host.mjs +26 -8
- package/src/lib/evolution/local-ui-evolution-runtime.js +42 -19
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +0 -1
- package/src/assets/web-panel/assets/QuickAsk-53WNo7xT.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +0 -1
- package/src/assets/web-panel/assets/index-Bq24rTYx.js +0 -1
- 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(
|
|
204
|
-
|
|
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(
|
|
235
|
-
|
|
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),
|
|
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(
|
|
314
|
-
|
|
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,
|
|
318
|
-
const modulePath = path.join(finalDirectory,
|
|
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,
|
|
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: [
|
|
365
|
+
commands: [...LOCAL_EVOLUTION_COMMANDS],
|
|
328
366
|
};
|
|
329
367
|
descriptor.signature = sign(
|
|
330
368
|
null,
|
|
331
|
-
Buffer.from(
|
|
369
|
+
Buffer.from(
|
|
370
|
+
serializeEvolutionDeploymentDescriptorPayload(descriptor),
|
|
371
|
+
"utf8",
|
|
372
|
+
),
|
|
332
373
|
keys["deployment-root"].privateKey,
|
|
333
374
|
).toString("base64");
|
|
334
375
|
|
|
335
|
-
|
|
376
|
+
if (!identity)
|
|
377
|
+
writePrivateFile(path.join(directory, "deployment-public.pem"), publicRoot);
|
|
336
378
|
writePrivateFile(
|
|
337
|
-
path.join(directory,
|
|
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,
|
|
398
|
+
path.join(directory, names.manifest),
|
|
357
399
|
`${JSON.stringify(manifest, null, 2)}\n`,
|
|
358
400
|
);
|
|
359
401
|
const deployment = Object.freeze({
|
|
360
|
-
descriptorPath
|
|
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
|
|
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,
|
|
426
|
+
const manifestPath = path.join(directory, names.manifest);
|
|
383
427
|
const paths = keyPaths(directory);
|
|
384
|
-
const modulePath = path.join(expectedDirectory,
|
|
385
|
-
const storedModulePath = path.join(directory,
|
|
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(
|
|
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) !==
|
|
472
|
-
|
|
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
|
-
|
|
476
|
-
|
|
524
|
+
!(
|
|
525
|
+
canonical(descriptor.commands) === canonical(LOCAL_EVOLUTION_COMMANDS) ||
|
|
526
|
+
(generation === 1 && canonical(descriptor.commands) === '["ui"]')
|
|
527
|
+
)
|
|
477
528
|
) {
|
|
478
|
-
throw new Error(
|
|
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
|
-
/**
|
|
521
|
-
export async function initializeDefaultLocalUiEvolutionDeployment(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
751
|
+
throw new Error(
|
|
752
|
+
"Local Evolution profile identity does not match its signed host",
|
|
753
|
+
);
|
|
671
754
|
}
|
|
672
|
-
assertEvolutionDeploymentActiveTrustRoot(
|
|
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
|
|
2
|
-
//
|
|
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
|
-
|
|
9
|
-
|
|
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
|
|
18
|
-
throw new Error(
|
|
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(
|
|
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"
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
575
|
+
!/^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/u.test(context.runId)
|
|
558
576
|
) {
|
|
559
|
-
throw new Error(
|
|
577
|
+
throw new Error(
|
|
578
|
+
"Local Evolution host does not admit this command mode or Run",
|
|
579
|
+
);
|
|
560
580
|
}
|
|
561
|
-
const root =
|
|
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(
|
|
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:
|
|
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};
|