chainlesschain 0.163.2 → 0.163.4
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/package.json +3 -2
- package/scripts/command-lifecycle-report.mjs +330 -38
- package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
- package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
- package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
- package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
- package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
- package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
- package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
- package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
- package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
- package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
- package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
- package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
- package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
- package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
- package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
- package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
- package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
- package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
- package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
- package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
- package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
- package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
- package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
- package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
- package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
- package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
- package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
- package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
- package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
- package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
- package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +2 -2
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/artifacts.js +98 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +218 -31
- package/src/commands/review.js +221 -22
- package/src/commands/session-mcp-recovery.js +5 -5
- package/src/data/changelog.json +27 -1
- package/src/gateways/ws/ws-agent-handler.js +492 -14
- package/src/harness/jsonl-session-store.js +39 -1
- package/src/harness/mcp-client.js +414 -71
- package/src/harness/prompt-compressor.js +24 -0
- package/src/harness/provider-backed-compaction.js +205 -0
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- package/src/lib/app-preview.js +3 -0
- package/src/lib/background-agent-supervisor.js +790 -186
- package/src/lib/background-command-argv.js +318 -0
- package/src/lib/background-launch-profile.js +1 -0
- package/src/lib/background-phase-reporter.js +22 -2
- package/src/lib/background-worktree-policy.js +109 -0
- package/src/lib/command-lifecycle-report.js +1340 -145
- package/src/lib/cowork-mcp-tools.js +51 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/delivery-coordinator.js +30 -5
- package/src/lib/delivery-production-adapter.js +1777 -0
- package/src/lib/delivery-production-runner.js +240 -0
- package/src/lib/durable-security-store.js +29 -17
- package/src/lib/execution-trace/trace-context.cjs +179 -0
- package/src/lib/execution-trace/trace-context.js +8 -175
- package/src/lib/mcp-call-ledger-store.js +58 -6
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-host-recovery-runtime.js +2 -0
- package/src/lib/mcp-ledger-recovery-admission.js +39 -3
- package/src/lib/mcp-recovery-adjudication.js +256 -19
- package/src/lib/mcp-sandbox-policy.js +184 -0
- package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
- package/src/lib/mcp-stdio-executable-identity.js +33 -2
- package/src/lib/mcp-stdio-execution-authority.js +163 -0
- package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
- package/src/lib/mcp-stdio-package-materialization.js +721 -333
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/observability/index.js +2 -0
- package/src/lib/observability/otlp-exporter.js +2 -2
- package/src/lib/packer/pack-update-applier.js +8 -1
- package/src/lib/packer/pkg-config-generator.js +34 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +213 -109
- package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/scheduler-kernel/contract.js +315 -0
- package/src/lib/scheduler-kernel/store.js +1345 -0
- package/src/lib/session-host-lease.js +403 -30
- package/src/lib/session-persistence-failure.js +4 -1
- package/src/lib/skill-mcp.js +65 -4
- package/src/lib/sub-agent-context.js +8 -0
- package/src/lib/web-fetch.js +4 -4
- package/src/repl/agent-repl.js +285 -38
- package/src/runtime/agent-core.js +1044 -90
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/headless-runner.js +260 -166
- package/src/runtime/headless-stream.js +254 -25
- package/src/runtime/mcp-config.js +235 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
- package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
- package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
- package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
- package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
|
@@ -34,13 +34,16 @@ export const MCP_CALL_LEDGER_EVENT = "mcp_call_ledger";
|
|
|
34
34
|
export const MCP_CALL_LEDGER_EVENT_SCHEMA_VERSION = 1;
|
|
35
35
|
export const MCP_CALL_RECOVERY_ADJUDICATION_EVENT =
|
|
36
36
|
"mcp_call_recovery_adjudication";
|
|
37
|
-
export const MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION =
|
|
37
|
+
export const MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION = 2;
|
|
38
38
|
export const McpCallRecoveryDecision = Object.freeze({
|
|
39
39
|
CONFIRMED_APPLIED: "confirmed_applied",
|
|
40
40
|
CONFIRMED_NOT_APPLIED: "confirmed_not_applied",
|
|
41
41
|
});
|
|
42
42
|
export const MCP_CALL_RECOVERY_AUTHORITY = "local-cli-tty";
|
|
43
|
-
export const MCP_CALL_RECOVERY_CONFIRMATION =
|
|
43
|
+
export const MCP_CALL_RECOVERY_CONFIRMATION =
|
|
44
|
+
"typed-digest-host-authority-revoke";
|
|
45
|
+
export const MCP_CALL_RECOVERY_LEGACY_CONFIRMATION =
|
|
46
|
+
"typed-digest-host-stopped";
|
|
44
47
|
|
|
45
48
|
const TERMINAL = new Set([
|
|
46
49
|
McpCallStatus.COMPLETED,
|
|
@@ -86,7 +89,7 @@ const EFFECT_CONTRACT_FIELDS = new Set([
|
|
|
86
89
|
]);
|
|
87
90
|
const OUTPUT_SUMMARY_FIELDS = new Set(["sha256", "bytes", "kind"]);
|
|
88
91
|
const ERROR_SUMMARY_FIELDS = new Set(["name", "code", "messageDigest"]);
|
|
89
|
-
const
|
|
92
|
+
const LEGACY_ADJUDICATION_FIELDS = new Set([
|
|
90
93
|
"schemaVersion",
|
|
91
94
|
"requestId",
|
|
92
95
|
"sessionId",
|
|
@@ -98,6 +101,18 @@ const ADJUDICATION_FIELDS = new Set([
|
|
|
98
101
|
"confirmation",
|
|
99
102
|
"reasonDigest",
|
|
100
103
|
]);
|
|
104
|
+
const ADJUDICATION_FIELDS = new Set([
|
|
105
|
+
...LEGACY_ADJUDICATION_FIELDS,
|
|
106
|
+
"hostRevocation",
|
|
107
|
+
]);
|
|
108
|
+
const HOST_REVOCATION_FIELDS = new Set([
|
|
109
|
+
"requestId",
|
|
110
|
+
"revocationEpoch",
|
|
111
|
+
"targetLeaseId",
|
|
112
|
+
"targetFencingToken",
|
|
113
|
+
"targetOwnerPid",
|
|
114
|
+
]);
|
|
115
|
+
const HOST_LEASE_ID = /^lease-[0-9a-f-]{36}$/;
|
|
101
116
|
const RECOVERY_PROJECTION_FIELDS = new Set([
|
|
102
117
|
"sessionId",
|
|
103
118
|
"records",
|
|
@@ -414,9 +429,32 @@ function stableSorted(values) {
|
|
|
414
429
|
}
|
|
415
430
|
|
|
416
431
|
function canonicalAdjudication(value) {
|
|
432
|
+
const legacy = value?.schemaVersion === 1;
|
|
433
|
+
const validConfirmation =
|
|
434
|
+
(legacy && value?.confirmation === MCP_CALL_RECOVERY_LEGACY_CONFIRMATION) ||
|
|
435
|
+
(value?.schemaVersion === MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION &&
|
|
436
|
+
value?.confirmation === MCP_CALL_RECOVERY_CONFIRMATION);
|
|
437
|
+
const fields = legacy ? LEGACY_ADJUDICATION_FIELDS : ADJUDICATION_FIELDS;
|
|
438
|
+
const revocation = value?.hostRevocation;
|
|
439
|
+
const targetIsNull = revocation?.targetLeaseId === null;
|
|
440
|
+
const validRevocation =
|
|
441
|
+
legacy ||
|
|
442
|
+
(hasExactFields(revocation, HOST_REVOCATION_FIELDS) &&
|
|
443
|
+
revocation.requestId === value?.requestId &&
|
|
444
|
+
Number.isSafeInteger(revocation.revocationEpoch) &&
|
|
445
|
+
revocation.revocationEpoch >= 1 &&
|
|
446
|
+
(targetIsNull
|
|
447
|
+
? revocation.targetFencingToken === null &&
|
|
448
|
+
revocation.targetOwnerPid === null
|
|
449
|
+
: HOST_LEASE_ID.test(String(revocation.targetLeaseId || "")) &&
|
|
450
|
+
Number.isSafeInteger(revocation.targetFencingToken) &&
|
|
451
|
+
revocation.targetFencingToken >= 1 &&
|
|
452
|
+
Number.isSafeInteger(revocation.targetOwnerPid) &&
|
|
453
|
+
revocation.targetOwnerPid >= 1));
|
|
417
454
|
if (
|
|
418
|
-
!hasExactFields(value,
|
|
419
|
-
|
|
455
|
+
!hasExactFields(value, fields) ||
|
|
456
|
+
!validConfirmation ||
|
|
457
|
+
!validRevocation ||
|
|
420
458
|
!isCanonicalProtocolText(
|
|
421
459
|
value.requestId,
|
|
422
460
|
MCP_CALL_LEDGER_PROTOCOL_LIMITS.identifier,
|
|
@@ -433,7 +471,6 @@ function canonicalAdjudication(value) {
|
|
|
433
471
|
!RAW_AUTHORITY_HASH.test(String(value.expectedHeadHash || "")) ||
|
|
434
472
|
!PAYLOAD_DIGEST.test(String(value.expectedRecoveryDigest || "")) ||
|
|
435
473
|
value.authority !== MCP_CALL_RECOVERY_AUTHORITY ||
|
|
436
|
-
value.confirmation !== MCP_CALL_RECOVERY_CONFIRMATION ||
|
|
437
474
|
!PAYLOAD_DIGEST.test(String(value.reasonDigest || ""))
|
|
438
475
|
) {
|
|
439
476
|
return null;
|
|
@@ -449,6 +486,17 @@ function canonicalAdjudication(value) {
|
|
|
449
486
|
authority: value.authority,
|
|
450
487
|
confirmation: value.confirmation,
|
|
451
488
|
reasonDigest: value.reasonDigest,
|
|
489
|
+
...(legacy
|
|
490
|
+
? {}
|
|
491
|
+
: {
|
|
492
|
+
hostRevocation: Object.freeze({
|
|
493
|
+
requestId: revocation.requestId,
|
|
494
|
+
revocationEpoch: revocation.revocationEpoch,
|
|
495
|
+
targetLeaseId: revocation.targetLeaseId,
|
|
496
|
+
targetFencingToken: revocation.targetFencingToken,
|
|
497
|
+
targetOwnerPid: revocation.targetOwnerPid,
|
|
498
|
+
}),
|
|
499
|
+
}),
|
|
452
500
|
});
|
|
453
501
|
}
|
|
454
502
|
|
|
@@ -546,6 +594,10 @@ export function computeMcpRecoveryFenceDigest(recovery = {}) {
|
|
|
546
594
|
authority: entry?.authority || null,
|
|
547
595
|
confirmation: entry?.confirmation || null,
|
|
548
596
|
reasonDigest: entry?.reasonDigest || null,
|
|
597
|
+
...(entry?.schemaVersion ===
|
|
598
|
+
MCP_CALL_RECOVERY_ADJUDICATION_SCHEMA_VERSION
|
|
599
|
+
? { hostRevocation: entry?.hostRevocation || null }
|
|
600
|
+
: {}),
|
|
549
601
|
})),
|
|
550
602
|
),
|
|
551
603
|
replayDenied: stableSorted(
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
+
import { isProxy } from "node:util/types";
|
|
3
4
|
import executionBroker from "./process-execution-broker/index.js";
|
|
4
5
|
import hookShellCommand from "./hook-shell-command.cjs";
|
|
5
6
|
import {
|
|
@@ -9,6 +10,7 @@ import {
|
|
|
9
10
|
import { checkLocalMcpHeadersHelperTrust } from "./mcp-headers-helper-trust.js";
|
|
10
11
|
import { resolvePluginWorkspaceAuthority } from "./plugin-runtime/sandbox-policy.js";
|
|
11
12
|
import { resolveProjectMcpWorkspaceAuthority } from "./project-mcp-trust.js";
|
|
13
|
+
import { normalizeMcpSandboxPolicy } from "./mcp-sandbox-policy.js";
|
|
12
14
|
|
|
13
15
|
const { buildExplicitHookShellInvocation } = hookShellCommand;
|
|
14
16
|
|
|
@@ -42,6 +44,45 @@ function helperError(code, message) {
|
|
|
42
44
|
return error;
|
|
43
45
|
}
|
|
44
46
|
|
|
47
|
+
function declaredSandboxPolicy(config) {
|
|
48
|
+
if (!config || typeof config !== "object" || isProxy(config)) {
|
|
49
|
+
throw helperError(
|
|
50
|
+
"CC_MCP_SANDBOX_POLICY_INVALID",
|
|
51
|
+
"MCP headersHelper sandbox policy owner must be a non-Proxy object",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const descriptor = Object.getOwnPropertyDescriptor(config, "sandboxPolicy");
|
|
55
|
+
if (!descriptor) return null;
|
|
56
|
+
if (!("value" in descriptor)) {
|
|
57
|
+
throw helperError(
|
|
58
|
+
"CC_MCP_SANDBOX_POLICY_INVALID",
|
|
59
|
+
"MCP headersHelper sandboxPolicy must be an own data property",
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return normalizeMcpSandboxPolicy(descriptor.value, {
|
|
63
|
+
label: "MCP headersHelper sandboxPolicy",
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function sandboxExecution(config, sandboxPolicy, fallbackOrigin) {
|
|
68
|
+
if (!sandboxPolicy) return null;
|
|
69
|
+
return Object.freeze({
|
|
70
|
+
origin:
|
|
71
|
+
typeof config.origin === "string" && config.origin.length > 0
|
|
72
|
+
? config.origin
|
|
73
|
+
: fallbackOrigin,
|
|
74
|
+
policy:
|
|
75
|
+
typeof config.policy === "string" && config.policy.length > 0
|
|
76
|
+
? config.policy
|
|
77
|
+
: "allow",
|
|
78
|
+
scope:
|
|
79
|
+
typeof config.scope === "string" && config.scope.length > 0
|
|
80
|
+
? config.scope
|
|
81
|
+
: "mcp",
|
|
82
|
+
sandboxPolicy,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
45
86
|
function normalizeHelperCommand(value) {
|
|
46
87
|
if (
|
|
47
88
|
typeof value !== "string" ||
|
|
@@ -89,6 +130,16 @@ function canonicalHelperCwd(value, realpath = fs.realpathSync.native) {
|
|
|
89
130
|
return canonical;
|
|
90
131
|
}
|
|
91
132
|
|
|
133
|
+
function hasInvalidHeaderValueCharacter(value) {
|
|
134
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
135
|
+
const code = value.charCodeAt(index);
|
|
136
|
+
if (code <= 0x08 || (code >= 0x0a && code <= 0x1f) || code === 0x7f) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
|
|
92
143
|
function normalizeHeaderMap(value, source) {
|
|
93
144
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
94
145
|
throw helperError(
|
|
@@ -108,7 +159,7 @@ function normalizeHeaderMap(value, source) {
|
|
|
108
159
|
if (
|
|
109
160
|
!HEADER_NAME.test(name) ||
|
|
110
161
|
typeof headerValue !== "string" ||
|
|
111
|
-
|
|
162
|
+
hasInvalidHeaderValueCharacter(headerValue) ||
|
|
112
163
|
Buffer.byteLength(headerValue, "utf8") > MAX_HEADER_VALUE_BYTES ||
|
|
113
164
|
(source === "dynamic" && TRANSPORT_OWNED_HEADERS.has(name.toLowerCase()))
|
|
114
165
|
) {
|
|
@@ -138,6 +189,7 @@ function isPathInside(root, candidate) {
|
|
|
138
189
|
* plugin configs must carry the collector-issued opaque plugin authority.
|
|
139
190
|
*/
|
|
140
191
|
export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
|
|
192
|
+
const sandboxPolicy = declaredSandboxPolicy(config);
|
|
141
193
|
if (config.origin === "plugin:mcp") {
|
|
142
194
|
const resolvePlugin =
|
|
143
195
|
deps.resolvePluginWorkspaceAuthority || resolvePluginWorkspaceAuthority;
|
|
@@ -156,17 +208,15 @@ export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
|
|
|
156
208
|
return {
|
|
157
209
|
cwd: pluginRoot,
|
|
158
210
|
pluginRoot,
|
|
159
|
-
execution: {
|
|
211
|
+
execution: Object.freeze({
|
|
160
212
|
origin: config.origin,
|
|
161
213
|
policy: config.policy || "allow",
|
|
162
214
|
scope: config.scope || "mcp",
|
|
163
215
|
pluginId: config.pluginId,
|
|
164
216
|
pluginVersion: config.pluginVersion,
|
|
165
217
|
pluginSource: config.pluginSource,
|
|
166
|
-
...(
|
|
167
|
-
|
|
168
|
-
: {}),
|
|
169
|
-
},
|
|
218
|
+
...(sandboxPolicy ? { sandboxPolicy } : {}),
|
|
219
|
+
}),
|
|
170
220
|
};
|
|
171
221
|
}
|
|
172
222
|
|
|
@@ -253,12 +303,30 @@ export function resolveMcpHeadersHelperContext(config = {}, deps = {}) {
|
|
|
253
303
|
);
|
|
254
304
|
}
|
|
255
305
|
}
|
|
256
|
-
return {
|
|
306
|
+
return {
|
|
307
|
+
cwd: binding.workspaceRoot,
|
|
308
|
+
pluginRoot: null,
|
|
309
|
+
execution: sandboxExecution(
|
|
310
|
+
config,
|
|
311
|
+
sandboxPolicy,
|
|
312
|
+
`mcp:headers-helper:${scope}`,
|
|
313
|
+
),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
if (sandboxPolicy && !binding?.workspaceRoot) {
|
|
317
|
+
throw helperError(
|
|
318
|
+
"CC_MCP_HEADERS_HELPER_UNTRUSTED_WORKSPACE",
|
|
319
|
+
"Policy-bearing MCP headersHelper requires a trusted host workspace",
|
|
320
|
+
);
|
|
257
321
|
}
|
|
258
322
|
return {
|
|
259
323
|
cwd: binding?.workspaceRoot || path.resolve(deps.cwd || process.cwd()),
|
|
260
324
|
pluginRoot: null,
|
|
261
|
-
execution:
|
|
325
|
+
execution: sandboxExecution(
|
|
326
|
+
config,
|
|
327
|
+
sandboxPolicy,
|
|
328
|
+
`mcp:headers-helper:${scope}`,
|
|
329
|
+
),
|
|
262
330
|
};
|
|
263
331
|
}
|
|
264
332
|
|
|
@@ -98,6 +98,7 @@ export function createMcpHostRecoveryRuntime({
|
|
|
98
98
|
recovery = null,
|
|
99
99
|
recoveryError = null,
|
|
100
100
|
controller = null,
|
|
101
|
+
dispatchAdmission = null,
|
|
101
102
|
} = {}) {
|
|
102
103
|
const admissionController = tightenRecoveryController(
|
|
103
104
|
controller,
|
|
@@ -120,6 +121,7 @@ export function createMcpHostRecoveryRuntime({
|
|
|
120
121
|
resolveEffect: (serverName, toolName) =>
|
|
121
122
|
resolveHostMcpEffect(bundle, serverName, toolName),
|
|
122
123
|
sessionId,
|
|
124
|
+
dispatchAdmission,
|
|
123
125
|
})
|
|
124
126
|
: rawClient;
|
|
125
127
|
return Object.freeze({
|
|
@@ -813,6 +813,7 @@ export function createRecoveryGuardedMcpClient({
|
|
|
813
813
|
controller,
|
|
814
814
|
resolveEffect = null,
|
|
815
815
|
sessionId = null,
|
|
816
|
+
dispatchAdmission = null,
|
|
816
817
|
} = {}) {
|
|
817
818
|
if (!client || typeof client.callTool !== "function") {
|
|
818
819
|
throw new TypeError("MCP client wrapper requires client.callTool()");
|
|
@@ -826,6 +827,9 @@ export function createRecoveryGuardedMcpClient({
|
|
|
826
827
|
if (resolveEffect != null && typeof resolveEffect !== "function") {
|
|
827
828
|
throw new TypeError("MCP client effect resolver must be a function");
|
|
828
829
|
}
|
|
830
|
+
if (dispatchAdmission != null && typeof dispatchAdmission !== "function") {
|
|
831
|
+
throw new TypeError("MCP client dispatch admission must be a function");
|
|
832
|
+
}
|
|
829
833
|
|
|
830
834
|
const existingGuard = GUARDED_MCP_CLIENTS.get(client);
|
|
831
835
|
if (existingGuard) {
|
|
@@ -833,7 +837,8 @@ export function createRecoveryGuardedMcpClient({
|
|
|
833
837
|
existingGuard.ledger === ledger &&
|
|
834
838
|
existingGuard.controller === controller &&
|
|
835
839
|
existingGuard.resolveEffect === resolveEffect &&
|
|
836
|
-
existingGuard.sessionId === sessionId
|
|
840
|
+
existingGuard.sessionId === sessionId &&
|
|
841
|
+
existingGuard.dispatchAdmission === dispatchAdmission
|
|
837
842
|
) {
|
|
838
843
|
return client;
|
|
839
844
|
}
|
|
@@ -850,6 +855,33 @@ export function createRecoveryGuardedMcpClient({
|
|
|
850
855
|
// Snapshot before the first await. Admission, durable identity and the raw
|
|
851
856
|
// transport all receive this exact deeply-frozen JSON value.
|
|
852
857
|
const inputSnapshot = snapshotMcpJsonRpcInput(input);
|
|
858
|
+
let callOptions = rest;
|
|
859
|
+
if (dispatchAdmission) {
|
|
860
|
+
const supplied = rest[0];
|
|
861
|
+
if (
|
|
862
|
+
supplied != null &&
|
|
863
|
+
(typeof supplied !== "object" ||
|
|
864
|
+
Array.isArray(supplied) ||
|
|
865
|
+
isProxy(supplied))
|
|
866
|
+
) {
|
|
867
|
+
throw new TypeError("MCP call options must be a plain object");
|
|
868
|
+
}
|
|
869
|
+
const merged = {};
|
|
870
|
+
if (supplied) {
|
|
871
|
+
for (const key of Reflect.ownKeys(supplied)) {
|
|
872
|
+
if (typeof key !== "string") {
|
|
873
|
+
throw new TypeError("MCP call options cannot contain symbols");
|
|
874
|
+
}
|
|
875
|
+
const descriptor = Object.getOwnPropertyDescriptor(supplied, key);
|
|
876
|
+
if (!descriptor || !("value" in descriptor)) {
|
|
877
|
+
throw new TypeError("MCP call options cannot contain accessors");
|
|
878
|
+
}
|
|
879
|
+
merged[key] = descriptor.value;
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
merged.dispatchAdmission = dispatchAdmission;
|
|
883
|
+
callOptions = [merged, ...rest.slice(1)];
|
|
884
|
+
}
|
|
853
885
|
const effect = await resolveHostEffectContract(
|
|
854
886
|
resolveEffect,
|
|
855
887
|
client,
|
|
@@ -871,10 +903,13 @@ export function createRecoveryGuardedMcpClient({
|
|
|
871
903
|
serverName,
|
|
872
904
|
toolName,
|
|
873
905
|
inputSnapshot,
|
|
874
|
-
...
|
|
906
|
+
...callOptions,
|
|
875
907
|
]);
|
|
876
908
|
} catch (callError) {
|
|
877
|
-
if (
|
|
909
|
+
if (
|
|
910
|
+
effect.effectContract.effect !== McpEffect.READ &&
|
|
911
|
+
safeProperty(callError, "dispatched") !== false
|
|
912
|
+
) {
|
|
878
913
|
throw outcomeUnknown(
|
|
879
914
|
controller,
|
|
880
915
|
ticket,
|
|
@@ -1060,6 +1095,7 @@ export function createRecoveryGuardedMcpClient({
|
|
|
1060
1095
|
controller,
|
|
1061
1096
|
resolveEffect,
|
|
1062
1097
|
sessionId,
|
|
1098
|
+
dispatchAdmission,
|
|
1063
1099
|
});
|
|
1064
1100
|
return wrappedClient;
|
|
1065
1101
|
}
|