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
@@ -131,6 +131,9 @@ const ADMITTED_STEP_STATUSES = new Set([
131
131
  "failed",
132
132
  "partial",
133
133
  "skipped",
134
+ "exhausted",
135
+ "upstream_failed",
136
+ "cancelled",
134
137
  ]);
135
138
  const MAX_ADMITTED_RUN_STEPS = 64;
136
139
  const MAX_ADMITTED_SNAPSHOT_NODES = 25_000;
@@ -948,6 +951,23 @@ export function validateWorkflow(wf) {
948
951
  errors.push(`steps[${i}].maxIterations must be a positive integer`);
949
952
  }
950
953
  }
954
+ // forEach expands `stepId` into concrete runtime ids such as
955
+ // `stepId[0]`. A declarative step with the same id would overwrite the
956
+ // child result and make dependency/evidence accounting ambiguous.
957
+ for (const parent of wf.steps) {
958
+ if (parent?.forEach === undefined || typeof parent.id !== "string") {
959
+ continue;
960
+ }
961
+ const escapedParentId = parent.id.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
962
+ const childIdPattern = new RegExp(`^${escapedParentId}\\[\\d+\\]$`, "u");
963
+ for (const id of ids) {
964
+ if (childIdPattern.test(id)) {
965
+ errors.push(
966
+ `step id '${id}' collides with dynamic children of '${parent.id}'`,
967
+ );
968
+ }
969
+ }
970
+ }
951
971
  // Check dependsOn references exist
