chainlesschain 0.166.6 → 0.166.9
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 +21 -0
- package/package.json +5 -1
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-DJvpifGx.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-D2UhuF_A.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-C9ho9obu.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-BvRCpFK3.js} +3 -3
- package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-jxrySvpk.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-ovEw0ZYl.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-D7H5z6zS.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-BuXob8za.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-CtnszuQ2.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-B_mYE8fJ.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-ierdtcJD.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-3VKPJD_B.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-1EdMyf5P.js} +1 -1
- package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-D6H7UA8K.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-BBAZvYIm.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-CgsTrAoj.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-tnZgLoTE.js} +4 -4
- package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-CPpZw2Nh.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-BymBcp5z.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-DKPxS_K1.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-DvJhEmH9.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-b8iQyQIZ.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer--0-A-zKb.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BRhaE2Z8.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C4dnq7yf.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
- package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-4eA2fYzL.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-BJuY9Y-9.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-DZ5Dy4up.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-BKEeQEfJ.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-Dhho4fEg.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-BW6xxSlU.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory-mPqlpSkq.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-Cb9N_DQI.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BNs8tah_.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-CaxBt8tn.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-DRPQbp3t.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-CRm-d8bK.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-BCCk3LPs.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-Cv8SN8gN.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-CggIvTh5.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-BW3_bV12.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-BuRE-VCO.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-DBrm1gju.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CWVnDYgS.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-8RKUIpte.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-tDUAxogW.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-Dv2-CFis.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DM6kvFni.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-DzK-yL0d.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-B5UrNpkj.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-CxJD43oW.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
- package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-CYl4jRYK.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-DeH2T0fH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-Bw9k_kTk.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-Bl_jGwoi.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ds_Dfr-k.js} +1 -1
- package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-BpQUQTNj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-BatpZBGt.js} +3 -3
- package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-D7hOObzi.js} +1 -1
- package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-dXQ4FKNt.js} +4 -4
- package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-D8wInGPa.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-DXQCoYpM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-D3oLRIVn.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-BmP4-LnJ.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-DLj-xzro.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-8KKaaRMr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-GyK42I7C.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-n1y_8UBG.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-B39nBph8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-DCQoOKXe.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-BkhbDfXk.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-BeHIIU8D.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BHvWXVOb.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-y2WaOSto.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-DBFeJBzt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-BEOWitC-.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-BITedTe6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DMwlJVin.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-CKfGFEu1.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-DR6gnBGF.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-C_Hw5NCn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-B8IPwsEu.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-D-u4JVnJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-CZubdS4D.js} +1 -1
- package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-11ASqx-A.js} +1 -1
- package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
- package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-BXS6wYJZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-Bi21Etg4.js} +1 -1
- package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-Bizm87cX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-Bv2132PO.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-BzoFanEQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-C25rOz7O.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-C2VmtNaQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-Cbm8F0M2.js} +1 -1
- package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-CfniPP5p.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-Cg2bCeol.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-CiXkhOkY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-Cl5RpreD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-CqmLw8cs.js} +1 -1
- package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-Ctje8Vl3.js} +1 -1
- package/src/assets/web-panel/assets/{index-i5MB455u.js → index-D1w96gg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-D47jt8ET.js} +1 -1
- package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-DJ6pG79m.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-DTosx2Wu.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DY6MHo9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-DcFjRT-K.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-DfnzrUxU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-DjRrqooR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-DmRcgiYT.js} +1 -1
- package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-DpjHpRoq.js} +3 -3
- package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-Dt-w3xQ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-DuOU5apg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-LvjAKDSl.js} +1 -1
- package/src/assets/web-panel/assets/{index-be8SonCh.js → index-_nL79NT8.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-auyNYjLo.js} +1 -1
- package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-cVqbas5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-ffe7bvqP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-idZKyADQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-k1Xa5iw1.js} +1 -1
- package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-mYZJxGH6.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-rYBHSDcJ.js} +1 -1
- package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
- package/src/assets/web-panel/assets/{index-C846lPGD.js → index-xoNssgz_.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-lcU_dT2r.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Dc7UNXZ1.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-Cll8ZXaL.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-CAb_yLIM.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-DurYMyTe.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-BITQyOlw.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dg1rH91i.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-D_EWIeac.js} +1 -1
- package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-lK4d3zsh.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-Bflq-Git.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-Ccp0I-wt.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-CYZbByYA.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-B_x0nxFD.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-DW55rL85.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-Ca6MH3W8.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-NdHelOog.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/graph.js +215 -5
- package/src/commands/orchestrate.js +61 -9
- package/src/commands/team-distributed.js +342 -2
- package/src/commands/team.js +169 -7
- package/src/data/changelog.json +46 -0
- package/src/gateways/ws/message-dispatcher.js +4 -0
- package/src/gateways/ws/session-protocol.js +89 -11
- package/src/gateways/ws/ws-agent-handler.js +65 -9
- package/src/gateways/ws/ws-approval-gate.js +181 -16
- package/src/gateways/ws/ws-server.js +16 -6
- package/src/generated/cc-agent-protocol.schema.json +154 -3
- package/src/lib/agent-team/task-lease.js +487 -3
- package/src/lib/agent-team/team-agent-stream.js +16 -0
- package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
- package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
- package/src/lib/agent-team/team-distributed-queue.js +251 -0
- package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
- package/src/lib/agent-team/team-runner.js +285 -3
- package/src/lib/app-server/graph-runtime.js +1078 -0
- package/src/lib/app-server/rollout-store.js +32 -0
- package/src/lib/app-server/server.js +200 -0
- package/src/lib/approval-grant-ledger.js +69 -0
- package/src/lib/autonomous-agent.js +11 -0
- package/src/lib/codex-app-server-adapter.js +11 -20
- package/src/lib/cowork-graph-authority-adapter.js +455 -0
- package/src/lib/dynamic-workflow-facade.js +83 -16
- package/src/lib/graph-kernel/adapters.js +93 -20
- package/src/lib/graph-kernel/authority.js +324 -0
- package/src/lib/graph-kernel/compiler.js +67 -21
- package/src/lib/graph-kernel/cutover-authority-resolver.js +245 -0
- package/src/lib/graph-kernel/cutover-ledger.js +692 -0
- package/src/lib/graph-kernel/event-store.js +15 -1
- package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
- package/src/lib/graph-kernel/index.js +4 -0
- package/src/lib/graph-kernel/migration-saga.js +309 -0
- package/src/lib/graph-kernel/retirement-evidence.js +567 -0
- package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
- package/src/lib/graph-kernel/runtime.js +737 -38
- package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
- package/src/lib/graph-kernel/trace-reducer.js +6 -0
- package/src/lib/graph-kernel/trigger-adapter.js +60 -3
- package/src/lib/interaction-adapter.js +61 -9
- package/src/lib/legacy-runtime-authority.js +160 -0
- package/src/lib/orchestrator.js +28 -0
- package/src/lib/policy-decision-event.js +149 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
- package/src/lib/record-replay/index.js +1 -0
- package/src/lib/record-replay/playwright-ui-driver.js +327 -0
- package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
- package/src/lib/scheduler-kernel/runtime.js +75 -2
- package/src/lib/webhook-security.js +484 -36
- package/src/runtime/coding-agent-events.cjs +13 -11
- package/src/runtime/headless-runner.js +17 -1
- package/src/runtime/headless-stream.js +66 -3
- package/src/runtime/session-slash-commands.js +57 -6
- package/src/assets/web-panel/assets/MarkdownRenderer-BwH414Ms.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
- package/src/assets/web-panel/assets/Projects-DiCGnMjz.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-s1gR38IO.js +0 -5
- package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
- package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
- package/src/assets/web-panel/assets/index-B7mDobAl.js +0 -1
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createRuntimeGraphCutoverAuthorityResolver } from "./graph-kernel/cutover-authority-resolver.js";
|
|
2
|
+
import {
|
|
3
|
+
graphRuntimeSurfaceEntry,
|
|
4
|
+
loadGraphRuntimeSurfaceManifest,
|
|
5
|
+
} from "./graph-kernel/runtime-surface-manifest.js";
|
|
6
|
+
|
|
7
|
+
const AUTHORITY_MODES = new Set(["legacy", "shadow", "canonical"]);
|
|
8
|
+
const ENTRYPOINTS = Object.freeze([
|
|
9
|
+
["CLIAutonomousAgent.", "cli-legacy-autonomous"],
|
|
10
|
+
["Orchestrator.", "cli-legacy-orchestrate"],
|
|
11
|
+
]);
|
|
12
|
+
const resolverCache = new Map();
|
|
13
|
+
const runtimeManifest = loadGraphRuntimeSurfaceManifest();
|
|
14
|
+
|
|
15
|
+
function authorityError(code, message, details = {}) {
|
|
16
|
+
const error = new Error(message);
|
|
17
|
+
error.name = "CLILegacyRuntimeAuthorityError";
|
|
18
|
+
error.code = code;
|
|
19
|
+
Object.assign(error, details);
|
|
20
|
+
return error;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function fallbackMode(env) {
|
|
24
|
+
const mode = String(env.CHAINLESSCHAIN_GRAPH_COWORK || "legacy")
|
|
25
|
+
.trim()
|
|
26
|
+
.toLowerCase();
|
|
27
|
+
if (!AUTHORITY_MODES.has(mode)) {
|
|
28
|
+
throw authorityError(
|
|
29
|
+
"CC_GRAPH_AUTHORITY_MODE_INVALID",
|
|
30
|
+
"CHAINLESSCHAIN_GRAPH_COWORK must be legacy, shadow, or canonical",
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return mode;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function entryIdFor(entrypoint) {
|
|
37
|
+
const value = String(entrypoint || "");
|
|
38
|
+
return ENTRYPOINTS.find(([prefix]) => value.startsWith(prefix))?.[1];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function retirementContractFor(entryId) {
|
|
42
|
+
if (!entryId) return null;
|
|
43
|
+
const entry = graphRuntimeSurfaceEntry(
|
|
44
|
+
runtimeManifest,
|
|
45
|
+
"cowork",
|
|
46
|
+
entryId,
|
|
47
|
+
).entry;
|
|
48
|
+
const replacementTargets = (entry.replacementEntryIds || []).map(
|
|
49
|
+
(replacementEntryId) => {
|
|
50
|
+
for (const surface of runtimeManifest.surfaces || []) {
|
|
51
|
+
const target = (surface.entries || []).find(
|
|
52
|
+
(candidate) => candidate.id === replacementEntryId,
|
|
53
|
+
);
|
|
54
|
+
if (!target) continue;
|
|
55
|
+
return Object.freeze({
|
|
56
|
+
entryId: target.id,
|
|
57
|
+
originSurface: surface.originSurface,
|
|
58
|
+
rolloutKey: target.rolloutKey,
|
|
59
|
+
entrypoints: Object.freeze([...(target.entrypoints || [])]),
|
|
60
|
+
recoveryEntrypoints: Object.freeze([
|
|
61
|
+
...(target.recoveryEntrypoints || []),
|
|
62
|
+
]),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
},
|
|
67
|
+
);
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
replacementEntrypoint: entry.replacementEntrypoint || null,
|
|
70
|
+
replacementEntryIds: Object.freeze([...(entry.replacementEntryIds || [])]),
|
|
71
|
+
historicalReadFunctions: Object.freeze([
|
|
72
|
+
...(entry.historicalReadFunctions || []),
|
|
73
|
+
]),
|
|
74
|
+
replacementTargets: Object.freeze(replacementTargets.filter(Boolean)),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export function cliLegacyRuntimeAuthorityMode(env = process.env, options = {}) {
|
|
79
|
+
const configured = fallbackMode(env);
|
|
80
|
+
const entryId = options.entryId;
|
|
81
|
+
if (!entryId) return configured;
|
|
82
|
+
let resolver = options.resolver;
|
|
83
|
+
if (!resolver) {
|
|
84
|
+
const key = `${entryId}\0${configured}\0${
|
|
85
|
+
env.CHAINLESSCHAIN_GRAPH_CUTOVER_STATE_DIR || ""
|
|
86
|
+
}`;
|
|
87
|
+
resolver = resolverCache.get(key);
|
|
88
|
+
if (!resolver) {
|
|
89
|
+
resolver = createRuntimeGraphCutoverAuthorityResolver({
|
|
90
|
+
env,
|
|
91
|
+
surface: "cowork",
|
|
92
|
+
entryId,
|
|
93
|
+
fallbackMode: configured,
|
|
94
|
+
});
|
|
95
|
+
resolverCache.set(key, resolver);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const resolved =
|
|
99
|
+
typeof resolver === "function"
|
|
100
|
+
? resolver({ runKey: options.runKey, optIn: options.optIn === true })
|
|
101
|
+
: resolver.resolve({
|
|
102
|
+
runKey: options.runKey,
|
|
103
|
+
optIn: options.optIn === true,
|
|
104
|
+
fallbackMode: configured,
|
|
105
|
+
});
|
|
106
|
+
const mode = typeof resolved === "string" ? resolved : resolved?.mode;
|
|
107
|
+
if (!AUTHORITY_MODES.has(mode)) {
|
|
108
|
+
throw authorityError(
|
|
109
|
+
"CC_GRAPH_AUTHORITY_MODE_INVALID",
|
|
110
|
+
"CLI legacy runtime authority resolver returned an invalid mode",
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
return mode;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function assertCLILegacyMutationAllowed(
|
|
117
|
+
entrypoint,
|
|
118
|
+
env = process.env,
|
|
119
|
+
options = {},
|
|
120
|
+
) {
|
|
121
|
+
const entryId = options.entryId || entryIdFor(entrypoint);
|
|
122
|
+
const mode =
|
|
123
|
+
options.authorityMode ||
|
|
124
|
+
cliLegacyRuntimeAuthorityMode(env, { ...options, entryId });
|
|
125
|
+
if (
|
|
126
|
+
mode !== "canonical" &&
|
|
127
|
+
String(env.CHAINLESSCHAIN_CLI_LEGACY_READ_ONLY || "") !== "1"
|
|
128
|
+
) {
|
|
129
|
+
return Object.freeze({
|
|
130
|
+
authorityMode: mode,
|
|
131
|
+
authoritySource:
|
|
132
|
+
mode === "shadow" ? "graph_kernel_shadow" : "legacy_runtime",
|
|
133
|
+
legacyReadOnly: false,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
const retirementContract = retirementContractFor(entryId);
|
|
137
|
+
const replacementEntrypoint = retirementContract?.replacementEntrypoint;
|
|
138
|
+
throw authorityError(
|
|
139
|
+
"CC_CLI_LEGACY_RUNTIME_READ_ONLY",
|
|
140
|
+
`CLI legacy runtime is read-only; '${entrypoint}' must use ${replacementEntrypoint || "the canonical Graph Kernel entrypoint"}`,
|
|
141
|
+
{
|
|
142
|
+
entrypoint: String(entrypoint),
|
|
143
|
+
entryId,
|
|
144
|
+
replacementEntrypoint,
|
|
145
|
+
replacementEntryIds: retirementContract?.replacementEntryIds || [],
|
|
146
|
+
historicalReadFunctions:
|
|
147
|
+
retirementContract?.historicalReadFunctions || [],
|
|
148
|
+
replacementTargets: retirementContract?.replacementTargets || [],
|
|
149
|
+
authorityMode: "canonical",
|
|
150
|
+
authoritySource: "graph_kernel",
|
|
151
|
+
},
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function cliLegacyRuntimeReadOnly(env = process.env, options = {}) {
|
|
156
|
+
return (
|
|
157
|
+
cliLegacyRuntimeAuthorityMode(env, options) === "canonical" ||
|
|
158
|
+
String(env.CHAINLESSCHAIN_CLI_LEGACY_READ_ONLY || "") === "1"
|
|
159
|
+
);
|
|
160
|
+
}
|
package/src/lib/orchestrator.js
CHANGED
|
@@ -27,6 +27,10 @@ import { AgentRouter } from "./agent-router.js";
|
|
|
27
27
|
import { NotificationManager } from "./notifiers/index.js";
|
|
28
28
|
import { createChatFn } from "./cowork-adapter.js";
|
|
29
29
|
import { firstBalancedJson } from "./json-schema-output.js";
|
|
30
|
+
import {
|
|
31
|
+
assertCLILegacyMutationAllowed,
|
|
32
|
+
cliLegacyRuntimeReadOnly,
|
|
33
|
+
} from "./legacy-runtime-authority.js";
|
|
30
34
|
import executionBroker from "./process-execution-broker/index.js";
|
|
31
35
|
import runtimeClaimsContract from "@chainlesschain/session-core/runtime-claims";
|
|
32
36
|
|
|
@@ -108,6 +112,20 @@ export class Orchestrator extends EventEmitter {
|
|
|
108
112
|
/** @type {Map<string, object>} taskId → task */
|
|
109
113
|
this._tasks = new Map();
|
|
110
114
|
|
|
115
|
+
this._legacyReadOnly = cliLegacyRuntimeReadOnly(process.env, {
|
|
116
|
+
entryId: "cli-legacy-orchestrate",
|
|
117
|
+
});
|
|
118
|
+
if (this._legacyReadOnly) {
|
|
119
|
+
this._router = new AgentRouter({
|
|
120
|
+
backends: [],
|
|
121
|
+
maxParallel: this.maxParallel,
|
|
122
|
+
});
|
|
123
|
+
this.notifier = { isConfigured: false };
|
|
124
|
+
this._chat = null;
|
|
125
|
+
this._cronTimer = null;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
111
129
|
// Multi-path agent router
|
|
112
130
|
this._router =
|
|
113
131
|
options.agentRouter ||
|
|
@@ -155,6 +173,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
155
173
|
* @returns {Promise<object>} Final task record
|
|
156
174
|
*/
|
|
157
175
|
async addTask(description, opts = {}) {
|
|
176
|
+
assertCLILegacyMutationAllowed("Orchestrator.addTask");
|
|
158
177
|
const task = {
|
|
159
178
|
id: generateId("task"),
|
|
160
179
|
description,
|
|
@@ -222,12 +241,14 @@ export class Orchestrator extends EventEmitter {
|
|
|
222
241
|
* @param {number} intervalMs - Poll interval (default 600_000 = 10 min)
|
|
223
242
|
*/
|
|
224
243
|
startCronWatch(intervalMs = 600_000) {
|
|
244
|
+
assertCLILegacyMutationAllowed("Orchestrator.startCronWatch");
|
|
225
245
|
if (this._cronTimer) return;
|
|
226
246
|
this._log(`Cron watch started (every ${Math.round(intervalMs / 60_000)}m)`);
|
|
227
247
|
this._cronTimer = setInterval(() => this._cronTick(), intervalMs);
|
|
228
248
|
}
|
|
229
249
|
|
|
230
250
|
stopCronWatch() {
|
|
251
|
+
assertCLILegacyMutationAllowed("Orchestrator.stopCronWatch");
|
|
231
252
|
if (this._cronTimer) {
|
|
232
253
|
clearInterval(this._cronTimer);
|
|
233
254
|
this._cronTimer = null;
|
|
@@ -237,6 +258,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
237
258
|
// ─── Orchestration pipeline ──────────────────────────────────────
|
|
238
259
|
|
|
239
260
|
async _orchestrate(task) {
|
|
261
|
+
assertCLILegacyMutationAllowed("Orchestrator._orchestrate");
|
|
240
262
|
try {
|
|
241
263
|
// Step 1: Decompose
|
|
242
264
|
task.subtasks = await this._decompose(task);
|
|
@@ -264,6 +286,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
264
286
|
|
|
265
287
|
/** LLM-driven task decomposition into coding subtasks. */
|
|
266
288
|
async _decompose(task) {
|
|
289
|
+
assertCLILegacyMutationAllowed("Orchestrator._decompose");
|
|
267
290
|
task.status = TASK_STATUS.DECOMPOSING;
|
|
268
291
|
this.emit("task:decomposing", task);
|
|
269
292
|
|
|
@@ -306,6 +329,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
306
329
|
|
|
307
330
|
/** Dispatch subtasks to the Claude Code pool. */
|
|
308
331
|
async _dispatch(task) {
|
|
332
|
+
assertCLILegacyMutationAllowed("Orchestrator._dispatch");
|
|
309
333
|
this.emit("agents:dispatched", { task, count: task.subtasks.length });
|
|
310
334
|
this._log(
|
|
311
335
|
`Dispatching ${task.subtasks.length} subtask(s) to ${this._router.summary().length} agent backend(s)`,
|
|
@@ -320,6 +344,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
320
344
|
|
|
321
345
|
/** Run CI command and retry loop. */
|
|
322
346
|
async _ciLoop(task) {
|
|
347
|
+
assertCLILegacyMutationAllowed("Orchestrator._ciLoop");
|
|
323
348
|
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
324
349
|
task.status = TASK_STATUS.CI_CHECKING;
|
|
325
350
|
this.emit("ci:checking", { task, attempt });
|
|
@@ -398,6 +423,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
398
423
|
|
|
399
424
|
/** Execute CI command and parse results. */
|
|
400
425
|
_runCI(cwd) {
|
|
426
|
+
assertCLILegacyMutationAllowed("Orchestrator._runCI");
|
|
401
427
|
try {
|
|
402
428
|
const output = _deps.execSync(this.ciCommand, {
|
|
403
429
|
cwd,
|
|
@@ -465,6 +491,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
465
491
|
* the caller has already seen via task:complete / task:failed events.
|
|
466
492
|
*/
|
|
467
493
|
_pruneTasks() {
|
|
494
|
+
assertCLILegacyMutationAllowed("Orchestrator._pruneTasks");
|
|
468
495
|
if (this._tasks.size <= this.maxTasks) return;
|
|
469
496
|
for (const [id, t] of this._tasks) {
|
|
470
497
|
if (this._tasks.size <= this.maxTasks) break;
|
|
@@ -478,6 +505,7 @@ export class Orchestrator extends EventEmitter {
|
|
|
478
505
|
}
|
|
479
506
|
|
|
480
507
|
async _cronTick() {
|
|
508
|
+
assertCLILegacyMutationAllowed("Orchestrator._cronTick");
|
|
481
509
|
this.emit("cron:tick", { at: new Date().toISOString() });
|
|
482
510
|
// Override this method or listen to the event to add input source polling
|
|
483
511
|
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { redactSecrets } from "./secret-scan.js";
|
|
3
|
+
|
|
4
|
+
export const POLICY_DECISION_EVENT_VERSION = 1;
|
|
5
|
+
|
|
6
|
+
const MAX_CHAIN = 8;
|
|
7
|
+
|
|
8
|
+
function boundedText(value, max) {
|
|
9
|
+
if (value == null) return null;
|
|
10
|
+
let text;
|
|
11
|
+
if (typeof value === "string") {
|
|
12
|
+
text = value;
|
|
13
|
+
} else {
|
|
14
|
+
try {
|
|
15
|
+
text = JSON.stringify(value);
|
|
16
|
+
} catch {
|
|
17
|
+
text = String(value);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
const redacted = redactSecrets(String(text));
|
|
21
|
+
return redacted.length > max
|
|
22
|
+
? `${redacted.slice(0, Math.max(0, max - 1))}…`
|
|
23
|
+
: redacted;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function stableValue(value) {
|
|
27
|
+
if (Array.isArray(value)) return value.map(stableValue);
|
|
28
|
+
if (!value || typeof value !== "object") return value;
|
|
29
|
+
return Object.fromEntries(
|
|
30
|
+
Object.keys(value)
|
|
31
|
+
.filter((key) => value[key] !== undefined)
|
|
32
|
+
.sort()
|
|
33
|
+
.map((key) => [key, stableValue(value[key])]),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function digest(value) {
|
|
38
|
+
return `sha256:${createHash("sha256")
|
|
39
|
+
.update(JSON.stringify(stableValue(value)))
|
|
40
|
+
.digest("hex")}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function canonicalDecision(
|
|
44
|
+
value,
|
|
45
|
+
{ blocked = false, requiresApproval = false } = {},
|
|
46
|
+
) {
|
|
47
|
+
const normalized = String(value || "")
|
|
48
|
+
.trim()
|
|
49
|
+
.toLowerCase();
|
|
50
|
+
if (
|
|
51
|
+
blocked ||
|
|
52
|
+
["block", "blocked", "deny", "denied", "decline", "cancel"].includes(
|
|
53
|
+
normalized,
|
|
54
|
+
)
|
|
55
|
+
) {
|
|
56
|
+
return "deny";
|
|
57
|
+
}
|
|
58
|
+
if (
|
|
59
|
+
requiresApproval ||
|
|
60
|
+
["ask", "confirm", "approval_required", "require_confirmation"].includes(
|
|
61
|
+
normalized,
|
|
62
|
+
)
|
|
63
|
+
) {
|
|
64
|
+
return "ask";
|
|
65
|
+
}
|
|
66
|
+
return "allow";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function normalizeChain(value) {
|
|
70
|
+
if (!Array.isArray(value)) return [];
|
|
71
|
+
return value.slice(0, MAX_CHAIN).map((candidate) => {
|
|
72
|
+
const row =
|
|
73
|
+
candidate && typeof candidate === "object" && !Array.isArray(candidate)
|
|
74
|
+
? candidate
|
|
75
|
+
: {};
|
|
76
|
+
return {
|
|
77
|
+
layer: boundedText(row.layer, 80),
|
|
78
|
+
outcome: boundedText(row.outcome, 80),
|
|
79
|
+
via: boundedText(row.via || row.source, 120),
|
|
80
|
+
rule: boundedText(row.rule, 256),
|
|
81
|
+
reason: boundedText(row.reason, 512),
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function finalizePolicyDecision(value) {
|
|
87
|
+
const projection = Object.fromEntries(
|
|
88
|
+
Object.entries(value).filter(([, entry]) => entry !== undefined),
|
|
89
|
+
);
|
|
90
|
+
const policyDigest = digest(projection);
|
|
91
|
+
return Object.freeze({
|
|
92
|
+
type: "policy_decision",
|
|
93
|
+
schema_version: POLICY_DECISION_EVENT_VERSION,
|
|
94
|
+
decision_id:
|
|
95
|
+
boundedText(projection.decision_id, 160) ||
|
|
96
|
+
`policy:${policyDigest.slice("sha256:".length, "sha256:".length + 48)}`,
|
|
97
|
+
...projection,
|
|
98
|
+
policy_digest: policyDigest,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function projectHookPolicyDecision(event = {}) {
|
|
103
|
+
if (event?.type !== "hook_response") return null;
|
|
104
|
+
return finalizePolicyDecision({
|
|
105
|
+
source: "hook",
|
|
106
|
+
decision: canonicalDecision(event.decision, {
|
|
107
|
+
blocked: event.blocked === true || Boolean(event.error),
|
|
108
|
+
requiresApproval: event.requires_approval === true,
|
|
109
|
+
}),
|
|
110
|
+
session_id: boundedText(event.session_id, 160) || undefined,
|
|
111
|
+
turn_id: boundedText(event.turn_id, 160) || undefined,
|
|
112
|
+
tool_use_id: boundedText(event.tool_use_id, 160) || undefined,
|
|
113
|
+
tool: boundedText(event.tool || event.tool_name, 256) || undefined,
|
|
114
|
+
hook_event: boundedText(event.hook_event, 96) || undefined,
|
|
115
|
+
via: boundedText(
|
|
116
|
+
event.via || (event.hook_event ? `hook:${event.hook_event}` : "hook"),
|
|
117
|
+
120,
|
|
118
|
+
),
|
|
119
|
+
reason: event.error ? "hook_runtime_error" : undefined,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function projectToolPolicyDecision(event = {}, context = {}) {
|
|
124
|
+
const permission =
|
|
125
|
+
event?.permission_decision &&
|
|
126
|
+
typeof event.permission_decision === "object" &&
|
|
127
|
+
!Array.isArray(event.permission_decision)
|
|
128
|
+
? event.permission_decision
|
|
129
|
+
: null;
|
|
130
|
+
if (!permission) return null;
|
|
131
|
+
return finalizePolicyDecision({
|
|
132
|
+
decision_id:
|
|
133
|
+
boundedText(permission.id || event.permission_decision_id, 160) ||
|
|
134
|
+
undefined,
|
|
135
|
+
source: "tool",
|
|
136
|
+
decision: canonicalDecision(permission.decision),
|
|
137
|
+
session_id:
|
|
138
|
+
boundedText(context.sessionId || event.session_id, 160) || undefined,
|
|
139
|
+
turn_id: boundedText(context.turnId || event.turn_id, 160) || undefined,
|
|
140
|
+
tool_use_id:
|
|
141
|
+
boundedText(context.toolUseId || event.tool_use_id || event.id, 160) ||
|
|
142
|
+
undefined,
|
|
143
|
+
tool: boundedText(event.tool || permission.tool, 256) || undefined,
|
|
144
|
+
via: boundedText(permission.via, 120) || undefined,
|
|
145
|
+
rule: boundedText(permission.rule, 256) || undefined,
|
|
146
|
+
reason: boundedText(permission.reason, 512) || undefined,
|
|
147
|
+
chain: normalizeChain(permission.chain),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
@@ -2208,7 +2208,7 @@ function cleanupWindowsTemporaryPath(
|
|
|
2208
2208
|
}
|
|
2209
2209
|
if (
|
|
2210
2210
|
!expectedIdentity ||
|
|
2211
|
-
!
|
|
2211
|
+
!sameWindowsFileObjectIdentity(inspected.identity, expectedIdentity)
|
|
2212
2212
|
) {
|
|
2213
2213
|
return false;
|
|
2214
2214
|
}
|
|
@@ -2719,6 +2719,20 @@ function sameWindowsFileIdentity(left, right) {
|
|
|
2719
2719
|
);
|
|
2720
2720
|
}
|
|
2721
2721
|
|
|
2722
|
+
// Cleanup is authorized by the stable file-object identity, not by metadata
|
|
2723
|
+
// that Windows may settle after the helper closes its last write handle. The
|
|
2724
|
+
// strict identity above remains authoritative while content is read or
|
|
2725
|
+
// attested; this cleanup-only comparison still rejects a same-path replacement
|
|
2726
|
+
// because that changes the inode/birth identity.
|
|
2727
|
+
function sameWindowsFileObjectIdentity(left, right) {
|
|
2728
|
+
return (
|
|
2729
|
+
left.dev === right.dev &&
|
|
2730
|
+
left.ino === right.ino &&
|
|
2731
|
+
left.mode === right.mode &&
|
|
2732
|
+
left.birthtimeNs === right.birthtimeNs
|
|
2733
|
+
);
|
|
2734
|
+
}
|
|
2735
|
+
|
|
2722
2736
|
function inspectWindowsAdapterAssembly(runtime, assemblyPath) {
|
|
2723
2737
|
const boundBefore = inspectWindowsAdapterBoundPath(
|
|
2724
2738
|
runtime,
|