chainlesschain 0.162.198 → 0.162.200

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 (195) hide show
  1. package/bin/chainlesschain.js +14 -6
  2. package/package.json +4 -1
  3. package/scripts/command-lifecycle-report.mjs +94 -0
  4. package/src/assets/web-panel/assets/{AIOps-CSN-D2xb.js → AIOps-DcQ0bWKy.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CBSMlGzv.js → ActionButton-GecwfFPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-3yr3Nt2t.js → Analytics-CD6iSt9v.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-1b-o3lMH.js → AppLayout-CDEtuEYf.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-Dr8rJi17.js → Artifacts-DS3jAjeW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-2V689HC2.js → Audit-CcSJA048.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-DIxkNrD_.js → BackgroundAgents-DRo9Morb.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-Pg6BcwrE.js → Backup-Vw5MrWft.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-CLUpqyfH.js → BaseInput-DNHIu823.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-qVS8rD4G.js → Chat-DvAsO8-b.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-ti49X12Q.js → ChatBubbleRenderer-9aDuObay.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-Bs9AaEay.js → Checkbox-CKCa7tvn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-Dvc1mq8q.js → Codegen-CIFvZdaT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C4_biO7A.js → Col-C79yz7bK.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-al25XQUV.js → Community-DVvZskLJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-D-ZDB8M1.js → Compact-oaew61hV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-6lIfDz1W.js → Compliance-DqA7wmRx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DdI48XMJ.js → Cowork-B-qGadxa.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-DF5HZd2g.js → Cron-CUlCl4sS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-DuxeSvt3.js → Crosschain-CNOlr9DU.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-B9yHkUTd.js → DID-DJqFCT_3.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-Z5EuI3IM.js → Dashboard-CznGpphf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-vuRfO3dY.js → Dropdown-_cJw218E.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-QFLCc1uL.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BZ7EXkFJ.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-DycIEg2s.js → Federation-DOiG3i_1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-Ba0H_7yG.js → FormItemContext-BzbMcFB9.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer--JgSTK-C.js → GenericCardRenderer-VbBrYttP.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DEvTbldE.js → Git-CLG8E6ED.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-BJIljy18.js → Governance-LGJQfk_q.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-CVyW3G3q.js → Inference-DlQKx9lF.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-v8-borge.js → KnowledgeGraph-DU8vEouV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BCdS7gGo.js → Logs-FZIQOdln.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-AN6tGA2B.js → Marketplace-C_xd-zZI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DGViXASN.js → McpTools-q-YktphS.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-Bpvmx9X4.js → Memory-Cq9OhDin.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CTP-DOTC.js → MobileBridge-B03_R98T.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-C8qfktxn.js → MobileProjects-DZrk-qmF.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-ndYr0M1s.js → Mtc-BidCKW28.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-Ci0-YK7W.js → MtcAudit-r-iaMVM7.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BehSTFW7.js → Multisig-CgTUFvff.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-B91_YBLv.js → NLProgramming-B7NvzfAV.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BQlJ0-gq.js → Notes-80CWNqJI.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-CDgYMjYK.js → NotificationSettings-0H6xdiY3.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BJkSlKeH.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-B-b3cWCp.js → Organization-B8sxCV_h.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-CILUL4nL.js → Overflow-CW9JBBhQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-BTCFBkF0.js → P2P-bdSQV7oZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-BAR6AUx5.js → PdhVaultBrowser-DQad42nW.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-RRf6HbWJ.js → Permissions-CueexxTR.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BGTMiICa.js → PersonalDataHub-fqxflhR8.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-945qY9YF.js → Pipeline-KFwwnIMC.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DPZwI6lJ.js → Privacy-ClnD9buY.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BPH2NRKc.js → ProjectInit-CZEz6sm3.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BZCRNCvb.js → ProjectSettings-B6NzpmOI.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-BTI__tBt.js → Projects-DYyuwPCs.js} +1 -1
  61. package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
  62. package/src/assets/web-panel/assets/{QrScannerModal-N6rbqt1r.js → QrScannerModal-BzuOBbqB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DrwjPS7M.js → QuickAsk-CmNO9qSj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-Cog9Wd99.js → Recommend-VJNj3_NF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DC9pynjM.js → RemoteSession-CrbdbSBF.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-D4th4gKS.js → Reputation-DTyMd45j.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-ogiWR6v9.js → Row-DHrQ-Icz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-uYlk-2Oj.js → RssFeed-DqWxY9c5.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-DYzzwvtM.js → Search-ctF1Ks3J.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Da7YOyX6.js → Security-BrQz8uo5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CLI1VM1X.js → Services-D4scVFar.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DK77dzDC.js → Skeleton-oUScaOjv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-C_z7Lmhl.js → Skills-CL-y0eLt.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-D6413Q8L.js → Sla-DQExhwXj.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C07ydbj2.js → SpeechSettings-iNp_I7kN.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DGOm2W22.js → SyncSettings-CTDlMo0A.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-Cr_PVyLM.js → Tasks-4kb8l3sc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BhL2mZ0t.js → Templates-BXcL9oXW.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CPk5oyUr.js → Tenant-DLE8eS0D.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-ClhqUsqV.js → Terminal-DGpUZPPK.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BCC7MV5a.js → TimelineRenderer-C1pWXGPC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-DD1Jt4oO.js → Tokens-BYfbfqhZ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BCydFvN2.js → Trigger-K9YfLOCw.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DDHT1noa.js → Trust-Ctkq77Hy.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-CWPZC7oI.js → UkeySign-C6_CSe9J.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-9Ea0nJR0.js → VideoEditing-Be3rpOWs.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BjxhLxTf.js → Wallet-D0UIplxk.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-C6uCye67.js → WebAuthn-CF9bM9I3.js} +3 -3
  89. package/src/assets/web-panel/assets/{WorkflowEditor-d2g4reYo.js → WorkflowEditor-D0H1XVPY.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-frTc6ScX.js → chat-Cgzzbe0o.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-B5K6lG3v.js → colors-BwNxEVS0.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-Cdn46r8D.js → compact-item-D60Z4Hhs.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DU1jqVQi.js → createContext-MFk58XB0.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DdNH-aW_.js → hasIn-CRj2SvGO.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DM5FmPZU.js → index--s45_1cb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D4l82Me1.js → index--tquQ2ZG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CQorP1Ng.js → index-1T1rhokn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CHmkkdfT.js → index-B-M82_rx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CGiwfwB9.js → index-BE_el1Zs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BwlIxAmX.js → index-BhRkR7IO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cj6P9Nst.js → index-Bo0y96-K.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BoFak7le.js → index-CJgu5JUK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Dca_i7H8.js → index-CLWwdebO.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BVLL-mq_.js → index-CNAK5QG_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-LaivuXyF.js → index-CQjJjPRD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-t_OBzIP4.js → index-CTDbAfae.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BcGwGIaR.js → index-CVI_9sRK.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-D23xGYjM.js → index-CY14oMQK.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-VDM2KKo9.js → index-CbiTJkZf.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
  112. package/src/assets/web-panel/assets/{index-32ajXmTb.js → index-CqWpxMqx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-PjAS0sIZ.js → index-CvB8lYUR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-7ehytj1K.js → index-D51XwtCY.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DtBCCkC4.js → index-D6HvK_1O.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Be4OtL-N.js → index-D9jVIwLJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CUoNAmE8.js → index-DA4tE98u.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-cYaWV4Mq.js → index-DBwOtXw0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-MM4Zz2OE.js → index-DKdNzTIb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DIVyTmZ3.js → index-DRySdmvN.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CtRPi4YC.js → index-DWzyTev7.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
  123. package/src/assets/web-panel/assets/{index-kVO_MDm-.js → index-DYjs7jAP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D4miNkWv.js → index-DbROzMBp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-yZRuZpwK.js → index-DhFtk5PR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BXKhhx9V.js → index-Di2AbMLg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BC4eGkar.js → index-DvmocQsM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-NmEXVjzt.js → index-Dw-o0zEF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DRzBBdQ0.js → index-DysPoP38.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-HjCvXHf5.js → index-LX9pJxm_.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-gg3QPC3i.js → index-OI_fXWx0.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-mgU3Q-lN.js → index-eDTOX8Xj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-D1qIC4GR.js → index-gWKDsTzF.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DftZuyA7.js → index-q_GDUVAA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-DwLTRNdo.js → initDefaultProps-C61kZqEd.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-BchZDXnh.js → motion-DZnT5U1L.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-e8M-zZFl.js → move-L8wzwbel.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Ci40fQb3.js → mtc-parser-DLdYSejc.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-C7110_f2.js → omit-D53cbS59.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-skteMgnM.js → pickAttrs-Bbc5HPtu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-MGZ-lh2B.js → placementArrow-BkvmO860.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-N4Sd7uy-.js → responsiveObserve-u2y1ryS1.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-C7HDGRaa.js → slide-BBqj7svU.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BhRexlgy.js → statusUtils-GN0mqu2d.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-ChEoQkN2.js → styleChecker-BvwPKoBT.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-CDbG1s2Y.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CUIx0tcJ.js → useFs-DXAxl2SV.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-bkO7L7ec.js → usePersonalDataHub-DihlR2dj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-B_ZvABIG.js → vnode-D7BOX2gi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-D5shjpS8.js → zoom-CVbO-nL7.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/mcp.js +119 -0
  154. package/src/commands/session-show.js +8 -10
  155. package/src/commands/session.js +60 -52
  156. package/src/data/changelog.json +27 -1
  157. package/src/gateways/ws/session-protocol.js +14 -4
  158. package/src/gateways/ws/ws-agent-handler.js +31 -0
  159. package/src/harness/jsonl-session-store.js +1147 -130
  160. package/src/harness/mcp-client.js +44 -11
  161. package/src/harness/session-index.js +80 -80
  162. package/src/harness/session-list-index.js +147 -2
  163. package/src/lib/background-interaction-journal.js +2 -2
  164. package/src/lib/command-lifecycle-report.js +516 -0
  165. package/src/lib/mcp-stdio-environment.js +48 -0
  166. package/src/lib/mcp-stdio-executable-identity.js +552 -17
  167. package/src/lib/mcp-stdio-package-materialization.js +1424 -0
  168. package/src/lib/packer/native-update-state.js +979 -1
  169. package/src/lib/packer/pack-update-applier.js +1050 -125
  170. package/src/lib/packer/pkg-config-generator.js +1 -0
  171. package/src/lib/paths.js +53 -0
  172. package/src/lib/process-execution-broker/index.js +180 -37
  173. package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
  174. package/src/lib/recent-session.js +17 -17
  175. package/src/lib/secure-file-identity.js +47 -0
  176. package/src/lib/secure-fs.js +21 -2
  177. package/src/lib/session-anti-rollback-anchor.js +766 -0
  178. package/src/lib/session-host-lease.js +492 -0
  179. package/src/lib/session-persistence-failure.js +109 -0
  180. package/src/lib/session-picker.js +26 -3
  181. package/src/lib/session-search.js +25 -11
  182. package/src/lib/side-effect-ledger-store.js +2 -2
  183. package/src/lib/skill-execution-authority.js +13 -9
  184. package/src/lib/turn-binding-store.js +2 -2
  185. package/src/repl/agent-repl.js +309 -39
  186. package/src/runtime/agent-core.js +88 -5
  187. package/src/runtime/cleanup-deadline.js +143 -0
  188. package/src/runtime/headless-runner.js +357 -139
  189. package/src/runtime/headless-stream.js +207 -28
  190. package/src/runtime/output-backpressure.js +53 -0
  191. package/src/assets/web-panel/assets/MarkdownRenderer-CU-JB2Ns.js +0 -1
  192. package/src/assets/web-panel/assets/Providers-DDCf_nIw.js +0 -1
  193. package/src/assets/web-panel/assets/devWarning-CP-jEUyw.js +0 -1
  194. package/src/assets/web-panel/assets/index-CzrCHrFy.js +0 -1
  195. package/src/assets/web-panel/assets/index-OJsGskZw.js +0 -1
@@ -394,6 +394,7 @@ export function generatePkgConfig(ctx) {
394
394
  `${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.dll`,
395
395
  `${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox-helper.exe`,
396
396
  `${posixify(cliRoot)}/src/lib/process-execution-broker/windows-sandbox.cs`,
397
+ `${posixify(cliRoot)}/install/install.ps1`,
397
398
  ];
398
399
  if (prebuildsDir) assets.push(`${posixify(prebuildsDir)}/**/*`);
399
400
  // Project mode: bundle the collected .chainlesschain/ snapshot as an asset.
package/src/lib/paths.js CHANGED
@@ -58,6 +58,59 @@ export function getStatePath() {
58
58
  return join(getHomeDir(), "state");
59
59
  }
60
60
 
61
+ /** User-local security state that survives rollback of CHAINLESSCHAIN_HOME. */
62
+ export function getMachineSecurityAnchorDir() {
63
+ const configured = process.env.CHAINLESSCHAIN_SECURITY_ANCHOR_HOME;
64
+ let anchorPath;
65
+ if (configured) {
66
+ if (!isAbsolute(configured)) {
67
+ const error = new Error(
68
+ "CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be an absolute path",
69
+ );
70
+ error.code = "CONFIG_HOME_UNSAFE";
71
+ throw error;
72
+ }
73
+ anchorPath = resolve(configured);
74
+ } else {
75
+ const platform = getPlatform();
76
+ if (platform === "win32") {
77
+ anchorPath = join(
78
+ process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local"),
79
+ "ChainlessChain",
80
+ "SecurityAnchors",
81
+ );
82
+ } else if (platform === "darwin") {
83
+ anchorPath = join(
84
+ homedir(),
85
+ "Library",
86
+ "Application Support",
87
+ "ChainlessChain",
88
+ "SecurityAnchors",
89
+ );
90
+ } else {
91
+ anchorPath = join(
92
+ process.env.XDG_STATE_HOME || join(homedir(), ".local", "state"),
93
+ "chainlesschain",
94
+ "security-anchors",
95
+ );
96
+ }
97
+ }
98
+ const resolvedAnchor = resolve(anchorPath);
99
+ const resolvedHome = resolve(getHomeDir());
100
+ const relativeToHome = relative(resolvedHome, resolvedAnchor);
101
+ if (
102
+ relativeToHome === "" ||
103
+ (!relativeToHome.startsWith("..") && !isAbsolute(relativeToHome))
104
+ ) {
105
+ const error = new Error(
106
+ "CHAINLESSCHAIN_SECURITY_ANCHOR_HOME must be outside CHAINLESSCHAIN_HOME",
107
+ );
108
+ error.code = "CONFIG_HOME_UNSAFE";
109
+ throw error;
110
+ }
111
+ return resolvedAnchor;
112
+ }
113
+
61
114
  export function getPidFilePath() {
62
115
  return join(getStatePath(), "app.pid");
63
116
  }
@@ -48,7 +48,11 @@ import { consumeIssuedPluginSandboxExecutionContract } from "../plugin-runtime/b
48
48
  import runtimeProvenanceLedger from "../runtime-provenance-ledger.js";
49
49
  import { credentialAgent } from "./credential-agent.js";
50
50
  import { WorkspaceTransactionManager } from "./workspace-transaction.js";
51
- import { consumeMcpStdioExecutableIdentityAuthority } from "../mcp-stdio-executable-identity.js";
51
+ import {
52
+ consumeMcpStdioCapsuleSandboxExecutionContract,
53
+ consumeMcpStdioExecutableIdentityAuthority,
54
+ MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
55
+ } from "../mcp-stdio-executable-identity.js";
52
56
 
53
57
  const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
54
58
  const SUPPORTED_SANDBOX_PROFILES = new Set([
@@ -706,22 +710,35 @@ class ProcessExecutionBroker extends EventEmitter {
706
710
  }
707
711
  return admitted;
708
712
  }
709
- if (
710
- !consumeIssuedPluginSandboxExecutionContract(raw, {
711
- origin: options.origin,
712
- command: launch?.command,
713
- args: launch?.args,
714
- cwd: options.cwd,
715
- pluginId: options.pluginId,
716
- pluginVersion: options.pluginVersion,
717
- pluginSource: options.pluginSource,
718
- pluginExecutableIdentity: options.pluginExecutableIdentity,
719
- requiredBoundaries,
720
- sync: launch?.sync === true,
721
- })
722
- ) {
713
+ const mcpCapsule = raw?.kind === MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND;
714
+ const consumed = mcpCapsule
715
+ ? consumeMcpStdioCapsuleSandboxExecutionContract(raw, {
716
+ origin: options.origin,
717
+ command: launch?.command,
718
+ args: launch?.args,
719
+ cwd: options.cwd,
720
+ shell: options.shell,
721
+ requiredBoundaries,
722
+ sync: launch?.sync === true,
723
+ identityDigest: options.mcpStdioExecutableIdentityDigest,
724
+ })
725
+ : consumeIssuedPluginSandboxExecutionContract(raw, {
726
+ origin: options.origin,
727
+ command: launch?.command,
728
+ args: launch?.args,
729
+ cwd: options.cwd,
730
+ pluginId: options.pluginId,
731
+ pluginVersion: options.pluginVersion,
732
+ pluginSource: options.pluginSource,
733
+ pluginExecutableIdentity: options.pluginExecutableIdentity,
734
+ requiredBoundaries,
735
+ sync: launch?.sync === true,
736
+ });
737
+ if (!consumed) {
723
738
  return invalid(
724
- "sandboxExecutionContract was not issued for this plugin launch provenance",
739
+ mcpCapsule
740
+ ? "sandboxExecutionContract was not issued for this MCP capsule launch provenance"
741
+ : "sandboxExecutionContract was not issued for this plugin launch provenance",
725
742
  );
726
743
  }
727
744
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
@@ -751,18 +768,22 @@ class ProcessExecutionBroker extends EventEmitter {
751
768
  "strict-plugin-node-bin",
752
769
  "strict-plugin-native-static-elf-bin",
753
770
  "strict-plugin-native-elf-bin",
771
+ MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
754
772
  ].includes(raw.kind)
755
773
  ) {
756
774
  return invalid("unsupported sandboxExecutionContract kind or version");
757
775
  }
758
776
  if (
759
- options.origin !== "plugin:bin" ||
760
- typeof options.pluginId !== "string" ||
761
- !options.pluginId ||
762
- options.shell !== false
777
+ options.shell !== false ||
778
+ (!mcpCapsule &&
779
+ (options.origin !== "plugin:bin" ||
780
+ typeof options.pluginId !== "string" ||
781
+ !options.pluginId))
763
782
  ) {
764
783
  return invalid(
765
- "sandboxExecutionContract is restricted to direct plugin:bin shell:false launches",
784
+ mcpCapsule
785
+ ? "sandboxExecutionContract is restricted to direct MCP capsule shell:false launches"
786
+ : "sandboxExecutionContract is restricted to direct plugin:bin shell:false launches",
766
787
  );
767
788
  }
768
789
 
@@ -804,17 +825,19 @@ class ProcessExecutionBroker extends EventEmitter {
804
825
  );
805
826
  }
806
827
 
807
- const provenanceIdentity = this._normalizePluginExecutableIdentity(
808
- options.pluginExecutableIdentity,
809
- );
810
- if (
811
- !provenanceIdentity ||
812
- provenanceIdentity.realPath !== entryIdentity.realPath ||
813
- provenanceIdentity.sha256 !== entryIdentity.sha256
814
- ) {
815
- return invalid(
816
- "sandboxExecutionContract entry identity does not match plugin provenance",
828
+ if (!mcpCapsule) {
829
+ const provenanceIdentity = this._normalizePluginExecutableIdentity(
830
+ options.pluginExecutableIdentity,
817
831
  );
832
+ if (
833
+ !provenanceIdentity ||
834
+ provenanceIdentity.realPath !== entryIdentity.realPath ||
835
+ provenanceIdentity.sha256 !== entryIdentity.sha256
836
+ ) {
837
+ return invalid(
838
+ "sandboxExecutionContract entry identity does not match plugin provenance",
839
+ );
840
+ }
818
841
  }
819
842
  const entryRelative = path.relative(
820
843
  path.resolve(raw.pluginRoot),
@@ -1181,6 +1204,9 @@ class ProcessExecutionBroker extends EventEmitter {
1181
1204
  "pluginTreeSnapshotContractBound",
1182
1205
  "pluginTreeSnapshotAtomic",
1183
1206
  "initialDynamicLoadClosureDescriptorBound",
1207
+ "sharedLibraryClosure",
1208
+ "entrySnapshotAtomic",
1209
+ "runtimeLaunchAtomic",
1184
1210
  ]) {
1185
1211
  if (
1186
1212
  plan.runtimeProbe[field] !== undefined &&
@@ -1197,6 +1223,9 @@ class ProcessExecutionBroker extends EventEmitter {
1197
1223
  "pluginTreeContentSnapshotBytes",
1198
1224
  "initialDynamicDependencyCount",
1199
1225
  "initialDynamicRuntimeFileCount",
1226
+ "runtimeSnapshotBytes",
1227
+ "runtimeAttestedBytes",
1228
+ "entrySnapshotBytes",
1200
1229
  ]) {
1201
1230
  if (
1202
1231
  plan.runtimeProbe[field] !== undefined &&
@@ -1209,6 +1238,22 @@ class ProcessExecutionBroker extends EventEmitter {
1209
1238
  );
1210
1239
  }
1211
1240
  }
1241
+ for (const field of [
1242
+ "runtimeSnapshotSha256",
1243
+ "runtimeAttestedSha256",
1244
+ "entrySnapshotSha256",
1245
+ ]) {
1246
+ if (
1247
+ plan.runtimeProbe[field] !== undefined &&
1248
+ (typeof plan.runtimeProbe[field] !== "string" ||
1249
+ !/^[a-f0-9]{64}$/.test(plan.runtimeProbe[field]))
1250
+ ) {
1251
+ throw this._sandboxError(
1252
+ "invalid_sandbox_plan",
1253
+ `Sandbox runtime probe ${field} must be a lowercase SHA-256 value`,
1254
+ );
1255
+ }
1256
+ }
1212
1257
  if (
1213
1258
  plan.runtimeProbe.pluginTreeContentSnapshotDigest !== undefined &&
1214
1259
  (typeof plan.runtimeProbe.pluginTreeContentSnapshotDigest !==
@@ -1510,6 +1555,78 @@ class ProcessExecutionBroker extends EventEmitter {
1510
1555
  "Sandbox runtime probe successful dynamic ELF evidence requires a descriptor-bound initial direct system set",
1511
1556
  );
1512
1557
  }
1558
+ const codeSnapshotGuaranteed = guarantees.includes(
1559
+ SANDBOX_BOUNDARIES.CODE_SNAPSHOT,
1560
+ );
1561
+ if (codeSnapshotGuaranteed) {
1562
+ const exactSnapshotEvidence =
1563
+ plan.applied === true &&
1564
+ candidateBackend === null &&
1565
+ plan.runtimeProbe.attempted === true &&
1566
+ plan.runtimeProbe.runnable === true &&
1567
+ plan.runtimeProbe.reason === null &&
1568
+ plan.runtimeProbe.probeRuntime === "node" &&
1569
+ plan.runtimeProbe.targetRuntime === "node" &&
1570
+ plan.runtimeProbe.contentSnapshot === true &&
1571
+ plan.runtimeProbe.sharedLibraryClosure === false &&
1572
+ /^[a-f0-9]{64}$/.test(plan.runtimeProbe.entrySnapshotSha256 || "") &&
1573
+ Number.isSafeInteger(plan.runtimeProbe.entrySnapshotBytes) &&
1574
+ plan.runtimeProbe.entrySnapshotBytes >= 0 &&
1575
+ plan.runtimeProbe.entrySnapshotBytes <= 64 * 1024 * 1024;
1576
+ const linuxSnapshotEvidence =
1577
+ plan.platform === "linux" &&
1578
+ backend === "linux-fd-code-snapshot" &&
1579
+ plan.enforcement === "linux-fd-code-snapshot" &&
1580
+ policyAttested === true &&
1581
+ policyDigest !== null &&
1582
+ plan.runtimeProbe.kind === "linux-mcp-capsule-code-snapshot-v1" &&
1583
+ plan.runtimeProbe.contentSnapshotScope ===
1584
+ "mcp-capsule-entry-and-node-runtime" &&
1585
+ plan.runtimeProbe.contentSnapshotMechanism ===
1586
+ "verified-o_tmpfile-copy-inherited-fd-exec-v1" &&
1587
+ plan.runtimeProbe.handleAtomic === true &&
1588
+ /^[a-f0-9]{64}$/.test(
1589
+ plan.runtimeProbe.runtimeSnapshotSha256 || "",
1590
+ ) &&
1591
+ Number.isSafeInteger(plan.runtimeProbe.runtimeSnapshotBytes) &&
1592
+ plan.runtimeProbe.runtimeSnapshotBytes > 0 &&
1593
+ plan.runtimeProbe.runtimeSnapshotBytes <= 256 * 1024 * 1024 &&
1594
+ /^\/proc\/self\/fd\/\d+$/.test(plan.command) &&
1595
+ /^\/proc\/self\/fd\/\d+$/.test(plan.args[0] || "");
1596
+ const windowsSnapshotEvidence =
1597
+ plan.platform === "win32" &&
1598
+ [
1599
+ "windows-job-restricted-token",
1600
+ "windows-appcontainer-job-restricted-token",
1601
+ ].includes(backend) &&
1602
+ plan.enforcement === backend &&
1603
+ [
1604
+ "windows-plugin-node-entry-snapshot-v1",
1605
+ "windows-appcontainer-launch-attestation-v1",
1606
+ ].includes(plan.runtimeProbe.kind) &&
1607
+ plan.runtimeProbe.contentSnapshotScope ===
1608
+ "mcp-capsule-entry-source" &&
1609
+ plan.runtimeProbe.contentSnapshotMechanism ===
1610
+ "verified-handle-inherited-pipe-module-compile-v1" &&
1611
+ plan.runtimeProbe.handleAtomic === false &&
1612
+ plan.runtimeProbe.entrySnapshotAtomic === true &&
1613
+ plan.runtimeProbe.runtimeLaunchAtomic === false &&
1614
+ /^[a-f0-9]{64}$/.test(
1615
+ plan.runtimeProbe.runtimeAttestedSha256 || "",
1616
+ ) &&
1617
+ Number.isSafeInteger(plan.runtimeProbe.runtimeAttestedBytes) &&
1618
+ plan.runtimeProbe.runtimeAttestedBytes > 0 &&
1619
+ plan.runtimeProbe.runtimeAttestedBytes <= 256 * 1024 * 1024;
1620
+ if (
1621
+ !exactSnapshotEvidence ||
1622
+ (!linuxSnapshotEvidence && !windowsSnapshotEvidence)
1623
+ ) {
1624
+ throw this._sandboxError(
1625
+ "invalid_sandbox_plan",
1626
+ "Code snapshot guarantee requires typed atomic MCP capsule evidence",
1627
+ );
1628
+ }
1629
+ }
1513
1630
  const genericWorkspaceEvidenceFields = [
1514
1631
  "contractDigest",
1515
1632
  "policyDigest",
@@ -1801,6 +1918,26 @@ class ProcessExecutionBroker extends EventEmitter {
1801
1918
  plan.runtimeProbe.contentSnapshotMechanism,
1802
1919
  }
1803
1920
  : {}),
1921
+ ...(plan.runtimeProbe.runtimeSnapshotSha256 !== undefined
1922
+ ? {
1923
+ runtimeSnapshotSha256: plan.runtimeProbe.runtimeSnapshotSha256,
1924
+ runtimeSnapshotBytes: plan.runtimeProbe.runtimeSnapshotBytes,
1925
+ entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
1926
+ entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
1927
+ sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
1928
+ }
1929
+ : {}),
1930
+ ...(plan.runtimeProbe.runtimeAttestedSha256 !== undefined
1931
+ ? {
1932
+ runtimeAttestedSha256: plan.runtimeProbe.runtimeAttestedSha256,
1933
+ runtimeAttestedBytes: plan.runtimeProbe.runtimeAttestedBytes,
1934
+ entrySnapshotSha256: plan.runtimeProbe.entrySnapshotSha256,
1935
+ entrySnapshotBytes: plan.runtimeProbe.entrySnapshotBytes,
1936
+ entrySnapshotAtomic: plan.runtimeProbe.entrySnapshotAtomic,
1937
+ runtimeLaunchAtomic: plan.runtimeProbe.runtimeLaunchAtomic,
1938
+ sharedLibraryClosure: plan.runtimeProbe.sharedLibraryClosure,
1939
+ }
1940
+ : {}),
1804
1941
  };
1805
1942
  for (const field of [
1806
1943
  "pluginTreeContentSnapshot",
@@ -2820,6 +2957,7 @@ class ProcessExecutionBroker extends EventEmitter {
2820
2957
  this._stripWorkspaceTransactionOptions(spawnOpts);
2821
2958
  this._stripAuditControlOptions(spawnOpts);
2822
2959
  delete spawnOpts.mcpStdioExecutableIdentityAuthority;
2960
+ delete spawnOpts.mcpStdioExecutableIdentityDigest;
2823
2961
  if (traceCtx) {
2824
2962
  spawnOpts.env = { ...(spawnOpts.env || process.env) };
2825
2963
  spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
@@ -2896,7 +3034,11 @@ class ProcessExecutionBroker extends EventEmitter {
2896
3034
  if (mcpStdioExecutableIdentityAuthority !== undefined) {
2897
3035
  const admitted = consumeMcpStdioExecutableIdentityAuthority(
2898
3036
  mcpStdioExecutableIdentityAuthority,
2899
- { command: identityCommand, args: identityArgs },
3037
+ {
3038
+ command: identityCommand,
3039
+ args: identityArgs,
3040
+ env: optsForSpawn.env || {},
3041
+ },
2900
3042
  );
2901
3043
  auditEntry.mcpStdioExecutableIdentityDigest = admitted.identityDigest;
2902
3044
  }
@@ -2934,15 +3076,16 @@ class ProcessExecutionBroker extends EventEmitter {
2934
3076
  if (
2935
3077
  sandboxPlan.applied === true &&
2936
3078
  (sandboxPlan.backend === "linux-bwrap-workspace" ||
2937
- sandboxPlan.backend === "linux-bwrap") &&
3079
+ sandboxPlan.backend === "linux-bwrap" ||
3080
+ sandboxPlan.backend === "linux-fd-code-snapshot") &&
2938
3081
  sandboxPlan.postSpawn.required === false
2939
3082
  ) {
2940
3083
  // child_process.spawn() has synchronously duplicated every stdio entry
2941
- // into the launched bwrap process before returning. Both the generic
2942
- // workspace backend and direct Plugin-bin bwrap backend are complete
3084
+ // into the launched process before returning. The generic/direct bwrap
3085
+ // backends and the MCP anonymous-code snapshot backend are complete
2943
3086
  // pre-spawn plans with no parent-side enforcement handle. Retaining
2944
- // their pinned mount/seccomp/supervisor descriptors until a long-lived
2945
- // process exits would turn each child into an avoidable FD leak.
3087
+ // their pinned descriptors until a long-lived process exits would turn
3088
+ // each child into an avoidable FD leak.
2946
3089
  cleanupSandbox();
2947
3090
  }
2948
3091
  try {