952
972
  for (const s of wf.steps) {
953
973
  for (const dep of s.dependsOn || []) {
@@ -1682,7 +1702,7 @@ export async function runLoopStep({
1682
1702
  }
1683
1703
  const outcome = {
1684
1704
  id: recordId,
1685
- status: last ? last.status : "skipped",
1705
+ status: stopReason === "cap" ? "exhausted" : last ? last.status : "skipped",
1686
1706
  taskId: last?.taskId ?? null,
1687
1707
  result: {
1688
1708
  ...(last?.result || {}),
@@ -1694,6 +1714,35 @@ export async function runLoopStep({
1694
1714
  return admitted ? normalizeAdmittedOutcome(outcome) : outcome;
1695
1715
  }
1696
1716
 
1717
+ function dependencyBlock(step, resultsById) {
1718
+ const blocked = (step.dependsOn || [])
1719
+ .map((id) => resultsById.get(id))
1720
+ .filter((outcome) => outcome && outcome.status !== "completed");
1721
+ if (blocked.length === 0) return null;
1722
+
1723
+ const blockedRootCut = [
1724
+ ...new Set(
1725
+ blocked.flatMap((outcome) =>
1726
+ Array.isArray(outcome.result?.blockedRootCut)
1727
+ ? outcome.result.blockedRootCut
1728
+ : [outcome.id],
1729
+ ),
1730
+ ),
1731
+ ];
1732
+ const allSkipped = blocked.every((outcome) => outcome.status === "skipped");
1733
+ return {
1734
+ id: step.id,
1735
+ status: allSkipped ? "skipped" : "upstream_failed",
1736
+ taskId: null,
1737
+ result: {
1738
+ summary: allSkipped
1739
+ ? "skipped because an upstream dependency was skipped"
1740
+ : "blocked by an unsuccessful upstream dependency",
1741
+ blockedRootCut,
1742
+ },
1743
+ };
1744
+ }
1745
+
1697
1746
  // ─── Step node + no-barrier pipeline ──────────────────────────────────────────
1698
1747
 
1699
1748
  /**
@@ -1726,6 +1775,12 @@ export async function runStepNode(step, ctx) {
1726
1775
  };
1727
1776
  };
1728
1777
 
1778
+ const blocked = dependencyBlock(step, resultsById);
1779
+ if (blocked) {
1780
+ resultsById.set(recordId, blocked);
1781
+ return { outcomes: [blocked], failed: blocked.status !== "skipped" };
1782
+ }
1783
+
1729
1784
  let runThis;
1730
1785
  try {
1731
1786
  runThis = shouldRunStep(step, resultsById);
@@ -1834,9 +1889,10 @@ export async function runStepNode(step, ctx) {
1834
1889
  * No-barrier pipeline scheduler: start each step the instant *its own*
1835
1890
  * dependencies finish, rather than waiting for the whole dependency level.
1836
1891
  * Up to `maxParallel` step nodes run concurrently. On failure with
1837
- * `continueOnError` off, no new steps are scheduled (in-flight ones finish) and
1838
- * the rest are marked skipped. Produces the same outcome set as the batch
1839
- * executor — only the wall-clock idle between levels is removed.
1892
+ * `continueOnError` off, no new steps are scheduled (in-flight ones finish).
1893
+ * Unscheduled descendants receive the same dependency-derived terminal state
1894
+ * as the batch executor; unrelated work is marked skipped. Only the wall-clock
1895
+ * idle between levels differs.
1840
1896
  */
1841
1897
  export async function runPipeline({
1842
1898
  steps,
@@ -1886,9 +1942,9 @@ export async function runPipeline({
1886
1942
  reject(fatalError);
1887
1943
  return;
1888
1944
  }
1889
- for (const s of steps) {
1945
+ for (const s of topoSort(steps)) {
1890
1946
  if (scheduled.has(s.id)) continue;
1891
- const o = {
1947
+ const o = dependencyBlock(s, resultsById) || {
1892
1948
  id: s.id,
1893
1949
  status: "skipped",
1894
1950
  taskId: null,
@@ -2196,6 +2252,13 @@ export async function executeWorkflow(options = {}) {
2196
2252
  const runnable = []; // { step, message, recordId, parentId }
2197
2253
  const preOutcomes = []; // outcomes produced synchronously (skipped)
2198
2254
  for (const step of chunk) {
2255
+ const blocked = dependencyBlock(step, resultsById);
2256
+ if (blocked) {
2257
+ if (blocked.status !== "skipped") anyFailure = true;
2258
+ resultsById.set(step.id, blocked);
2259
+ preOutcomes.push(blocked);
2260
+ continue;
2261
+ }
2199
2262
  if (anyFailure && !continueOnError) {
2200
2263
  const outcome = {
2201
2264
  id: step.id,
@@ -0,0 +1,226 @@
1
+ #!/usr/bin/env node
2
+
3
+ import assert from "node:assert/strict";
4
+ import { spawn } from "node:child_process";
5
+ import fs from "node:fs";
6
+ import path from "node:path";
7
+ import process from "node:process";
8
+ import {
9
+ samePathHandleFileIdentity,
10
+ withTrustedFileParentSync,
11
+ } from "./secure-file-identity.js";
12
+
13
+ const MEBIBYTE = 1024 * 1024;
14
+ const MAX_CAPTURED_MARKER_BYTES = 256;
15
+ const MAX_STDIN_BYTES = 64 * 1024 * 1024;
16
+ const CPU_LIMIT_SIGNALS = new Set(["SIGKILL", "SIGXCPU"]);
17
+
18
+ function parseArguments(argv) {
19
+ const separator = argv.indexOf("--");
20
+ assert.ok(separator >= 0, "local target supervisor requires --");
21
+ const control = argv.slice(0, separator);
22
+ const command = argv.slice(separator + 1);
23
+ const options = {};
24
+ for (let index = 0; index < control.length; index += 2) {
25
+ const key = control[index];
26
+ const value = control[index + 1];
27
+ assert.ok(key?.startsWith("--") && value, `invalid argument: ${key}`);
28
+ options[
29
+ key
30
+ .slice(2)
31
+ .replace(/-([a-z])/gu, (_, character) => character.toUpperCase())
32
+ ] = value;
33
+ }
34
+ assert.ok(options.cwd && options.entry && command.length > 0);
35
+ const cpuSeconds = Number(options.cpuSeconds);
36
+ const memoryBytes = Number(options.memoryBytes);
37
+ assert.ok(
38
+ Number.isSafeInteger(cpuSeconds) && cpuSeconds >= 1 && cpuSeconds <= 86_400,
39
+ );
40
+ assert.ok(
41
+ Number.isSafeInteger(memoryBytes) &&
42
+ memoryBytes >= 64 * MEBIBYTE &&
43
+ memoryBytes <= 64 * 1024 * MEBIBYTE,
44
+ );
45
+ return { ...options, cpuSeconds, memoryBytes, command };
46
+ }
47
+
48
+ function boundedHeapMebibytes(memoryBytes) {
49
+ // V8's old-space boundary is a real child-process limit and is intentionally
50
+ // allowed to be stricter than the runner's total-memory ceiling. Keeping the
51
+ // probe at or below 256 MiB avoids consuming a multi-GiB hosted runner merely
52
+ // to prove that the target-side supervisor terminates the workload.
53
+ return Math.max(64, Math.min(256, Math.floor(memoryBytes / MEBIBYTE)));
54
+ }
55
+
56
+ function openStagedReplicaInput(inputPath) {
57
+ let descriptor = null;
58
+ try {
59
+ return withTrustedFileParentSync(
60
+ fs,
61
+ inputPath,
62
+ ({ canonicalPath, parentDevice }) => {
63
+ const requested = fs.lstatSync(canonicalPath, { bigint: true });
64
+ assert.ok(
65
+ requested.isFile() &&
66
+ !requested.isSymbolicLink() &&
67
+ requested.size > 0n &&
68
+ requested.size <= BigInt(MAX_STDIN_BYTES),
69
+ "local target stdin file is invalid",
70
+ );
71
+ descriptor = fs.openSync(
72
+ canonicalPath,
73
+ fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0),
74
+ );
75
+ const opened = fs.fstatSync(descriptor, { bigint: true });
76
+ assert.ok(
77
+ opened.isFile() &&
78
+ opened.nlink === 1n &&
79
+ samePathHandleFileIdentity(requested, opened, parentDevice),
80
+ "local target stdin file changed while opening",
81
+ );
82
+ const stagedInput = fs.readFileSync(descriptor);
83
+ assert.equal(
84
+ BigInt(stagedInput.length),
85
+ requested.size,
86
+ "local target stdin file changed while reading",
87
+ );
88
+ return Object.freeze({ descriptor, stagedInput });
89
+ },
90
+ );
91
+ } catch (error) {
92
+ if (descriptor !== null) fs.closeSync(descriptor);
93
+ throw error;
94
+ }
95
+ }
96
+
97
+ async function main() {
98
+ const options = parseArguments(process.argv.slice(2));
99
+ const resourceKind =
100
+ options.command[0] === "session" &&
101
+ options.command[1] === "location" &&
102
+ options.command[2] === "resource-probe"
103
+ ? options.command[3]
104
+ : null;
105
+ const resume =
106
+ options.command[0] === "session" && options.command[1] === "resume";
107
+ const forwardsInput =
108
+ options.command[0] === "session" &&
109
+ options.command[1] === "location" &&
110
+ options.command[2] === "prepare";
111
+ if (options.stdinFile) {
112
+ assert.ok(
113
+ forwardsInput && path.isAbsolute(options.stdinFile),
114
+ "local target stdin file is invalid",
115
+ );
116
+ }
117
+ let inputDescriptor = null;
118
+ let stagedInput = null;
119
+ if (options.stdinFile) {
120
+ ({ descriptor: inputDescriptor, stagedInput } = openStagedReplicaInput(
121
+ options.stdinFile,
122
+ ));
123
+ }
124
+ const heapMebibytes = boundedHeapMebibytes(options.memoryBytes);
125
+ const childEnvironment = {
126
+ ...process.env,
127
+ CC_EXECUTION_LOCATION_OBSERVED_CPU_SECONDS: String(options.cpuSeconds),
128
+ CC_EXECUTION_LOCATION_OBSERVED_MEMORY_BYTES: String(
129
+ heapMebibytes * MEBIBYTE,
130
+ ),
131
+ CC_EXECUTION_LOCATION_RESOURCE_ENFORCEMENT: "target-supervisor",
132
+ };
133
+ let child;
134
+ try {
135
+ child = spawn(
136
+ process.execPath,
137
+ [
138
+ `--max-old-space-size=${heapMebibytes}`,
139
+ options.entry,
140
+ ...options.command,
141
+ ],
142
+ {
143
+ cwd: options.cwd,
144
+ env: childEnvironment,
145
+ shell: false,
146
+ stdio: [
147
+ resume || stagedInput !== null
148
+ ? "pipe"
149
+ : forwardsInput
150
+ ? "inherit"
151
+ : "ignore",
152
+ "pipe",
153
+ "inherit",
154
+ ],
155
+ windowsHide: true,
156
+ },
157
+ );
158
+ } finally {
159
+ if (inputDescriptor !== null) fs.closeSync(inputDescriptor);
160
+ }
161
+
162
+ if (resume) child.stdin.end("/exit\n", "utf8");
163
+ else if (stagedInput !== null) child.stdin.end(stagedInput);
164
+ let outputPrefix = "";
165
+ let cpuLimitReached = false;
166
+ let cpuTimer = null;
167
+ const armCpuLimit = () => {
168
+ if (cpuTimer !== null) return;
169
+ cpuTimer = setTimeout(() => {
170
+ cpuLimitReached = true;
171
+ child.kill("SIGKILL");
172
+ }, options.cpuSeconds * 1_000);
173
+ };
174
+ child.stdout.on("data", (chunk) => {
175
+ process.stdout.write(chunk);
176
+ if (outputPrefix.length < MAX_CAPTURED_MARKER_BYTES) {
177
+ outputPrefix += chunk
178
+ .toString("utf8")
179
+ .slice(0, MAX_CAPTURED_MARKER_BYTES - outputPrefix.length);
180
+ }
181
+ if (
182
+ resourceKind === "cpu" &&
183
+ outputPrefix.includes("CC_EXECUTION_LOCATION_RESOURCE_PROBE_ARMED:cpu")
184
+ ) {
185
+ // Startup and module loading are not the probed workload. Arm the
186
+ // target-side CPU boundary only after the fixed command proves that its
187
+ // busy loop is live; otherwise slow filesystem I/O could masquerade as
188
+ // CPU enforcement on hosted Windows or macOS.
189
+ armCpuLimit();
190
+ }
191
+ });
192
+
193
+ const forwardSignal = () => child.kill("SIGTERM");
194
+ process.once("SIGTERM", forwardSignal);
195
+ const result = await new Promise((resolve, reject) => {
196
+ child.once("error", reject);
197
+ child.once("exit", (code, signal) => resolve({ code, signal }));
198
+ });
199
+ if (cpuTimer !== null) clearTimeout(cpuTimer);
200
+ process.removeListener("SIGTERM", forwardSignal);
201
+
202
+ const expectedMarker = resourceKind
203
+ ? `CC_EXECUTION_LOCATION_RESOURCE_PROBE_ARMED:${resourceKind}`
204
+ : null;
205
+ const armed =
206
+ expectedMarker !== null && outputPrefix.includes(expectedMarker);
207
+ if (
208
+ resourceKind === "cpu" &&
209
+ armed &&
210
+ (cpuLimitReached || CPU_LIMIT_SIGNALS.has(result.signal))
211
+ ) {
212
+ process.exitCode = 152;
213
+ } else if (
214
+ resourceKind === "memory" &&
215
+ armed &&
216
+ (result.code !== 0 || result.signal !== null)
217
+ ) {
218
+ process.exitCode = 137;
219
+ } else if (result.signal !== null) {
220
+ process.exitCode = 128;
221
+ } else {
222
+ process.exitCode = Number(result.code || 0);
223
+ }
224
+ }
225
+
226
+ await main();