chainlesschain 0.162.188 → 0.162.193

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 (337) hide show
  1. package/README.md +61 -11
  2. package/bin/chainlesschain.js +7 -52
  3. package/completions/_cc +209 -0
  4. package/completions/cc.bash +18 -0
  5. package/completions/cc.fish +13 -0
  6. package/completions/cc.ps1 +226 -0
  7. package/package.json +10 -2
  8. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
  9. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
  10. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
  11. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
  12. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
  13. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
  14. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
  16. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
  17. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
  18. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
  20. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
  21. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
  22. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
  24. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
  25. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
  26. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
  27. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
  28. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
  30. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
  31. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
  32. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
  33. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
  34. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
  35. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
  37. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
  38. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
  39. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
  40. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
  41. package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
  42. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
  43. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
  44. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
  45. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
  46. package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
  47. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
  48. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
  49. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
  50. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
  51. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
  52. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
  53. package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
  54. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
  56. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
  57. package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
  58. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
  59. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
  60. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
  61. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
  62. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
  63. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
  64. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
  65. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
  66. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
  67. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
  68. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
  69. package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
  70. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
  72. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
  73. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
  74. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
  75. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
  76. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
  77. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
  78. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
  79. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
  80. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
  81. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
  82. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
  85. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
  86. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
  88. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
  89. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
  90. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
  91. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
  92. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
  93. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
  94. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
  133. package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
  134. package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
  135. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
  155. package/src/assets/web-panel/index.html +1 -1
  156. package/src/cli-help.js +181 -0
  157. package/src/command-help-index.json +181 -0
  158. package/src/command-manifest.json +1107 -175
  159. package/src/command-surface-policy.js +197 -0
  160. package/src/commands/agent.js +98 -33
  161. package/src/commands/artifacts.js +400 -2
  162. package/src/commands/background-session.js +41 -3
  163. package/src/commands/checkpoint-managed.js +1059 -0
  164. package/src/commands/checkpoint-restore-recovery.js +1476 -0
  165. package/src/commands/checkpoint.js +950 -22
  166. package/src/commands/compact.js +101 -25
  167. package/src/commands/config.js +506 -20
  168. package/src/commands/doctor.js +4 -1
  169. package/src/commands/hub.js +1 -1
  170. package/src/commands/mcp.js +688 -24
  171. package/src/commands/pack.js +16 -2
  172. package/src/commands/plugin.js +20 -12
  173. package/src/commands/session-mcp-recovery.js +218 -0
  174. package/src/commands/session.js +470 -110
  175. package/src/commands/setup.js +36 -10
  176. package/src/commands/skill.js +181 -110
  177. package/src/commands/status.js +21 -5
  178. package/src/commands/team-distributed.js +3324 -0
  179. package/src/commands/team.js +1130 -74
  180. package/src/commands/update.js +68 -6
  181. package/src/constants.js +11 -0
  182. package/src/data/changelog.json +26 -0
  183. package/src/gateways/ws/action-protocol.js +10 -0
  184. package/src/gateways/ws/session-protocol.js +555 -27
  185. package/src/gateways/ws/ws-agent-handler.js +541 -14
  186. package/src/gateways/ws/ws-session-gateway.js +129 -22
  187. package/src/gateways/ws/ws-session-state.js +431 -0
  188. package/src/harness/background-task-manager.js +233 -36
  189. package/src/harness/jsonl-session-store.js +2551 -167
  190. package/src/harness/mcp-client.js +802 -61
  191. package/src/harness/prompt-compressor.js +227 -27
  192. package/src/harness/session-index.js +89 -38
  193. package/src/harness/session-list-index.js +254 -0
  194. package/src/harness/structured-handoff.js +410 -0
  195. package/src/lazy-dispatch.js +747 -84
  196. package/src/lib/__tests__/logger.test.js +50 -2
  197. package/src/lib/advisor-runtime.js +1047 -0
  198. package/src/lib/agent-core.js +2 -0
  199. package/src/lib/agent-sandbox.js +120 -26
  200. package/src/lib/agent-session-export.js +20 -0
  201. package/src/lib/agent-team/task-lease.js +271 -3
  202. package/src/lib/agent-team/team-adjudication.js +1501 -0
  203. package/src/lib/agent-team/team-budget.js +4 -1
  204. package/src/lib/agent-team/team-control-store.js +582 -0
  205. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  206. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  207. package/src/lib/agent-team/team-runner.js +543 -24
  208. package/src/lib/agent-team/team-worktree.js +1403 -95
  209. package/src/lib/artifact-store.js +131 -8
  210. package/src/lib/background-agent-supervisor.js +185 -13
  211. package/src/lib/background-interaction-journal.js +37 -9
  212. package/src/lib/background-launch-profile.js +1058 -0
  213. package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
  214. package/src/lib/checkpoint-restore-orchestrator.js +987 -0
  215. package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
  216. package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
  217. package/src/lib/checkpoint-restore-recovery.js +884 -0
  218. package/src/lib/checkpoint-restore-retention.js +126 -0
  219. package/src/lib/checkpoint-restore-saga.js +5079 -0
  220. package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
  221. package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
  222. package/src/lib/checkpoint-store.js +1688 -97
  223. package/src/lib/checkpoint-timeline-authority.js +522 -0
  224. package/src/lib/checkpoint-timeline.js +642 -0
  225. package/src/lib/config-keys.js +18 -119
  226. package/src/lib/config-manager.js +446 -27
  227. package/src/lib/config-redaction.js +57 -0
  228. package/src/lib/config-schema.js +853 -0
  229. package/src/lib/cowork-mcp-tools.js +5 -0
  230. package/src/lib/cowork-task-runner.js +458 -63
  231. package/src/lib/delivery-coordinator.js +1234 -0
  232. package/src/lib/delivery-evidence.js +450 -0
  233. package/src/lib/doctor-checkup.js +199 -14
  234. package/src/lib/executable-path.js +34 -0
  235. package/src/lib/fatal-handler.js +16 -0
  236. package/src/lib/file-checkpoint.js +4909 -186
  237. package/src/lib/file-lines.js +125 -0
  238. package/src/lib/headless-config-command.js +16 -5
  239. package/src/lib/hook-runner.cjs +139 -38
  240. package/src/lib/hooks-v2-workspace-context.js +10 -0
  241. package/src/lib/impacted-gate-selector.js +424 -0
  242. package/src/lib/interaction-adapter.js +62 -0
  243. package/src/lib/jsonl-session-store.js +1 -35
  244. package/src/lib/logger.js +66 -14
  245. package/src/lib/managed-checkpoint-render.js +60 -0
  246. package/src/lib/managed-tool-checkpoint.js +194 -0
  247. package/src/lib/mcp-call-ledger-store.js +1069 -0
  248. package/src/lib/mcp-call-ledger.js +747 -0
  249. package/src/lib/mcp-client.js +5 -0
  250. package/src/lib/mcp-conflict-scheduler.js +468 -0
  251. package/src/lib/mcp-effect-contract.js +102 -0
  252. package/src/lib/mcp-headers-helper-trust.js +145 -0
  253. package/src/lib/mcp-headers-helper.js +616 -0
  254. package/src/lib/mcp-host-recovery-runtime.js +131 -0
  255. package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
  256. package/src/lib/mcp-recovery-adjudication.js +443 -0
  257. package/src/lib/output-context.js +86 -0
  258. package/src/lib/packer/file-identity.js +170 -0
  259. package/src/lib/packer/index.js +3 -0
  260. package/src/lib/packer/native-update-state.js +277 -0
  261. package/src/lib/packer/pack-update-applier.js +1983 -136
  262. package/src/lib/packer/pack-update-checker.js +34 -0
  263. package/src/lib/packer/pack-update-downloader.js +875 -86
  264. package/src/lib/packer/pack-update-signature.js +86 -0
  265. package/src/lib/packer/pkg-config-generator.js +6 -0
  266. package/src/lib/paths.js +65 -10
  267. package/src/lib/plan-mode.js +831 -14
  268. package/src/lib/plan-persistence.js +540 -0
  269. package/src/lib/plugin-runtime/hooks.js +227 -69
  270. package/src/lib/plugin-runtime/plugin-options.js +189 -44
  271. package/src/lib/pr-automation-policy.js +146 -8
  272. package/src/lib/process-execution-broker/credential-agent.js +7 -0
  273. package/src/lib/process-execution-broker/index.js +491 -13
  274. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  275. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  276. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  277. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  278. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  279. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  280. package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
  281. package/src/lib/project-instructions.js +165 -29
  282. package/src/lib/project-mcp-trust.js +67 -0
  283. package/src/lib/public-ide-capability-manifest.js +272 -0
  284. package/src/lib/public-ide-capability-validation.js +351 -0
  285. package/src/lib/secret-store.js +267 -43
  286. package/src/lib/secure-file-identity.js +433 -0
  287. package/src/lib/secure-fs.js +1089 -0
  288. package/src/lib/security-audit.js +58 -0
  289. package/src/lib/service-manager.js +34 -13
  290. package/src/lib/session-budget-runtime.js +1452 -0
  291. package/src/lib/session-host-snapshot.js +388 -0
  292. package/src/lib/session-message-provenance.js +429 -0
  293. package/src/lib/session-projection.js +804 -0
  294. package/src/lib/session-resource-budget.js +1495 -0
  295. package/src/lib/settings-hooks.cjs +138 -22
  296. package/src/lib/settings-loader.cjs +25 -2
  297. package/src/lib/side-effect-ledger-store.js +45 -23
  298. package/src/lib/skill-execution-identity.js +217 -0
  299. package/src/lib/skill-loader.js +299 -18
  300. package/src/lib/sub-agent-context.js +236 -28
  301. package/src/lib/sub-agent-registry.js +5 -0
  302. package/src/lib/subagent-contract.js +94 -0
  303. package/src/lib/todo-manager.js +185 -18
  304. package/src/lib/todo-persistence.js +417 -0
  305. package/src/lib/turn-binding-store.js +41 -23
  306. package/src/lib/turn-binding.js +160 -2
  307. package/src/lib/with-file-lock.js +165 -24
  308. package/src/lib/ws-chat-handler.js +21 -0
  309. package/src/program-base.js +18 -0
  310. package/src/repl/advisor-command.js +103 -0
  311. package/src/repl/agent-repl.js +2175 -146
  312. package/src/repl/btw-command.js +93 -10
  313. package/src/repl/clipboard-image.js +119 -0
  314. package/src/repl/config-summary.js +64 -108
  315. package/src/repl/prompt-editor.js +233 -0
  316. package/src/repl/prompt-interactions.js +344 -0
  317. package/src/repl/prompt-stash.js +354 -0
  318. package/src/repl/prompt-suggestions.js +312 -0
  319. package/src/repl/repl-keybindings.js +227 -0
  320. package/src/repl/session-recap.js +217 -0
  321. package/src/repl/slash-command-registry.js +22 -0
  322. package/src/repl/terminal-layout.js +88 -0
  323. package/src/runtime/agent-core.js +1630 -447
  324. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  325. package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
  326. package/src/runtime/diagnostics.js +32 -13
  327. package/src/runtime/headless-runner.js +310 -118
  328. package/src/runtime/headless-stream.js +356 -95
  329. package/src/runtime/mcp-config.js +148 -14
  330. package/src/runtime/policies/agent-policy.js +14 -0
  331. package/src/runtime/status-diagnostics-lite.js +137 -0
  332. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  333. package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
  334. package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
  335. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  336. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  337. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -22,9 +22,44 @@ import { EventEmitter } from "node:events";
