chainlesschain 0.162.197 → 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 (233) 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-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BSFxiHkg.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-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
  54. package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Y975Mh6R.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-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BZ332MYl.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-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DgPvuIn2.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-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DePOeMDM.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-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +4 -4
  153. package/src/commands/agent.js +3 -3
  154. package/src/commands/background-session.js +145 -0
  155. package/src/commands/mcp.js +244 -7
  156. package/src/commands/serve.js +1 -1
  157. package/src/commands/session-show.js +129 -0
  158. package/src/commands/session.js +97 -145
  159. package/src/commands/skill.js +87 -50
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/session-protocol.js +14 -4
  162. package/src/gateways/ws/ws-agent-handler.js +39 -1
  163. package/src/harness/jsonl-session-store.js +1547 -127
  164. package/src/harness/mcp-client.js +2690 -409
  165. package/src/harness/session-index.js +80 -80
  166. package/src/harness/session-list-index.js +210 -7
  167. package/src/lazy-dispatch.js +76 -8
  168. package/src/lib/abort-utils.js +68 -0
  169. package/src/lib/agent-core.js +1 -59
  170. package/src/lib/background-interaction-journal.js +2 -2
  171. package/src/lib/chat-core.js +24 -6
  172. package/src/lib/command-lifecycle-report.js +516 -0
  173. package/src/lib/cowork-mcp-tools.js +47 -2
  174. package/src/lib/cowork-task-runner.js +11 -3
  175. package/src/lib/doctor-checkup.js +9 -7
  176. package/src/lib/learning/skill-improver.js +21 -2
  177. package/src/lib/mcp-call-ledger-store.js +116 -3
  178. package/src/lib/mcp-call-ledger.js +59 -14
  179. package/src/lib/mcp-client.js +1 -0
  180. package/src/lib/mcp-stdio-environment.js +48 -0
  181. package/src/lib/mcp-stdio-executable-identity.js +1133 -0
  182. package/src/lib/mcp-stdio-execution-authority.js +363 -0
  183. package/src/lib/mcp-stdio-package-materialization.js +1424 -0
  184. package/src/lib/mcp-tool-metadata.js +436 -0
  185. package/src/lib/mcp-tool-result.js +367 -0
  186. package/src/lib/observability/index.js +71 -0
  187. package/src/lib/packer/native-update-state.js +979 -1
  188. package/src/lib/packer/pack-update-applier.js +1050 -125
  189. package/src/lib/packer/pkg-config-generator.js +1 -0
  190. package/src/lib/paths.js +53 -0
  191. package/src/lib/pr-link-ledger.js +8 -27
  192. package/src/lib/pr-link-store.js +26 -0
  193. package/src/lib/process-execution-broker/index.js +192 -35
  194. package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
  195. package/src/lib/process-tree-termination.js +253 -0
  196. package/src/lib/recent-session.js +17 -17
  197. package/src/lib/secure-file-identity.js +47 -0
  198. package/src/lib/secure-fs.js +21 -2
  199. package/src/lib/session-anti-rollback-anchor.js +766 -0
  200. package/src/lib/session-host-lease.js +492 -0
  201. package/src/lib/session-host-snapshot.js +9 -5
  202. package/src/lib/session-persistence-failure.js +109 -0
  203. package/src/lib/session-picker.js +26 -3
  204. package/src/lib/session-projection.js +5 -1
  205. package/src/lib/session-search.js +25 -11
  206. package/src/lib/session-tail.js +31 -1
  207. package/src/lib/side-effect-ledger-store.js +2 -2
  208. package/src/lib/skill-budget.js +222 -0
  209. package/src/lib/skill-execution-authority.js +385 -0
  210. package/src/lib/skill-execution-identity.js +39 -2
  211. package/src/lib/skill-loader.js +322 -86
  212. package/src/lib/skill-mcp.js +43 -1
  213. package/src/lib/turn-binding-store.js +2 -2
  214. package/src/repl/agent-repl.js +483 -77
  215. package/src/repl/bg-dashboard.js +81 -28
  216. package/src/repl/chat-repl.js +77 -12
  217. package/src/runtime/agent-core.js +428 -113
  218. package/src/runtime/agent-runtime.js +26 -3
  219. package/src/runtime/cleanup-deadline.js +143 -0
  220. package/src/runtime/headless-runner.js +494 -149
  221. package/src/runtime/headless-stream.js +504 -75
  222. package/src/runtime/mcp-config.js +157 -10
  223. package/src/runtime/mcp-tool-search.js +0 -0
  224. package/src/runtime/output-backpressure.js +419 -0
  225. package/src/runtime/pipe-safety.js +56 -21
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
  227. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
  228. package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
  229. package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
  231. package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
  232. package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
  233. package/src/lib/skill-process-broker.js +0 -85
