chainlesschain 0.165.4 → 0.165.5
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/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-CEeYTeDB.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-BeRUQ3V2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-DrV718XF.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-Cd2Frt7Q.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CUJMlORU.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-CXJcfT6p.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DOv6Z7H9.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-BwdDyBI0.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-BmLn4kYH.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-COg8pAW2.js} +4 -4
- package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BCP4uoU8.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-pRt6Y9JI.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-DLaprKhS.js} +1 -1
- package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-DyATsz5f.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-BXAaupZK.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-DpcJBELr.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-DG4EFWyd.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-F6Oy5n2P.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-BOdgtalX.js} +1 -1
- package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-DT1dSkjH.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-NBUIqWzC.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-CSpHeMYB.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-CEG0xISr.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-BTZ0BZna.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-BuuCTn2V.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-KAVceevk.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-DnHpcQvW.js} +1 -1
- package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-C_B_0HwB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-DPSZuzuu.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BV-06V7q.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-wpDuupn6.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-Bseca1_I.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-d3kM4DDL.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DQ_xZ23i.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-CRIeYO4L.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-BsllIa9l.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-BUuQy30X.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BOFDIzrC.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-BQg-vyvG.js} +5 -5
- package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-Bo1jrPdN.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-Bmod8alw.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CGGFL8w-.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-BsZvCJxC.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C1-Quo_h.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-BjOeDYOi.js} +2 -2
- package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-DwVV3l5A.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-Cu3DQT9W.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-Cg0gR7dH.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-CsAXxRN5.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-C-nNmnYp.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-BOnW7nNc.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-ClLSyGKt.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-DuLvjjq7.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-DQYYbDD9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-Drw8MBGK.js +1 -0
- package/src/assets/web-panel/assets/Providers-ckqHQe6K.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DW5BXk-G.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-DDLnhNTp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-PJQ2C91U.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-s6wmda34.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-DC2sb-I3.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-hPGk1eGj.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-RIvfZql0.js} +3 -3
- package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DFg1G1eR.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-D6H5p8Dp.js} +4 -4
- package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-nxYiFV_w.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-BmgFNAdB.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-CsaaD2av.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-yM5y9yvK.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-DPy1XMYh.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-CFVhEyyr.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DdO02Inn.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-Eo2d8Llu.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-ChESOXgy.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-BJ7oDxTI.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-hWX0fUvz.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-DVBZQnd-.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-D89cQfVq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BIVSb4-V.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-B58gWopl.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-DhHI7bmG.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-C4FheWS_.js} +3 -3
- package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DnPRq-Bx.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-BerRPjpJ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-BzZ52iKr.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-BI_E4BAn.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-d50mr3yk.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-C6FsQ1IH.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CagEcIex.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-DLZEMgLP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-9H_M2jju.js} +1 -1
- package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-A5CDWP7y.js} +1 -1
- package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-AHr7ryWf.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-B81mo1Et.js} +1 -1
- package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-BAE3hwev.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMGmg497.js → index-BB9SqVSt.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-BRGx3w6T.js} +3 -3
- package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BTpIOTfR.js} +1 -1
- package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-BZjjdQ62.js} +1 -1
- package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BcSUl9fA.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-BeM4hfht.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-Bmr_vxXD.js} +1 -1
- package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-BoNZlzhQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-C3k8kevG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-CLoTQr0W.js} +1 -1
- package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CO8DAF7U.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-CRN5TRTQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CUaEHfQ0.js} +1 -1
- package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-CVzuawCX.js} +1 -1
- package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-CdKt9fOd.js} +1 -1
- package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-CgkoH3_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-CjuKZBqJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-Co7s9LsB.js} +1 -1
- package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-D-aBumtY.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-DE0V6cp-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-DY4j5zkF.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-Dec0Kf_Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-DShSkww-.js → index-DoFtCVZ7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-DqkbHHg8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-DsscwxPE.js} +1 -1
- package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-GXE0D8Nx.js} +1 -1
- package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-IPkwSAW_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-KNGgO4Wm.js} +1 -1
- package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Pvf30m8Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-Q5Tn735s.js} +1 -1
- package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-TWG-_D1M.js} +1 -1
- package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-Y2-q7QLm.js} +1 -1
- package/src/assets/web-panel/assets/index-pzT9PpOU.js +1 -0
- package/src/assets/web-panel/assets/index-z1kFadaX.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-D-4Hzgej.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-D4Wl4xU7.js} +1 -1
- package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-Cd5eQvL0.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-B4ilslCW.js} +1 -1
- package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-Ckarx-tf.js} +1 -1
- package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
- package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-QJ0bpCmc.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-CKHm-tq8.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-CV6a_w_Y.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-mHpeQFgk.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-DIaQNQWA.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-PJpzavV8.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-BH7zTw8S.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-BDNG3JDd.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CY2VWdUg.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-D0kw9jhz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-B5g7TN7r.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/artifacts.js +235 -0
- package/src/commands/cowork.js +86 -57
- package/src/commands/session-location.js +20 -1
- package/src/commands/session.js +64 -69
- package/src/data/changelog.json +16 -3
- package/src/gateways/ws/message-dispatcher.js +57 -0
- package/src/lib/artifact-access-ledger.js +1 -0
- package/src/lib/artifact-deletion-ledger.js +1 -0
- package/src/lib/artifact-recovery.js +970 -0
- package/src/lib/artifact-workbench-projection.js +171 -0
- package/src/lib/dynamic-workflow-runtime.js +408 -1
- package/src/lib/execution-location-target.js +4 -2
- package/src/lib/mcp-stdio-executable-identity.js +16 -0
- package/src/lib/mcp-stdio-native-code-policy.js +74 -0
- package/src/lib/mcp-stdio-package-materialization.js +12 -3
- package/src/lib/process-execution-broker/index.js +112 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
- package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
- package/src/lib/session-projection.js +126 -10
- package/src/runtime/agent-core.js +12 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
- package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
- package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
- package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
- package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
- package/src/assets/web-panel/assets/parsers-UEvh_ShA.js +0 -4
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Materialized MCP capsules are JavaScript-only products. They do not admit
|
|
5
|
+
* package-provided native addons: esbuild emits one CJS file, retains only
|
|
6
|
+
* Node builtins as externals, and the immutable capsule prelude replaces
|
|
7
|
+
* process.dlopen before package code runs. Platform runtime libraries and V8's
|
|
8
|
+
* own executable memory remain part of the trusted Node/OS runtime base and are
|
|
9
|
+
* deliberately not represented as an arbitrary shared-library closure.
|
|
10
|
+
*/
|
|
11
|
+
export const MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY = Object.freeze({
|
|
12
|
+
schema: "chainlesschain.mcp-stdio-native-code-policy/v1",
|
|
13
|
+
contractVersion: 1,
|
|
14
|
+
mode: "deny-package-native-addons",
|
|
15
|
+
capsuleFormat: "single-bundled-cjs",
|
|
16
|
+
nativeAddonLoading: "denied",
|
|
17
|
+
nativeAddonDenialMechanism:
|
|
18
|
+
"immutable-process-dlopen-guard-plus-bundled-js-only-v1",
|
|
19
|
+
hostRuntimeSharedLibraries: "platform-runtime-tcb",
|
|
20
|
+
anonymousExecutableMemory: "node-runtime-tcb",
|
|
21
|
+
sharedLibraryClosure: false,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const POLICY_KEYS = Object.freeze(
|
|
25
|
+
Object.keys(MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY).sort(),
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
function canonicalPolicy(value) {
|
|
29
|
+
return JSON.stringify(
|
|
30
|
+
Object.fromEntries(POLICY_KEYS.map((key) => [key, value[key]])),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY_DIGEST = crypto
|
|
35
|
+
.createHash("sha256")
|
|
36
|
+
.update(canonicalPolicy(MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY))
|
|
37
|
+
.digest("hex");
|
|
38
|
+
|
|
39
|
+
export function isMcpStdioCapsuleNativeCodePolicy(value) {
|
|
40
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
41
|
+
const keys = Object.keys(value).sort();
|
|
42
|
+
return (
|
|
43
|
+
keys.length === POLICY_KEYS.length &&
|
|
44
|
+
keys.every((key, index) => key === POLICY_KEYS[index]) &&
|
|
45
|
+
POLICY_KEYS.every(
|
|
46
|
+
(key) => value[key] === MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY[key],
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function mcpStdioCapsuleNativeCodePolicyDigest(value) {
|
|
52
|
+
if (!isMcpStdioCapsuleNativeCodePolicy(value)) {
|
|
53
|
+
throw new TypeError("MCP capsule native-code policy is invalid");
|
|
54
|
+
}
|
|
55
|
+
return crypto
|
|
56
|
+
.createHash("sha256")
|
|
57
|
+
.update(canonicalPolicy(value))
|
|
58
|
+
.digest("hex");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function mcpStdioCapsuleNativeCodeEvidence(value) {
|
|
62
|
+
const digest = mcpStdioCapsuleNativeCodePolicyDigest(value);
|
|
63
|
+
return Object.freeze({
|
|
64
|
+
nativeCodePolicyBound: true,
|
|
65
|
+
nativeCodePolicySchema: value.schema,
|
|
66
|
+
nativeCodePolicyDigest: digest,
|
|
67
|
+
nativeCodePolicyMode: value.mode,
|
|
68
|
+
capsuleNativeCodeFormat: value.capsuleFormat,
|
|
69
|
+
nativeAddonLoading: value.nativeAddonLoading,
|
|
70
|
+
nativeAddonDenialMechanism: value.nativeAddonDenialMechanism,
|
|
71
|
+
hostRuntimeSharedLibraries: value.hostRuntimeSharedLibraries,
|
|
72
|
+
anonymousExecutableMemory: value.anonymousExecutableMemory,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
@@ -25,6 +25,10 @@ import {
|
|
|
25
25
|
writeSecurityStore,
|
|
26
26
|
} from "./durable-security-store.js";
|
|
27
27
|
import { sanitizeMcpStdioHostEnvironment } from "./mcp-stdio-environment.js";
|
|
28
|
+
import {
|
|
29
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
30
|
+
MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY,
|
|
31
|
+
} from "./mcp-stdio-native-code-policy.js";
|
|
28
32
|
|
|
29
33
|
export const MCP_STDIO_PACKAGE_MATERIALIZATION_REQUIRED_CODE =
|
|
30
34
|
"CC_MCP_STDIO_PACKAGE_MATERIALIZATION_REQUIRED";
|
|
@@ -36,9 +40,9 @@ export const MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED_CODE =
|
|
|
36
40
|
"CC_MCP_STDIO_PACKAGE_MATERIALIZATION_CHANGED";
|
|
37
41
|
|
|
38
42
|
const MATERIALIZATION_SCHEMA =
|
|
39
|
-
"chainlesschain.mcp-stdio-package-materialization/
|
|
40
|
-
const MATERIALIZATION_VERSION =
|
|
41
|
-
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/
|
|
43
|
+
"chainlesschain.mcp-stdio-package-materialization/v6";
|
|
44
|
+
const MATERIALIZATION_VERSION = 6;
|
|
45
|
+
const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/v5";
|
|
42
46
|
const CAPSULE_RELATIVE_PATH = "capsule/server.cjs";
|
|
43
47
|
const CAPSULE_BUILDER = "esbuild-wasm";
|
|
44
48
|
const CAPSULE_BUILDER_VERSION = "0.28.1";
|
|
@@ -1504,6 +1508,7 @@ async function buildCapsule({
|
|
|
1504
1508
|
? CAPSULE_EXECUTION_CONTEXT_ISOLATION
|
|
1505
1509
|
: "not-required",
|
|
1506
1510
|
}),
|
|
1511
|
+
nativeCodePolicy: MCP_STDIO_CAPSULE_NATIVE_CODE_POLICY,
|
|
1507
1512
|
});
|
|
1508
1513
|
}
|
|
1509
1514
|
|
|
@@ -1563,6 +1568,7 @@ function validateManifest(manifest) {
|
|
|
1563
1568
|
) ||
|
|
1564
1569
|
manifest.capsule?.builtinPolicy?.schema !== CAPSULE_BUILTIN_POLICY_SCHEMA ||
|
|
1565
1570
|
manifest.capsule?.builtinPolicy?.mode !== "static-external-only" ||
|
|
1571
|
+
!isMcpStdioCapsuleNativeCodePolicy(manifest.capsule?.nativeCodePolicy) ||
|
|
1566
1572
|
!Array.isArray(manifest.capsule?.builtinPolicy?.allowedBuiltins) ||
|
|
1567
1573
|
manifest.capsule.builtinPolicy.allowedBuiltins.some(
|
|
1568
1574
|
(name) => typeof name !== "string" || !NODE_BUILTINS.has(name),
|
|
@@ -1743,6 +1749,9 @@ function verifyPublishedGeneration(root, record, expectedFingerprint) {
|
|
|
1743
1749
|
...manifest.capsule.builtinPolicy.executionContextBuiltins,
|
|
1744
1750
|
]),
|
|
1745
1751
|
}),
|
|
1752
|
+
nativeCodePolicy: Object.freeze({
|
|
1753
|
+
...manifest.capsule.nativeCodePolicy,
|
|
1754
|
+
}),
|
|
1746
1755
|
}),
|
|
1747
1756
|
closureDigest: manifest.closureDigest,
|
|
1748
1757
|
fileCount: manifest.fileCount,
|
|
@@ -71,6 +71,10 @@ import {
|
|
|
71
71
|
consumeMcpStdioExecutableIdentityAuthority,
|
|
72
72
|
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
|
|
73
73
|
} from "../mcp-stdio-executable-identity.js";
|
|
74
|
+
import {
|
|
75
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
76
|
+
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
77
|
+
} from "../mcp-stdio-native-code-policy.js";
|
|
74
78
|
|
|
75
79
|
const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
|
|
76
80
|
const SUPPORTED_SANDBOX_PROFILES = new Set([
|
|
@@ -1193,6 +1197,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1193
1197
|
"rootIdentity",
|
|
1194
1198
|
"entryIdentity",
|
|
1195
1199
|
"runtimeIdentity",
|
|
1200
|
+
"nativeCodePolicy",
|
|
1196
1201
|
]);
|
|
1197
1202
|
const unsupportedKey = Object.keys(raw).find(
|
|
1198
1203
|
(key) => !supportedKeys.has(key),
|
|
@@ -1213,6 +1218,15 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1213
1218
|
) {
|
|
1214
1219
|
return invalid("unsupported sandboxExecutionContract kind or version");
|
|
1215
1220
|
}
|
|
1221
|
+
if (
|
|
1222
|
+
(mcpCapsule &&
|
|
1223
|
+
!isMcpStdioCapsuleNativeCodePolicy(raw.nativeCodePolicy)) ||
|
|
1224
|
+
(!mcpCapsule && raw.nativeCodePolicy !== undefined)
|
|
1225
|
+
) {
|
|
1226
|
+
return invalid(
|
|
1227
|
+
"sandboxExecutionContract native-code policy is invalid for this contract kind",
|
|
1228
|
+
);
|
|
1229
|
+
}
|
|
1216
1230
|
if (
|
|
1217
1231
|
options.shell !== false ||
|
|
1218
1232
|
(!mcpCapsule &&
|
|
@@ -1303,6 +1317,11 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1303
1317
|
rootIdentity,
|
|
1304
1318
|
entryIdentity: this._freezeExecutableIdentity(entryIdentity),
|
|
1305
1319
|
runtimeIdentity: this._freezeExecutableIdentity(runtimeIdentity),
|
|
1320
|
+
...(mcpCapsule
|
|
1321
|
+
? {
|
|
1322
|
+
nativeCodePolicy: Object.freeze({ ...raw.nativeCodePolicy }),
|
|
1323
|
+
}
|
|
1324
|
+
: {}),
|
|
1306
1325
|
});
|
|
1307
1326
|
}
|
|
1308
1327
|
|
|
@@ -1789,6 +1808,13 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1789
1808
|
"helperTeamIdentifier",
|
|
1790
1809
|
"helperPackageIdentifier",
|
|
1791
1810
|
"helperPackageVersion",
|
|
1811
|
+
"nativeCodePolicySchema",
|
|
1812
|
+
"nativeCodePolicyMode",
|
|
1813
|
+
"capsuleNativeCodeFormat",
|
|
1814
|
+
"nativeAddonLoading",
|
|
1815
|
+
"nativeAddonDenialMechanism",
|
|
1816
|
+
"hostRuntimeSharedLibraries",
|
|
1817
|
+
"anonymousExecutableMemory",
|
|
1792
1818
|
]) {
|
|
1793
1819
|
if (
|
|
1794
1820
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1842,6 +1868,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1842
1868
|
"processForkExplicitlyDenied",
|
|
1843
1869
|
"sandboxExecLiveGateContract",
|
|
1844
1870
|
"globalLaunchSerialization",
|
|
1871
|
+
"nativeCodePolicyBound",
|
|
1845
1872
|
]) {
|
|
1846
1873
|
if (
|
|
1847
1874
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -1890,6 +1917,7 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
1890
1917
|
"helperDesignatedRequirementSha256",
|
|
1891
1918
|
"installAttestationDigest",
|
|
1892
1919
|
"planBindingDigest",
|
|
1920
|
+
"nativeCodePolicyDigest",
|
|
1893
1921
|
]) {
|
|
1894
1922
|
if (
|
|
1895
1923
|
plan.runtimeProbe[field] !== undefined &&
|
|
@@ -2347,6 +2375,75 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
2347
2375
|
"Successful dynamic ELF evidence requires a runtime pathname shared-library closure",
|
|
2348
2376
|
);
|
|
2349
2377
|
}
|
|
2378
|
+
const nativeCodeEvidenceFields = [
|
|
2379
|
+
"nativeCodePolicyBound",
|
|
2380
|
+
"nativeCodePolicySchema",
|
|
2381
|
+
"nativeCodePolicyDigest",
|
|
2382
|
+
"nativeCodePolicyMode",
|
|
2383
|
+
"capsuleNativeCodeFormat",
|
|
2384
|
+
"nativeAddonLoading",
|
|
2385
|
+
"nativeAddonDenialMechanism",
|
|
2386
|
+
"hostRuntimeSharedLibraries",
|
|
2387
|
+
"anonymousExecutableMemory",
|
|
2388
|
+
];
|
|
2389
|
+
const nativeAddonLoadingGuaranteed = guarantees.includes(
|
|
2390
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
2391
|
+
);
|
|
2392
|
+
const capsuleExecutionContract = launchContext.executionContract;
|
|
2393
|
+
const expectedNativeCodePolicy =
|
|
2394
|
+
capsuleExecutionContract?.nativeCodePolicy;
|
|
2395
|
+
const nativeCodePolicyEvidenceValid =
|
|
2396
|
+
nativeAddonLoadingGuaranteed &&
|
|
2397
|
+
guarantees.includes(SANDBOX_BOUNDARIES.CODE_SNAPSHOT) &&
|
|
2398
|
+
capsuleExecutionContract?.kind ===
|
|
2399
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND &&
|
|
2400
|
+
isMcpStdioCapsuleNativeCodePolicy(expectedNativeCodePolicy) &&
|
|
2401
|
+
plan.runtimeProbe.nativeCodePolicyBound === true &&
|
|
2402
|
+
plan.runtimeProbe.nativeCodePolicySchema ===
|
|
2403
|
+
expectedNativeCodePolicy.schema &&
|
|
2404
|
+
plan.runtimeProbe.nativeCodePolicyDigest ===
|
|
2405
|
+
mcpStdioCapsuleNativeCodePolicyDigest(expectedNativeCodePolicy) &&
|
|
2406
|
+
plan.runtimeProbe.nativeCodePolicyMode ===
|
|
2407
|
+
expectedNativeCodePolicy.mode &&
|
|
2408
|
+
plan.runtimeProbe.capsuleNativeCodeFormat ===
|
|
2409
|
+
expectedNativeCodePolicy.capsuleFormat &&
|
|
2410
|
+
plan.runtimeProbe.nativeAddonLoading ===
|
|
2411
|
+
expectedNativeCodePolicy.nativeAddonLoading &&
|
|
2412
|
+
plan.runtimeProbe.nativeAddonDenialMechanism ===
|
|
2413
|
+
expectedNativeCodePolicy.nativeAddonDenialMechanism &&
|
|
2414
|
+
plan.runtimeProbe.hostRuntimeSharedLibraries ===
|
|
2415
|
+
expectedNativeCodePolicy.hostRuntimeSharedLibraries &&
|
|
2416
|
+
plan.runtimeProbe.anonymousExecutableMemory ===
|
|
2417
|
+
expectedNativeCodePolicy.anonymousExecutableMemory &&
|
|
2418
|
+
plan.runtimeProbe.sharedLibraryClosure === false;
|
|
2419
|
+
if (nativeAddonLoadingGuaranteed && !nativeCodePolicyEvidenceValid) {
|
|
2420
|
+
throw this._sandboxError(
|
|
2421
|
+
"invalid_sandbox_plan",
|
|
2422
|
+
"Native-addon loading guarantee requires the exact deny-native-addons capsule policy",
|
|
2423
|
+
);
|
|
2424
|
+
}
|
|
2425
|
+
if (
|
|
2426
|
+
!nativeAddonLoadingGuaranteed &&
|
|
2427
|
+
nativeCodeEvidenceFields.some(
|
|
2428
|
+
(field) => plan.runtimeProbe[field] !== undefined,
|
|
2429
|
+
)
|
|
2430
|
+
) {
|
|
2431
|
+
throw this._sandboxError(
|
|
2432
|
+
"invalid_sandbox_plan",
|
|
2433
|
+
"Native-addon policy evidence requires its sandbox guarantee",
|
|
2434
|
+
);
|
|
2435
|
+
}
|
|
2436
|
+
if (
|
|
2437
|
+
capsuleExecutionContract?.kind ===
|
|
2438
|
+
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND &&
|
|
2439
|
+
guarantees.includes(SANDBOX_BOUNDARIES.CODE_SNAPSHOT) &&
|
|
2440
|
+
!nativeCodePolicyEvidenceValid
|
|
2441
|
+
) {
|
|
2442
|
+
throw this._sandboxError(
|
|
2443
|
+
"invalid_sandbox_plan",
|
|
2444
|
+
"MCP capsule code snapshots require a bound native-addon denial policy",
|
|
2445
|
+
);
|
|
2446
|
+
}
|
|
2350
2447
|
const codeSnapshotGuaranteed = guarantees.includes(
|
|
2351
2448
|
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
2352
2449
|
);
|
|
@@ -3099,6 +3196,21 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
3099
3196
|
}
|
|
3100
3197
|
: {}),
|
|
3101
3198
|
};
|
|
3199
|
+
for (const field of [
|
|
3200
|
+
"nativeCodePolicyBound",
|
|
3201
|
+
"nativeCodePolicySchema",
|
|
3202
|
+
"nativeCodePolicyDigest",
|
|
3203
|
+
"nativeCodePolicyMode",
|
|
3204
|
+
"capsuleNativeCodeFormat",
|
|
3205
|
+
"nativeAddonLoading",
|
|
3206
|
+
"nativeAddonDenialMechanism",
|
|
3207
|
+
"hostRuntimeSharedLibraries",
|
|
3208
|
+
"anonymousExecutableMemory",
|
|
3209
|
+
]) {
|
|
3210
|
+
if (plan.runtimeProbe[field] !== undefined) {
|
|
3211
|
+
runtimeProbe[field] = plan.runtimeProbe[field];
|
|
3212
|
+
}
|
|
3213
|
+
}
|
|
3102
3214
|
for (const field of [
|
|
3103
3215
|
"pluginTreeContentSnapshot",
|
|
3104
3216
|
...pluginTreeEvidenceFields,
|
|
@@ -48,6 +48,11 @@ import {
|
|
|
48
48
|
macosMcpLauncherPolicyDigest,
|
|
49
49
|
verifyMacosMcpLauncherInstallContract,
|
|
50
50
|
} from "./macos-mcp-launcher-contract.js";
|
|
51
|
+
import {
|
|
52
|
+
isMcpStdioCapsuleNativeCodePolicy,
|
|
53
|
+
mcpStdioCapsuleNativeCodeEvidence,
|
|
54
|
+
mcpStdioCapsuleNativeCodePolicyDigest,
|
|
55
|
+
} from "../mcp-stdio-native-code-policy.js";
|
|
51
56
|
|
|
52
57
|
export {
|
|
53
58
|
MCP_STDIO_FD_ENTRY_BOOTSTRAP,
|
|
@@ -68,6 +73,7 @@ export const SANDBOX_BOUNDARIES = Object.freeze({
|
|
|
68
73
|
PROCESS_TREE: "process-tree",
|
|
69
74
|
RESOURCE_LIMITS: "resource-limits",
|
|
70
75
|
PRIVILEGE_REDUCTION: "privilege-reduction",
|
|
76
|
+
NATIVE_ADDON_LOADING: "native-addon-loading",
|
|
71
77
|
});
|
|
72
78
|
|
|
73
79
|
/**
|
|
@@ -1663,6 +1669,7 @@ function validateMacMcpCapsuleContract(
|
|
|
1663
1669
|
if (
|
|
1664
1670
|
contract?.kind !== MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND ||
|
|
1665
1671
|
contract.contractVersion !== 1 ||
|
|
1672
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy) ||
|
|
1666
1673
|
(sync !== true && sync !== false) ||
|
|
1667
1674
|
spawnOpts?.shell !== false ||
|
|
1668
1675
|
!linuxStdioIsNarrow(spawnOpts?.stdio) ||
|
|
@@ -1774,6 +1781,9 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1774
1781
|
});
|
|
1775
1782
|
}
|
|
1776
1783
|
|
|
1784
|
+
const nativeCodeEvidence = mcpStdioCapsuleNativeCodeEvidence(
|
|
1785
|
+
contract.nativeCodePolicy,
|
|
1786
|
+
);
|
|
1777
1787
|
const protocol = MACOS_MCP_LAUNCHER_INPUTS.protocol;
|
|
1778
1788
|
const legacyUnavailable = () =>
|
|
1779
1789
|
unavailable("macos_atomic_runtime_exec_unavailable", {
|
|
@@ -1894,6 +1904,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1894
1904
|
entryFd: entryPin.fd,
|
|
1895
1905
|
capsuleRootFd: capsulePin.fd,
|
|
1896
1906
|
callerLifelineFd: protocol.callerLifelineFd,
|
|
1907
|
+
nativeCodePolicyDigest: nativeCodeEvidence.nativeCodePolicyDigest,
|
|
1897
1908
|
}),
|
|
1898
1909
|
)
|
|
1899
1910
|
.digest("hex");
|
|
@@ -1940,6 +1951,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1940
1951
|
entrySnapshotBootstrapSha256:
|
|
1941
1952
|
MCP_STDIO_MACOS_GATED_ENTRY_BOOTSTRAP_SHA256,
|
|
1942
1953
|
sharedLibraryClosure: false,
|
|
1954
|
+
...nativeCodeEvidence,
|
|
1943
1955
|
rootProtectedRuntimeSnapshot: true,
|
|
1944
1956
|
entryRootOwnedAnonymousSnapshot: true,
|
|
1945
1957
|
entrySourcePrePostStat: true,
|
|
@@ -1996,6 +2008,7 @@ function applyMacMcpCapsuleCodeSnapshot(
|
|
|
1996
2008
|
SANDBOX_BOUNDARIES.PROCESS_EXEC,
|
|
1997
2009
|
SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
1998
2010
|
SANDBOX_BOUNDARIES.PRIVILEGE_REDUCTION,
|
|
2011
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
1999
2012
|
],
|
|
2000
2013
|
cleanup,
|
|
2001
2014
|
});
|
|
@@ -4039,6 +4052,15 @@ function windowsPluginNodeEntrySnapshot(invocation, sandboxOpts, spawnOpts) {
|
|
|
4039
4052
|
reason: "windows_plugin_execution_contract_unsupported",
|
|
4040
4053
|
};
|
|
4041
4054
|
}
|
|
4055
|
+
if (
|
|
4056
|
+
capsuleContract &&
|
|
4057
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy)
|
|
4058
|
+
) {
|
|
4059
|
+
return {
|
|
4060
|
+
locks: null,
|
|
4061
|
+
reason: "windows_mcp_native_code_policy_invalid",
|
|
4062
|
+
};
|
|
4063
|
+
}
|
|
4042
4064
|
if (
|
|
4043
4065
|
(!capsuleContract && sandboxOpts.sync !== true) ||
|
|
4044
4066
|
spawnOpts?.detached === true
|
|
@@ -4189,6 +4211,9 @@ function windowsAppContainerPolicyDigest({
|
|
|
4189
4211
|
runtimeLaunchMechanism:
|
|
4190
4212
|
"filter-oplock-locked-createprocess-suspended-image-v1",
|
|
4191
4213
|
sharedLibraryClosure: false,
|
|
4214
|
+
nativeCodePolicyDigest: mcpStdioCapsuleNativeCodePolicyDigest(
|
|
4215
|
+
executionContract.nativeCodePolicy,
|
|
4216
|
+
),
|
|
4192
4217
|
}
|
|
4193
4218
|
: {}),
|
|
4194
4219
|
launchPathLocks: snapshotLocks,
|
|
@@ -4241,6 +4266,7 @@ export function applyWindowsSandbox(
|
|
|
4241
4266
|
const appContainerSupportedBoundaries = [
|
|
4242
4267
|
...appContainerGuarantees,
|
|
4243
4268
|
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
4269
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
4244
4270
|
];
|
|
4245
4271
|
const base = {
|
|
4246
4272
|
platform: runtime.platform,
|
|
@@ -4859,6 +4885,9 @@ export function applyWindowsSandbox(
|
|
|
4859
4885
|
runtimeLaunchMechanism:
|
|
4860
4886
|
"filter-oplock-locked-createprocess-suspended-image-v1",
|
|
4861
4887
|
sharedLibraryClosure: false,
|
|
4888
|
+
...mcpStdioCapsuleNativeCodeEvidence(
|
|
4889
|
+
sandboxOpts.executionContract.nativeCodePolicy,
|
|
4890
|
+
),
|
|
4862
4891
|
planBindingMechanism: "windows-mcp-code-snapshot-plan-binding-v1",
|
|
4863
4892
|
planBindingDigest: windowsMcpPlanBinding.planBindingDigest,
|
|
4864
4893
|
}
|
|
@@ -4884,7 +4913,10 @@ export function applyWindowsSandbox(
|
|
|
4884
4913
|
...(entrySnapshot.locks &&
|
|
4885
4914
|
sandboxOpts.executionContract?.kind ===
|
|
4886
4915
|
MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND
|
|
4887
|
-
? [
|
|
4916
|
+
? [
|
|
4917
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
4918
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
4919
|
+
]
|
|
4888
4920
|
: []),
|
|
4889
4921
|
],
|
|
4890
4922
|
command: helperInvocation.command,
|
|
@@ -5402,6 +5434,12 @@ function validateLinuxPluginContract(
|
|
|
5402
5434
|
) {
|
|
5403
5435
|
return { ok: false, reason: "execution_contract_missing" };
|
|
5404
5436
|
}
|
|
5437
|
+
if (
|
|
5438
|
+
capsuleContract &&
|
|
5439
|
+
!isMcpStdioCapsuleNativeCodePolicy(contract.nativeCodePolicy)
|
|
5440
|
+
) {
|
|
5441
|
+
return { ok: false, reason: "mcp_native_code_policy_invalid" };
|
|
5442
|
+
}
|
|
5405
5443
|
if (
|
|
5406
5444
|
(sync !== true && sync !== false) ||
|
|
5407
5445
|
spawnOpts?.shell !== false ||
|
|
@@ -6173,6 +6211,9 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6173
6211
|
entrySnapshotSha256: entrySnapshot.attestation.sha256,
|
|
6174
6212
|
entrySnapshotBytes: entrySnapshot.attestation.bytes,
|
|
6175
6213
|
});
|
|
6214
|
+
const nativeCodeEvidence = mcpStdioCapsuleNativeCodeEvidence(
|
|
6215
|
+
contract.nativeCodePolicy,
|
|
6216
|
+
);
|
|
6176
6217
|
const policyDigest = sha256(
|
|
6177
6218
|
JSON.stringify({
|
|
6178
6219
|
version: 1,
|
|
@@ -6186,6 +6227,7 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6186
6227
|
entrySnapshotBootstrapSha256: MCP_STDIO_FD_ENTRY_BOOTSTRAP_SHA256,
|
|
6187
6228
|
runtimeLaunchMechanism: "inherited-executable-fd-v1",
|
|
6188
6229
|
passthroughArgsDigest: sha256(JSON.stringify(invocation.args.slice(1))),
|
|
6230
|
+
nativeCodePolicyDigest: nativeCodeEvidence.nativeCodePolicyDigest,
|
|
6189
6231
|
}),
|
|
6190
6232
|
);
|
|
6191
6233
|
let closed = false;
|
|
@@ -6218,10 +6260,14 @@ function applyLinuxMcpCapsuleCodeSnapshot(
|
|
|
6218
6260
|
runtimeLaunchMechanism: "inherited-executable-fd-v1",
|
|
6219
6261
|
entrySnapshotBootstrapSha256: MCP_STDIO_FD_ENTRY_BOOTSTRAP_SHA256,
|
|
6220
6262
|
sharedLibraryClosure: false,
|
|
6263
|
+
...nativeCodeEvidence,
|
|
6221
6264
|
...snapshotIdentity,
|
|
6222
6265
|
},
|
|
6223
6266
|
reason: null,
|
|
6224
|
-
guarantees: [
|
|
6267
|
+
guarantees: [
|
|
6268
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
6269
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
6270
|
+
],
|
|
6225
6271
|
command: `/proc/self/fd/${runtimeFd}`,
|
|
6226
6272
|
args: [
|
|
6227
6273
|
"-e",
|
|
@@ -9694,6 +9740,9 @@ export function applyLinuxSandbox(
|
|
|
9694
9740
|
runtimeLaunchMechanism:
|
|
9695
9741
|
"bwrap-descriptor-mount-node-runtime-exec-v1",
|
|
9696
9742
|
sharedLibraryClosure: false,
|
|
9743
|
+
...mcpStdioCapsuleNativeCodeEvidence(
|
|
9744
|
+
validation.contract.nativeCodePolicy,
|
|
9745
|
+
),
|
|
9697
9746
|
runtimeSnapshotSha256: validation.contract.runtimeIdentity.sha256,
|
|
9698
9747
|
runtimeSnapshotBytes: validation.contract.runtimeIdentity.bytes,
|
|
9699
9748
|
entrySnapshotSha256: entrySnapshot.attestation.sha256,
|
|
@@ -9749,7 +9798,12 @@ export function applyLinuxSandbox(
|
|
|
9749
9798
|
SANDBOX_BOUNDARIES.FILESYSTEM,
|
|
9750
9799
|
SANDBOX_BOUNDARIES.NETWORK,
|
|
9751
9800
|
SANDBOX_BOUNDARIES.PROCESS_TREE,
|
|
9752
|
-
...(capsuleContract
|
|
9801
|
+
...(capsuleContract
|
|
9802
|
+
? [
|
|
9803
|
+
SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
|
|
9804
|
+
SANDBOX_BOUNDARIES.NATIVE_ADDON_LOADING,
|
|
9805
|
+
]
|
|
9806
|
+
: []),
|
|
9753
9807
|
],
|
|
9754
9808
|
command: invocation.command,
|
|
9755
9809
|
args: invocation.args,
|
|
@@ -102,6 +102,8 @@ const WORKSPACE_LOCK_OWNER_KEYS = Object.freeze([
|
|
|
102
102
|
const WORKSPACE_LOCK_RETENTION_REQUEST = Symbol(
|
|
103
103
|
"workspace-lock-retention-request",
|
|
104
104
|
);
|
|
105
|
+
const WORKSPACE_COORDINATION_TOKEN_PATTERN = /^[A-Za-z0-9-]{16,128}$/;
|
|
106
|
+
const WORKSPACE_COORDINATION_RECLAIM_TOKENS_PATTERN = /^[A-Za-z0-9-]{33,257}$/;
|
|
105
107
|
const TERMINAL_STATES = new Set([
|
|
106
108
|
WORKSPACE_TRANSACTION_STATE.COMMITTED,
|
|
107
109
|
WORKSPACE_TRANSACTION_STATE.ROLLED_BACK,
|
|
@@ -1669,6 +1671,24 @@ function workspacesOverlap(left, right) {
|
|
|
1669
1671
|
return isPathInside(left, right) || isPathInside(right, left);
|
|
1670
1672
|
}
|
|
1671
1673
|
|
|
1674
|
+
function isWorkspaceCoordinationDebris(name) {
|
|
1675
|
+
for (const lifecycle of ["acquire", "release"]) {
|
|
1676
|
+
const prefix = `coordination.lock.${lifecycle}-`;
|
|
1677
|
+
if (name.startsWith(prefix)) {
|
|
1678
|
+
return WORKSPACE_COORDINATION_TOKEN_PATTERN.test(
|
|
1679
|
+
name.slice(prefix.length),
|
|
1680
|
+
);
|
|
1681
|
+
}
|
|
1682
|
+
}
|
|
1683
|
+
const reclaimedPrefix = "coordination.lock.reclaimed-";
|
|
1684
|
+
return (
|
|
1685
|
+
name.startsWith(reclaimedPrefix) &&
|
|
1686
|
+
WORKSPACE_COORDINATION_RECLAIM_TOKENS_PATTERN.test(
|
|
1687
|
+
name.slice(reclaimedPrefix.length),
|
|
1688
|
+
)
|
|
1689
|
+
);
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1672
1692
|
function assertNoOverlappingWorkspaceLock(
|
|
1673
1693
|
lockDir,
|
|
1674
1694
|
workspaceRoot,
|
|
@@ -1695,6 +1715,12 @@ function assertNoOverlappingWorkspaceLock(
|
|
|
1695
1715
|
{ path: candidate },
|
|
1696
1716
|
);
|
|
1697
1717
|
}
|
|
1718
|
+
// withFileLock atomically detaches its private coordination directory
|
|
1719
|
+
// before recursive cleanup. Windows can temporarily retain that uniquely
|
|
1720
|
+
// tokened directory after the coordination lock itself is already free.
|
|
1721
|
+
// It contains state-lock ownership, not workspace ownership, and therefore
|
|
1722
|
+
// must not be interpreted as an overlapping workspace lease.
|
|
1723
|
+
if (isWorkspaceCoordinationDebris(name)) continue;
|
|
1698
1724
|
const owner = readLockOwner(candidate);
|
|
1699
1725
|
if (!owner) {
|
|
1700
1726
|
throw codedError(
|