22
22
  import { getHomeDir } from "../lib/paths.js";
23
23
  import executionBroker from "../lib/process-execution-broker/index.js";
24
24
 
25
+ function defaultKillProcessTree(child, signal = "SIGTERM") {
26
+ // `child.killed` only means Node successfully delivered an earlier signal;
27
+ // the process may still be alive and must remain eligible for escalation.
28
+ if (!child || child.exitCode !== null) return false;
29
+ try {
30
+ if (_deps.platform === "win32" && child.pid) {
31
+ const result = executionBroker.spawnSync(
32
+ "taskkill",
33
+ ["/PID", String(child.pid), "/T", "/F"],
34
+ {
35
+ windowsHide: true,
36
+ encoding: "utf8",
37
+ origin: "background-task:process-tree-kill",
38
+ policy: "allow",
39
+ scope: "background-task",
40
+ },
41
+ );
42
+ if (!result?.error && result?.status === 0) return true;
43
+ return child.kill(signal) !== false;
44
+ }
45
+ if (child.pid) {
46
+ try {
47
+ process.kill(-child.pid, signal);
48
+ return true;
49
+ } catch {
50
+ return child.kill(signal) !== false;
51
+ }
52
+ }
53
+ return child.kill(signal) !== false;
54
+ } catch {
55
+ return false;
56
+ }
57
+ }
58
+
25
59
  export const _deps = {
26
60
  spawn: executionBroker.spawn.bind(executionBroker),
27
61
  platform: process.platform,
62
+ killProcessTree: defaultKillProcessTree,
28
63
  };
