chainlesschain 0.165.6 → 0.165.9

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 (251) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-vfoDb6HZ.js → AIOps-DxwjrnEA.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Cm5f7p93.js → ActionButton-JdbYowzn.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-yRuvgWxa.js → Analytics-C06GCahv.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BROsC4h1.js → AppLayout-BUVEEyi1.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-CimHApb1.js → Artifacts-D_ORzkJd.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DI8kr8zI.js → Audit-8o_Y5ejG.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DSLzKy-n.js → BackgroundAgents-DrkHd5VU.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DkH_n2r1.js → Backup-CKBZCX11.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-CKSrUoRA.js → BaseInput-C8HkI399.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-ClwfMXUS.js → Chat-zb2H2Wux.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CjMaqfL7.js → ChatBubbleRenderer-BDcNpU_F.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BYTehcQG.js → Checkbox-MwPtQmNz.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B8AMcp6J.js → Codegen-3p5QCkFK.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-BNSogPo3.js → Col-BPLlhn52.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-JxPvGb8O.js → Community-C-3dBNOM.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DF7bFAgE.js → Compact-BUcy-F_b.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-Bvhqnwrq.js → Compliance-CI8NxT8m.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BDS0CJvM.js → Cowork-DaDEBS-Q.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DqvRfxoQ.js → Cron-BSv9HXu5.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CDcIvnqS.js → Crosschain-yuiKlJmv.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D7jaUxU3.js → DID-D6LfldB0.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-B5A18wEV.js → Dashboard-CBhLqG61.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-_6IVkGag.js → Dropdown-BG8pIl3O.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-C9PeiKCG.js → EmailListRenderer-CY92VIE6.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DXjuEHrX.js → FamilyGuardDashboard-1Q_ehauM.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-B4IAR9zv.js → Federation-D3XirJIU.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-CxQeSNx1.js → FormItemContext-DfI9UuGZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-B8GS-Y3N.js → GenericCardRenderer-IeCZk2m7.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BS8SouUX.js → Git-DzK4IJAZ.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-Dq9aYb5Q.js → Governance-BHf5KfmQ.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-BrCEe9AJ.js → Inference-BmaxSALS.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DybOpiY2.js → KnowledgeGraph-BgePFLA9.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DBpzbRfx.js → Logs-nqgxpOc4.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-xkX6izBt.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Cc7CCSCu.js → Marketplace-Bu8to-86.js} +1 -1
  38. package/src/assets/web-panel/assets/McpTools-BFWTzEk0.js +4 -0
  39. package/src/assets/web-panel/assets/{Memory-KCqlp9ol.js → Memory-B026G2GA.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-Bys84ySN.js → MobileBridge-CM2Eeg6I.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-B-6qU-je.js → MobileProjects-B79Ob3hy.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BgY-fvCq.js → Mtc-CxevSZuV.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-B8pCmqQJ.js → MtcAudit-X396cPEX.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-BbOmYutA.js → Multisig-HWIB_aZ1.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BocLQz_M.js → NLProgramming-gnYD1Xwy.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-CSwbxEop.js → Notes-Dn2Gf_J1.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-CqFNSYG3.js → NotificationSettings-BRKBQ5rq.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-C6gMfAk7.js → OrderTableRenderer-Dy___Cgo.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-QrDXVdMJ.js → Organization-cqfccxnt.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-Cxntotjt.js → Overflow-CSX4FHN3.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CIdBOwNq.js → P2P-Bwa4aghp.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-CT5aP8rD.js → PdhVaultBrowser-Dhszyjig.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-DH7OM8XU.js → Permissions-CXzTyk6e.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CnJqbWce.js → PersonalDataHub-CFCAAJbb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-5C3HG1kH.js → Pipeline-BPJbx6xt.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-B4yIp7xK.js → Privacy-BbiXvEHz.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BMvt-2M0.js → ProjectInit-B-s7-wSD.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CvSTEMRG.js → ProjectSettings-Dyug206y.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-BKBJxEek.js → Projects-BtAI5Fwo.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-BdwUqFWN.js → Providers-JpIPmz6N.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DtnCKlTm.js → QrScannerModal-CZdoN64A.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-sTbgwyNr.js → QuickAsk-BwvnoRIT.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Bzr14gSb.js → Recommend-ASMlMQrD.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-C_TF5IaJ.js → RemoteSession-BiJzKFKi.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-GCAM4H2K.js → Reputation-C80TWLIO.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-Dir0r6OQ.js → Row-C1VNmjmX.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CpGnlecX.js → RssFeed-T2MyGUlG.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DMMamC6u.js → Search-DXM6O83L.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-yqay5yG-.js → Security-nv69kU7W.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-C5i2wh9G.js → Services-AyHWe7Qj.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-vUqk35yj.js → Skeleton-D6PWLxFI.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-DzcSkhot.js → Skills-BqVeOmNQ.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-CB6qbYNr.js → Sla-BegIPl9M.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BHUI7cox.js → SpeechSettings-CKJn3xk-.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-D-RrsxTJ.js → SyncSettings-Th4cnAMl.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DFxdOJiq.js → Tasks-BuKfBroh.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-SKAob_Aq.js → Templates-CMuWN8Ac.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BPfsfHQ-.js → Tenant-C4je8E8Q.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-8iw7FpUf.js → Terminal-agJESOcO.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-C4Gjj5Su.js → TimelineRenderer-D2qDuVZ_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-COYhN18e.js → Tokens-Cvmn99rH.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-B-JzXcf6.js → Trigger-D_QYIHH8.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-BJ5bg0nI.js → Trust-BmzvQLnX.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-BG_ByRMf.js → UkeySign-D_LopHwH.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-B3kOnSiU.js → VideoEditing-DoWl3PhQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-CcoGFnK7.js → Wallet-5NYcAkxe.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-DdT8vRC_.js → WebAuthn-B-_Q3ewp.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CZu3M9N8.js → WorkflowEditor-CHET-gi2.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DxJt3Qba.js → chat-C6nvb-n6.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DdYfwJaB.js → colors-CTDE9LTX.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BG3SUzwj.js → compact-item-KnemdF8D.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-By51z2-1.js → createContext-DUJR3Uek.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-1DqLH1KX.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-B0apZ3KJ.js → hasIn-CFNTaby8.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-ZxtP8jG7.js → index-65HO56Bv.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Da_WBdLX.js → index-B8RtbSkV.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BBPf3TpM.js → index-BHqSqnW7.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BP94CrBV.js → index-BTetEUWd.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-p1_8SbI1.js → index-BXWg1crv.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BWF8_mkx.js → index-BdiC4LOs.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BhJtcPWo.js +1 -0
  102. package/src/assets/web-panel/assets/{index-SQqOlR3d.js → index-BuizJo2E.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CpjZhgNd.js → index-BwZM1rod.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CzmQElZy.js → index-C96N9xeL.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-bP_VlDb4.js → index-CHfUdnJH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-ZFbps9po.js → index-CKvBF3Ov.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaIz0NAW.js → index-CSD9_I2_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BewKYrX9.js → index-Cc7dbl_p.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CNIxXMmN.js → index-CcF0D7UZ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Q2SCX-MI.js → index-Ceu92a8D.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DE76D-kA.js → index-CnLpuTAU.js} +1 -1
  112. package/src/assets/web-panel/assets/index-Cq8MWPDT.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BkvcEo4p.js → index-CquKnw5r.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cp6e-hGw.js → index-CyEtHvEE.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BLIbGOLX.js → index-DF-fcTvQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DCn8IcxV.js → index-DF1Y0Vuw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bissefox.js → index-DJyPeBBk.js} +3 -3
  118. package/src/assets/web-panel/assets/{index-BZ_0qm4g.js → index-DP-PbO11.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-kf57LJ93.js → index-DZgCRMxk.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BYINoRLK.js → index-DfJzS3Qa.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-3jWkIu5j.js → index-DqPpJkte.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B5rLiEo0.js → index-DzReoLyh.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CW93tZDv.js → index-JGTiDeOW.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C1C9i79A.js → index-NUR0If7O.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CAhHirVH.js → index-NtAcnJYW.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-RD6O-0C6.js → index-OmuhFYKE.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-oxRrmFO9.js → index-Wlc7o_C8.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-B3rWuPMW.js → index-bxTPfdri.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BIrJfqO4.js → index-k6uorYmf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BfWYsB9t.js → index-ox6mIwE2.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bos5_aMV.js → index-rVDD7AAR.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CWEuZWCK.js → index-u0h6QqVV.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Dz49VOyQ.js → index-v-mtxmWH.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BWJktcg8.js → initDefaultProps-qEt8dI-t.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BEXBzUFV.js → motion-DetKPWy-.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-BUKwn2sx.js → move-BeNYeDV2.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-FTI7btqQ.js → mtc-parser-C0q0MK_T.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-CsLtSPH3.js → omit-DLKkrKpE.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DWZxsT_S.js → pickAttrs-Bw1tWsY8.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bcfs43CX.js → placementArrow-DeesBLbd.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-a9bcC1p-.js → responsiveObserve-bqLhxHhn.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BDTzgOXN.js → slide-DGCXRoQm.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-Iq1j_HUg.js → statusUtils-H-re3Egl.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-DAZEYxeh.js → styleChecker-BXg4qGX_.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DVkjyDrh.js → useFlexGapSupport-CKLb2KA6.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-wXTpNTHt.js → useFs-CTAhHeyw.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-CtQM_aZr.js → usePersonalDataHub-BQ4pDh5g.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-hjEoG85v.js → vnode-jrSK6j4j.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-BHVpyKg_.js → zoom-fOQE24pw.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +91 -60
  153. package/src/commands/git.js +39 -0
  154. package/src/commands/plugin.js +17 -2
  155. package/src/commands/session-group.js +131 -0
  156. package/src/commands/session-location.js +48 -0
  157. package/src/commands/session.js +11 -0
  158. package/src/commands/sync-providers.js +4 -1
  159. package/src/commands/update.js +1 -0
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/mcp-topic-handlers.js +167 -0
  162. package/src/gateways/ws/ws-agent-handler.js +20 -12
  163. package/src/harness/jsonl-session-store.js +279 -37
  164. package/src/harness/mcp-client.js +701 -91
  165. package/src/harness/session-index.js +15 -4
  166. package/src/lib/agent-network.js +166 -29
  167. package/src/lib/agent-router.js +62 -6
  168. package/src/lib/agent-sandbox.js +7 -1
  169. package/src/lib/agent-worktree.js +8 -1
  170. package/src/lib/auto-mode-safety-classifier.js +3 -17
  171. package/src/lib/background-agent-keeper-protocol.js +26 -6
  172. package/src/lib/background-agent-supervisor.js +17 -1
  173. package/src/lib/browser-evidence.js +1405 -0
  174. package/src/lib/chrome-connector.js +465 -79
  175. package/src/lib/claude-code-bridge.js +159 -54
  176. package/src/lib/claude-project-auto-memory.js +481 -0
  177. package/src/lib/claude-project-storage-layout.js +104 -0
  178. package/src/lib/cloud/cloud-client.js +40 -0
  179. package/src/lib/cowork-workflow.js +69 -6
  180. package/src/lib/execution-location-local-supervisor.mjs +226 -0
  181. package/src/lib/execution-location-runner-lifecycle.js +991 -0
  182. package/src/lib/execution-location-target-preflight.js +333 -0
  183. package/src/lib/execution-location-target.js +783 -13
  184. package/src/lib/external-agent-adapters.js +269 -0
  185. package/src/lib/file-lines.js +6 -1
  186. package/src/lib/gateway-client-resilience.js +571 -0
  187. package/src/lib/gitlab-mr-worktree.js +176 -0
  188. package/src/lib/hooks-v2-producers.js +119 -15
  189. package/src/lib/hooks-v2-workspace-context.js +44 -1
  190. package/src/lib/host-resource-budget.js +295 -0
  191. package/src/lib/ide-context.js +15 -2
  192. package/src/lib/ipfs-storage.js +127 -25
  193. package/src/lib/llm-config-defaults.js +43 -0
  194. package/src/lib/mcp-lifecycle-authority.js +887 -0
  195. package/src/lib/mcp-oauth.js +101 -20
  196. package/src/lib/mcp-tls.js +103 -3
  197. package/src/lib/orchestrator.js +47 -0
  198. package/src/lib/paths.js +260 -32
  199. package/src/lib/permission-request.js +48 -0
  200. package/src/lib/plugin-runtime/bin.js +3 -1
  201. package/src/lib/plugin-runtime/hooks.js +3 -1
  202. package/src/lib/plugin-runtime/install.js +117 -1
  203. package/src/lib/plugin-runtime/lsp.js +4 -4
  204. package/src/lib/plugin-runtime/marketplace-archive-source.js +40 -5
  205. package/src/lib/plugin-runtime/marketplace-catalog.js +13 -2
  206. package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
  207. package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
  208. package/src/lib/plugin-runtime/marketplace-source-adapter.js +33 -8
  209. package/src/lib/plugin-runtime/mcp.js +3 -1
  210. package/src/lib/plugin-runtime/monitors.js +3 -1
  211. package/src/lib/plugin-runtime/remote-source.js +151 -6
  212. package/src/lib/plugin-runtime/settings.js +3 -1
  213. package/src/lib/plugin-runtime/trust.js +274 -13
  214. package/src/lib/process-execution-broker/credential-agent.js +210 -41
  215. package/src/lib/process-execution-broker/index.js +15 -1
  216. package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
  217. package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
  218. package/src/lib/project-mcp-trust.js +165 -10
  219. package/src/lib/resume-session.js +9 -6
  220. package/src/lib/session-core-singletons.js +26 -11
  221. package/src/lib/session-host-lease.js +52 -16
  222. package/src/lib/session-lifecycle-scope.js +153 -0
  223. package/src/lib/session-message-fabric.js +168 -21
  224. package/src/lib/session-projection.js +244 -4
  225. package/src/lib/session-store-guard.js +3 -1
  226. package/src/lib/session-workbench-store.js +466 -0
  227. package/src/lib/shell-approval.js +7 -5
  228. package/src/lib/spellcheck.js +211 -0
  229. package/src/lib/sub-agent-context.js +9 -9
  230. package/src/lib/sync-cli-db.js +485 -129
  231. package/src/lib/sync-credentials.js +31 -20
  232. package/src/lib/web-fetch.js +112 -40
  233. package/src/lib/web-search.js +127 -61
  234. package/src/lib/workflow-engine.js +42 -11
  235. package/src/lib/workspace-trust.js +793 -0
  236. package/src/repl/agent-repl.js +124 -5
  237. package/src/repl/permission-prompt.js +10 -12
  238. package/src/runtime/agent-core.js +311 -18
  239. package/src/runtime/agent-runtime.js +12 -1
  240. package/src/runtime/bootstrap.js +37 -13
  241. package/src/runtime/coding-agent-contract-shared.cjs +11 -4
  242. package/src/runtime/headless-runner.js +234 -36
  243. package/src/runtime/headless-stream.js +181 -6
  244. package/src/runtime/mcp-config.js +298 -8
  245. package/src/runtime/policies/agent-policy.js +8 -0
  246. package/src/runtime/status-diagnostics-lite.js +9 -1
  247. package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +0 -1
  248. package/src/assets/web-panel/assets/McpTools-DFaIhOfu.js +0 -7
  249. package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +0 -1
  250. package/src/assets/web-panel/assets/index-BETiL0a3.js +0 -1
  251. package/src/assets/web-panel/assets/index-BhAVHuW8.js +0 -1
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Optional cgroup v2 resource association for one broker-launched tool.
3
+ *
4
+ * A caller must explicitly supply a delegated cgroup root. This module never
5
+ * enables controllers on a parent cgroup; it creates only a uniquely named
6
+ * child below that explicit root. If memory is not already delegated, the
7
+ * feature is reported unavailable.
8
+ */
9
+
10
+ import { randomUUID } from "node:crypto";
11
+ import path from "node:path";
12
+
13
+ export const LINUX_CGROUP_MODES = Object.freeze(["optional", "required"]);
14
+
15
+ function isRecord(value) {
16
+ return (
17
+ value !== null &&
18
+ typeof value === "object" &&
19
+ !Array.isArray(value) &&
20
+ (Object.getPrototypeOf(value) === Object.prototype ||
21
+ Object.getPrototypeOf(value) === null)
22
+ );
23
+ }
24
+
25
+ function normalizePositiveInteger(field, value) {
26
+ const normalized = Number(value);
27
+ if (!Number.isSafeInteger(normalized) || normalized < 1) {
28
+ throw new TypeError(`invalid Linux cgroup policy: ${field}`);
29
+ }
30
+ return normalized;
31
+ }
32
+
33
+ function normalizeRoot(value) {
34
+ if (
35
+ typeof value !== "string" ||
36
+ value.length < 2 ||
37
+ value.includes("\0") ||
38
+ !path.posix.isAbsolute(value) ||
39
+ value.split("/").includes("..")
40
+ ) {
41
+ throw new TypeError("invalid Linux cgroup policy: root");
42
+ }
43
+ const normalized = path.posix.normalize(value);
44
+ if (normalized === "/") {
45
+ throw new TypeError("invalid Linux cgroup policy: root");
46
+ }
47
+ return normalized.replace(/\/+$/, "");
48
+ }
49
+
50
+ /**
51
+ * Validate the only cgroup settings that can cross the broker boundary.
52
+ * `memoryMaxBytes` is mandatory so an enabled policy always provides the
53
+ * P1-6 per-tool memory ceiling, not merely an audit label.
54
+ */
55
+ export function normalizeLinuxCgroupPolicy(value) {
56
+ if (value === undefined || value === null) return null;
57
+ if (!isRecord(value)) {
58
+ throw new TypeError("invalid Linux cgroup policy");
59
+ }
60
+ const allowed = new Set([
61
+ "mode",
62
+ "root",
63
+ "memoryMaxBytes",
64
+ "memoryHighBytes",
65
+ "pidsMax",
66
+ "cpuQuotaMicros",
67
+ "cpuPeriodMicros",
68
+ ]);
69
+ if (Object.keys(value).some((key) => !allowed.has(key))) {
70
+ throw new TypeError("invalid Linux cgroup policy field");
71
+ }
72
+ const mode = value.mode ?? "optional";
73
+ if (!LINUX_CGROUP_MODES.includes(mode)) {
74
+ throw new TypeError("invalid Linux cgroup policy: mode");
75
+ }
76
+ const memoryMaxBytes = normalizePositiveInteger(
77
+ "memoryMaxBytes",
78
+ value.memoryMaxBytes,
79
+ );
80
+ const memoryHighBytes =
81
+ value.memoryHighBytes === undefined || value.memoryHighBytes === null
82
+ ? null
83
+ : normalizePositiveInteger("memoryHighBytes", value.memoryHighBytes);
84
+ if (memoryHighBytes !== null && memoryHighBytes > memoryMaxBytes) {
85
+ throw new TypeError(
86
+ "invalid Linux cgroup policy: memoryHighBytes exceeds memoryMaxBytes",
87
+ );
88
+ }
89
+ const pidsMax =
90
+ value.pidsMax === undefined || value.pidsMax === null
91
+ ? null
92
+ : normalizePositiveInteger("pidsMax", value.pidsMax);
93
+ const cpuQuotaMicros =
94
+ value.cpuQuotaMicros === undefined || value.cpuQuotaMicros === null
95
+ ? null
96
+ : normalizePositiveInteger("cpuQuotaMicros", value.cpuQuotaMicros);
97
+ const cpuPeriodMicros =
98
+ cpuQuotaMicros === null
99
+ ? null
100
+ : value.cpuPeriodMicros === undefined || value.cpuPeriodMicros === null
101
+ ? 100_000
102
+ : normalizePositiveInteger("cpuPeriodMicros", value.cpuPeriodMicros);
103
+
104
+ return Object.freeze({
105
+ mode,
106
+ root: normalizeRoot(value.root),
107
+ memoryMaxBytes,
108
+ memoryHighBytes,
109
+ pidsMax,
110
+ cpuQuotaMicros,
111
+ cpuPeriodMicros,
112
+ });
113
+ }
114
+
115
+ function requestedControllers(policy) {
116
+ const controllers = ["memory"];
117
+ if (policy.pidsMax !== null) controllers.push("pids");
118
+ if (policy.cpuQuotaMicros !== null) controllers.push("cpu");
119
+ return controllers;
120
+ }
121
+
122
+ function readControllerSet(fs, pathname) {
123
+ return new Set(
124
+ String(fs.readFileSync(pathname, "utf8") || "")
125
+ .trim()
126
+ .split(/\s+/)
127
+ .filter(Boolean),
128
+ );
129
+ }
130
+
131
+ function unavailable(reason) {
132
+ return Object.freeze({ ok: false, reason });
133
+ }
134
+
135
+ function cgroupEvidence(policy, state, reason = null) {
136
+ return Object.freeze({
137
+ kind: "linux-cgroup-v2-tool-memory-v1",
138
+ mode: policy.mode,
139
+ state,
140
+ reason,
141
+ memoryMaxBytes: policy.memoryMaxBytes,
142
+ ...(policy.memoryHighBytes !== null
143
+ ? { memoryHighBytes: policy.memoryHighBytes }
144
+ : {}),
145
+ ...(policy.pidsMax !== null ? { pidsMax: policy.pidsMax } : {}),
146
+ ...(policy.cpuQuotaMicros !== null
147
+ ? {
148
+ cpuQuotaMicros: policy.cpuQuotaMicros,
149
+ cpuPeriodMicros: policy.cpuPeriodMicros,
150
+ }
151
+ : {}),
152
+ });
153
+ }
154
+
155
+ function removeChildCgroup(fs, cgroupPath) {
156
+ try {
157
+ fs.rmdirSync(cgroupPath);
158
+ return true;
159
+ } catch (error) {
160
+ // It is safe to retry at process exit. In particular, an already-attached
161
+ // child makes rmdir return EBUSY until the broker's exit fence fires.
162
+ return error?.code === "ENOENT";
163
+ }
164
+ }
165
+
166
+ /**
167
+ * Pre-create and configure a child cgroup. Attaching a PID is deliberately a
168
+ * separate synchronous post-spawn step, because only child_process.spawn()
169
+ * knows the real tool PID. All failures are converted to stable availability
170
+ * reasons so a required policy can fail closed without exposing host paths.
171
+ */
172
+ export function prepareLinuxCgroupV2(policyInput, runtime = {}) {
173
+ const policy = normalizeLinuxCgroupPolicy(policyInput);
174
+ if (!policy) return unavailable("linux_cgroup_not_configured");
175
+ if (runtime.platform !== "linux") {
176
+ return unavailable("linux_cgroup_platform_unavailable");
177
+ }
178
+ const fs = runtime.fs;
179
+ if (
180
+ !fs ||
181
+ typeof fs.readFileSync !== "function" ||
182
+ typeof fs.mkdirSync !== "function" ||
183
+ typeof fs.writeFileSync !== "function" ||
184
+ typeof fs.rmdirSync !== "function"
185
+ ) {
186
+ return unavailable("linux_cgroup_runtime_unavailable");
187
+ }
188
+
189
+ const controllers = requestedControllers(policy);
190
+ let supported;
191
+ let delegated;
192
+ try {
193
+ supported = readControllerSet(
194
+ fs,
195
+ path.posix.join(policy.root, "cgroup.controllers"),
196
+ );
197
+ delegated = readControllerSet(
198
+ fs,
199
+ path.posix.join(policy.root, "cgroup.subtree_control"),
200
+ );
201
+ } catch {
202
+ return unavailable("linux_cgroup_v2_unavailable");
203
+ }
204
+ if (controllers.some((controller) => !supported.has(controller))) {
205
+ return unavailable("linux_cgroup_controller_unavailable");
206
+ }
207
+ if (controllers.some((controller) => !delegated.has(controller))) {
208
+ return unavailable("linux_cgroup_controller_not_delegated");
209
+ }
210
+
211
+ const cgroupPath = path.posix.join(policy.root, `cc-tool-${randomUUID()}`);
212
+ try {
213
+ fs.mkdirSync(cgroupPath, { mode: 0o700 });
214
+ } catch {
215
+ return unavailable("linux_cgroup_create_failed");
216
+ }
217
+
218
+ const limits = [
219
+ ["memory.max", String(policy.memoryMaxBytes)],
220
+ ...(policy.memoryHighBytes !== null
221
+ ? [["memory.high", String(policy.memoryHighBytes)]]
222
+ : []),
223
+ ...(policy.pidsMax !== null ? [["pids.max", String(policy.pidsMax)]] : []),
224
+ ...(policy.cpuQuotaMicros !== null
225
+ ? [["cpu.max", `${policy.cpuQuotaMicros} ${policy.cpuPeriodMicros}`]]
226
+ : []),
227
+ ];
228
+ try {
229
+ for (const [file, content] of limits) {
230
+ fs.writeFileSync(path.posix.join(cgroupPath, file), content, "utf8");
231
+ }
232
+ } catch {
233
+ removeChildCgroup(fs, cgroupPath);
234
+ return unavailable("linux_cgroup_limit_write_failed");
235
+ }
236
+
237
+ let attached = false;
238
+ let cleaned = false;
239
+ const cleanup = () => {
240
+ if (cleaned) return true;
241
+ const removed = removeChildCgroup(fs, cgroupPath);
242
+ if (removed) cleaned = true;
243
+ return removed;
244
+ };
245
+ return Object.freeze({
246
+ ok: true,
247
+ evidence: cgroupEvidence(policy, "prepared"),
248
+ attach(proc) {
249
+ const pid = Number(proc?.pid);
250
+ if (!Number.isSafeInteger(pid) || pid < 1) {
251
+ cleanup();
252
+ const error = new Error("Linux cgroup post-spawn PID is unavailable");
253
+ error.code = "ERR_LINUX_CGROUP_ATTACH";
254
+ error.cgroupReason = "linux_cgroup_invalid_pid";
255
+ throw error;
256
+ }
257
+ try {
258
+ fs.writeFileSync(
259
+ path.posix.join(cgroupPath, "cgroup.procs"),
260
+ `${pid}\n`,
261
+ "utf8",
262
+ );
263
+ attached = true;
264
+ } catch {
265
+ cleanup();
266
+ const error = new Error("Linux cgroup post-spawn association failed");
267
+ error.code = "ERR_LINUX_CGROUP_ATTACH";
268
+ error.cgroupReason = "linux_cgroup_attach_failed";
269
+ throw error;
270
+ }
271
+ return true;
272
+ },
273
+ cleanup,
274
+ status() {
275
+ return Object.freeze({
276
+ ...cgroupEvidence(policy, attached ? "enforced" : "prepared"),
277
+ attached,
278
+ });
279
+ },
280
+ });
281
+ }
282
+
283
+ function unavailablePlan(plan, policy, reason) {
284
+ return Object.freeze({
285
+ contractVersion: 1,
286
+ applied: false,
287
+ platform: plan.platform,
288
+ profile: plan.profile,
289
+ command: plan.command,
290
+ args: [...(plan.args || [])],
291
+ options: { ...(plan.options || {}) },
292
+ enforcement: null,
293
+ backend: null,
294
+ candidateBackend: "linux-cgroup-v2",
295
+ guarantees: [],
296
+ reason,
297
+ resourceControl: cgroupEvidence(policy, "unavailable", reason),
298
+ cleanup: plan.cleanup,
299
+ postSpawn: Object.freeze({ required: false, mode: "none" }),
300
+ });
301
+ }
302
+
303
+ /**
304
+ * Decorate an existing platform plan. Optional policy preserves the existing
305
+ * plan on hosts without a delegated cgroup; required policy returns an
306
+ * unavailable plan so ProcessExecutionBroker's resource-limits boundary
307
+ * rejects before native spawn.
308
+ */
309
+ export function applyLinuxCgroupV2ToPlan(plan, policyInput, runtime = {}) {
310
+ const policy = normalizeLinuxCgroupPolicy(policyInput);
311
+ if (!policy) return plan;
312
+ if (!plan?.applied) {
313
+ return policy.mode === "required"
314
+ ? unavailablePlan(
315
+ plan,
316
+ policy,
317
+ plan?.reason || "linux_cgroup_unavailable",
318
+ )
319
+ : Object.freeze({
320
+ ...plan,
321
+ resourceControl: cgroupEvidence(
322
+ policy,
323
+ "unavailable",
324
+ plan?.reason || "linux_cgroup_unavailable",
325
+ ),
326
+ });
327
+ }
328
+ if (runtime.sync === true) {
329
+ const reason = "linux_cgroup_post_spawn_unavailable_for_sync";
330
+ return policy.mode === "required"
331
+ ? unavailablePlan(plan, policy, reason)
332
+ : Object.freeze({
333
+ ...plan,
334
+ resourceControl: cgroupEvidence(policy, "unavailable", reason),
335
+ });
336
+ }
337
+ if (plan.postSpawn?.required) {
338
+ return policy.mode === "required"
339
+ ? unavailablePlan(plan, policy, "linux_cgroup_post_spawn_conflict")
340
+ : Object.freeze({
341
+ ...plan,
342
+ resourceControl: cgroupEvidence(
343
+ policy,
344
+ "unavailable",
345
+ "linux_cgroup_post_spawn_conflict",
346
+ ),
347
+ });
348
+ }
349
+ const prepared = prepareLinuxCgroupV2(policy, runtime);
350
+ if (!prepared.ok) {
351
+ if (policy.mode === "required") {
352
+ return unavailablePlan(plan, policy, prepared.reason);
353
+ }
354
+ return Object.freeze({
355
+ ...plan,
356
+ resourceControl: cgroupEvidence(policy, "unavailable", prepared.reason),
357
+ });
358
+ }
359
+
360
+ let cleaned = false;
361
+ const upstreamCleanup = plan.cleanup;
362
+ const cleanup = () => {
363
+ if (cleaned) return;
364
+ cleaned = true;
365
+ try {
366
+ prepared.cleanup();
367
+ } finally {
368
+ upstreamCleanup?.();
369
+ }
370
+ };
371
+ return Object.freeze({
372
+ ...plan,
373
+ guarantees: Object.freeze([
374
+ ...new Set([...(plan.guarantees || []), "resource-limits"]),
375
+ ]),
376
+ resourceControl: cgroupEvidence(policy, "prepared"),
377
+ cleanup,
378
+ postSpawn: Object.freeze({ required: true, mode: "sync" }),
379
+ postSpawnLinux: (proc) => {
380
+ const attached = prepared.attach(proc);
381
+ // ProcessExecutionBroker installs its generic cleanup listener before
382
+ // this post-spawn association. If a later broker bookkeeping step fails
383
+ // and invokes cleanup while the child is still alive, this second exit
384
+ // listener retries the cgroup rmdir after the kernel has drained it.
385
+ proc?.once?.("exit", () => {
386
+ prepared.cleanup();
387
+ });
388
+ return attached;
389
+ },
390
+ });
391
+ }
@@ -53,6 +53,10 @@ import {
53
53
  mcpStdioCapsuleNativeCodeEvidence,
54
54
  mcpStdioCapsuleNativeCodePolicyDigest,
55
55
  } from "../mcp-stdio-native-code-policy.js";
56
+ import {
57
+ applyLinuxCgroupV2ToPlan,
58
+ normalizeLinuxCgroupPolicy,
59
+ } from "./linux-cgroup-v2.js";
56
60
 
57
61
  export {
58
62
  MCP_STDIO_FD_ENTRY_BOOTSTRAP,
@@ -782,6 +786,7 @@ function normalizeSandboxRequest(profileOrRequest, explicitRequest) {
782
786
  requiredBoundaries,
783
787
  sync: request.sync === true,
784
788
  pty: request.pty === true,
789
+ linuxCgroup: normalizeLinuxCgroupPolicy(request.linuxCgroup),
785
790
  executionContract:
786
791
  request.executionContract &&
787
792
  typeof request.executionContract === "object" &&
@@ -9890,6 +9895,7 @@ export function applyLinuxSandbox(
9890
9895
  * requiredBoundaries?: string[],
9891
9896
  * sync?: boolean,
9892
9897
  * pty?: boolean,
9898
+ * linuxCgroup?: Object|null,
9893
9899
  * executionContract?: Readonly<Object>|null
9894
9900
  * }|null} explicitRequest
9895
9901
  * @returns {ReturnType<typeof createSandboxPlan>}
@@ -9957,49 +9963,59 @@ export function applySandbox(
9957
9963
  requiredBoundaries: sandboxRequest.requiredBoundaries,
9958
9964
  sync: sandboxRequest.sync,
9959
9965
  pty: sandboxRequest.pty,
9966
+ linuxCgroup: sandboxRequest.linuxCgroup,
9960
9967
  executionContract: sandboxRequest.executionContract,
9961
9968
  };
9962
9969
 
9970
+ const applyRequestedLinuxCgroup = (plan) =>
9971
+ applyLinuxCgroupV2ToPlan(plan, sandboxRequest.linuxCgroup, {
9972
+ platform: runtime.platform,
9973
+ fs: runtime.fs,
9974
+ sync: sandboxRequest.sync,
9975
+ });
9976
+
9963
9977
  // Dispatch to platform handler
9964
9978
  if (runtime.platform === "darwin") {
9965
- return applyMacSandbox(
9966
- command,
9967
- args,
9968
- spawnOpts,
9969
- profile,
9970
- runtimeOverrides,
9971
- runtimeInjected ? null : MACOS_MCP_CODE_SNAPSHOT_ISSUER,
9979
+ return applyRequestedLinuxCgroup(
9980
+ applyMacSandbox(
9981
+ command,
9982
+ args,
9983
+ spawnOpts,
9984
+ profile,
9985
+ runtimeOverrides,
9986
+ runtimeInjected ? null : MACOS_MCP_CODE_SNAPSHOT_ISSUER,
9987
+ ),
9972
9988
  );
9973
9989
  }
9974
9990
  if (runtime.platform === "win32") {
9975
- return applyWindowsSandbox(
9976
- command,
9977
- args,
9978
- spawnOpts,
9979
- profile,
9980
- runtimeOverrides,
9981
- runtimeInjected ? null : WINDOWS_MCP_CODE_SNAPSHOT_ISSUER,
9991
+ return applyRequestedLinuxCgroup(
9992
+ applyWindowsSandbox(
9993
+ command,
9994
+ args,
9995
+ spawnOpts,
9996
+ profile,
9997
+ runtimeOverrides,
9998
+ runtimeInjected ? null : WINDOWS_MCP_CODE_SNAPSHOT_ISSUER,
9999
+ ),
9982
10000
  );
9983
10001
  }
9984
10002
  if (runtime.platform === "linux") {
9985
- return applyLinuxSandbox(
9986
- command,
9987
- args,
9988
- spawnOpts,
9989
- profile,
9990
- runtimeOverrides,
10003
+ return applyRequestedLinuxCgroup(
10004
+ applyLinuxSandbox(command, args, spawnOpts, profile, runtimeOverrides),
9991
10005
  );
9992
10006
  }
9993
10007
 
9994
10008
  // Unknown platform - no sandbox applied
9995
- return createSandboxPlan({
9996
- platform: runtime.platform,
9997
- profile: profile.profileName,
9998
- command,
9999
- args,
10000
- options: spawnOpts,
10001
- reason: "unsupported_platform",
10002
- });
10009
+ return applyRequestedLinuxCgroup(
10010
+ createSandboxPlan({
10011
+ platform: runtime.platform,
10012
+ profile: profile.profileName,
10013
+ command,
10014
+ args,
10015
+ options: spawnOpts,
10016
+ reason: "unsupported_platform",
10017
+ }),
10018
+ );
10003
10019
  }
10004
10020
 
10005
10021
  /**
@@ -10014,6 +10030,12 @@ export function postSpawnSandbox(proc, sandboxResult, runtimeOverrides = {}) {
10014
10030
  if (runtime.platform === "win32" && sandboxResult?.postSpawn?.required) {
10015
10031
  return postSpawnWindowsSandbox(proc, sandboxResult, runtimeOverrides);
10016
10032
  }
10033
+ if (runtime.platform === "linux" && sandboxResult?.postSpawn?.required) {
10034
+ if (typeof sandboxResult.postSpawnLinux !== "function") {
10035
+ throw new Error("Linux post-spawn sandbox adapter is unavailable");
10036
+ }
10037
+ return sandboxResult.postSpawnLinux(proc);
10038
+ }
10017
10039
  }
10018
10040
 
10019
10041
  export default {