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
|
@@ -11,7 +11,14 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import crypto from "node:crypto";
|
|
14
|
+
import fs from "node:fs";
|
|
15
|
+
import path from "node:path";
|
|
14
16
|
import { isProxy } from "node:util/types";
|
|
17
|
+
import {
|
|
18
|
+
currentHostHooksV2WorkspaceBinding,
|
|
19
|
+
resolveHostHooksV2WorkspaceBinding,
|
|
20
|
+
} from "./hooks-v2-workspace-context.js";
|
|
21
|
+
import { resolvePluginWorkspaceAuthority } from "./plugin-runtime/sandbox-policy.js";
|
|
15
22
|
|
|
16
23
|
export const MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE =
|
|
17
24
|
"CC_MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED";
|
|
@@ -175,6 +182,7 @@ function invocationSnapshot(serverName, config) {
|
|
|
175
182
|
dataProperty(config, "projectPath", null),
|
|
176
183
|
"projectPath",
|
|
177
184
|
),
|
|
185
|
+
cwd: scalar(dataProperty(config, "cwd", null), "cwd"),
|
|
178
186
|
pluginId: scalar(dataProperty(config, "pluginId", null), "pluginId"),
|
|
179
187
|
pluginVersion: scalar(
|
|
180
188
|
dataProperty(config, "pluginVersion", null),
|
|
@@ -205,6 +213,8 @@ function comparableSnapshot(snapshot) {
|
|
|
205
213
|
projectMcpWorkspaceAuthority: _projectAuthority,
|
|
206
214
|
...plain
|
|
207
215
|
} = snapshot;
|
|
216
|
+
void _pluginAuthority;
|
|
217
|
+
void _projectAuthority;
|
|
208
218
|
return plain;
|
|
209
219
|
}
|
|
210
220
|
|
|
@@ -224,6 +234,116 @@ function sameSnapshot(expected, actual) {
|
|
|
224
234
|
);
|
|
225
235
|
}
|
|
226
236
|
|
|
237
|
+
function directoryGeneration(stat) {
|
|
238
|
+
return stat.birthtimeNs > 0n
|
|
239
|
+
? `birth:${stat.birthtimeNs.toString()}`
|
|
240
|
+
: `ctime:${stat.ctimeNs.toString()}`;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function captureDirectoryIdentity(value, base, label) {
|
|
244
|
+
if (typeof value !== "string" || value.length === 0 || value.includes("\0")) {
|
|
245
|
+
throw new TypeError(`${label} must be a non-empty directory path`);
|
|
246
|
+
}
|
|
247
|
+
const requestedPath = path.isAbsolute(value)
|
|
248
|
+
? path.resolve(value)
|
|
249
|
+
: path.resolve(base, value);
|
|
250
|
+
let canonicalRoot;
|
|
251
|
+
let stat;
|
|
252
|
+
try {
|
|
253
|
+
const implementation = fs.realpathSync.native || fs.realpathSync;
|
|
254
|
+
canonicalRoot = implementation.call(fs.realpathSync, requestedPath);
|
|
255
|
+
stat = fs.statSync(canonicalRoot, { bigint: true });
|
|
256
|
+
} catch (cause) {
|
|
257
|
+
throw new TypeError(`${label} must resolve to an existing directory`, {
|
|
258
|
+
cause,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
if (!stat.isDirectory()) {
|
|
262
|
+
throw new TypeError(`${label} must resolve to a directory`);
|
|
263
|
+
}
|
|
264
|
+
return Object.freeze({
|
|
265
|
+
requestedPath,
|
|
266
|
+
canonicalRoot,
|
|
267
|
+
device: stat.dev,
|
|
268
|
+
inode: stat.ino,
|
|
269
|
+
generation: directoryGeneration(stat),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function sameDirectoryIdentity(expected, actual) {
|
|
274
|
+
return (
|
|
275
|
+
expected.canonicalRoot === actual.canonicalRoot &&
|
|
276
|
+
expected.device === actual.device &&
|
|
277
|
+
expected.inode === actual.inode &&
|
|
278
|
+
expected.generation === actual.generation
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function verifyDirectoryIdentity(binding) {
|
|
283
|
+
try {
|
|
284
|
+
return sameDirectoryIdentity(
|
|
285
|
+
binding,
|
|
286
|
+
captureDirectoryIdentity(
|
|
287
|
+
binding.requestedPath,
|
|
288
|
+
process.cwd(),
|
|
289
|
+
"approved MCP stdio cwd",
|
|
290
|
+
),
|
|
291
|
+
);
|
|
292
|
+
} catch {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function approvedWorkspaceRoot(snapshot, workspaceRoot, workspaceBinding) {
|
|
298
|
+
if (snapshot.origin === "plugin:mcp") {
|
|
299
|
+
const pluginRoot = resolvePluginWorkspaceAuthority(
|
|
300
|
+
snapshot.pluginWorkspaceAuthority,
|
|
301
|
+
{
|
|
302
|
+
origin: snapshot.origin,
|
|
303
|
+
pluginId: snapshot.pluginId,
|
|
304
|
+
pluginVersion: snapshot.pluginVersion,
|
|
305
|
+
pluginSource: snapshot.pluginSource,
|
|
306
|
+
},
|
|
307
|
+
);
|
|
308
|
+
if (pluginRoot) return pluginRoot;
|
|
309
|
+
}
|
|
310
|
+
if (workspaceBinding != null) {
|
|
311
|
+
const resolvedBinding =
|
|
312
|
+
resolveHostHooksV2WorkspaceBinding(workspaceBinding);
|
|
313
|
+
if (!resolvedBinding?.workspaceRoot) {
|
|
314
|
+
throw new TypeError(
|
|
315
|
+
"approved MCP stdio workspace binding is invalid or stale",
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
return resolvedBinding.workspaceRoot;
|
|
319
|
+
}
|
|
320
|
+
if (typeof workspaceRoot === "string" && workspaceRoot.length > 0) {
|
|
321
|
+
return workspaceRoot;
|
|
322
|
+
}
|
|
323
|
+
const hostRoot = currentHostHooksV2WorkspaceBinding()?.workspaceRoot;
|
|
324
|
+
if (hostRoot) return hostRoot;
|
|
325
|
+
if (typeof snapshot.projectPath === "string" && snapshot.projectPath) {
|
|
326
|
+
return snapshot.projectPath;
|
|
327
|
+
}
|
|
328
|
+
return process.cwd();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function captureApprovedCwd(snapshot, workspaceRoot, workspaceBinding) {
|
|
332
|
+
if (snapshot.sandboxPolicy == null || snapshot.cwd == null) return null;
|
|
333
|
+
return captureDirectoryIdentity(
|
|
334
|
+
snapshot.cwd,
|
|
335
|
+
approvedWorkspaceRoot(snapshot, workspaceRoot, workspaceBinding),
|
|
336
|
+
"approved MCP stdio cwd",
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function staleDirectoryError(serverName) {
|
|
341
|
+
return authorityError(
|
|
342
|
+
MCP_STDIO_EXECUTION_AUTHORITY_STALE_CODE,
|
|
343
|
+
`MCP stdio working directory for "${String(serverName)}" changed after approval`,
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
227
347
|
function materializeSnapshot(snapshot) {
|
|
228
348
|
return {
|
|
229
349
|
command: snapshot.command,
|
|
@@ -237,6 +357,7 @@ function materializeSnapshot(snapshot) {
|
|
|
237
357
|
configScope: snapshot.configScope,
|
|
238
358
|
configSource: snapshot.configSource,
|
|
239
359
|
projectPath: snapshot.projectPath,
|
|
360
|
+
cwd: snapshot.cwd,
|
|
240
361
|
pluginId: snapshot.pluginId,
|
|
241
362
|
pluginVersion: snapshot.pluginVersion,
|
|
242
363
|
pluginSource: snapshot.pluginSource,
|
|
@@ -254,6 +375,8 @@ export function issueMcpStdioExecutionAuthority({
|
|
|
254
375
|
config,
|
|
255
376
|
approvalKind,
|
|
256
377
|
approvalSource,
|
|
378
|
+
workspaceRoot,
|
|
379
|
+
workspaceBinding,
|
|
257
380
|
}) {
|
|
258
381
|
if (!APPROVAL_KINDS.has(approvalKind)) {
|
|
259
382
|
throw new TypeError("MCP stdio approval kind is not recognized");
|
|
@@ -261,6 +384,11 @@ export function issueMcpStdioExecutionAuthority({
|
|
|
261
384
|
const source = scalar(approvalSource, "approvalSource", { nullable: false });
|
|
262
385
|
if (!source.trim()) throw new TypeError("approvalSource must not be empty");
|
|
263
386
|
const snapshot = invocationSnapshot(serverName, config);
|
|
387
|
+
const cwdIdentity = captureApprovedCwd(
|
|
388
|
+
snapshot,
|
|
389
|
+
workspaceRoot,
|
|
390
|
+
workspaceBinding,
|
|
391
|
+
);
|
|
264
392
|
const token = Object.freeze({});
|
|
265
393
|
issuedAuthorities.set(
|
|
266
394
|
token,
|
|
@@ -269,6 +397,7 @@ export function issueMcpStdioExecutionAuthority({
|
|
|
269
397
|
approvalSource: source,
|
|
270
398
|
fingerprint: snapshotDigest(snapshot),
|
|
271
399
|
snapshot,
|
|
400
|
+
cwdIdentity,
|
|
272
401
|
}),
|
|
273
402
|
);
|
|
274
403
|
return token;
|
|
@@ -309,6 +438,9 @@ export function consumeMcpStdioExecutionAuthority(
|
|
|
309
438
|
`MCP stdio invocation for "${String(serverName)}" changed after approval`,
|
|
310
439
|
);
|
|
311
440
|
}
|
|
441
|
+
if (issued.cwdIdentity && !verifyDirectoryIdentity(issued.cwdIdentity)) {
|
|
442
|
+
throw staleDirectoryError(serverName);
|
|
443
|
+
}
|
|
312
444
|
const approval = Object.freeze({
|
|
313
445
|
approvalKind: issued.approvalKind,
|
|
314
446
|
approvalSource: issued.approvalSource,
|
|
@@ -336,6 +468,9 @@ export function renewMcpStdioExecutionAuthority(
|
|
|
336
468
|
`MCP stdio reconnect invocation for "${String(serverName)}" changed after approval`,
|
|
337
469
|
);
|
|
338
470
|
}
|
|
471
|
+
if (issued.cwdIdentity && !verifyDirectoryIdentity(issued.cwdIdentity)) {
|
|
472
|
+
throw staleDirectoryError(serverName);
|
|
473
|
+
}
|
|
339
474
|
const token = Object.freeze({});
|
|
340
475
|
issuedAuthorities.set(token, issued);
|
|
341
476
|
return token;
|
|
@@ -352,6 +487,34 @@ export function materializeApprovedMcpStdioInvocation(approval) {
|
|
|
352
487
|
return materializeSnapshot(issued.snapshot);
|
|
353
488
|
}
|
|
354
489
|
|
|
490
|
+
export function verifyMcpStdioApprovedWorkingDirectory(
|
|
491
|
+
approval,
|
|
492
|
+
workingDirectory,
|
|
493
|
+
) {
|
|
494
|
+
const issued = renewableApprovals.get(approval);
|
|
495
|
+
if (!issued) {
|
|
496
|
+
throw authorityError(
|
|
497
|
+
MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
|
|
498
|
+
"MCP stdio working directory requires a consumed execution approval",
|
|
499
|
+
);
|
|
500
|
+
}
|
|
501
|
+
if (!issued.cwdIdentity) return true;
|
|
502
|
+
let actual;
|
|
503
|
+
try {
|
|
504
|
+
actual = captureDirectoryIdentity(
|
|
505
|
+
workingDirectory,
|
|
506
|
+
process.cwd(),
|
|
507
|
+
"materialized MCP stdio cwd",
|
|
508
|
+
);
|
|
509
|
+
} catch {
|
|
510
|
+
throw staleDirectoryError(issued.snapshot.serverName);
|
|
511
|
+
}
|
|
512
|
+
if (!sameDirectoryIdentity(issued.cwdIdentity, actual)) {
|
|
513
|
+
throw staleDirectoryError(issued.snapshot.serverName);
|
|
514
|
+
}
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
|
|
355
518
|
/**
|
|
356
519
|
* Return only the content-free provenance needed to key a durable executable
|
|
357
520
|
* identity. The approval object itself remains an unforgeable WeakMap-backed
|