29
64
 
30
65
  function getTasksDir() {
@@ -181,8 +216,23 @@ export class BackgroundTaskManager extends EventEmitter {
181
216
  ? resolve(options.policyCwd || process.cwd())
182
217
  : null;
183
218
  this._resolveSandboxPolicy = resolveSandboxPolicy;
219
+ this.sessionBudget = options.sessionBudget || null;
220
+ if (
221
+ this.sessionBudget !== null &&
222
+ (typeof this.sessionBudget.acquireWork !== "function" ||
223
+ typeof this.sessionBudget.registerAbortable !== "function")
224
+ ) {
225
+ throw new TypeError("sessionBudget must be a SessionResourceBudget");
226
+ }
227
+ this.killGraceMs =
228
+ Number.isFinite(options.killGraceMs) && options.killGraceMs >= 0
229
+ ? options.killGraceMs
230
+ : 2000;
184
231
  this.tasks = new Map();
185
232
  this.processes = new Map();
233
+ this._budgetLeases = new Map();
234
+ this._budgetAbortCleanup = new Map();
235
+ this._killTimers = new Map();
186
236
  this._checkInterval = null;
187
237
  this._createSeq = 0;
188
238
  if (options.recoverOnStart) {
@@ -229,6 +279,8 @@ export class BackgroundTaskManager extends EventEmitter {
229
279
  sandboxRequiredBoundaries: sandboxPolicy
230
280
  ? [...sandboxPolicy.requiredBoundaries].sort()
231
281
  : null,
282
+ depth:
283
+ Number.isSafeInteger(spec.depth) && spec.depth >= 0 ? spec.depth : 1,
232
284
  _seq: ++this._createSeq,
233
285
  };
234
286
 
@@ -247,6 +299,11 @@ export class BackgroundTaskManager extends EventEmitter {
247
299
  if (task.status !== TaskStatus.PENDING) {
248
300
  throw new Error(`Task ${taskId} is not pending (status: ${task.status})`);
249
301
  }
302
+ if (this._runningCount() >= this.maxConcurrent) {
303
+ throw new Error(
304
+ `Max concurrent tasks reached (${this.maxConcurrent}). Wait for a task to finish.`,
305
+ );
306
+ }
250
307
 
251
308
  const sandboxPolicy = this._resolvePinnedSandboxPolicy(task.cwd);
252
309
  const pinnedBoundaries = task.sandboxRequiredBoundaries;
@@ -277,6 +334,22 @@ export class BackgroundTaskManager extends EventEmitter {
277
334
  }
278
335
  }
279
336
 
337
+ const budgetLease = this.sessionBudget?.acquireWork({
338
+ id: `background-task:${taskId}`,
339
+ kind: "background-task",
340
+ depth: task.depth ?? 1,
341
+ });
342
+ if (budgetLease && !budgetLease.ok) {
343
+ const error = new Error(
344
+ `Background task blocked by session budget: ${budgetLease.reason}`,
345
+ );
346
+ error.code = "ERR_SESSION_RESOURCE_BUDGET";
347
+ error.budgetReason = budgetLease.reason;
348
+ error.retryable = budgetLease.retryable === true;
349
+ throw error;
350
+ }
351
+ if (budgetLease) this._budgetLeases.set(taskId, budgetLease);
352
+
280
353
  task.status = TaskStatus.RUNNING;
281
354
  task.startedAt = Date.now();
282
355
  task.lastHeartbeat = Date.now();
@@ -288,33 +361,43 @@ export class BackgroundTaskManager extends EventEmitter {
288
361
  import.meta.dirname || ".",
289
362
  "background-task-worker.js",
290
363
  );
291
- const child = _deps.spawn(
292
- process.execPath,
293
- [
294
- ...(sandboxPolicy ? [] : process.execArgv),
295
- workerPath,
296
- task.command,
297
- task.cwd,
298
- task.type,
299
- task.sandboxWorkspaceCwd || "",
300
- JSON.stringify(task.sandboxRequiredBoundaries || []),
301
- ],
302
- {
303
- cwd: task.cwd,
304
- stdio: ["pipe", "pipe", "pipe", "ipc"],
305
- env: sandboxPolicy
306
- ? strongWorkerEnvironment(taskId)
307
- : { ...process.env, CC_TASK_ID: taskId },
308
- origin: "background-task:worker",
309
- policy: "allow",
310
- scope: "background-task",
311
- shell: false,
312
- },
313
- );
364
+ let child;
365
+ try {
366
+ child = _deps.spawn(
367
+ process.execPath,
368
+ [
369
+ ...(sandboxPolicy ? [] : process.execArgv),
370
+ workerPath,
371
+ task.command,
372
+ task.cwd,
373
+ task.type,
374
+ task.sandboxWorkspaceCwd || "",
375
+ JSON.stringify(task.sandboxRequiredBoundaries || []),
376
+ ],
377
+ {
378
+ cwd: task.cwd,
379
+ stdio: ["pipe", "pipe", "pipe", "ipc"],
380
+ env: sandboxPolicy
381
+ ? strongWorkerEnvironment(taskId)
382
+ : { ...process.env, CC_TASK_ID: taskId },
383
+ origin: "background-task:worker",
384
+ policy: "allow",
385
+ scope: "background-task",
386
+ shell: false,
387
+ // POSIX group ownership lets cancellation kill the worker and every
388
+ // shell/tool descendant with one negative-pid signal.
389
+ detached: _deps.platform !== "win32",
390
+ },
391
+ );
392
+ } catch (error) {
393
+ this._complete(taskId, TaskStatus.FAILED, null, error.message);
394
+ throw error;
395
+ }
314
396
 
315
397
  this.processes.set(taskId, child);
316
398
 
317
399
  child.on("message", (msg) => {
400
+ if (task.status !== TaskStatus.RUNNING) return;
318
401
  if (msg.type === "heartbeat") {
319
402
  task.lastHeartbeat = Date.now();
320
403
  } else if (msg.type === "result") {
@@ -345,14 +428,35 @@ export class BackgroundTaskManager extends EventEmitter {
345
428
  );
346
429
  }
347
430
  }
348
- this.processes.delete(taskId);
431
+ this._settleProcessOwnership(taskId, child);
349
432
  });
350
433
 
351
434
  child.on("error", (err) => {
352
435
  this._complete(taskId, TaskStatus.FAILED, null, err.message);
353
- this.processes.delete(taskId);
436
+ this._settleProcessOwnership(taskId, child);
354
437
  });
355
438
 
439
+ if (this.sessionBudget) {
440
+ try {
441
+ const unregister = this.sessionBudget.registerAbortable(
442
+ `background-task:${taskId}`,
443
+ (reason) => this._stopForBudget(taskId, reason),
444
+ );
445
+ this._budgetAbortCleanup.set(taskId, unregister);
446
+ } catch (error) {
447
+ // Registration happens after spawn, so settlement and lease release
448
+ // must still run even if an injected/host kill adapter itself throws.
449
+ try {
450
+ _deps.killProcessTree(child, "SIGKILL");
451
+ } catch {
452
+ // Keep the live child in `processes` so destroy()/its eventual event
453
+ // retains ownership and can retry instead of orphaning it.
454
+ }
455
+ this._complete(taskId, TaskStatus.FAILED, null, error.message);
456
+ throw error;
457
+ }
458
+ }
459
+
356
460
  this._persistTask(task, "started");
357
461
  this._ensureHeartbeatChecker();
358
462
  return task;
@@ -435,16 +539,20 @@ export class BackgroundTaskManager extends EventEmitter {
435
539
  stop(taskId) {
436
540
  const child = this.processes.get(taskId);
437
541
  if (child) {
438
- child.kill("SIGTERM");
542
+ this._clearKillTimer(taskId);
543
+ _deps.killProcessTree(child, "SIGTERM");
439
544
  // Escalate to SIGKILL only if SIGTERM didn't take. unref() + clear-on-exit
440
545
  // so a prompt exit (or process shutdown right after stop) isn't held open
441
546
  // for the full grace period by this timer.
442
547
  const killTimer = setTimeout(() => {
443
- if (child.exitCode === null) child.kill("SIGKILL");
444
- }, 2000);
548
+ if (child.exitCode === null) {
549
+ _deps.killProcessTree(child, "SIGKILL");
550
+ }
551
+ }, this.killGraceMs);
445
552
  if (killTimer && typeof killTimer.unref === "function") killTimer.unref();
553
+ this._killTimers.set(taskId, killTimer);
446
554
  if (typeof child.once === "function") {
447
- child.once("exit", () => clearTimeout(killTimer));
555
+ child.once("exit", () => this._clearKillTimer(taskId));
448
556
  }
449
557
  }
450
558
  const task = this.tasks.get(taskId);
@@ -454,6 +562,66 @@ export class BackgroundTaskManager extends EventEmitter {
454
562
  this._complete(taskId, TaskStatus.FAILED, null, "Stopped by user");
455
563
  }
456
564
 
565
+ _stopForBudget(taskId, reason) {
566
+ const child = this.processes.get(taskId);
567
+ if (child) {
568
+ this._clearKillTimer(taskId);
569
+ _deps.killProcessTree(child, "SIGTERM");
570
+ const killTimer = setTimeout(() => {
571
+ if (child.exitCode === null) {
572
+ _deps.killProcessTree(child, "SIGKILL");
573
+ }
574
+ }, this.killGraceMs);
575
+ killTimer?.unref?.();
576
+ this._killTimers.set(taskId, killTimer);
577
+ child.once?.("exit", () => this._clearKillTimer(taskId));
578
+ }
579
+ const budgetReason =
580
+ reason?.budgetReason || reason?.message || "session-budget";
581
+ const task = this.tasks.get(taskId);
582
+ if (task) {
583
+ this._recordHistory(task, "budget-stop-requested", { budgetReason });
584
+ }
585
+ this._complete(
586
+ taskId,
587
+ TaskStatus.FAILED,
588
+ null,
589
+ `Session budget exhausted: ${budgetReason}`,
590
+ );
591
+ }
592
+
593
+ _clearKillTimer(taskId) {
594
+ const timer = this._killTimers.get(taskId);
595
+ if (timer) clearTimeout(timer);
596
+ this._killTimers.delete(taskId);
597
+ }
598
+
599
+ _releaseBudget(taskId) {
600
+ const unregister = this._budgetAbortCleanup.get(taskId);
601
+ this._budgetAbortCleanup.delete(taskId);
602
+ try {
603
+ unregister?.();
604
+ } catch {
605
+ // Budget cancellation has already been delivered.
606
+ }
607
+ const lease = this._budgetLeases.get(taskId);
608
+ this._budgetLeases.delete(taskId);
609
+ try {
610
+ lease?.release?.();
611
+ } catch {
612
+ // Work leases are idempotent and must not hide task settlement.
613
+ }
614
+ }
615
+
616
+ _settleProcessOwnership(taskId, child = null) {
617
+ const ownedChild = this.processes.get(taskId);
618
+ if (child && ownedChild && ownedChild !== child) return false;
619
+ if (ownedChild) this.processes.delete(taskId);
620
+ this._clearKillTimer(taskId);
621
+ this._releaseBudget(taskId);
622
+ return Boolean(ownedChild);
623
+ }
624
+
457
625
  cleanup(maxAge = 3600000) {
458
626
  const cutoff = Date.now() - maxAge;
459
627
  let removed = 0;
@@ -478,16 +646,35 @@ export class BackgroundTaskManager extends EventEmitter {
478
646
  clearInterval(this._checkInterval);
479
647
  this._checkInterval = null;
480
648
  }
481
- for (const [id] of this.processes) {
649
+ for (const [id, child] of this.processes) {
482
650
  this.stop(id);
651
+ // destroy() has no future owner that can wait for the grace timer. Force
652
+ // the detached group/tree down before clearing process accountability.
653
+ if (child.exitCode === null) {
654
+ _deps.killProcessTree(child, "SIGKILL");
655
+ }
656
+ this._clearKillTimer(id);
483
657
  }
484
658
  this.tasks.clear();
485
- this.processes.clear();
659
+ for (const taskId of [...this._killTimers.keys()]) {
660
+ this._clearKillTimer(taskId);
661
+ }
662
+ for (const taskId of [...this._budgetLeases.keys()]) {
663
+ if (!this.processes.has(taskId)) this._releaseBudget(taskId);
664
+ }
486
665
  }
487
666
 
488
667
  _complete(taskId, status, result, error) {
489
668
  const task = this.tasks.get(taskId);
490
669
  if (!task) return;
670
+ if (
671
+ task.completedAt !== null &&
672
+ [TaskStatus.COMPLETED, TaskStatus.FAILED, TaskStatus.TIMEOUT].includes(
673
+ task.status,
674
+ )
675
+ ) {
676
+ return;
677
+ }
491
678
 
492
679
  task.status = status;
493
680
  task.completedAt = Date.now();
@@ -496,15 +683,24 @@ export class BackgroundTaskManager extends EventEmitter {
496
683
  task.outputSummary = this._buildOutputSummary({ result, error, status });
497
684
  this._recordHistory(task, "completed", { status, result, error });
498
685
  this._persistTask(task, "completed");
686
+ // Logical settlement can arrive over IPC before the worker and its tool
687
+ // descendants have physically exited. Keep the work lease and abort hook
688
+ // until exit/error proves that process ownership has ended.
689
+ if (!this.processes.has(taskId)) this._releaseBudget(taskId);
499
690
  this.emit("task:complete", task);
500
691
  }
501
692
 
502
693
  _runningCount() {
503
- let count = 0;
694
+ // A task can be known to be running before/without a local child-process
695
+ // entry (for example a restored task or an alternate executor), while a
696
+ // logically settled task must continue occupying capacity until its owned
697
+ // worker actually exits. Count the union so neither case can bypass the
698
+ // concurrency ceiling, and avoid double-counting ordinary local workers.
699
+ const activeTaskIds = new Set(this.processes.keys());
504
700
  for (const task of this.tasks.values()) {
505
- if (task.status === TaskStatus.RUNNING) count++;
701
+ if (task.status === TaskStatus.RUNNING) activeTaskIds.add(task.id);
506
702
  }
507
- return count;
703
+ return activeTaskIds.size;
508
704
  }
509
705
 
510
706
  _persistTask(task, eventType = "snapshot", meta = {}) {
@@ -736,8 +932,9 @@ export class BackgroundTaskManager extends EventEmitter {
736
932
  this._complete(id, TaskStatus.TIMEOUT, null, "Heartbeat timeout");
737
933
  const child = this.processes.get(id);
738
934
  if (child) {
739
- child.kill("SIGKILL");
740
- this.processes.delete(id);
935
+ _deps.killProcessTree(child, "SIGKILL");
936
+ // Retain ownership until exit/error confirms the child is gone;
937
+ // destroy() can otherwise retry a failed host termination.
741
938
  }
742
939
  }
743
940
  }