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
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { isProxy } from "node:util/types";
|
|
4
|
+
import { resolveHostHooksV2WorkspaceBinding } from "./hooks-v2-workspace-context.js";
|
|
5
|
+
import { normalizeMcpSandboxPolicy } from "./mcp-sandbox-policy.js";
|
|
6
|
+
import { resolvePluginWorkspaceAuthority } from "./plugin-runtime/sandbox-policy.js";
|
|
7
|
+
import { resolveProjectMcpWorkspaceAuthority } from "./project-mcp-trust.js";
|
|
8
|
+
|
|
9
|
+
export const MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE =
|
|
10
|
+
"CC_MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED";
|
|
11
|
+
export const MCP_STDIO_SANDBOX_CWD_INVALID_CODE =
|
|
12
|
+
"CC_MCP_STDIO_SANDBOX_CWD_INVALID";
|
|
13
|
+
|
|
14
|
+
function workspaceError(code, message, cause) {
|
|
15
|
+
const error = new Error(message, cause ? { cause } : undefined);
|
|
16
|
+
error.code = code;
|
|
17
|
+
return error;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function dataProperty(owner, key, fallback) {
|
|
21
|
+
if (!owner || typeof owner !== "object" || isProxy(owner)) {
|
|
22
|
+
throw workspaceError(
|
|
23
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
24
|
+
"MCP stdio sandbox config must be a non-Proxy object",
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, key);
|
|
28
|
+
if (!descriptor) return fallback;
|
|
29
|
+
if (!("value" in descriptor)) {
|
|
30
|
+
throw workspaceError(
|
|
31
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
32
|
+
`MCP stdio sandbox config.${key} must be an own data property`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
return descriptor.value;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function canonicalDirectory(value, label) {
|
|
39
|
+
if (typeof value !== "string" || value.length === 0 || value.includes("\0")) {
|
|
40
|
+
throw workspaceError(
|
|
41
|
+
MCP_STDIO_SANDBOX_CWD_INVALID_CODE,
|
|
42
|
+
`${label} must be a non-empty directory path`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const canonical = fs.realpathSync.native(path.resolve(value));
|
|
47
|
+
if (!fs.statSync(canonical).isDirectory()) {
|
|
48
|
+
throw new Error("not a directory");
|
|
49
|
+
}
|
|
50
|
+
return canonical;
|
|
51
|
+
} catch (cause) {
|
|
52
|
+
throw workspaceError(
|
|
53
|
+
MCP_STDIO_SANDBOX_CWD_INVALID_CODE,
|
|
54
|
+
`${label} must resolve to an existing directory`,
|
|
55
|
+
cause,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function isPathInside(root, candidate) {
|
|
61
|
+
const relative = path.relative(root, candidate);
|
|
62
|
+
return (
|
|
63
|
+
relative === "" ||
|
|
64
|
+
(relative !== ".." &&
|
|
65
|
+
!relative.startsWith(`..${path.sep}`) &&
|
|
66
|
+
!path.isAbsolute(relative))
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function sandboxPolicyFromConfig(config, serverName) {
|
|
71
|
+
const raw = dataProperty(config, "sandboxPolicy", null);
|
|
72
|
+
return normalizeMcpSandboxPolicy(raw, {
|
|
73
|
+
label: `MCP stdio server "${serverName}" sandboxPolicy`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function pluginRootFromConfig(config, deps) {
|
|
78
|
+
if (dataProperty(config, "origin", null) !== "plugin:mcp") return null;
|
|
79
|
+
const resolvePlugin =
|
|
80
|
+
deps.resolvePluginWorkspaceAuthority || resolvePluginWorkspaceAuthority;
|
|
81
|
+
return resolvePlugin(dataProperty(config, "pluginWorkspaceAuthority", null), {
|
|
82
|
+
origin: "plugin:mcp",
|
|
83
|
+
pluginId: dataProperty(config, "pluginId", null),
|
|
84
|
+
pluginVersion: dataProperty(config, "pluginVersion", null),
|
|
85
|
+
pluginSource: dataProperty(config, "pluginSource", null),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function isProjectFileSource(configScope, configSource) {
|
|
90
|
+
return (
|
|
91
|
+
configScope === "project" &&
|
|
92
|
+
typeof configSource === "string" &&
|
|
93
|
+
path.basename(configSource).toLowerCase() === ".mcp.json"
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function requirePublicWorkspaceRoot(
|
|
98
|
+
serverName,
|
|
99
|
+
config,
|
|
100
|
+
workspaceBinding,
|
|
101
|
+
deps,
|
|
102
|
+
) {
|
|
103
|
+
const resolveHost =
|
|
104
|
+
deps.resolveHostWorkspaceBinding || resolveHostHooksV2WorkspaceBinding;
|
|
105
|
+
const binding = resolveHost(workspaceBinding);
|
|
106
|
+
if (!binding?.workspaceRoot) {
|
|
107
|
+
throw workspaceError(
|
|
108
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
109
|
+
`Policy-bearing MCP stdio server "${serverName}" requires a trusted host workspace`,
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const hostRoot = canonicalDirectory(
|
|
113
|
+
binding.workspaceRoot,
|
|
114
|
+
`MCP stdio server "${serverName}" host workspace`,
|
|
115
|
+
);
|
|
116
|
+
const configScope = dataProperty(config, "configScope", null);
|
|
117
|
+
const projectPath = dataProperty(config, "projectPath", null);
|
|
118
|
+
const configSource = dataProperty(config, "configSource", null);
|
|
119
|
+
const projectAuthority = dataProperty(
|
|
120
|
+
config,
|
|
121
|
+
"projectMcpWorkspaceAuthority",
|
|
122
|
+
null,
|
|
123
|
+
);
|
|
124
|
+
const projectFileSource = isProjectFileSource(configScope, configSource);
|
|
125
|
+
|
|
126
|
+
if (
|
|
127
|
+
configScope === "project" &&
|
|
128
|
+
(projectFileSource || projectAuthority) &&
|
|
129
|
+
!projectPath
|
|
130
|
+
) {
|
|
131
|
+
throw workspaceError(
|
|
132
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
133
|
+
`Project MCP stdio server "${serverName}" is missing its project workspace`,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if ((configScope === "local" || configScope === "project") && projectPath) {
|
|
138
|
+
const projectRoot = canonicalDirectory(
|
|
139
|
+
projectPath,
|
|
140
|
+
`MCP stdio server "${serverName}" project workspace`,
|
|
141
|
+
);
|
|
142
|
+
if (!isPathInside(projectRoot, hostRoot)) {
|
|
143
|
+
throw workspaceError(
|
|
144
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
145
|
+
`MCP stdio server "${serverName}" does not belong to the trusted host workspace`,
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (projectAuthority || projectFileSource) {
|
|
150
|
+
const resolveProject =
|
|
151
|
+
deps.resolveProjectMcpWorkspaceAuthority ||
|
|
152
|
+
resolveProjectMcpWorkspaceAuthority;
|
|
153
|
+
const authorityRoot = resolveProject(projectAuthority, {
|
|
154
|
+
configSource,
|
|
155
|
+
serverName,
|
|
156
|
+
url: dataProperty(config, "url", null),
|
|
157
|
+
transport: dataProperty(config, "transport", null),
|
|
158
|
+
headersHelper: dataProperty(config, "headersHelper", null),
|
|
159
|
+
});
|
|
160
|
+
let canonicalAuthorityRoot = null;
|
|
161
|
+
try {
|
|
162
|
+
canonicalAuthorityRoot = authorityRoot
|
|
163
|
+
? canonicalDirectory(
|
|
164
|
+
authorityRoot,
|
|
165
|
+
`MCP stdio server "${serverName}" project authority`,
|
|
166
|
+
)
|
|
167
|
+
: null;
|
|
168
|
+
} catch {
|
|
169
|
+
canonicalAuthorityRoot = null;
|
|
170
|
+
}
|
|
171
|
+
if (canonicalAuthorityRoot !== projectRoot) {
|
|
172
|
+
throw workspaceError(
|
|
173
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
174
|
+
`Project MCP stdio server "${serverName}" is missing its trusted file authority`,
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return hostRoot;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function requestedWorkingDirectory(config, trustedRoot, serverName) {
|
|
184
|
+
const requested = dataProperty(config, "cwd", null);
|
|
185
|
+
if (requested == null || requested === "") return trustedRoot;
|
|
186
|
+
if (typeof requested !== "string" || requested.includes("\0")) {
|
|
187
|
+
throw workspaceError(
|
|
188
|
+
MCP_STDIO_SANDBOX_CWD_INVALID_CODE,
|
|
189
|
+
`MCP stdio server "${serverName}" cwd must be a path`,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
const candidate = canonicalDirectory(
|
|
193
|
+
path.isAbsolute(requested)
|
|
194
|
+
? requested
|
|
195
|
+
: path.resolve(trustedRoot, requested),
|
|
196
|
+
`MCP stdio server "${serverName}" cwd`,
|
|
197
|
+
);
|
|
198
|
+
if (!isPathInside(trustedRoot, candidate)) {
|
|
199
|
+
throw workspaceError(
|
|
200
|
+
MCP_STDIO_SANDBOX_CWD_INVALID_CODE,
|
|
201
|
+
`MCP stdio server "${serverName}" cwd escapes its trusted workspace`,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
return candidate;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Resolve source-declared MCP isolation against an opaque host/plugin
|
|
209
|
+
* workspace capability. A policy-bearing launch never derives authority from
|
|
210
|
+
* process.cwd(); the selected cwd is canonical, existing, and contained by the
|
|
211
|
+
* trusted root before executable identity or Broker contract issuance.
|
|
212
|
+
*/
|
|
213
|
+
export function resolveMcpStdioSandboxContext(
|
|
214
|
+
{ serverName, config, workspaceBinding },
|
|
215
|
+
deps = {},
|
|
216
|
+
) {
|
|
217
|
+
const name = String(serverName || "unknown");
|
|
218
|
+
const sandboxPolicy = sandboxPolicyFromConfig(config, name);
|
|
219
|
+
const pluginWorkspaceRoot = pluginRootFromConfig(config, deps);
|
|
220
|
+
|
|
221
|
+
if (!sandboxPolicy) {
|
|
222
|
+
return Object.freeze({
|
|
223
|
+
sandboxPolicy: null,
|
|
224
|
+
pluginWorkspaceRoot,
|
|
225
|
+
workingDirectory: pluginWorkspaceRoot,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (
|
|
230
|
+
dataProperty(config, "origin", null) === "plugin:mcp" &&
|
|
231
|
+
!pluginWorkspaceRoot
|
|
232
|
+
) {
|
|
233
|
+
throw workspaceError(
|
|
234
|
+
MCP_STDIO_SANDBOX_WORKSPACE_REQUIRED_CODE,
|
|
235
|
+
`Plugin MCP stdio server "${name}" is missing its trusted workspace authority`,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
const trustedRoot = pluginWorkspaceRoot
|
|
240
|
+
? canonicalDirectory(
|
|
241
|
+
pluginWorkspaceRoot,
|
|
242
|
+
`Plugin MCP stdio server "${name}" workspace`,
|
|
243
|
+
)
|
|
244
|
+
: requirePublicWorkspaceRoot(name, config, workspaceBinding, deps);
|
|
245
|
+
const workingDirectory = requestedWorkingDirectory(config, trustedRoot, name);
|
|
246
|
+
|
|
247
|
+
return Object.freeze({
|
|
248
|
+
sandboxPolicy,
|
|
249
|
+
pluginWorkspaceRoot,
|
|
250
|
+
workingDirectory,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
@@ -186,6 +186,7 @@ export class ObservabilityRuntime {
|
|
|
186
186
|
unit: "{invocation}",
|
|
187
187
|
value: 1,
|
|
188
188
|
monotonic: true,
|
|
189
|
+
aggregationTemporality: 1,
|
|
189
190
|
attributes,
|
|
190
191
|
},
|
|
191
192
|
{
|
|
@@ -194,6 +195,7 @@ export class ObservabilityRuntime {
|
|
|
194
195
|
unit: "ms",
|
|
195
196
|
count: 1,
|
|
196
197
|
sum: durationMs,
|
|
198
|
+
aggregationTemporality: 1,
|
|
197
199
|
attributes,
|
|
198
200
|
},
|
|
199
201
|
]);
|
|
@@ -924,7 +924,7 @@ export class OtlpExporter {
|
|
|
924
924
|
description: metric.description || "",
|
|
925
925
|
unit: metric.unit || "1",
|
|
926
926
|
histogram: {
|
|
927
|
-
aggregationTemporality: 2,
|
|
927
|
+
aggregationTemporality: metric.aggregationTemporality === 1 ? 1 : 2,
|
|
928
928
|
dataPoints: [
|
|
929
929
|
{
|
|
930
930
|
...point,
|
|
@@ -945,7 +945,7 @@ export class OtlpExporter {
|
|
|
945
945
|
: { asDouble: Number(metric.value) || 0 };
|
|
946
946
|
const data = { dataPoints: [{ ...point, ...number }] };
|
|
947
947
|
if (metric.type === "sum" || metric.type === "counter") {
|
|
948
|
-
data.aggregationTemporality = 2;
|
|
948
|
+
data.aggregationTemporality = metric.aggregationTemporality === 1 ? 1 : 2;
|
|
949
949
|
data.isMonotonic = metric.monotonic !== false;
|
|
950
950
|
return {
|
|
951
951
|
name: metric.name,
|
|
@@ -46,6 +46,13 @@ export const _deps = {
|
|
|
46
46
|
tmpdir: () => os.tmpdir(),
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
+
// A real Windows sidecar performs path, lock-token and digest checks before it
|
|
50
|
+
// publishes the readiness marker. Loaded hosted runners have exceeded the old
|
|
51
|
+
// 10 second allowance while still completing successfully. Keep the parent in
|
|
52
|
+
// charge of the lock until the marker is verified, but give the safety
|
|
53
|
+
// preflight a bounded budget that also covers heavily contended machines.
|
|
54
|
+
export const WINDOWS_SIDECAR_READY_TIMEOUT_MS = 30_000;
|
|
55
|
+
|
|
49
56
|
export async function scheduleReplace(ctx = {}) {
|
|
50
57
|
const {
|
|
51
58
|
newExePath,
|
|
@@ -778,7 +785,7 @@ function scheduleWindowsTransaction(ctx) {
|
|
|
778
785
|
waitForReadyImpl({
|
|
779
786
|
readyPath,
|
|
780
787
|
transactionId,
|
|
781
|
-
timeoutMs:
|
|
788
|
+
timeoutMs: WINDOWS_SIDECAR_READY_TIMEOUT_MS,
|
|
782
789
|
child,
|
|
783
790
|
}),
|
|
784
791
|
) && !childError;
|
|
@@ -18,8 +18,41 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import fs from "node:fs";
|
|
21
|
+
import { createRequire } from "node:module";
|
|
21
22
|
import path from "node:path";
|
|
22
23
|
|
|
24
|
+
function capsuleBuilderAssets(cliRoot) {
|
|
25
|
+
const requireFromCli = createRequire(path.join(cliRoot, "package.json"));
|
|
26
|
+
const realpath = fs.realpathSync.native || fs.realpathSync;
|
|
27
|
+
let packageJsonPath;
|
|
28
|
+
try {
|
|
29
|
+
packageJsonPath = realpath(
|
|
30
|
+
requireFromCli.resolve("esbuild-wasm/package.json"),
|
|
31
|
+
);
|
|
32
|
+
} catch (cause) {
|
|
33
|
+
throw new Error(
|
|
34
|
+
`Cannot resolve the pinned esbuild-wasm package for pkg assets: ${cause.message}`,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
const packageRoot = path.dirname(packageJsonPath);
|
|
38
|
+
const sourceAssets = [
|
|
39
|
+
packageJsonPath,
|
|
40
|
+
path.join(packageRoot, "lib", "browser.js"),
|
|
41
|
+
path.join(packageRoot, "esbuild.wasm"),
|
|
42
|
+
path.join(cliRoot, "src", "lib", "mcp-stdio-capsule-builder-worker.cjs"),
|
|
43
|
+
path.join(cliRoot, "src", "lib", "mcp-stdio-immutable-vfs-resolver.cjs"),
|
|
44
|
+
];
|
|
45
|
+
for (const asset of sourceAssets) {
|
|
46
|
+
const stat = fs.lstatSync(asset);
|
|
47
|
+
if (stat.isSymbolicLink() || !stat.isFile()) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`Pinned capsule builder pkg asset is not a regular file: ${asset}`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return sourceAssets.map((asset) => realpath(asset));
|
|
54
|
+
}
|
|
55
|
+
|
|
23
56
|
/**
|
|
24
57
|
* @param {object} ctx
|
|
25
58
|
* @param {string} ctx.cliRoot packages/cli/
|
|
@@ -396,6 +429,7 @@ export function generatePkgConfig(ctx) {
|
|
|
396
429
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.exe`,
|
|
397
430
|
`${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox.cs`,
|
|
398
431
|
`${posixify(cliRoot)}/install/install.ps1`,
|
|
432
|
+
...capsuleBuilderAssets(cliRoot).map(posixify),
|
|
399
433
|
];
|
|
400
434
|
if (prebuildsDir) assets.push(`${posixify(prebuildsDir)}/**/*`);
|
|
401
435
|
// Project mode: bundle the collected .chainlesschain/ snapshot as an asset.
|
|
@@ -20,6 +20,28 @@ const SUPPORTED_BOUNDARIES = new Set(PLUGIN_SANDBOX_BOUNDARIES);
|
|
|
20
20
|
const PLUGIN_WORKSPACE_AUTHORITY_KIND = "trusted-plugin-workspace";
|
|
21
21
|
const pluginWorkspaceAuthorities = new WeakMap();
|
|
22
22
|
|
|
23
|
+
function directoryGeneration(stat) {
|
|
24
|
+
return stat.birthtimeNs > 0n
|
|
25
|
+
? `birth:${stat.birthtimeNs.toString()}`
|
|
26
|
+
: `ctime:${stat.ctimeNs.toString()}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function directoryIdentity(stat) {
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
device: stat.dev,
|
|
32
|
+
inode: stat.ino,
|
|
33
|
+
generation: directoryGeneration(stat),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function sameDirectoryIdentity(left, right) {
|
|
38
|
+
return (
|
|
39
|
+
left.device === right.dev &&
|
|
40
|
+
left.inode === right.ino &&
|
|
41
|
+
left.generation === directoryGeneration(right)
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
23
45
|
function invalidPolicy(message) {
|
|
24
46
|
const error = new Error(message);
|
|
25
47
|
error.code = "ERR_PLUGIN_SANDBOX_POLICY_INVALID";
|
|
@@ -69,7 +91,7 @@ export function issuePluginWorkspaceAuthority(value = {}) {
|
|
|
69
91
|
try {
|
|
70
92
|
const implementation = fs.realpathSync.native || fs.realpathSync;
|
|
71
93
|
canonicalRoot = implementation.call(fs.realpathSync, requestedRoot);
|
|
72
|
-
stat = fs.statSync(canonicalRoot);
|
|
94
|
+
stat = fs.statSync(canonicalRoot, { bigint: true });
|
|
73
95
|
} catch {
|
|
74
96
|
throw invalidPolicy("trusted plugin workspace root is unavailable");
|
|
75
97
|
}
|
|
@@ -92,7 +114,11 @@ export function issuePluginWorkspaceAuthority(value = {}) {
|
|
|
92
114
|
});
|
|
93
115
|
pluginWorkspaceAuthorities.set(
|
|
94
116
|
authority,
|
|
95
|
-
Object.freeze({
|
|
117
|
+
Object.freeze({
|
|
118
|
+
root: canonicalRoot,
|
|
119
|
+
identity: directoryIdentity(stat),
|
|
120
|
+
provenance,
|
|
121
|
+
}),
|
|
96
122
|
);
|
|
97
123
|
return authority;
|
|
98
124
|
}
|
|
@@ -117,6 +143,20 @@ export function resolvePluginWorkspaceAuthority(authority, provenance = {}) {
|
|
|
117
143
|
) {
|
|
118
144
|
return null;
|
|
119
145
|
}
|
|
146
|
+
try {
|
|
147
|
+
const implementation = fs.realpathSync.native || fs.realpathSync;
|
|
148
|
+
const currentRoot = implementation.call(fs.realpathSync, binding.root);
|
|
149
|
+
const currentStat = fs.statSync(currentRoot, { bigint: true });
|
|
150
|
+
if (
|
|
151
|
+
currentRoot !== binding.root ||
|
|
152
|
+
!currentStat.isDirectory() ||
|
|
153
|
+
!sameDirectoryIdentity(binding.identity, currentStat)
|
|
154
|
+
) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
} catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
120
160
|
return binding.root;
|
|
121
161
|
}
|
|
122
162
|
|