chainlesschain 0.162.188 → 0.162.189

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 (188) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DbZft8w0.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-DoOZpwfN.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-B0J0KLTW.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-D9eIR0qq.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-BnZXEVeo.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-X1ce4Bjn.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-BvWR-y5v.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BublSGEd.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-CR_77Hso.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-DixW52tq.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DDHDpBBA.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CCv1C87K.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-B03Cc3dd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CA06-6pU.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-Bj881J52.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-UZLTPoaL.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-kGwzRb_0.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-KundoYM8.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-BYZyoqDe.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BhrrppBX.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-CdC6EguZ.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-CcQx3J4y.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-BpijtEzQ.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-DfZjeZTe.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-BFYSf69C.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-Okdi3pJm.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-mH-HebKW.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-xivV69x7.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-1rh_YBwg.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-eAXkNxdY.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-CS6dMVTN.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-Bq_TnkvD.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-KchHtiHt.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-TabqHW9B.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-CsmGcX5X.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-BaPFnnyz.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-2m-sUUf7.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-D5nVZBRu.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-Bo8MLZvT.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-3GDvamGa.js} +6 -6
  42. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-D2zGuZCH.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-BBVQ4t6t.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-BIOCyOGp.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DVwBGpzc.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-BDnHfIfX.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BU2Yqq5H.js → OrderTableRenderer-C7Ek20ag.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D3SRKaa7.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-C2B8ahyn.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-2iwQzG65.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-69ca_WeR.js → PdhVaultBrowser-CoPiWqMN.js} +4 -4
  52. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-yV5XNXo5.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-uCDJhMUF.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-hN7ucMOA.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-CgU0ptN4.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-CfYPiT6j.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-B0A2C4nw.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-BE5C0ajn.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-CstQPf8W.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-Co3z_ynk.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-DMTS6pQ6.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-ETw4odUa.js} +1 -1
  63. package/src/assets/web-panel/assets/RemoteSession-B0rkE09d.js +5 -0
  64. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-BTVqQgKq.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CBKKwwtO.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BHUQ438I.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-B4NqeUsF.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-BRjoYG5_.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-CxQzu3p3.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton-BKzwwmWO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-DrsFcgth.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-D21tmXCH.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-CjyjLfp8.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-Cu45-tnx.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-oMcILYOj.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-Bh-Zcr5R.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-68ns63aI.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BLJkFykE.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-xcrJLq-O.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-C6PpFJtf.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-BaKA7tdM.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-BzhA57Jc.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-4_U3JkIR.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-162AANxX.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-B1viuql_.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-ZVWazhCy.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-tzdyUk-1.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-DmrHNuwq.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-DAJ_M-PK.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-uIzmYwLs.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-D_ZmuLwb.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DIrncrV1.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-CDt_shTL.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-BAvSmJXW.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-BDF6EQBs.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-BHvlm0In.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-BRa4kJ_S.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-BTCXf1t-.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Bbxjfstq.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-Bx4d6c1k.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-ByzGvpR9.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-C16fYKFD.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-C5WcdJH2.js} +3 -3
  104. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-CG0lY4h3.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-CKyd472S.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-CaelyMgF.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CbD_WW_6.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-CcZ9xJI9.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CeUpKjvi.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-Cvak6Oe2.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-CzXqvMuP.js} +1 -1
  112. package/src/assets/web-panel/assets/index-D-Swwqld.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-D4n1lGTB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-D9OE8B3d.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-DBFmcaCQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-DdUMcwRB.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-DeGBoLQA.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-DfSSy9uy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-DqDSF2RW.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-DvFhhe6r.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-DwfvPe-j.js} +1 -1
  122. package/src/assets/web-panel/assets/index-FMZAMKy8.js +1 -0
  123. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-FyplHuNt.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-GcKOHD_c.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-OzTxFIJP.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-QsgfSZrV.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-Z8P4BexE.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-clSX4PEc.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-ifxmu8SY.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-rS3gl_68.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-rXdwUeE3.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-saf3VNeP.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-pmfaD-aK.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-CaQ2CpYF.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-CkKTqNbI.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-Dd4xsgRI.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-BFuA5YEs.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-DDfxOAJc.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-Be595JCp.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-7byljUM3.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-CTWfOTaY.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-CNZOuIxM.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-DwOcBV78.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-B6MNwAO9.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-CzyQjH9r.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-Dxh3KiVA.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-DVfZiS5N.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-BYme7fbY.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agent.js +22 -0
  151. package/src/commands/checkpoint-managed.js +1059 -0
  152. package/src/commands/checkpoint.js +3 -0
  153. package/src/commands/team-distributed.js +3324 -0
  154. package/src/commands/team.js +1130 -74
  155. package/src/data/changelog.json +13 -0
  156. package/src/lib/agent-core.js +1 -0
  157. package/src/lib/agent-team/task-lease.js +271 -3
  158. package/src/lib/agent-team/team-adjudication.js +1501 -0
  159. package/src/lib/agent-team/team-budget.js +4 -1
  160. package/src/lib/agent-team/team-control-store.js +582 -0
  161. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  162. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  163. package/src/lib/agent-team/team-runner.js +319 -22
  164. package/src/lib/agent-team/team-worktree.js +1403 -95
  165. package/src/lib/managed-checkpoint-render.js +60 -0
  166. package/src/lib/managed-tool-checkpoint.js +194 -0
  167. package/src/lib/process-execution-broker/index.js +438 -5
  168. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  169. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  170. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  171. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  172. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  173. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  174. package/src/lib/process-execution-broker/workspace-transaction.js +3556 -0
  175. package/src/lib/secure-file-identity.js +433 -0
  176. package/src/lib/turn-binding.js +160 -2
  177. package/src/lib/with-file-lock.js +140 -23
  178. package/src/repl/agent-repl.js +19 -1
  179. package/src/runtime/agent-core.js +366 -122
  180. package/src/runtime/headless-runner.js +12 -0
  181. package/src/runtime/headless-stream.js +3 -0
  182. package/src/runtime/policies/agent-policy.js +14 -0
  183. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  184. package/src/assets/web-panel/assets/MobileProjects-COBbEOlj.js +0 -1
  185. package/src/assets/web-panel/assets/RemoteSession-oOVIv9wq.js +0 -5
  186. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  187. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  188. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -90,12 +90,14 @@ const OPAQUE_NON_ROOT_FILESYSTEMS = new Set([
90
90
  const REQUIRED_BWRAP_OPTIONS = [
91
91
  "--assert-userns-disabled",
92
92
  "--bind-fd",
93
+ "--die-with-parent",
93
94
  "--disable-userns",
94
95
  "--file",
95
96
  "--perms",
96
97
  "--remount-ro",
97
98
  "--ro-bind-fd",
98
99
  "--seccomp",
100
+ "--unshare-pid",
99
101
  ];
100
102
  const SECCOMP_ARCHITECTURES = Object.freeze({
101
103
  x64: Object.freeze({
@@ -127,6 +129,8 @@ const DEFAULT_RUNTIME = Object.freeze({
127
129
  homedir: () => os.homedir(),
128
130
  tmpdir: () => os.tmpdir(),
129
131
  randomBytes: (size) => crypto.randomBytes(size),
132
+ sleepSync: (milliseconds) =>
133
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds),
130
134
  spawnSync: nativeSpawnSync,
131
135
  });
132
136
 
@@ -771,6 +775,12 @@ function createTrustedResources(
771
775
  if (!/^net:\[\d+\]$/.test(hostNetworkNamespace)) {
772
776
  throw new Error("host_network_namespace_identity_unavailable");
773
777
  }
778
+ const hostPidNamespace = String(
779
+ runtime.fs.readlinkSync("/proc/self/ns/pid"),
780
+ );
781
+ if (!/^pid:\[\d+\]$/.test(hostPidNamespace)) {
782
+ throw new Error("host_pid_namespace_identity_unavailable");
783
+ }
774
784
 
775
785
  const workspace = openPair(contract.workspaceRoot, {
776
786
  directory: true,
@@ -1245,6 +1255,10 @@ function createTrustedResources(
1245
1255
  contract.workspaceRoot,
1246
1256
  `.chainless-bwrap-probe-${nonce}`,
1247
1257
  );
1258
+ const processTreeMarker = path.posix.join(
1259
+ contract.workspaceRoot,
1260
+ `.chainless-bwrap-tree-probe-${nonce}`,
1261
+ );
1248
1262
  const outsideMarker = path.posix.join(
1249
1263
  runtime.tmpdir(),
1250
1264
  `.chainless-bwrap-outside-${nonce}`,
@@ -1368,10 +1382,16 @@ function createTrustedResources(
1368
1382
  `test "$(readlink /proc/self/ns/net)" != ${shellQuote(
1369
1383
  hostNetworkNamespace,
1370
1384
  )}`,
1385
+ `test "$(readlink /proc/self/ns/pid)" != ${shellQuote(
1386
+ hostPidNamespace,
1387
+ )}`,
1371
1388
  `printf %s ${shellQuote(nonce)} > ${shellQuote(workspaceMarker)}`,
1372
1389
  `test "$(cat ${shellQuote(workspaceMarker)})" = ${shellQuote(nonce)}`,
1373
1390
  `rm -f ${shellQuote(workspaceMarker)}`,
1374
1391
  socketProbeCommand,
1392
+ `( sleep 0.05; printf late-writer > ${shellQuote(
1393
+ processTreeMarker,
1394
+ )} ) &`,
1375
1395
  `printf '%s\\n%s\\n' ${shellQuote(call.policyDigest)} ${shellQuote(
1376
1396
  call.contractDigest,
1377
1397
  )}`,
@@ -1392,6 +1412,8 @@ function createTrustedResources(
1392
1412
  devShmCreated &&
1393
1413
  String(runtime.fs.readFileSync(devShmMarker, "utf8")) ===
1394
1414
  `host-dev-shm-${nonce}`;
1415
+ runtime.sleepSync(75);
1416
+ const processTreeClosed = !runtime.fs.existsSync(processTreeMarker);
1395
1417
  const expectedOutput = `${call.policyDigest}\n${call.contractDigest}\n`;
1396
1418
  const runnable =
1397
1419
  !result?.error &&
@@ -1399,7 +1421,8 @@ function createTrustedResources(
1399
1421
  String(result.stdout) === expectedOutput &&
1400
1422
  outsideUnchanged &&
1401
1423
  homeUnchanged &&
1402
- devShmUnchanged;
1424
+ devShmUnchanged &&
1425
+ processTreeClosed;
1403
1426
  return {
1404
1427
  runnable,
1405
1428
  policyDigest: runnable ? call.policyDigest : null,
@@ -1414,6 +1437,9 @@ function createTrustedResources(
1414
1437
  outsideMarkerHidden: runnable,
1415
1438
  networkNamespace: runnable,
1416
1439
  networkNamespaceChanged: runnable,
1440
+ pidNamespace: runnable,
1441
+ pidNamespaceChanged: runnable,
1442
+ processTreeCloseProbe: runnable,
1417
1443
  socketCreationDenied: runnable,
1418
1444
  };
1419
1445
  } catch {
@@ -1421,6 +1447,7 @@ function createTrustedResources(
1421
1447
  } finally {
1422
1448
  for (const marker of [
1423
1449
  workspaceMarker,
1450
+ processTreeMarker,
1424
1451
  outsideMarker,
1425
1452
  homeMarker,
1426
1453
  devShmMarker,
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * This module is intentionally independent from platform-sandbox.js so the
5
5
  * Broker can adopt it without weakening the narrow Plugin-bin contract. A raw
6
- * manifest policy can request filesystem/network boundaries, but it cannot
6
+ * manifest policy can request filesystem/network/process-tree boundaries, but it cannot
7
7
  * nominate a writable root: only an exact object issued here is accepted, and
8
8
  * every contract is single-use.
9
9
  *
@@ -26,7 +26,7 @@ export const LINUX_GENERIC_BWRAP_BACKEND = "linux-bwrap-workspace";
26
26
  export const LINUX_GENERIC_CONTRACT_KIND = "strict-workspace-command";
27
27
  export const LINUX_GENERIC_PTY_LAUNCHER_PATH = "/usr/bin/setsid";
28
28
 
29
- const SUPPORTED_BOUNDARIES = new Set(["filesystem", "network"]);
29
+ const SUPPORTED_BOUNDARIES = new Set(["filesystem", "network", "process-tree"]);
30
30
  const SYSTEM_RUNTIME_DESTINATIONS = new Set([
31
31
  "/usr",
32
32
  "/bin",
@@ -185,7 +185,7 @@ function normalizeBoundaries(boundaries) {
185
185
  )
186
186
  ) {
187
187
  throw new TypeError(
188
- "requiredBoundaries may contain only filesystem and network",
188
+ "requiredBoundaries may contain only filesystem, network, and process-tree",
189
189
  );
190
190
  }
191
191
  return Object.freeze(normalized);
@@ -1018,6 +1018,13 @@ function policyBinding({
1018
1018
  namespace: "new",
1019
1019
  seccomp: validated.seccomp,
1020
1020
  },
1021
+ processTree: {
1022
+ namespace: "new",
1023
+ init: "bubblewrap-pid1-reaper",
1024
+ dieWithParent: true,
1025
+ asPid1: false,
1026
+ closeFence: "pid-namespace-empty-or-killed",
1027
+ },
1021
1028
  target: {
1022
1029
  requestedCommand: validated.target.requestedCommand,
1023
1030
  command: validated.target.resolvedCommand,
@@ -1199,6 +1206,9 @@ export function planLinuxGenericBubblewrap(
1199
1206
  probeResult.outsideMarkerHidden !== true ||
1200
1207
  probeResult.networkNamespace !== true ||
1201
1208
  probeResult.networkNamespaceChanged !== true ||
1209
+ probeResult.pidNamespace !== true ||
1210
+ probeResult.pidNamespaceChanged !== true ||
1211
+ probeResult.processTreeCloseProbe !== true ||
1202
1212
  probeResult.socketCreationDenied !== true
1203
1213
  ) {
1204
1214
  return unavailablePlan(
@@ -1268,7 +1278,7 @@ export function planLinuxGenericBubblewrap(
1268
1278
  enforcement: LINUX_GENERIC_BWRAP_BACKEND,
1269
1279
  backend: LINUX_GENERIC_BWRAP_BACKEND,
1270
1280
  candidateBackend: null,
1271
- guarantees: Object.freeze(["filesystem", "network"]),
1281
+ guarantees: Object.freeze(["filesystem", "network", "process-tree"]),
1272
1282
  requiredBoundaries: Object.freeze([...requiredBoundaries]),
1273
1283
  policyAttested: true,
1274
1284
  policyDigest,
@@ -1303,6 +1313,12 @@ export function planLinuxGenericBubblewrap(
1303
1313
  outsideMarkerHidden: true,
1304
1314
  networkNamespace: true,
1305
1315
  networkNamespaceChanged: true,
1316
+ pidNamespace: true,
1317
+ pidNamespaceChanged: true,
1318
+ processTreeCloseProbe: true,
1319
+ bubblewrapPid1Reaper: true,
1320
+ dieWithParent: true,
1321
+ closeImpliesProcessTreeClosed: true,
1306
1322
  socketCreationDenied: true,
1307
1323
  descriptorMounts: true,
1308
1324
  }),
@@ -1339,6 +1355,14 @@ export function planLinuxGenericBubblewrap(
1339
1355
  namespaceIdentityChanged: true,
1340
1356
  seccomp: "deny-network-creation",
1341
1357
  }),
1358
+ processTreePolicy: Object.freeze({
1359
+ namespace: "new",
1360
+ namespaceIdentityChanged: true,
1361
+ init: "bubblewrap-pid1-reaper",
1362
+ parentDeathSignal: "SIGKILL",
1363
+ asPid1: false,
1364
+ closeFence: "pid-namespace-empty-or-killed",
1365
+ }),
1342
1366
  ptyPolicy: issued.pty
1343
1367
  ? Object.freeze({
1344
1368
  mode: "dedicated-controlling-terminal",
@@ -1113,8 +1113,8 @@ function buildWindowsAdapterInvocation(entry, invocation) {
1113
1113
  };
1114
1114
  }
1115
1115
 
1116
- function resolveWindowsPowerShellHost(runtime, loaderMode) {
1117
- if (loaderMode !== "powershell-byte-assembly") return null;
1116
+ function resolveWindowsPowerShellHosts(runtime, loaderMode) {
1117
+ if (loaderMode !== "powershell-byte-assembly") return [];
1118
1118
  const windowsDirectory = path.win32.resolve(runtime.windowsDir());
1119
1119
  const driveRoot = path.win32.parse(windowsDirectory).root;
1120
1120
  const modernHost = runtime.joinPath(
@@ -1126,13 +1126,14 @@ function resolveWindowsPowerShellHost(runtime, loaderMode) {
1126
1126
  );
1127
1127
  const realpath =
1128
1128
  runtime.fs.realpathSync?.native || runtime.fs.realpathSync || null;
1129
+ const hosts = [];
1129
1130
  if (runtime.fs.existsSync(modernHost) && typeof realpath === "function") {
1130
1131
  try {
1131
1132
  if (
1132
1133
  windowsCanonicalPathKey(realpath.call(runtime.fs, modernHost)) ===
1133
1134
  windowsCanonicalPathKey(modernHost)
1134
1135
  ) {
1135
- return modernHost;
1136
+ hosts.push(modernHost);
1136
1137
  }
1137
1138
  } catch {
1138
1139
  // Fall through to the protected in-box host.
@@ -1146,15 +1147,24 @@ function resolveWindowsPowerShellHost(runtime, loaderMode) {
1146
1147
  "v1.0",
1147
1148
  "powershell.exe",
1148
1149
  );
1149
- return runtime.fs.existsSync(inboxHost) ? inboxHost : null;
1150
+ if (runtime.fs.existsSync(inboxHost) && !hosts.includes(inboxHost)) {
1151
+ hosts.push(inboxHost);
1152
+ }
1153
+ return hosts;
1150
1154
  }
1151
1155
 
1152
1156
  function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
1153
1157
  const materialized = materializeWindowsAdapter(runtime, source);
1154
1158
  if (!materialized.assemblyPath) return materialized;
1155
1159
 
1156
- const powershell = resolveWindowsPowerShellHost(runtime, source.loaderMode);
1157
- if (source.loaderMode === "powershell-byte-assembly" && !powershell) {
1160
+ const powershellHosts = resolveWindowsPowerShellHosts(
1161
+ runtime,
1162
+ source.loaderMode,
1163
+ );
1164
+ if (
1165
+ source.loaderMode === "powershell-byte-assembly" &&
1166
+ powershellHosts.length === 0
1167
+ ) {
1158
1168
  const assemblyDeleted = materialized.cleanupAssembly();
1159
1169
  return {
1160
1170
  reason: assemblyDeleted
@@ -1188,7 +1198,7 @@ function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
1188
1198
  sourceDigest: source.sourceDigest,
1189
1199
  sourceContractDigest: source.sourceContractDigest,
1190
1200
  loaderMode: source.loaderMode,
1191
- powershellPath: powershell,
1201
+ powershellPath: powershellHosts[0] || null,
1192
1202
  adapterDirectory: materialized.adapterDirectory,
1193
1203
  assemblyPath: materialized.assemblyPath,
1194
1204
  assemblyDigest: attestation.assemblyDigest,
@@ -1198,69 +1208,76 @@ function createFreshWindowsAdapter(runtime, source, hostEnvironment) {
1198
1208
  retired: false,
1199
1209
  cleaned: false,
1200
1210
  };
1201
- const probePayload = materializeWindowsAdapterInvocation(runtime, [
1202
- "--probe-helper",
1203
- ]);
1204
- if (!probePayload.payloadPath) {
1205
- const assemblyDeleted = materialized.cleanupAssembly();
1206
- return assemblyDeleted
1207
- ? probePayload
1208
- : { reason: "windows_native_adapter_compile_cleanup_unverified" };
1209
- }
1210
- const probeInvocation = buildWindowsAdapterInvocation(entry, probePayload);
1211
- let probeResult;
1212
- let probePayloadDeleted = false;
1213
- try {
1214
- probeResult = runtime.spawnSync(
1215
- probeInvocation.command,
1216
- probeInvocation.args,
1217
- {
1218
- shell: false,
1219
- windowsHide: true,
1220
- encoding: "utf8",
1221
- timeout: WINDOWS_SANDBOX_HELPER_OPERATION_TIMEOUT_MS,
1222
- cwd: runtime.joinPath(runtime.windowsDir(), "System32"),
1223
- env: hostEnvironment,
1224
- },
1225
- );
1226
- } catch (error) {
1227
- probeResult = { error, status: null };
1228
- } finally {
1229
- probePayloadDeleted = probeInvocation.cleanup();
1230
- }
1231
- let probeReady = false;
1232
- try {
1233
- const probe = JSON.parse(String(probeResult?.stdout || "").trim());
1234
- probeReady =
1235
- probeResult?.status === 0 &&
1236
- probe?.ready === true &&
1237
- probe?.hostRuntime ===
1238
- (source.loaderMode === "managed-executable"
1239
- ? "managed-executable-v1"
1240
- : "powershell-byte-assembly-v1") &&
1241
- (source.sourceContractDigest === null ||
1242
- probe?.sourceSha256 === source.sourceContractDigest);
1243
- } catch {
1244
- probeReady = false;
1245
- }
1246
- if (
1247
- !probePayloadDeleted ||
1248
- !probeReady ||
1249
- !verifyWindowsAdapterEntry(entry, runtime, source)
1250
- ) {
1251
- const assemblyDeleted = materialized.cleanupAssembly();
1252
- return {
1253
- reason:
1254
- !assemblyDeleted || !probePayloadDeleted
1255
- ? "windows_native_adapter_compile_cleanup_unverified"
1256
- : "windows_in_memory_adapter_probe_failed",
1257
- };
1211
+ const probeHosts =
1212
+ source.loaderMode === "powershell-byte-assembly" ? powershellHosts : [null];
1213
+ for (const powershellPath of probeHosts) {
1214
+ entry.powershellPath = powershellPath;
1215
+ const probePayload = materializeWindowsAdapterInvocation(runtime, [
1216
+ "--probe-helper",
1217
+ ]);
1218
+ if (!probePayload.payloadPath) {
1219
+ const assemblyDeleted = materialized.cleanupAssembly();
1220
+ return assemblyDeleted
1221
+ ? probePayload
1222
+ : { reason: "windows_native_adapter_compile_cleanup_unverified" };
1223
+ }
1224
+ const probeInvocation = buildWindowsAdapterInvocation(entry, probePayload);
1225
+ let probeResult;
1226
+ let probePayloadDeleted = false;
1227
+ try {
1228
+ probeResult = runtime.spawnSync(
1229
+ probeInvocation.command,
1230
+ probeInvocation.args,
1231
+ {
1232
+ shell: false,
1233
+ windowsHide: true,
1234
+ encoding: "utf8",
1235
+ timeout: WINDOWS_SANDBOX_HELPER_OPERATION_TIMEOUT_MS,
1236
+ cwd: runtime.joinPath(runtime.windowsDir(), "System32"),
1237
+ env: hostEnvironment,
1238
+ },
1239
+ );
1240
+ } catch (error) {
1241
+ probeResult = { error, status: null };
1242
+ } finally {
1243
+ probePayloadDeleted = probeInvocation.cleanup();
1244
+ }
1245
+ if (!probePayloadDeleted) {
1246
+ materialized.cleanupAssembly();
1247
+ return {
1248
+ reason: "windows_native_adapter_compile_cleanup_unverified",
1249
+ };
1250
+ }
1251
+ let probeReady = false;
1252
+ try {
1253
+ const probe = JSON.parse(String(probeResult?.stdout || "").trim());
1254
+ probeReady =
1255
+ probeResult?.status === 0 &&
1256
+ probe?.ready === true &&
1257
+ probe?.hostRuntime ===
1258
+ (source.loaderMode === "managed-executable"
1259
+ ? "managed-executable-v1"
1260
+ : "powershell-byte-assembly-v1") &&
1261
+ (source.sourceContractDigest === null ||
1262
+ probe?.sourceSha256 === source.sourceContractDigest);
1263
+ } catch {
1264
+ probeReady = false;
1265
+ }
1266
+ if (!probeReady) continue;
1267
+ if (!verifyWindowsAdapterEntry(entry, runtime, source)) break;
1268
+
1269
+ windowsAdapterCacheEntries.add(entry);
1270
+ windowsAdapterCache = entry;
1271
+ registerWindowsAdapterExitCleanup();
1272
+ return { entry };
1258
1273
  }
1259
1274
 
1260
- windowsAdapterCacheEntries.add(entry);
1261
- windowsAdapterCache = entry;
1262
- registerWindowsAdapterExitCleanup();
1263
- return { entry };
1275
+ const assemblyDeleted = materialized.cleanupAssembly();
1276
+ return {
1277
+ reason: assemblyDeleted
1278
+ ? "windows_in_memory_adapter_probe_failed"
1279
+ : "windows_native_adapter_compile_cleanup_unverified",
1280
+ };
1264
1281
  }
1265
1282
 
1266
1283
  function acquireWindowsAdapterLease(runtime, source, hostEnvironment) {
@@ -5418,7 +5435,8 @@ export function applyLinuxSandbox(
5418
5435
  const requiresStrongLinuxBoundary = requiredBoundaries.some(
5419
5436
  (boundary) =>
5420
5437
  boundary === SANDBOX_BOUNDARIES.FILESYSTEM ||
5421
- boundary === SANDBOX_BOUNDARIES.NETWORK,
5438
+ boundary === SANDBOX_BOUNDARIES.NETWORK ||
5439
+ boundary === SANDBOX_BOUNDARIES.PROCESS_TREE,
5422
5440
  );
5423
5441
 
5424
5442
  if (requiresStrongLinuxBoundary) {
@@ -6116,7 +6134,11 @@ export function applyLinuxSandbox(
6116
6134
  policyDigest,
6117
6135
  runtimeProbe,
6118
6136
  reason: null,
6119
- guarantees: [SANDBOX_BOUNDARIES.FILESYSTEM, SANDBOX_BOUNDARIES.NETWORK],
6137
+ guarantees: [
6138
+ SANDBOX_BOUNDARIES.FILESYSTEM,
6139
+ SANDBOX_BOUNDARIES.NETWORK,
6140
+ SANDBOX_BOUNDARIES.PROCESS_TREE,
6141
+ ],
6120
6142
  command: finalLaunch.command,
6121
6143
  args: [...policyArgs, "--", ...targetArgs],
6122
6144
  options,