@@ -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
  }
@@ -16,10 +16,15 @@
16
16
  * result or a session listing.
17
17
  */
18
18
 
19
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
20
- import { join } from "node:path";
21
- import { getHomeDir } from "./paths.js";
19
+ import { writeFileSync } from "node:fs";
22
20
  import { executionBroker } from "./process-execution-broker/index.js";
21
+ import {
22
+ getPrLinks,
23
+ prLinkLedgerPath,
24
+ readPrLinkLedger,
25
+ } from "./pr-link-store.js";
26
+
27
+ export { getPrLinks, prLinkLedgerPath, readPrLinkLedger };
23
28
 
24
29
  export const _deps = {
25
30
  execFile: (...args) => executionBroker.execFile(...args),
@@ -29,21 +34,6 @@ export const _deps = {
29
34
  const MAX_LINKS_PER_SESSION = 20;
30
35
  const MAX_SESSIONS = 500;
31
36
 
32
- export function prLinkLedgerPath() {
33
- return join(getHomeDir(), "pr-links.json");
34
- }
35
-
36
- export function readPrLinkLedger() {
37
- try {
38
- const p = prLinkLedgerPath();
39
- if (!existsSync(p)) return {};
40
- const parsed = JSON.parse(readFileSync(p, "utf-8"));
41
- return parsed && typeof parsed === "object" ? parsed : {};
42
- } catch {
43
- return {}; // corrupt ledger degrades to empty, never throws
44
- }
45
- }
46
-
47
37
  function writeLedger(ledger) {
48
38
  const ids = Object.keys(ledger);
49
39
  if (ids.length > MAX_SESSIONS) {
@@ -138,15 +128,6 @@ export function recordPrLink(sessionId, ref, options = {}) {
138
128
  return incoming;
139
129
  }
140
130
 
141
- /** Links for a session, newest first. */
142
- export function getPrLinks(sessionId) {
143
- if (!sessionId) return [];
144
- const links = readPrLinkLedger()[sessionId];
145
- return Array.isArray(links)
146
- ? [...links].sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
147
- : [];
148
- }
149
-
150
131
  function ghPrForBranch(cwd, timeoutMs = 3000) {
151
132
  const run = (file, fileArgs) =>
152
133
  new Promise((resolve) => {
@@ -0,0 +1,26 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { getHomeDir } from "./paths.js";
4
+
5
+ export function prLinkLedgerPath() {
6
+ return join(getHomeDir(), "pr-links.json");
7
+ }
8
+
9
+ export function readPrLinkLedger() {
10
+ try {
11
+ const ledgerPath = prLinkLedgerPath();
12
+ if (!existsSync(ledgerPath)) return {};
13
+ const parsed = JSON.parse(readFileSync(ledgerPath, "utf-8"));
14
+ return parsed && typeof parsed === "object" ? parsed : {};
15
+ } catch {
16
+ return {};
17
+ }
18
+ }
19
+
20
+ export function getPrLinks(sessionId) {
21
+ if (!sessionId) return [];
22
+ const links = readPrLinkLedger()[sessionId];
23
+ return Array.isArray(links)
24
+ ? [...links].sort((a, b) => (b.updatedAt || 0) - (a.updatedAt || 0))
25
+ : [];
26
+ }
@@ -48,6 +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 {
52
+ consumeMcpStdioCapsuleSandboxExecutionContract,
53
+ consumeMcpStdioExecutableIdentityAuthority,
54
+ MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
55
+ } from "../mcp-stdio-executable-identity.js";
51
56
 
52
57
  const SUPPORTED_SANDBOX_BOUNDARIES = new Set(Object.values(SANDBOX_BOUNDARIES));
53
58
  const SUPPORTED_SANDBOX_PROFILES = new Set([
@@ -705,22 +710,35 @@ class ProcessExecutionBroker extends EventEmitter {
705
710
  }
706
711
  return admitted;
707
712
  }
708
- if (
709
- !consumeIssuedPluginSandboxExecutionContract(raw, {
710
- origin: options.origin,
711
- command: launch?.command,
712
- args: launch?.args,
713
- cwd: options.cwd,
714
- pluginId: options.pluginId,
715
- pluginVersion: options.pluginVersion,
716
- pluginSource: options.pluginSource,
717
- pluginExecutableIdentity: options.pluginExecutableIdentity,
718
- requiredBoundaries,
719
- sync: launch?.sync === true,
720
- })
721
- ) {
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) {
722
738
  return invalid(
723
- "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",
724
742
  );
725
743
  }
726
744
  if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
@@ -750,18 +768,22 @@ class ProcessExecutionBroker extends EventEmitter {
750
768
  "strict-plugin-node-bin",
751
769
  "strict-plugin-native-static-elf-bin",
752
770
  "strict-plugin-native-elf-bin",
771
+ MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND,
753
772
  ].includes(raw.kind)
754
773
  ) {
755
774
  return invalid("unsupported sandboxExecutionContract kind or version");
756
775
  }
757
776
  if (
758
- options.origin !== "plugin:bin" ||
759
- typeof options.pluginId !== "string" ||
760
- !options.pluginId ||
761
- options.shell !== false
777
+ options.shell !== false ||
778
+ (!mcpCapsule &&
779
+ (options.origin !== "plugin:bin" ||
780
+ typeof options.pluginId !== "string" ||
781
+ !options.pluginId))
762
782
  ) {
763
783
  return invalid(
764
- "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",
765
787
  );
766
788
  }
767
789
 
@@ -803,17 +825,19 @@ class ProcessExecutionBroker extends EventEmitter {
803
825
  );
804
826
  }
805
827
 
806
- const provenanceIdentity = this._normalizePluginExecutableIdentity(
807
- options.pluginExecutableIdentity,
808
- );
809
- if (
810
- !provenanceIdentity ||
811
- provenanceIdentity.realPath !== entryIdentity.realPath ||
812
- provenanceIdentity.sha256 !== entryIdentity.sha256
813
- ) {
814
- return invalid(
815
- "sandboxExecutionContract entry identity does not match plugin provenance",
828
+ if (!mcpCapsule) {
829
+ const provenanceIdentity = this._normalizePluginExecutableIdentity(
830
+ options.pluginExecutableIdentity,
816
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
+ }
817
841
  }
818
842
  const entryRelative = path.relative(
819
843
  path.resolve(raw.pluginRoot),
@@ -1180,6 +1204,9 @@ class ProcessExecutionBroker extends EventEmitter {
1180
1204
  "pluginTreeSnapshotContractBound",
1181
1205
  "pluginTreeSnapshotAtomic",
1182
1206
  "initialDynamicLoadClosureDescriptorBound",
1207
+ "sharedLibraryClosure",
1208
+ "entrySnapshotAtomic",
1209
+ "runtimeLaunchAtomic",
1183
1210
  ]) {
1184
1211
  if (
1185
1212
  plan.runtimeProbe[field] !== undefined &&
@@ -1196,6 +1223,9 @@ class ProcessExecutionBroker extends EventEmitter {
1196
1223
  "pluginTreeContentSnapshotBytes",
1197
1224
  "initialDynamicDependencyCount",
1198
1225
  "initialDynamicRuntimeFileCount",
1226
+ "runtimeSnapshotBytes",
1227
+ "runtimeAttestedBytes",
1228
+ "entrySnapshotBytes",
1199
1229
  ]) {
1200
1230
  if (
1201
1231
  plan.runtimeProbe[field] !== undefined &&
@@ -1208,6 +1238,22 @@ class ProcessExecutionBroker extends EventEmitter {
1208
1238
  );
1209
1239
  }
1210
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
+ }
1211
1257
  if (
1212
1258
  plan.runtimeProbe.pluginTreeContentSnapshotDigest !== undefined &&
1213
1259
  (typeof plan.runtimeProbe.pluginTreeContentSnapshotDigest !==
@@ -1509,6 +1555,78 @@ class ProcessExecutionBroker extends EventEmitter {
1509
1555
  "Sandbox runtime probe successful dynamic ELF evidence requires a descriptor-bound initial direct system set",
1510
1556
  );
1511
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
+ }
1512
1630
  const genericWorkspaceEvidenceFields = [
1513
1631
  "contractDigest",
1514
1632
  "policyDigest",
@@ -1800,6 +1918,26 @@ class ProcessExecutionBroker extends EventEmitter {
1800
1918
  plan.runtimeProbe.contentSnapshotMechanism,
1801
1919
  }
1802
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
+ : {}),
1803
1941
  };
1804
1942
  for (const field of [
1805
1943
  "pluginTreeContentSnapshot",
@@ -2717,6 +2855,10 @@ class ProcessExecutionBroker extends EventEmitter {
2717
2855
  const startTime = Date.now();
2718
2856
  const origin = options.origin || "unknown";
2719
2857
  const requestedCwd = options.cwd || process.cwd();
2858
+ const mcpStdioExecutableIdentityAuthority =
2859
+ options.mcpStdioExecutableIdentityAuthority;
2860
+ const identityCommand = command;
2861
+ const identityArgs = [...(args || [])];
2720
2862
  options = this._withWorkspaceTransactionBoundaries(options, requestedCwd, {
2721
2863
  command,
2722
2864
  args,
@@ -2764,6 +2906,7 @@ class ProcessExecutionBroker extends EventEmitter {
2764
2906
  sandboxRequired: [],
2765
2907
  sandboxGuarantees: [],
2766
2908
  sandboxBackend: null,
2909
+ mcpStdioExecutableIdentityDigest: null,
2767
2910
  };
2768
2911
 
2769
2912
  let sandboxPolicy;
@@ -2813,6 +2956,8 @@ class ProcessExecutionBroker extends EventEmitter {
2813
2956
  this._stripPluginControlOptions(spawnOpts);
2814
2957
  this._stripWorkspaceTransactionOptions(spawnOpts);
2815
2958
  this._stripAuditControlOptions(spawnOpts);
2959
+ delete spawnOpts.mcpStdioExecutableIdentityAuthority;
2960
+ delete spawnOpts.mcpStdioExecutableIdentityDigest;
2816
2961
  if (traceCtx) {
2817
2962
  spawnOpts.env = { ...(spawnOpts.env || process.env) };
2818
2963
  spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
@@ -2886,6 +3031,17 @@ class ProcessExecutionBroker extends EventEmitter {
2886
3031
  const nativeSpawnFn = this._native?.spawn || nativeSpawn;
2887
3032
  let proc;
2888
3033
  try {
3034
+ if (mcpStdioExecutableIdentityAuthority !== undefined) {
3035
+ const admitted = consumeMcpStdioExecutableIdentityAuthority(
3036
+ mcpStdioExecutableIdentityAuthority,
3037
+ {
3038
+ command: identityCommand,
3039
+ args: identityArgs,
3040
+ env: optsForSpawn.env || {},
3041
+ },
3042
+ );
3043
+ auditEntry.mcpStdioExecutableIdentityDigest = admitted.identityDigest;
3044
+ }
2889
3045
  proc = nativeSpawnFn(command, args, optsForSpawn);
2890
3046
  this._bindWorkspaceTransactionProcess(auditEntry, proc);
2891
3047
  } catch (spawnError) {
@@ -2920,15 +3076,16 @@ class ProcessExecutionBroker extends EventEmitter {
2920
3076
  if (
2921
3077
  sandboxPlan.applied === true &&
2922
3078
  (sandboxPlan.backend === "linux-bwrap-workspace" ||
2923
- sandboxPlan.backend === "linux-bwrap") &&
3079
+ sandboxPlan.backend === "linux-bwrap" ||
3080
+ sandboxPlan.backend === "linux-fd-code-snapshot") &&
2924
3081
  sandboxPlan.postSpawn.required === false
2925
3082
  ) {
2926
3083
  // child_process.spawn() has synchronously duplicated every stdio entry
2927
- // into the launched bwrap process before returning. Both the generic
2928
- // 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
2929
3086
  // pre-spawn plans with no parent-side enforcement handle. Retaining
2930
- // their pinned mount/seccomp/supervisor descriptors until a long-lived
2931
- // 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.
2932
3089
  cleanupSandbox();
2933
3090
  }
2934
3091
  try {