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.
Files changed (180) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-C__nnraW.js → AIOps-CEeYTeDB.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CsKWHEZ-.js → ActionButton-BeRUQ3V2.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BhIjfjWO.js → Analytics-DrV718XF.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BjuXFzWZ.js → AppLayout-Cd2Frt7Q.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-k6whDkZJ.js → Artifacts-CUJMlORU.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-C4FBMYRh.js → Audit-CXJcfT6p.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-C_vRrSXk.js → BackgroundAgents-DOv6Z7H9.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CngFZeVp.js → Backup-BwdDyBI0.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-B_H9EBRm.js → BaseInput-BmLn4kYH.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DLEC5kt7.js → Chat-COg8pAW2.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-m3ClR4xh.js → Checkbox-BCP4uoU8.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CmLSFrgp.js → Codegen-pRt6Y9JI.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-DFGQteHN.js → Col-DLaprKhS.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-EUUVORHE.js → Community-DyATsz5f.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-2PSg0Yr7.js → Compact-BXAaupZK.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CcKur7gB.js → Compliance-DpcJBELr.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DK_Fezfa.js → Cowork-DG4EFWyd.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-Dbw89xl7.js → Cron-F6Oy5n2P.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CH66h_Ec.js → Crosschain-BOdgtalX.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D1igRb17.js → DID-DT1dSkjH.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DVAsrobk.js → Dashboard-NBUIqWzC.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-Dl7W8AQs.js → Dropdown-CSpHeMYB.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D5tpaEQC.js → EmailListRenderer-CEG0xISr.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-O_VQf8gq.js → FamilyGuardDashboard-BTZ0BZna.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BTVcgS9n.js → Federation-BuuCTn2V.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BRnkJAIz.js → FormItemContext-KAVceevk.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-8OWSCkDj.js → GenericCardRenderer-DnHpcQvW.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-WXLYTQj2.js → Git-C_B_0HwB.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-BezaUhtc.js → Governance-DPSZuzuu.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CuRay3Gu.js → Inference-BV-06V7q.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DfWLDW1m.js → KnowledgeGraph-wpDuupn6.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-C55y2pPY.js → Logs-Bseca1_I.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Dk08Uycg.js → Marketplace-d3kM4DDL.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C11fSB5V.js → McpTools-DQ_xZ23i.js} +3 -3
  39. package/src/assets/web-panel/assets/{Memory-mr0eZc97.js → Memory-CRIeYO4L.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-C0iCSRbb.js → MobileBridge-BsllIa9l.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-CY-xMG8Z.js → MobileProjects-BUuQy30X.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-Bplqc_Wc.js → Mtc-BOFDIzrC.js} +2 -2
  43. package/src/assets/web-panel/assets/{MtcAudit-BlzwsoSM.js → MtcAudit-BQg-vyvG.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-BBLmTty6.js → Multisig-Bo1jrPdN.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-DtT1uf1W.js → NLProgramming-Bmod8alw.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DcqQAxTK.js → Notes-CGGFL8w-.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-cb0kWoZe.js → NotificationSettings-BsZvCJxC.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-kw9HZQNN.js → OrderTableRenderer-C1-Quo_h.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-DlTlbkUN.js → Organization-BjOeDYOi.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-pp1qs-oY.js → Overflow-DwVV3l5A.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BESLnyYz.js → P2P-Cu3DQT9W.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-B-J1mGuf.js → PdhVaultBrowser-Cg0gR7dH.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-B36PeT1_.js → Permissions-CsAXxRN5.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CTK2ad-3.js → PersonalDataHub-C-nNmnYp.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-zJNGXsac.js → Pipeline-BOnW7nNc.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-b9fz0Qf0.js → Privacy-ClLSyGKt.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-DjZbZgiB.js → ProjectInit-DuLvjjq7.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-C-hHJXlD.js → ProjectSettings-DQYYbDD9.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-Drw8MBGK.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-ckqHQe6K.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-A0yoQ3-3.js → QrScannerModal-DW5BXk-G.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DrFgFJNC.js → QuickAsk-DDLnhNTp.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-KC8hF1g4.js → Recommend-PJQ2C91U.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-DGTPIk6u.js → RemoteSession-s6wmda34.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-QmbwM7Yk.js → Reputation-DC2sb-I3.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-BxjJylia.js → Row-hPGk1eGj.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-B7Wda1J6.js → RssFeed-RIvfZql0.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-_plQ_YSA.js → Search-DFg1G1eR.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CD2YJZfx.js → Security-D6H5p8Dp.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-qQE7NmwE.js → Services-nxYiFV_w.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-DgQqkFf7.js → Skeleton-BmgFNAdB.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-C4C0oFFt.js → Skills-CsaaD2av.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-Px2N2B5c.js → Sla-yM5y9yvK.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-DN6C3lQd.js → SpeechSettings-DPy1XMYh.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-jm5aH_m7.js → SyncSettings-CFVhEyyr.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DlkJcv67.js → Tasks-DdO02Inn.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-DyrTHUBs.js → Templates-Eo2d8Llu.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-mC434PtL.js → Tenant-ChESOXgy.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-o0_s3NgK.js → Terminal-BJ7oDxTI.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-DAGlAXOw.js → TimelineRenderer-hWX0fUvz.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BnulS_bs.js → Tokens-DVBZQnd-.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-suQbVXYM.js → Trigger-D89cQfVq.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-DbIJAPo5.js → Trust-BIVSb4-V.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-CQNpbIHi.js → UkeySign-B58gWopl.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-D8aWCERk.js → VideoEditing-DhHI7bmG.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-CuLpYfZc.js → Wallet-C4FheWS_.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-CsfG8ZMc.js → WebAuthn-DnPRq-Bx.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-BYsEAZbd.js → WorkflowEditor-BerRPjpJ.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-FT4Um3-I.js → chat-BzZ52iKr.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-CKbS_Wlt.js → colors-BI_E4BAn.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-CFJtzuJM.js → compact-item-d50mr3yk.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-B9kSRW6K.js → createContext-C6FsQ1IH.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CagEcIex.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DR-x0Xpi.js → hasIn-DLZEMgLP.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-DdkIhfi-.js → index-9H_M2jju.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BfFCQHL3.js → index-A5CDWP7y.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-7jHr_A_k.js → index-AHr7ryWf.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BVPU43b1.js → index-B81mo1Et.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B3ZX81mK.js → index-BAE3hwev.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DMGmg497.js → index-BB9SqVSt.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-B7osrXqy.js → index-BRGx3w6T.js} +3 -3
  102. package/src/assets/web-panel/assets/{index-Bt4fS2eL.js → index-BTpIOTfR.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-WE08gMJP.js → index-BZjjdQ62.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BwR7yc2h.js → index-BcSUl9fA.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DtkFqPVA.js → index-BeM4hfht.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BGbPnC5x.js → index-Bmr_vxXD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DjEP7WkH.js → index-BoNZlzhQ.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-r2VI1Ikk.js → index-C3k8kevG.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DeSgw-WV.js → index-CLoTQr0W.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C_enk9I_.js → index-CO8DAF7U.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CJmIQ9XR.js → index-CRN5TRTQ.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Dap9c3eD.js → index-CUaEHfQ0.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-KqDaCApw.js → index-CVzuawCX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BK3TiKVq.js → index-CdKt9fOd.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-OSzjTzGM.js → index-CgkoH3_g.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DW4BWjTk.js → index-CjuKZBqJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C2JvmYRc.js → index-Co7s9LsB.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DiNUEpSQ.js → index-D-aBumtY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BW-t9n-q.js → index-DE0V6cp-.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Bzz0C1BZ.js → index-DY4j5zkF.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cr2FLUsD.js → index-Dec0Kf_Z.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DShSkww-.js → index-DoFtCVZ7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DTxNy0ZU.js → index-DqkbHHg8.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CvrCCqJt.js → index-DsscwxPE.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DWdqx7zI.js → index-GXE0D8Nx.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-tqSEHPRT.js → index-IPkwSAW_.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-DcfxhKXR.js → index-KNGgO4Wm.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CGaXUsIs.js → index-Pvf30m8Q.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-D4LfPvWA.js → index-Q5Tn735s.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BI5hP_qy.js → index-TWG-_D1M.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-QBSeNVO3.js → index-Y2-q7QLm.js} +1 -1
  132. package/src/assets/web-panel/assets/index-pzT9PpOU.js +1 -0
  133. package/src/assets/web-panel/assets/index-z1kFadaX.js +1 -0
  134. package/src/assets/web-panel/assets/{initDefaultProps-Dd7n7VgI.js → initDefaultProps-D-4Hzgej.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BwxouRw1.js → motion-D4Wl4xU7.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DObN0PG9.js → move-Cd5eQvL0.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-B3nOUQc7.js → mtc-parser-B4ilslCW.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-o9WU2Nbl.js → omit-Ckarx-tf.js} +1 -1
  139. package/src/assets/web-panel/assets/parsers-YNLm7sQ0.js +4 -0
  140. package/src/assets/web-panel/assets/{pickAttrs-CL_vvfQ_.js → pickAttrs-QJ0bpCmc.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-CYrM2tyK.js → placementArrow-CKHm-tq8.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-k_06cQ96.js → responsiveObserve-CV6a_w_Y.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-CPKG0pxS.js → slide-mHpeQFgk.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BDDEeLTw.js → statusUtils-DIaQNQWA.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-Cmb7RTh7.js → styleChecker-PJpzavV8.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-e2IedC4N.js → useFlexGapSupport-BH7zTw8S.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CE_gxVnm.js → useFs-BDNG3JDd.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BkMIIKMz.js → usePersonalDataHub-CY2VWdUg.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DW886XV1.js → vnode-D0kw9jhz.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-Dwo_adaf.js → zoom-B5g7TN7r.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/artifacts.js +235 -0
  154. package/src/commands/cowork.js +86 -57
  155. package/src/commands/session-location.js +20 -1
  156. package/src/commands/session.js +64 -69
  157. package/src/data/changelog.json +16 -3
  158. package/src/gateways/ws/message-dispatcher.js +57 -0
  159. package/src/lib/artifact-access-ledger.js +1 -0
  160. package/src/lib/artifact-deletion-ledger.js +1 -0
  161. package/src/lib/artifact-recovery.js +970 -0
  162. package/src/lib/artifact-workbench-projection.js +171 -0
  163. package/src/lib/dynamic-workflow-runtime.js +408 -1
  164. package/src/lib/execution-location-target.js +4 -2
  165. package/src/lib/mcp-stdio-executable-identity.js +16 -0
  166. package/src/lib/mcp-stdio-native-code-policy.js +74 -0
  167. package/src/lib/mcp-stdio-package-materialization.js +12 -3
  168. package/src/lib/process-execution-broker/index.js +112 -0
  169. package/src/lib/process-execution-broker/platform-sandbox.js +57 -3
  170. package/src/lib/process-execution-broker/workspace-transaction.js +26 -0
  171. package/src/lib/session-projection.js +126 -10
  172. package/src/runtime/agent-core.js +12 -0
  173. package/src/assets/web-panel/assets/ChatBubbleRenderer-xijcWkJe.js +0 -1
  174. package/src/assets/web-panel/assets/MarkdownRenderer-hDpWdiBc.js +0 -1
  175. package/src/assets/web-panel/assets/Projects-BC9KSDM6.js +0 -1
  176. package/src/assets/web-panel/assets/Providers-Dz-CAYYU.js +0 -1
  177. package/src/assets/web-panel/assets/devWarning-DJZ0gAMu.js +0 -1
  178. package/src/assets/web-panel/assets/index-Bizb4hkw.js +0 -1
  179. package/src/assets/web-panel/assets/index-OHSl-xCh.js +0 -1
  180. 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/v5";
40
- const MATERIALIZATION_VERSION = 5;
41
- const CAPSULE_SCHEMA = "chainlesschain.mcp-stdio-node-capsule/v4";
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
- ? [SANDBOX_BOUNDARIES.CODE_SNAPSHOT]
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: [SANDBOX_BOUNDARIES.CODE_SNAPSHOT],
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 ? [SANDBOX_BOUNDARIES.CODE_SNAPSHOT] : []),
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(