chainlesschain 0.166.109 → 0.166.112
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 +6 -4
- package/package.json +3 -2
- 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/assets/{AIOps-DkrNbDzS.js → AIOps-sOceeExN.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-DJjFXDhv.js → ActionButton-BQs-vRUr.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DyUbagRn.js → Analytics-sfAHHMhA.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-p7kJWSvn.js → AppLayout-0gAvE0c8.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-C3rVh4Ak.js → Artifacts-Dh9s2Qmd.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bch_L_YO.js → Audit-CITm26SU.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BNHy8zP6.js → BackgroundAgents-BiMbBOh0.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BUaye_Ys.js → Backup-CNpnhI3h.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-D49mzAVz.js → BaseInput-BI_lltkp.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-2MDzM_us.js → Chat-BgfB88xY.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-BDP3fGoz.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-5p1T_KEq.js → Checkbox-4xy9rS3j.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-TKtiLaoZ.js → Codegen-D93h9ihS.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BVCMG9mS.js → Col-BRf3STY-.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D09-QczH.js → Community-f187ziSL.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-QuRMCnj7.js → Compact-D4hXWuo1.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CN0PV7fk.js → Compliance-C6cYKI6H.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-5N2zhAty.js → Cowork-C1i1f8LD.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BxT8UZ0S.js → Cron-BacCE4LA.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-Dp-noQl4.js → Crosschain-DXztxOoH.js} +1 -1
- package/src/assets/web-panel/assets/{DID-B7MZFkjG.js → DID-rpf4HN8x.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DulJ3rKV.js → Dashboard-h4bgtH7L.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DV4ov4zF.js → Dropdown-CyQnoHmu.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DB2-ooz6.js → EmailListRenderer-FCtp4AcB.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-B1Rb6p7q.js → EvolutionSettings-JbISHTWR.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-U8aHayx-.js → FamilyGuardDashboard-DCIQLyfK.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BkQULBHY.js → Federation-DDbFpwja.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CtviG260.js → FormItemContext-CXF0jtXb.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DnPirB24.js → GenericCardRenderer-CUaNfAM0.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CK57Oro6.js → Git-Bhoz2gDf.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DbI-LB8-.js → Governance-FiiXHe8e.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-sEG4T1Jg.js → Inference-brpTW2Q3.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-9SLJR3h9.js → KnowledgeGraph-BCWP-f6k.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BIZYcISQ.js → Logs-CxYcduoK.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-12vD1nC1.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CRmLLwAE.js → Marketplace-DANdmW7l.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DkOFkSO1.js → McpTools-Bi_EKkb5.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-M29Kd9TU.js → Memory-DecoMbYw.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Tl6JvPw_.js → MobileBridge-DrOhFKp0.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-rRwP16dN.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-DkUjX1F5.js → Mtc-SLPII1iw.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BCqr1I4q.js → MtcAudit-DWoVORYy.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DmoqYGQ5.js → Multisig-Dxpnmq-m.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DNRQeRke.js → NLProgramming-kNTpNqCP.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CQSBeiY6.js → Notes-D1uXCfVd.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-gNY9bbH6.js → NotificationSettings-D3Qt8Gkl.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DW0CNjh8.js → OrderTableRenderer-qvaah2-m.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CthnbKag.js → Organization-EhRl4JoJ.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-_GQ3sbXu.js → Overflow-BTt5C_5W.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BTr7ea6W.js → P2P-CeR2jyb0.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-BzD3OHWq.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DMny2Cjs.js → Permissions-BOPyeRlz.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-CyYlMSoI.js → PersonalDataHub-DcmNNsfO.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-FASu2Oc4.js → Pipeline-DuL3kwWC.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-9bC5FnsJ.js → Privacy-CkQRdlSU.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BOYZwB5G.js → ProjectInit-moE_vQ1P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-45DViNG-.js → ProjectSettings-PnTWi4NQ.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-C2fZzMZc.js → Projects-DZvbT3D7.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-BgjvZx9F.js → Providers-CkcrHYy9.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Brw-3csB.js → QrScannerModal-nYNFGf_H.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DWG-A5zB.js → QuickAsk-53WNo7xT.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DuQGxjIR.js → Recommend-CmYN_NaS.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-T1cdSSRL.js → RemoteSession-BuOdNEjA.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-9FT2dI4G.js → Reputation-BgkheZou.js} +1 -1
- package/src/assets/web-panel/assets/{Row-yNIbNftX.js → Row-DvA3klj1.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BIchNoPd.js → RssFeed-CgkIL3PG.js} +3 -3
- package/src/assets/web-panel/assets/{Search-msDJ8UTZ.js → Search-Cv2twJdL.js} +1 -1
- package/src/assets/web-panel/assets/{Security-DE46oBYT.js → Security-XrD2UNU6.js} +2 -2
- package/src/assets/web-panel/assets/{Services-Dori7vc3.js → Services-LujCntCK.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D3O3sUFz.js → Skeleton-ZZCOsxPX.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-BV0ct8SO.js → Skills-BEXGkOrU.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DflIVOrh.js → Sla-CIqmCgdD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cpbv2Zz6.js → SpeechSettings-DkVbwJox.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dgg6-wbe.js → SyncSettings-BVGgUs0p.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-Cb6e4Klx.js → Tasks-C1lh68l5.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-GfdAATGz.js → Templates-BG4zNAFx.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-D0gecLXl.js → Tenant-t2o6i5fY.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BFRPJt-0.js → Terminal-CH8UDdVO.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BobtChxX.js → TimelineRenderer-B5sYY1IO.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CifeZtHV.js → Tokens-D0y7QkG5.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BHBvbBCf.js → Trigger-BA2nKko0.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-6lvqjKYp.js → Trust-CrFKCQIs.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqzMc-G5.js → UkeySign-B3x_-Zun.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-OIiRG582.js → VideoEditing-TEwxbLH6.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-4MeKq0q_.js → Wallet-Larp5rrt.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-eHBRjGQG.js → WebAuthn-DfWbEIZe.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DlzYdEqW.js → WorkflowEditor-8LKiKExY.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CBcjOzkX.js → chat-ByxYOvYW.js} +1 -1
- package/src/assets/web-panel/assets/{colors-zgwsYQSa.js → colors-Dh4yAClh.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Dcd9H5Bn.js → compact-item-f5n2j1WZ.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DR1tO-8r.js → createContext-DIprYuXL.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-DRIge35Z.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-CtfbUH_p.js → hasIn-CvYeap2I.js} +1 -1
- package/src/assets/web-panel/assets/{index-D1GxtY-h.js → index-3ROY-lYB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CT7zIkqP.js → index-6VEWxOyC.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cdhy5ckh.js → index-7eG1J-GT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvPOpvvH.js → index-B0AXUhiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cur8LNNn.js → index-BS_dpgzu.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWG98orp.js → index-BaXSBxy-.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5XGvJb0.js → index-Bk8oWRk6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DA2-Bhy8.js → index-BlImvgb7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CwHgaYVH.js → index-BoayvJ48.js} +1 -1
- package/src/assets/web-panel/assets/index-Bq24rTYx.js +1 -0
- package/src/assets/web-panel/assets/{index-DHEiuvhA.js → index-BsU46c7D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DSvcz0RO.js → index-BvyFQF8I.js} +1 -1
- package/src/assets/web-panel/assets/{index-D7ZOiIKb.js → index-C2RGykST.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmzQzTY5.js → index-C5aH2Pj2.js} +1 -1
- package/src/assets/web-panel/assets/{index-oWOlF7CM.js → index-CD0s5ESV.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVpp9YSQ.js → index-CIZQtz8G.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWuCGhHa.js → index-CJjc8ObW.js} +1 -1
- package/src/assets/web-panel/assets/{index-JSfldpw4.js → index-CTqJNul4.js} +1 -1
- package/src/assets/web-panel/assets/{index-dvF6C39V.js → index-CcvA1nae.js} +1 -1
- package/src/assets/web-panel/assets/{index-CmVIM-m2.js → index-CpR0zD38.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaGNqkY0.js → index-CzabQZ7I.js} +1 -1
- package/src/assets/web-panel/assets/index-D2f18WsK.js +1 -0
- package/src/assets/web-panel/assets/{index-BXfGHUz_.js → index-DGyTzElU.js} +1 -1
- package/src/assets/web-panel/assets/{index-LN7Hkl1C.js → index-DI8jC7gQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfzOYmOj.js → index-DUj-sL9U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BoxowMYS.js → index-DaZVtafQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CSQCHpDo.js → index-DjvON8oh.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3QUK1ks.js → index-DlJCDpeN.js} +1 -1
- package/src/assets/web-panel/assets/{index-J-ORW1i6.js → index-DlTwZIeX.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8lrkcb-.js → index-DlULGx8u.js} +1 -1
- package/src/assets/web-panel/assets/{index-hTcre7U9.js → index-DmcAL4hd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYPMJ5Mb.js → index-DshB3-Up.js} +3 -3
- package/src/assets/web-panel/assets/{index-5XaB_Tjg.js → index-Du435yzt.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0kP88Pb.js → index-bt-0zMmH.js} +1 -1
- package/src/assets/web-panel/assets/{index-D8WPohye.js → index-c_CxUQl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeAi4CNt.js → index-fpWv4u3Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-BndPtS9D.js → index-hwbaD3Nk.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTx4FyLU.js → index-uDiVjYrS.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPLLgPxA.js → index-xU0eHLIH.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CVMtDrWZ.js → initDefaultProps-DRuE92W6.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Dye3IU8k.js → motion-6Sgma5Vd.js} +1 -1
- package/src/assets/web-panel/assets/{move-C251Zo34.js → move-BbQsH8sb.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BDiOORoQ.js → mtc-parser-BdC4INal.js} +1 -1
- package/src/assets/web-panel/assets/{omit-DTDA_RHv.js → omit-DeC5m_bi.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CqEUTPcT.js → pickAttrs-DuehpBws.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BOB8QWH3.js → placementArrow-CJEhv2ij.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CZDXP1d9.js → responsiveObserve-Dyw3lDGr.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DPaRw3E9.js → slide-BMaLXTbS.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Ba9d7XZ7.js → statusUtils-c1K_SdJH.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-mZKU3lvW.js → styleChecker-CefBry8k.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-VcauLq0M.js → useFlexGapSupport-Dj2IsZpo.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Cal9KRcx.js → useFs-RLfB3yqb.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-DISoRyQB.js → usePersonalDataHub-DbRVH_NA.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-B58C6w6B.js → vnode-DTn_QVJz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-BPlBAMKB.js → zoom-DuFR0E7i.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +12 -5
- package/src/commands/ask.js +96 -21
- package/src/commands/complete.js +14 -10
- package/src/commands/llm.js +23 -41
- package/src/commands/session.js +2 -2
- package/src/commands/stream.js +9 -5
- package/src/commands/ui.js +30 -2
- package/src/data/changelog.json +39 -0
- package/src/gateways/ws/llm-chat-protocol.js +18 -10
- package/src/gateways/ws/llm-creds.js +29 -79
- package/src/gateways/ws/ws-agent-handler.js +1 -1
- package/src/gateways/ws/ws-session-gateway.js +26 -12
- package/src/lib/__tests__/provider-stream.test.js +70 -4
- package/src/lib/chat-core.js +186 -24
- package/src/lib/cowork-adapter.js +29 -15
- package/src/lib/evolution/agent-evolution-runtime-composition.js +10 -7
- package/src/lib/evolution/evolution-deployment-config.js +27 -4
- package/src/lib/evolution/evolution-deployment-loader.js +58 -3
- package/src/lib/evolution/evolution-deployment-profile.js +2 -2
- package/src/lib/evolution/evolution-evidence-projector.js +18 -3
- package/src/lib/evolution/evolution-file-witness.js +10 -0
- package/src/lib/evolution/evolution-ledger.js +237 -28
- package/src/lib/evolution/evolution-windows-directory-durability.js +322 -0
- package/src/lib/evolution/governed-hub-llm.js +2 -1
- package/src/lib/evolution/governed-model-turn.js +4 -1
- package/src/lib/evolution/local-ui-evolution-deployment.js +682 -0
- package/src/lib/evolution/local-ui-evolution-host.mjs +26 -0
- package/src/lib/evolution/local-ui-evolution-runtime.js +601 -0
- package/src/lib/evolution/opaque-hex-id.js +28 -0
- package/src/lib/hub-llm-client.js +22 -14
- package/src/lib/image-input.js +19 -3
- package/src/lib/llm-config-defaults.js +19 -30
- package/src/lib/llm-connection-config.js +4 -0
- package/src/lib/llm-connection-probe.js +5 -1
- package/src/lib/llm-connection-resolution.js +94 -0
- package/src/lib/llm-providers.js +33 -11
- package/src/lib/ollama-base-url.js +14 -0
- package/src/lib/provider-protocol.js +104 -0
- package/src/lib/provider-stream.js +163 -4
- package/src/lib/runnable-provider.js +1 -0
- package/src/repl/chat-repl.js +58 -11
- package/src/runtime/agent-core.js +26 -43
- package/src/runtime/headless-runner.js +11 -4
- package/src/runtime/headless-stream.js +10 -4
- package/src/runtime/policies/agent-policy.js +17 -11
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DOX3Y5EJ.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-9nfWupWP.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-Bq-FPDzS.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-D9McHF9I.js +0 -7
- package/src/assets/web-panel/assets/devWarning-DYhpRtve.js +0 -1
- package/src/assets/web-panel/assets/index-DPJXFIY7.js +0 -1
- package/src/assets/web-panel/assets/index-DjBhR5M_.js +0 -1
|
@@ -22,6 +22,7 @@ import { EvolutionRunLedgerAdapter } from "./evolution-run-ledger-adapter.js";
|
|
|
22
22
|
import { createEvolutionRunWikiEvidenceResolver } from "./evolution-run-wiki-evidence-resolver.js";
|
|
23
23
|
import { WikiMaintainerLedgerAdapter } from "./wiki-maintainer-ledger-adapter.js";
|
|
24
24
|
import { EvidenceBackedWikiMaintainer } from "./evidence-backed-wiki-maintainer.js";
|
|
25
|
+
import { ensureDirectoryTreeDurable } from "./evolution-windows-directory-durability.js";
|
|
25
26
|
import { createWikiEvidenceCommitGuard } from "./wiki-evidence-commit-guard.js";
|
|
26
27
|
import { EvolutionWorkbenchMetricsLedgerAdapter } from "./evolution-workbench-metrics-ledger-adapter.js";
|
|
27
28
|
import { EvolutionReleaseTrainLedgerAdapter } from "./evolution-release-train-ledger-adapter.js";
|
|
@@ -158,7 +159,7 @@ function normalizeClock(clock) {
|
|
|
158
159
|
});
|
|
159
160
|
}
|
|
160
161
|
|
|
161
|
-
function layout(stateRootDir, tenantId, runId, initialize = true) {
|
|
162
|
+
function layout(stateRootDir, tenantId, runId, initialize = true, fsImpl = fs) {
|
|
162
163
|
if (typeof stateRootDir !== "string" || stateRootDir.trim() === "") {
|
|
163
164
|
throw new TypeError("stateRootDir is required");
|
|
164
165
|
}
|
|
@@ -176,11 +177,12 @@ function layout(stateRootDir, tenantId, runId, initialize = true) {
|
|
|
176
177
|
ledgerAuthorityRootDir: path.join(scope, "ledger-authority"),
|
|
177
178
|
witnessFilePath: path.join(scope, "witness", "checkpoint.json"),
|
|
178
179
|
});
|
|
179
|
-
if (initialize)
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
180
|
+
if (initialize) {
|
|
181
|
+
ensureDirectoryTreeDurable(
|
|
182
|
+
fsImpl,
|
|
183
|
+
path.dirname(result.witnessFilePath),
|
|
184
|
+
);
|
|
185
|
+
}
|
|
184
186
|
return result;
|
|
185
187
|
}
|
|
186
188
|
|
|
@@ -408,7 +410,7 @@ export function createAgentEvolutionRuntimeComposition({
|
|
|
408
410
|
capture(authorities.witness?.signer, "sign", "witness signer");
|
|
409
411
|
capture(authorities.witness?.verifier, "verify", "witness verifier");
|
|
410
412
|
assertIndependentSigningAuthorities(authorities.ledger, authorities.witness);
|
|
411
|
-
const storage = layout(stateRootDir, tenantId, runId);
|
|
413
|
+
const storage = layout(stateRootDir, tenantId, runId, true, fsImpl ?? fs);
|
|
412
414
|
const artifactPorts = new EvolutionArtifactPorts({
|
|
413
415
|
tenantId,
|
|
414
416
|
audience,
|
|
@@ -712,6 +714,7 @@ export function createAgentEvolutionRuntimeComposition({
|
|
|
712
714
|
tenantId,
|
|
713
715
|
sourceRunId,
|
|
714
716
|
false,
|
|
717
|
+
fsImpl ?? fs,
|
|
715
718
|
);
|
|
716
719
|
if (!fs.existsSync(sourceStorage.witnessFilePath))
|
|
717
720
|
throw new Error("Cache source Run witness does not exist");
|
|
@@ -103,6 +103,9 @@ function withDeploymentReadiness(status) {
|
|
|
103
103
|
return Object.freeze({
|
|
104
104
|
...status,
|
|
105
105
|
readiness: Object.freeze({
|
|
106
|
+
ui: assessEvolutionDeploymentReadiness(status, {
|
|
107
|
+
requiredCommands: ["ui"],
|
|
108
|
+
}),
|
|
106
109
|
ask: assessEvolutionDeploymentReadiness(status, {
|
|
107
110
|
requiredCommands: ["ask"],
|
|
108
111
|
}),
|
|
@@ -197,6 +200,13 @@ export async function configureEvolutionDeployment(
|
|
|
197
200
|
options,
|
|
198
201
|
);
|
|
199
202
|
updateEvolutionDeploymentProfile((current) => {
|
|
203
|
+
if (options.expectedProfileAbsent === true && current) {
|
|
204
|
+
const error = new Error(
|
|
205
|
+
"Evolution deployment profile was configured during local initialization",
|
|
206
|
+
);
|
|
207
|
+
error.code = "EVOLUTION_DEPLOYMENT_PROFILE_ALREADY_CONFIGURED";
|
|
208
|
+
throw error;
|
|
209
|
+
}
|
|
200
210
|
if (
|
|
201
211
|
current?.activeTrustRootDigest &&
|
|
202
212
|
current.activeTrustRootDigest !== verified.descriptor.trustRootDigest
|
|
@@ -245,6 +255,11 @@ export async function configureEvolutionDeployment(
|
|
|
245
255
|
verified.descriptor.revision,
|
|
246
256
|
),
|
|
247
257
|
};
|
|
258
|
+
const preserveLocalMode =
|
|
259
|
+
deploymentMode === undefined &&
|
|
260
|
+
current?.deploymentMode === "local" &&
|
|
261
|
+
current.descriptorPath === verified.descriptorPath &&
|
|
262
|
+
current.trustRootPath === verified.trustRootPath;
|
|
248
263
|
const preserveTestMode =
|
|
249
264
|
deploymentMode === undefined &&
|
|
250
265
|
current?.deploymentMode === "test" &&
|
|
@@ -257,10 +272,18 @@ export async function configureEvolutionDeployment(
|
|
|
257
272
|
revisionFloors,
|
|
258
273
|
activeTrustRootDigest: verified.descriptor.trustRootDigest,
|
|
259
274
|
revokedDescriptorRevisions,
|
|
260
|
-
deploymentMode:
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
275
|
+
deploymentMode:
|
|
276
|
+
preserveLocalMode
|
|
277
|
+
? "local"
|
|
278
|
+
: preserveTestMode
|
|
279
|
+
? "test"
|
|
280
|
+
: deploymentMode || "managed",
|
|
281
|
+
testPrivateKeyPath:
|
|
282
|
+
deploymentMode === "test"
|
|
283
|
+
? testPrivateKeyPath || null
|
|
284
|
+
: preserveTestMode
|
|
285
|
+
? current.testPrivateKeyPath
|
|
286
|
+
: null,
|
|
264
287
|
};
|
|
265
288
|
}, options);
|
|
266
289
|
return getEvolutionDeploymentStatus(options);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash, createPublicKey, verify } from "node:crypto";
|
|
2
2
|
import { readFile, realpath } from "node:fs/promises";
|
|
3
|
-
import { isAbsolute } from "node:path";
|
|
3
|
+
import { dirname, isAbsolute, join } from "node:path";
|
|
4
4
|
import { types as utilTypes } from "node:util";
|
|
5
5
|
import {
|
|
6
6
|
assertEvolutionDeploymentActiveTrustRoot,
|
|
@@ -840,6 +840,15 @@ function bindFactoriesToModule(factories, moduleDigest) {
|
|
|
840
840
|
return factories[name](options);
|
|
841
841
|
};
|
|
842
842
|
}
|
|
843
|
+
if (typeof factories.createLocalUiEvolutionComposition === "function") {
|
|
844
|
+
result.createLocalUiEvolutionComposition = (options = {}) => {
|
|
845
|
+
if (options?.handlerArtifactDigest !== moduleDigest)
|
|
846
|
+
throw new Error(
|
|
847
|
+
"Local UI Evolution host digest must equal the authenticated deployment module digest",
|
|
848
|
+
);
|
|
849
|
+
return factories.createLocalUiEvolutionComposition(options);
|
|
850
|
+
};
|
|
851
|
+
}
|
|
843
852
|
for (const name of [
|
|
844
853
|
"createSkillEvaluatedPromotionProvider",
|
|
845
854
|
"createSkillPromotionReviewProvider",
|
|
@@ -1012,19 +1021,32 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
1012
1021
|
commandName,
|
|
1013
1022
|
{
|
|
1014
1023
|
env = process.env,
|
|
1024
|
+
cwd = process.cwd(),
|
|
1015
1025
|
read = readFile,
|
|
1016
1026
|
resolveRealPath = realpath,
|
|
1017
1027
|
importModule = (url) => import(url),
|
|
1018
1028
|
additionalFactories = {},
|
|
1029
|
+
initializeDefaultLocalUi = false,
|
|
1019
1030
|
} = {},
|
|
1020
1031
|
) {
|
|
1021
1032
|
if (!SUPPORTED_COMMANDS.has(commandName)) return null;
|
|
1022
1033
|
let descriptorPath = env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_DESCRIPTOR;
|
|
1023
1034
|
let trustRootPath = env.CHAINLESSCHAIN_EVOLUTION_DEPLOYMENT_TRUST_ROOT;
|
|
1035
|
+
if (
|
|
1036
|
+
initializeDefaultLocalUi === true &&
|
|
1037
|
+
commandName === "ui" &&
|
|
1038
|
+
!descriptorPath &&
|
|
1039
|
+
!trustRootPath
|
|
1040
|
+
) {
|
|
1041
|
+
const { initializeDefaultLocalUiEvolutionDeployment } = await import(
|
|
1042
|
+
"./local-ui-evolution-deployment.js"
|
|
1043
|
+
);
|
|
1044
|
+
await initializeDefaultLocalUiEvolutionDeployment({ env, cwd });
|
|
1045
|
+
}
|
|
1024
1046
|
let fromSavedProfile = false;
|
|
1025
1047
|
let saved = null;
|
|
1026
1048
|
if (!descriptorPath && !trustRootPath) {
|
|
1027
|
-
saved = await readEvolutionDeploymentProfile({ env });
|
|
1049
|
+
saved = await readEvolutionDeploymentProfile({ env, cwd });
|
|
1028
1050
|
if (saved.error) {
|
|
1029
1051
|
return deniedAgentDependencies(
|
|
1030
1052
|
commandName,
|
|
@@ -1086,6 +1108,23 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
1086
1108
|
throw error;
|
|
1087
1109
|
}
|
|
1088
1110
|
const { descriptor, moduleBytes } = verified;
|
|
1111
|
+
const localProfile =
|
|
1112
|
+
fromSavedProfile && saved.profile.deploymentMode === "local";
|
|
1113
|
+
if (localProfile) {
|
|
1114
|
+
const localHostPath = join(
|
|
1115
|
+
dirname(saved.filePath),
|
|
1116
|
+
"local-ui-host",
|
|
1117
|
+
"ui-host.mjs",
|
|
1118
|
+
);
|
|
1119
|
+
const canonicalLocalHostPath = await realpath(localHostPath);
|
|
1120
|
+
if (
|
|
1121
|
+
descriptor.commands.length !== 1 ||
|
|
1122
|
+
descriptor.commands[0] !== "ui" ||
|
|
1123
|
+
verified.modulePath !== canonicalLocalHostPath
|
|
1124
|
+
) {
|
|
1125
|
+
throw new Error("Local Evolution deployment is not the protected UI host");
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1089
1128
|
if (!descriptor.commands.includes(commandName)) {
|
|
1090
1129
|
return deniedAgentDependencies(
|
|
1091
1130
|
commandName,
|
|
@@ -1105,8 +1144,24 @@ export async function loadEvolutionDeploymentCommandDependencies(
|
|
|
1105
1144
|
throw new Error(
|
|
1106
1145
|
"evolution deployment module must export createChainlessChainCommandDependencies",
|
|
1107
1146
|
);
|
|
1147
|
+
const builtIn = await loadBuiltInFactories(commandName);
|
|
1148
|
+
let localFactories = null;
|
|
1149
|
+
if (localProfile) {
|
|
1150
|
+
const { createLocalUiEvolutionComposition } = await import(
|
|
1151
|
+
"./local-ui-evolution-runtime.js"
|
|
1152
|
+
);
|
|
1153
|
+
localFactories = {
|
|
1154
|
+
createLocalUiEvolutionComposition: (options = {}) =>
|
|
1155
|
+
createLocalUiEvolutionComposition({
|
|
1156
|
+
...options,
|
|
1157
|
+
localDirectory: join(dirname(saved.filePath), "local-ui-host"),
|
|
1158
|
+
env,
|
|
1159
|
+
cwd,
|
|
1160
|
+
}),
|
|
1161
|
+
};
|
|
1162
|
+
}
|
|
1108
1163
|
const builtInFactories = bindFactoriesToModule(
|
|
1109
|
-
|
|
1164
|
+
{ ...builtIn, ...(localFactories || {}) },
|
|
1110
1165
|
descriptor.moduleDigest,
|
|
1111
1166
|
);
|
|
1112
1167
|
if (
|
|
@@ -124,7 +124,7 @@ function normalizeProfile(value) {
|
|
|
124
124
|
const deploymentMode = beforeDeploymentMode
|
|
125
125
|
? "managed"
|
|
126
126
|
: value.deploymentMode;
|
|
127
|
-
if (!["managed", "test"].includes(deploymentMode))
|
|
127
|
+
if (!["managed", "test", "local"].includes(deploymentMode))
|
|
128
128
|
throw new TypeError("evolution deployment profile mode is invalid");
|
|
129
129
|
const testPrivateKeyPath = beforeDeploymentMode
|
|
130
130
|
? null
|
|
@@ -133,7 +133,7 @@ function normalizeProfile(value) {
|
|
|
133
133
|
(deploymentMode === "test" &&
|
|
134
134
|
(typeof testPrivateKeyPath !== "string" ||
|
|
135
135
|
!isAbsolute(testPrivateKeyPath))) ||
|
|
136
|
-
(deploymentMode
|
|
136
|
+
(deploymentMode !== "test" && testPrivateKeyPath !== null)
|
|
137
137
|
) {
|
|
138
138
|
throw new TypeError(
|
|
139
139
|
"evolution deployment profile test private key path is invalid",
|
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
EVIDENCE_JSON_POLICY,
|
|
21
21
|
isAgentToolArgumentsPath,
|
|
22
22
|
} from "./evidence-json-text.js";
|
|
23
|
+
import { formatLocalUiTenantReferenceId } from "./opaque-hex-id.js";
|
|
23
24
|
|
|
24
25
|
export const EVOLUTION_SOURCE_VERIFICATION_SCHEMA =
|
|
25
26
|
"chainlesschain.evolution-source-verification/v1";
|
|
@@ -89,6 +90,9 @@ const SOURCE_SCHEMES = new Set(["rollout", "tool", "outcome", "recording"]);
|
|
|
89
90
|
const SOURCE_COMMITMENT_PURPOSE = "chainlesschain.evolution-source-payload/v1";
|
|
90
91
|
const TRUSTED_PAYLOAD_COMMITMENT_PURPOSE =
|
|
91
92
|
"chainlesschain.evolution-trusted-payload/v1";
|
|
93
|
+
const LEGACY_LOCAL_UI_TENANT_ID_PATTERN = /^local-ui-[a-f0-9]{32}$/u;
|
|
94
|
+
const FORMATTED_LOCAL_UI_TENANT_ID_PATTERN =
|
|
95
|
+
/^local-ui-(?:[a-f0-9]{8}-){3}[a-f0-9]{8}$/u;
|
|
92
96
|
|
|
93
97
|
const INPUT_KEYS = new Set(["sourceEnvelope", "payload"]);
|
|
94
98
|
const SOURCE_VERIFICATION_KEYS = new Set([
|
|
@@ -873,6 +877,17 @@ function normalizeId(value, label, maximum = 256) {
|
|
|
873
877
|
return value;
|
|
874
878
|
}
|
|
875
879
|
|
|
880
|
+
function normalizeTenantId(value, label) {
|
|
881
|
+
if (
|
|
882
|
+
typeof value === "string" &&
|
|
883
|
+
(LEGACY_LOCAL_UI_TENANT_ID_PATTERN.test(value) ||
|
|
884
|
+
FORMATTED_LOCAL_UI_TENANT_ID_PATTERN.test(value))
|
|
885
|
+
) {
|
|
886
|
+
return value;
|
|
887
|
+
}
|
|
888
|
+
return normalizeId(value, label);
|
|
889
|
+
}
|
|
890
|
+
|
|
876
891
|
function normalizeDigest(
|
|
877
892
|
value,
|
|
878
893
|
label,
|
|
@@ -970,7 +985,7 @@ function normalizeOpaqueUri(value, { label, schemes, tenantId }) {
|
|
|
970
985
|
parsed.port ||
|
|
971
986
|
parsed.search ||
|
|
972
987
|
parsed.hash ||
|
|
973
|
-
parsed.hostname !== tenantId ||
|
|
988
|
+
parsed.hostname !== formatLocalUiTenantReferenceId(tenantId) ||
|
|
974
989
|
!decodedPath.startsWith("/") ||
|
|
975
990
|
decodedPath
|
|
976
991
|
.split("/")
|
|
@@ -1635,7 +1650,7 @@ function validateSourceVerification(
|
|
|
1635
1650
|
{ failures },
|
|
1636
1651
|
);
|
|
1637
1652
|
}
|
|
1638
|
-
const tenantId =
|
|
1653
|
+
const tenantId = normalizeTenantId(value.tenantId, "source tenantId");
|
|
1639
1654
|
const principalId = normalizeId(value.principalId, "source principalId");
|
|
1640
1655
|
const sourceRef = normalizeOpaqueUri(value.sourceRef, {
|
|
1641
1656
|
label: "sourceRef",
|
|
@@ -2737,7 +2752,7 @@ function validateRawMetadata(raw, receipt) {
|
|
|
2737
2752
|
}
|
|
2738
2753
|
const createdAtMs = new Date(createdAt).getTime();
|
|
2739
2754
|
normalizeId(raw.evidenceId, "Raw evidenceId");
|
|
2740
|
-
|
|
2755
|
+
normalizeTenantId(raw.tenantId, "Raw tenantId");
|
|
2741
2756
|
normalizeId(raw.principalId, "Raw principalId");
|
|
2742
2757
|
normalizeOpaqueUri(raw.sourceRef, {
|
|
2743
2758
|
label: "Raw sourceRef",
|
|
@@ -685,6 +685,16 @@ export function createEvolutionFileWitness({
|
|
|
685
685
|
};
|
|
686
686
|
|
|
687
687
|
const syncDirectory = (directoryPath = directory) => {
|
|
688
|
+
const directorySync = Object.getOwnPropertyDescriptor(
|
|
689
|
+
fsImpl,
|
|
690
|
+
"syncDirectorySync",
|
|
691
|
+
);
|
|
692
|
+
if (directorySync) {
|
|
693
|
+
if (typeof directorySync.value !== "function") {
|
|
694
|
+
throw new Error("syncDirectorySync must be a data function");
|
|
695
|
+
}
|
|
696
|
+
return Reflect.apply(directorySync.value, fsImpl, [directoryPath]);
|
|
697
|
+
}
|
|
688
698
|
let descriptor;
|
|
689
699
|
try {
|
|
690
700
|
descriptor = fsImpl.openSync(directoryPath, "r");
|