chainlesschain 0.163.1 → 0.163.3
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 +1 -1
- package/src/assets/web-panel/assets/{AIOps-Cn7quRgL.js → AIOps-DIY6KxV-.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-YqMX3ueH.js → ActionButton-BXH0muPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bxmy1b7Y.js → Analytics-D39w8vmg.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-DBOw69jE.js → AppLayout-CUU1zvLs.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-mq1nyzN1.js → Artifacts-D8azHO3T.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-mMiKtZ0D.js → Audit-D0tAwXTg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-WBUjpYVh.js → BackgroundAgents-C29mhJll.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-c25OoJgs.js → Backup-D6Aa1Gro.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BbfWhZ4-.js → BaseInput-B1uoHbPQ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CVVzsTwU.js → Chat-Bs4DLOR5.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVCjZJ04.js → ChatBubbleRenderer-DUYIBSle.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-C9o2HK-1.js → Checkbox-CNcBPEa4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B7X5LfKc.js → Codegen-CIY89763.js} +1 -1
- package/src/assets/web-panel/assets/{Col-jpPj2Pur.js → Col-CsPYFmgo.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Dti6bHxN.js → Community-BBocEge4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-S4ZsLt3W.js → Compact-TQ8Ux0Lf.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bge0sQ3O.js → Compliance-DfBsZTft.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C4XyzVI7.js → Cowork-Cg-I6FVH.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CPR0v2xy.js → Cron-DTQzfRTp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DAX8lDaj.js → Crosschain-DGxEKGpR.js} +1 -1
- package/src/assets/web-panel/assets/{DID-fBHPa0QH.js → DID-DLZ1RDSr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-vvaUTafU.js → Dashboard-XneICKNI.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DyaQM63v.js → Dropdown-BRU00J1-.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CAF0wiU2.js → EmailListRenderer-BzCbJuAy.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-ia-WzDRs.js → FamilyGuardDashboard-D7BRyNBG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Cz3gHoT5.js → Federation-D9DeFIhW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CJQDJr4Q.js → FormItemContext-6rAtA9Ko.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B05BZlQp.js → GenericCardRenderer-8Hqy80pU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DT0YcQnI.js → Git-Cmvkj1rt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Bqbl6m5Q.js → Governance-BRiQUjjw.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BdebLR0N.js → Inference-CKN_EzVf.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-M36b8YYV.js → KnowledgeGraph-BCDHwpwQ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-5LN_XL43.js → Logs-DK9ovhaB.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BCb1Dm8l.js → MarkdownRenderer-D53pHiHy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BkIin-QY.js → Marketplace-BILPGakp.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bkppx8Uj.js → McpTools-DTVCOr9-.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Qk9wg_Ib.js → Memory-Hzc1iow4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BsTDU3Aj.js → MobileBridge-GXfgnGYV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CrZW5I28.js → MobileProjects-B-3TJWsS.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BMkmgtsA.js → Mtc-DwSJMWtK.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-6m4CC0Yn.js → MtcAudit-D2uxf-DA.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BZ8yB7QV.js → Multisig-DG6kbKK0.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CxitAMIO.js → NLProgramming-f5p49EDU.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bv0msnHu.js → Notes-FUgHyzSD.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DeVMqM3P.js → NotificationSettings-DCHGee7e.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CXBSWa3R.js → OrderTableRenderer-Dm6LlIoa.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-b_G5Vs1Q.js → Organization-BawA7qAg.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DW7riOmA.js → Overflow-D6a5wZU1.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CtpQNYjL.js → P2P-K8WavwnA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Ba63yT4l.js → PdhVaultBrowser-4JAJYaqx.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DnzyeB67.js → Permissions-BDWvi8PD.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DbPZ7HWw.js → PersonalDataHub-DF_K4E9i.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-gs_HOThJ.js → Pipeline-BYeZlesI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CZlQ1EjE.js → Privacy-BIHlgnIc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DQp__Ccb.js → ProjectInit-Cvf-6B5P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7h2sOWZ.js → ProjectSettings-CnwfJrRz.js} +2 -2
- package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +1 -0
- package/src/assets/web-panel/assets/Providers-CxC7JuYv.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-B_8M1-FC.js → QrScannerModal-VLf3gAfL.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bpycr8WD.js → QuickAsk-B5vGjRiF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Z4TrcNzs.js → Recommend--UW4iYs-.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BD6TsJlS.js → RemoteSession-DMSPcfKR.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-IKxDXHEu.js → Reputation-kQXlEHmj.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DbmR20tJ.js → Row-CxGu3pit.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CLjA5PPf.js → RssFeed-Bi5lo8MZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Bm3owbIU.js → Search-Cq_H5RTh.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CY4RyOuq.js → Security-YFbmkaQS.js} +2 -2
- package/src/assets/web-panel/assets/{Services-CYO9qrd_.js → Services-DLOGdaLm.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ClF51Go6.js → Skeleton-CteIxb3D.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CccopaIZ.js +1 -0
- package/src/assets/web-panel/assets/{Sla-zqpDUxzP.js → Sla-AzfEQKX1.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DPSi8Qco.js → SpeechSettings-ekGo5l77.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CqABopsQ.js → SyncSettings-BmZmAgYH.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-D7q3Z4uL.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Dzl6f0M2.js → Templates-CX1Tgeka.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-XeZkw40a.js → Tenant-Zc59jF4i.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CYw2YzPm.js → Terminal-CXOD7y83.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Bc2pko4i.js → TimelineRenderer-B1aBHPBo.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CfCenOHx.js → Tokens-zALlOq_U.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DTz-_YqV.js → Trigger-CQfJMXaq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CB3tt3Z6.js → Trust-BU0RcM-w.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-y1ykmMvU.js → UkeySign-IFZ3HsbH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-UlZ_lX0e.js → VideoEditing-BzslgW0v.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DMBaHTha.js → Wallet-BZAcQNS6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cksm-hBI.js → WebAuthn-CBK1DMi0.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BhOa40sX.js → WorkflowEditor-BlMTPzO-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DNbeSTDO.js → chat-B51-8QVn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-9zz8gBmW.js → colors-504RTByU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-D7aoVv-5.js → compact-item-C-GP6IQM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DYg7B8nd.js → createContext-DOkIj7ID.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BNbhkcoI.js → hasIn-DN7V-_FW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeD1wWA8.js → index--n-ZciV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da0SysnX.js → index-7jIqHbzw.js} +1 -1
- package/src/assets/web-panel/assets/{index--TvoQ6UC.js → index-B2-x9bS8.js} +1 -1
- package/src/assets/web-panel/assets/{index-m2pXS3W2.js → index-BFIFJ5Dr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzDDeZBo.js → index-B_vGU-Js.js} +1 -1
- package/src/assets/web-panel/assets/{index-gNKj00Fx.js → index-Bkxhaeta.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8LC0nvw.js → index-By6u5IV1.js} +1 -1
- package/src/assets/web-panel/assets/index-Bya64sZE.js +1 -0
- package/src/assets/web-panel/assets/{index-B8irlIUK.js → index-C0k_Nqg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9zUawcE.js → index-C3TSohzc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPojutcZ.js → index-C4DV_5uA.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZPDbEh-L.js → index-C8UltbXK.js} +1 -1
- package/src/assets/web-panel/assets/{index-jS6NASar.js → index-C9_48OzU.js} +1 -1
- package/src/assets/web-panel/assets/{index-67GdrUx2.js → index-CKTfZyfU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYu-F-gp.js → index-CP2A226L.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cq3l0L7C.js → index-CUhQpiYv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtQzs0hH.js → index-CX78k-qf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bdxe0nrD.js → index-CYopNjcJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-uc8Rz96X.js → index-Cao5DZy7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnTM8FWK.js → index-CfiEM64n.js} +3 -3
- package/src/assets/web-panel/assets/{index-DHskwmwI.js → index-ConjaJro.js} +1 -1
- package/src/assets/web-panel/assets/{index-CA72qB1n.js → index-CqcLo5WV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn-JFqEi.js → index-CySTJKeq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUWmZ059.js → index-D1phyca8.js} +1 -1
- package/src/assets/web-panel/assets/{index-_-Vt1Wqk.js → index-D9LyiN-L.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIljkSt9.js → index-DA2f1UV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9TzVW7i.js → index-DAOpQvl_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRKukX1W.js → index-DE-hmI2l.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIMVe3HJ.js → index-DEMPUVa3.js} +1 -1
- package/src/assets/web-panel/assets/index-D_FWpDZM.js +1 -0
- package/src/assets/web-panel/assets/{index-FlBuITVG.js → index-DaA__-q1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cqy-hqD9.js → index-FcV8J_Qz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpEIwp4A.js → index-P2mfY27Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-nnmo3ipi.js → index-et5JIPHO.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmEIFaRm.js → index-f4Bo4KXm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMrqEsOS.js → index-kAqQXfP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV06YdPO.js → index-kt_5rfcZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN6-OEgS.js → index-so8eIIxF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRd1zkLB.js → index-yYTQZypF.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D0mTMUGz.js → initDefaultProps-CPYEIdpV.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DK16p4-o.js → motion-Cjim9pxs.js} +1 -1
- package/src/assets/web-panel/assets/{move-DalC20HC.js → move-DuU-cgz3.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B5RusszF.js → mtc-parser-DJHNAkta.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C9Mhitht.js → omit-DSQBgdBj.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-51xQLgwM.js → pickAttrs-CTmT_j5m.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CJzIqp8u.js → placementArrow-Lfm6v-r4.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-HQvC19u4.js → responsiveObserve-CgrcPcDi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C6hhabOp.js → slide-CuE3110i.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Q1r48-oc.js → statusUtils-DiK5nbpf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-UakVWrHs.js → styleChecker-DPEJdQaZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Dmv94cxx.js → useFlexGapSupport-CnnodGmp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DrxOnt_V.js → useFs-DWF84Yav.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BVf2M-Hg.js → usePersonalDataHub-a5b5Dw2f.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BzzW9qKH.js → vnode-DAluzXOq.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C1ZvMgAZ.js → zoom-Dokg7uAZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +245 -30
- package/src/data/changelog.json +28 -2
- package/src/harness/mcp-client.js +256 -43
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- 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/cowork-mcp-tools.js +52 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/cowork-task-templates.js +1 -0
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-sandbox-policy.js +155 -0
- package/src/lib/mcp-stdio-executable-identity.js +75 -11
- package/src/lib/mcp-stdio-execution-authority.js +168 -0
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +495 -126
- package/src/lib/process-execution-broker/platform-sandbox.js +1424 -189
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +5 -4
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/skill-mcp.js +74 -3
- package/src/lib/web-fetch.js +4 -4
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/mcp-config.js +238 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-DdCpNRNt.js +0 -1
- package/src/assets/web-panel/assets/Providers-CyvtUkUf.js +0 -1
- package/src/assets/web-panel/assets/Skills-CCCEmSf5.js +0 -1
- package/src/assets/web-panel/assets/Tasks-4dbAJng4.js +0 -1
- package/src/assets/web-panel/assets/devWarning-uadaGF_y.js +0 -1
- package/src/assets/web-panel/assets/index-C7zhie9M.js +0 -1
- package/src/assets/web-panel/assets/index-Cmbg0Wbr.js +0 -1
|
@@ -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
|
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { isProxy } from "node:util/types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Declarative sandbox boundaries an external MCP source may require.
|
|
5
|
+
*
|
|
6
|
+
* Internal broker guarantees (for example process-tree and code-snapshot) are
|
|
7
|
+
* deliberately not part of this source-controlled contract. A trusted host
|
|
8
|
+
* may add its own non-removable requirements after this value is normalized.
|
|
9
|
+
*/
|
|
10
|
+
export const MCP_SANDBOX_BOUNDARIES = Object.freeze(["filesystem", "network"]);
|
|
11
|
+
|
|
12
|
+
export const MCP_SANDBOX_POLICY_INVALID_CODE = "CC_MCP_SANDBOX_POLICY_INVALID";
|
|
13
|
+
export const MCP_STDIO_CWD_INVALID_CODE = "CC_MCP_STDIO_SANDBOX_CWD_INVALID";
|
|
14
|
+
|
|
15
|
+
const SUPPORTED_BOUNDARIES = new Set(MCP_SANDBOX_BOUNDARIES);
|
|
16
|
+
const MAX_BOUNDARY_DECLARATIONS = 32;
|
|
17
|
+
|
|
18
|
+
function invalidPolicy(message) {
|
|
19
|
+
const error = new TypeError(message);
|
|
20
|
+
error.code = MCP_SANDBOX_POLICY_INVALID_CODE;
|
|
21
|
+
return error;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function invalidCwd(message) {
|
|
25
|
+
const error = new TypeError(message);
|
|
26
|
+
error.code = MCP_STDIO_CWD_INVALID_CODE;
|
|
27
|
+
return error;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Read an optional stdio working directory without invoking accessors or Proxy
|
|
32
|
+
* traps. Absence means "retain/default" while null and the empty string are an
|
|
33
|
+
* explicit clear. Every other value must be a NUL-free string.
|
|
34
|
+
*/
|
|
35
|
+
export function readMcpStdioCwd(owner, options = {}) {
|
|
36
|
+
const label =
|
|
37
|
+
typeof options.label === "string" && options.label.length > 0
|
|
38
|
+
? options.label
|
|
39
|
+
: "MCP stdio config";
|
|
40
|
+
if (!owner || typeof owner !== "object" || isProxy(owner)) {
|
|
41
|
+
throw invalidCwd(`${label} must be a non-Proxy object`);
|
|
42
|
+
}
|
|
43
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, "cwd");
|
|
44
|
+
if (!descriptor) return { present: false, cwd: null };
|
|
45
|
+
if (!("value" in descriptor)) {
|
|
46
|
+
throw invalidCwd(`${label}.cwd must be an own data property`);
|
|
47
|
+
}
|
|
48
|
+
const value = descriptor.value;
|
|
49
|
+
if (value == null || value === "") return { present: true, cwd: null };
|
|
50
|
+
if (typeof value !== "string" || value.includes("\0")) {
|
|
51
|
+
throw invalidCwd(`${label}.cwd must be a NUL-free path string`);
|
|
52
|
+
}
|
|
53
|
+
return { present: true, cwd: value };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function ownDataDescriptor(value, key, label) {
|
|
57
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
58
|
+
if (!descriptor || !("value" in descriptor)) {
|
|
59
|
+
throw invalidPolicy(`${label} must be an own data property`);
|
|
60
|
+
}
|
|
61
|
+
return descriptor;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function normalizeRequiredBoundaries(value, label) {
|
|
65
|
+
if (!Array.isArray(value) || isProxy(value)) {
|
|
66
|
+
throw invalidPolicy(`${label} must be a non-Proxy array`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const lengthDescriptor = ownDataDescriptor(
|
|
70
|
+
value,
|
|
71
|
+
"length",
|
|
72
|
+
`${label}.length`,
|
|
73
|
+
);
|
|
74
|
+
const length = lengthDescriptor.value;
|
|
75
|
+
if (length > MAX_BOUNDARY_DECLARATIONS) {
|
|
76
|
+
throw invalidPolicy(
|
|
77
|
+
`${label} exceeds ${MAX_BOUNDARY_DECLARATIONS} boundary declarations`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
const allowedKeys = new Set(["length"]);
|
|
81
|
+
const requiredBoundaries = new Set();
|
|
82
|
+
|
|
83
|
+
for (let index = 0; index < length; index += 1) {
|
|
84
|
+
const key = String(index);
|
|
85
|
+
allowedKeys.add(key);
|
|
86
|
+
const descriptor = ownDataDescriptor(value, key, `${label}[${index}]`);
|
|
87
|
+
const boundary = descriptor.value;
|
|
88
|
+
if (typeof boundary !== "string" || !SUPPORTED_BOUNDARIES.has(boundary)) {
|
|
89
|
+
throw invalidPolicy(`${label} contains an unsupported boundary`);
|
|
90
|
+
}
|
|
91
|
+
requiredBoundaries.add(boundary);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
95
|
+
if (typeof key !== "string" || !allowedKeys.has(key)) {
|
|
96
|
+
throw invalidPolicy(
|
|
97
|
+
`${label} contains unsupported property: ${String(key)}`,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return Object.freeze([...requiredBoundaries].sort());
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Normalize an MCP source's small declarative sandbox contract.
|
|
107
|
+
*
|
|
108
|
+
* The input is treated as untrusted data: Proxy objects, inherited/accessor
|
|
109
|
+
* fields, non-plain objects, and unknown fields are rejected without invoking
|
|
110
|
+
* user-controlled code. `null` and an empty policy retain the legacy meaning
|
|
111
|
+
* of "no source-declared requirements".
|
|
112
|
+
*
|
|
113
|
+
* @param {unknown} value
|
|
114
|
+
* @param {{label?: string}} [options]
|
|
115
|
+
* @returns {{requiredBoundaries: readonly string[]}|null}
|
|
116
|
+
*/
|
|
117
|
+
export function normalizeMcpSandboxPolicy(value, options = {}) {
|
|
118
|
+
const label =
|
|
119
|
+
typeof options.label === "string" && options.label.length > 0
|
|
120
|
+
? options.label
|
|
121
|
+
: "sandboxPolicy";
|
|
122
|
+
|
|
123
|
+
if (value === undefined || value === null) return null;
|
|
124
|
+
if (typeof value !== "object" || Array.isArray(value) || isProxy(value)) {
|
|
125
|
+
throw invalidPolicy(`${label} must be a non-Proxy plain object`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const prototype = Object.getPrototypeOf(value);
|
|
129
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
130
|
+
throw invalidPolicy(`${label} must be a plain object`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const keys = Reflect.ownKeys(value);
|
|
134
|
+
for (const key of keys) {
|
|
135
|
+
if (key !== "requiredBoundaries") {
|
|
136
|
+
throw invalidPolicy(
|
|
137
|
+
`${label} contains unsupported field: ${String(key)}`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (!keys.includes("requiredBoundaries")) return null;
|
|
143
|
+
const descriptor = ownDataDescriptor(
|
|
144
|
+
value,
|
|
145
|
+
"requiredBoundaries",
|
|
146
|
+
`${label}.requiredBoundaries`,
|
|
147
|
+
);
|
|
148
|
+
const requiredBoundaries = normalizeRequiredBoundaries(
|
|
149
|
+
descriptor.value,
|
|
150
|
+
`${label}.requiredBoundaries`,
|
|
151
|
+
);
|
|
152
|
+
if (requiredBoundaries.length === 0) return null;
|
|
153
|
+
|
|
154
|
+
return Object.freeze({ requiredBoundaries });
|
|
155
|
+
}
|
|
@@ -41,6 +41,10 @@ export const MCP_STDIO_EXECUTABLE_AUTHORITY_REPLAYED_CODE =
|
|
|
41
41
|
"CC_MCP_STDIO_EXECUTABLE_AUTHORITY_REPLAYED";
|
|
42
42
|
export const MCP_STDIO_EXECUTABLE_IDENTITY_ROLLBACK_CODE =
|
|
43
43
|
"CC_MCP_STDIO_EXECUTABLE_IDENTITY_ROLLBACK";
|
|
44
|
+
export const MCP_STDIO_RUNTIME_KIND_REQUIRED_CODE =
|
|
45
|
+
"CC_MCP_STDIO_RUNTIME_KIND_REQUIRED";
|
|
46
|
+
export const MCP_STDIO_RUNTIME_KIND_INVALID_CODE =
|
|
47
|
+
"CC_MCP_STDIO_RUNTIME_KIND_INVALID";
|
|
44
48
|
export const MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND =
|
|
45
49
|
"strict-mcp-node-capsule";
|
|
46
50
|
export const MCP_STDIO_CAPSULE_CODE_SNAPSHOT_BOUNDARY = "code-snapshot";
|
|
@@ -54,6 +58,17 @@ const HASH_CHUNK_BYTES = 1024 * 1024;
|
|
|
54
58
|
const issuedLaunchAuthorities = new WeakMap();
|
|
55
59
|
const issuedCapsuleSandboxContracts = new WeakMap();
|
|
56
60
|
|
|
61
|
+
export const MCP_STDIO_RUNTIME_KINDS = Object.freeze([
|
|
62
|
+
"native",
|
|
63
|
+
"node",
|
|
64
|
+
"python",
|
|
65
|
+
"posix-shell",
|
|
66
|
+
"powershell",
|
|
67
|
+
"java",
|
|
68
|
+
"dotnet",
|
|
69
|
+
]);
|
|
70
|
+
const MCP_STDIO_RUNTIME_KIND_SET = new Set(MCP_STDIO_RUNTIME_KINDS);
|
|
71
|
+
|
|
57
72
|
const DYNAMIC_LAUNCHERS = new Set([
|
|
58
73
|
"bunx",
|
|
59
74
|
"corepack",
|
|
@@ -391,6 +406,46 @@ function executableBasename(value) {
|
|
|
391
406
|
.toLowerCase();
|
|
392
407
|
}
|
|
393
408
|
|
|
409
|
+
function inferredRuntimeKind(commandPath) {
|
|
410
|
+
const name = executableBasename(commandPath);
|
|
411
|
+
if (["node", "nodejs"].includes(name)) return "node";
|
|
412
|
+
if (/^python(?:w)?(?:\d+(?:\.\d+)*)?$/.test(name)) return "python";
|
|
413
|
+
if (["bash", "dash", "ksh", "sh", "zsh"].includes(name)) {
|
|
414
|
+
return "posix-shell";
|
|
415
|
+
}
|
|
416
|
+
if (["powershell", "pwsh"].includes(name)) return "powershell";
|
|
417
|
+
if (name === "java") return "java";
|
|
418
|
+
if (name === "dotnet") return "dotnet";
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
export function resolveMcpStdioRuntimeKind(commandPath, requestedKind = null) {
|
|
423
|
+
const inferred = inferredRuntimeKind(commandPath);
|
|
424
|
+
if (requestedKind != null) {
|
|
425
|
+
if (
|
|
426
|
+
typeof requestedKind !== "string" ||
|
|
427
|
+
!MCP_STDIO_RUNTIME_KIND_SET.has(requestedKind)
|
|
428
|
+
) {
|
|
429
|
+
throw identityError(
|
|
430
|
+
MCP_STDIO_RUNTIME_KIND_INVALID_CODE,
|
|
431
|
+
`MCP stdio runtimeKind must be one of: ${MCP_STDIO_RUNTIME_KINDS.join(", ")}`,
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
if (inferred && requestedKind !== inferred) {
|
|
435
|
+
throw identityError(
|
|
436
|
+
MCP_STDIO_RUNTIME_KIND_INVALID_CODE,
|
|
437
|
+
`MCP stdio runtimeKind "${requestedKind}" conflicts with recognized ${inferred} executable "${executableBasename(commandPath)}"`,
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
return requestedKind;
|
|
441
|
+
}
|
|
442
|
+
if (inferred) return inferred;
|
|
443
|
+
throw identityError(
|
|
444
|
+
MCP_STDIO_RUNTIME_KIND_REQUIRED_CODE,
|
|
445
|
+
`MCP stdio executable "${executableBasename(commandPath)}" has no recognized runtime semantics; set runtimeKind explicitly before trusting it`,
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
|
|
394
449
|
function materializeLaunchEnvironment(hostEnv, configEnv) {
|
|
395
450
|
const launch = sanitizeMcpStdioHostEnvironment(hostEnv);
|
|
396
451
|
for (const [key, value] of Object.entries(configEnv || {})) {
|
|
@@ -617,8 +672,7 @@ function localEntrypoint(value, cwd, label) {
|
|
|
617
672
|
: path.resolve(cwd, value);
|
|
618
673
|
}
|
|
619
674
|
|
|
620
|
-
function interpreterEntrypoints(
|
|
621
|
-
const name = executableBasename(commandPath);
|
|
675
|
+
function interpreterEntrypoints(runtimeKind, args, cwd) {
|
|
622
676
|
const values = [...args];
|
|
623
677
|
const entry = (index, role = "entrypoint") => [
|
|
624
678
|
{
|
|
@@ -627,7 +681,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
627
681
|
role,
|
|
628
682
|
},
|
|
629
683
|
];
|
|
630
|
-
if (
|
|
684
|
+
if (runtimeKind === "node") {
|
|
631
685
|
for (let index = 0; index < values.length; index += 1) {
|
|
632
686
|
const value = values[index];
|
|
633
687
|
if (["-e", "--eval", "-p", "--print"].includes(value)) return [];
|
|
@@ -655,7 +709,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
655
709
|
"MCP stdio Node launch must provide a script or inline program",
|
|
656
710
|
);
|
|
657
711
|
}
|
|
658
|
-
if (
|
|
712
|
+
if (runtimeKind === "python") {
|
|
659
713
|
for (let index = 0; index < values.length; index += 1) {
|
|
660
714
|
const value = values[index];
|
|
661
715
|
if (value === "-c") return [];
|
|
@@ -673,7 +727,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
673
727
|
"MCP stdio Python launch must provide a script or inline program",
|
|
674
728
|
);
|
|
675
729
|
}
|
|
676
|
-
if (
|
|
730
|
+
if (runtimeKind === "posix-shell") {
|
|
677
731
|
const inline = values.findIndex((value) => value === "-c");
|
|
678
732
|
if (inline >= 0) return [];
|
|
679
733
|
const index = values.findIndex((value) => !value.startsWith("-"));
|
|
@@ -683,7 +737,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
683
737
|
"MCP stdio shell launch must provide a script or inline command",
|
|
684
738
|
);
|
|
685
739
|
}
|
|
686
|
-
if (
|
|
740
|
+
if (runtimeKind === "powershell") {
|
|
687
741
|
const fileIndex = values.findIndex((value) => /^-file$/i.test(value));
|
|
688
742
|
if (fileIndex >= 0) return entry(fileIndex + 1, "powershell-script");
|
|
689
743
|
if (values.some((value) => /^-(?:command|encodedcommand)$/i.test(value))) {
|
|
@@ -694,7 +748,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
694
748
|
"MCP stdio PowerShell launch must use -File or an inline command",
|
|
695
749
|
);
|
|
696
750
|
}
|
|
697
|
-
if (
|
|
751
|
+
if (runtimeKind === "java") {
|
|
698
752
|
const jarIndex = values.findIndex((value) => value === "-jar");
|
|
699
753
|
if (jarIndex >= 0) return entry(jarIndex + 1, "java-jar");
|
|
700
754
|
throw identityError(
|
|
@@ -702,7 +756,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
|
|
|
702
756
|
"MCP stdio Java classpath launches are not bound to one entrypoint file",
|
|
703
757
|
);
|
|
704
758
|
}
|
|
705
|
-
if (
|
|
759
|
+
if (runtimeKind === "dotnet") {
|
|
706
760
|
const index = values.findIndex((value) => !value.startsWith("-"));
|
|
707
761
|
if (index >= 0 && /\.dll$/i.test(values[index])) {
|
|
708
762
|
return entry(index, "dotnet-assembly");
|
|
@@ -844,6 +898,7 @@ export function attestMcpStdioExecutableIdentity({
|
|
|
844
898
|
env = {},
|
|
845
899
|
cwd = process.cwd(),
|
|
846
900
|
platform = process.platform,
|
|
901
|
+
runtimeKind: requestedRuntimeKind = null,
|
|
847
902
|
}) {
|
|
848
903
|
const name = executableBasename(command);
|
|
849
904
|
if (DYNAMIC_LAUNCHERS.has(name)) {
|
|
@@ -868,8 +923,12 @@ export function attestMcpStdioExecutableIdentity({
|
|
|
868
923
|
"MCP stdio direct shebang commands do not bind the interpreter bytes; configure the interpreter and script as command + args",
|
|
869
924
|
);
|
|
870
925
|
}
|
|
926
|
+
const runtimeKind = resolveMcpStdioRuntimeKind(
|
|
927
|
+
commandIdentity.realPath,
|
|
928
|
+
requestedRuntimeKind,
|
|
929
|
+
);
|
|
871
930
|
const launchArgs = [...args];
|
|
872
|
-
const entrypoints = interpreterEntrypoints(
|
|
931
|
+
const entrypoints = interpreterEntrypoints(runtimeKind, launchArgs, cwd).map(
|
|
873
932
|
({ argIndex, path: entryPath, role }) => {
|
|
874
933
|
const identity = attestFile(
|
|
875
934
|
entryPath,
|
|
@@ -882,7 +941,8 @@ export function attestMcpStdioExecutableIdentity({
|
|
|
882
941
|
},
|
|
883
942
|
);
|
|
884
943
|
const identity = Object.freeze({
|
|
885
|
-
version:
|
|
944
|
+
version: 2,
|
|
945
|
+
runtimeKind,
|
|
886
946
|
command: commandIdentity,
|
|
887
947
|
entrypoints: Object.freeze(entrypoints),
|
|
888
948
|
});
|
|
@@ -919,7 +979,8 @@ function trustMessage(serverName, attestation, status) {
|
|
|
919
979
|
function materializedAttestation(attestation, materialization) {
|
|
920
980
|
if (!materialization) return attestation;
|
|
921
981
|
const identity = Object.freeze({
|
|
922
|
-
version:
|
|
982
|
+
version: 3,
|
|
983
|
+
runtimeKind: attestation.identity.runtimeKind,
|
|
923
984
|
command: attestation.identity.command,
|
|
924
985
|
entrypoints: attestation.identity.entrypoints,
|
|
925
986
|
materialization: materialization.identity,
|
|
@@ -1038,6 +1099,7 @@ export function prepareMcpStdioExecutableIdentity({
|
|
|
1038
1099
|
args: effectiveArgs,
|
|
1039
1100
|
env: config.env || {},
|
|
1040
1101
|
cwd,
|
|
1102
|
+
runtimeKind: materialization ? "node" : config.runtimeKind,
|
|
1041
1103
|
}),
|
|
1042
1104
|
materialization,
|
|
1043
1105
|
);
|
|
@@ -1063,6 +1125,7 @@ export function prepareMcpStdioExecutableIdentity({
|
|
|
1063
1125
|
identity: attestation.identity,
|
|
1064
1126
|
identityDigest: attestation.identityDigest,
|
|
1065
1127
|
materialization,
|
|
1128
|
+
runtimeKind: attestation.identity.runtimeKind,
|
|
1066
1129
|
}),
|
|
1067
1130
|
);
|
|
1068
1131
|
return Object.freeze({
|
|
@@ -1107,6 +1170,7 @@ export function consumeMcpStdioExecutableIdentityAuthority(
|
|
|
1107
1170
|
command,
|
|
1108
1171
|
args,
|
|
1109
1172
|
cwd: process.cwd(),
|
|
1173
|
+
runtimeKind: issued.runtimeKind,
|
|
1110
1174
|
});
|
|
1111
1175
|
if (issued.materialization) {
|
|
1112
1176
|
const verified = reattestMcpStdioPackageMaterialization(
|