chainlesschain 0.162.176 → 0.162.177

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 (221) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-BDLu5Elz.js → AIOps-DT-VPWuN.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-DH5us-CK.js → ActionButton-DyOreOVN.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-BZ0u8IFG.js → Analytics-DslNsKux.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-Duu8xR14.js → AppLayout-BNJJAYME.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-Br2YBbh_.js → Artifacts-DoaAtEcY.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-C3C6a482.js → Audit-DPG3WdJ9.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-CzHvebcj.js → BackgroundAgents-C_JO6R5G.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-DZNHYDFd.js → Backup-Cv3BooyX.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-VRiC4fIx.js → BaseInput-D2uQXWu-.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-Cm08WWAD.js → Chat-B4Vczyf3.js} +4 -4
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-DE6reP99.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-DtByk7d7.js → Checkbox-qTgk4VeP.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-CphXXOfD.js → Codegen-DlLWcIzj.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-Hz86TnLR.js → Col-DNO73qp7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-HP03ltpD.js → Community-vRDNpc4j.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-B_N1mqQz.js → Compact-CEWtIXni.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-CVztRpi8.js → Compliance-KgYC9Fxi.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-wUVOyZih.js → Cowork-zj5wvkpT.js} +4 -4
  20. package/src/assets/web-panel/assets/{Cron-DW5TLJKw.js → Cron-BLDoCozU.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-CrAFGhWH.js → Crosschain-BYnff4VY.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-pA-oD8ke.js → DID-C75VFsVm.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-CXrd5gAw.js → Dashboard-C4Gutni2.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-EweJcsek.js → Dropdown-B5dbO4Kx.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-C9xVLPG4.js → EmailListRenderer-BDipZtHJ.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CDcEEqlu.js → FamilyGuardDashboard-DmIzt8jj.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DtZda9A_.js → Federation-D9QOS-uW.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CiYdcVz3.js → FormItemContext-B47HRwAm.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DA13uwA0.js → GenericCardRenderer-3R4mXmgV.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DzRhZD1O.js → Git-DrNXZf1C.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-D5RMgOSb.js → Governance-BGd7JR98.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BgrPfSNk.js → Inference-D-2he1ed.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-DzjnD571.js → KnowledgeGraph-C0sHIbK5.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-BhWzVDtN.js → Logs-DiBQO-jL.js} +2 -2
  35. package/src/assets/web-panel/assets/{MarkdownRenderer-BDape9cx.js → MarkdownRenderer-DL_5eV2D.js} +1 -1
  36. package/src/assets/web-panel/assets/{Marketplace-DJtL5GV7.js → Marketplace-VR59OdrC.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-CZcQygI7.js → McpTools-DrPzwSd3.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-DUWSDUUu.js → Memory-CBgKALwQ.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BTwq2WKY.js → MobileBridge-pQ9Tn-Mn.js} +1 -1
  40. package/src/assets/web-panel/assets/MobileProjects-mASB6jyj.js +1 -0
  41. package/src/assets/web-panel/assets/{Mtc-BiGugEQm.js → Mtc-DTMgE7HC.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-DY7a6gUe.js → MtcAudit-CwTnCtiL.js} +2 -2
  43. package/src/assets/web-panel/assets/{Multisig-BQbDu_w7.js → Multisig-ngm6WU8f.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CM2wXTLv.js → NLProgramming-4YO4Qww9.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-DI6gGs1v.js → Notes-DP1k45mF.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-BsZOLWAB.js → NotificationSettings-r2H8yPKb.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C48mu09U.js → OrderTableRenderer-CoM_Zw0J.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-Cds0_tXr.js → Organization-DrO7jRWS.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-WunYMD87.js → Overflow-Cnwu4i4t.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-Bo6j4DDv.js → P2P-zi-cDwA_.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bh2XPD5f.js → PdhVaultBrowser-DBEryDv7.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-EMvMMC8N.js → Permissions-lqXK2C3x.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-AX3ypUDV.js → PersonalDataHub-b63T3HJM.js} +2 -2
  54. package/src/assets/web-panel/assets/{Pipeline-BOx8HOgL.js → Pipeline-Kep5KAGW.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-tBeTVQVM.js → Privacy-CHdvOAh1.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-CVYg1W4M.js → ProjectInit-BhKfdwe9.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-Dvt5I7y1.js → ProjectSettings-Yavk9K8A.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Cc7FC9-e.js → Projects-CN8E_5Mq.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-Ct8xqY-E.js → Providers-Bfym6SQn.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-Cni8Ooja.js → QrScannerModal-CLSQcrlR.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-BJVLKdxr.js → QuickAsk-VPa2WKQN.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-DPG8Rbbm.js → Recommend-CGXR8jVU.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DsdR7dCt.js → RemoteSession-C_20YfMB.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-Csg1YM-b.js → Reputation-awZh68UV.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-D9DoFoEf.js → Row-Ctb4oiYN.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-BsvKrXMS.js → RssFeed-D3sdjvUV.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-DFUStfgQ.js → Search-C-zfA4kT.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-ILg1zxdK.js → Security-D9XlmHA3.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-Dd41PCaY.js → Services-C3UKnr41.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-Bzo1cN80.js → Skeleton-BQxagZfF.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-q6eb6KPZ.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-jl7UTiRY.js → Sla-DveENvek.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-BePa-RF6.js → SpeechSettings-BFjXLNgF.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-DiqqDKGZ.js → SyncSettings-BpHgbaP9.js} +2 -2
  75. package/src/assets/web-panel/assets/Tasks-DvepRb8-.js +1 -0
  76. package/src/assets/web-panel/assets/{Templates-JiDeI06L.js → Templates-DEiaoyve.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-hhgI6zwS.js → Tenant-ITg774nY.js} +1 -1
  78. package/src/assets/web-panel/assets/Terminal-D3ZBcvnb.js +3 -0
  79. package/src/assets/web-panel/assets/{TimelineRenderer-B8uB5Llk.js → TimelineRenderer-BsLU6JjU.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-C3b_6r2z.js → Tokens-Cb5Pquc9.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-tIP7HKVe.js → Trigger-Dwfy-m9N.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-vjoc11vJ.js → Trust-CnlSRGG0.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-DUPBnGuH.js → UkeySign-Y4TlvKVo.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-CBvhUY5T.js → VideoEditing-BpKLtTTO.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DUaQ0uA5.js → Wallet-LLBzIq8x.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-DllSivjE.js → WebAuthn-BeSRiusP.js} +5 -5
  87. package/src/assets/web-panel/assets/{WorkflowEditor-xc8D3uO6.js → WorkflowEditor-BK_l1tXO.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BVicU7oA.js → chat-DYd-X7Wg.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-DJzLmhLm.js → colors-C9uip71j.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-BvYRfThE.js → compact-item-JBrfjUP6.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DGXxCBKR.js → createContext-D03fbuiq.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-B8LQ8leS.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-SBDJB1y4.js → hasIn-DLQOR6l-.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-MjC4G09d.js → index-5YN7F5bO.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Dm_77jgR.js → index-6GuLRpBQ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CtwqO5qo.js → index-B0X76LjX.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DRfiXB_p.js → index-B46YcgsV.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-VMfwIH5G.js → index-BNCdRmWf.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-hxTODbM1.js → index-BYv-LWdy.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DMarmfrv.js → index-Ba-Ps_AJ.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-xfluRkCT.js → index-BcBZwlnG.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BYqz4Wrr.js → index-BdH9l8wl.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BO1itZaY.js → index-BfOs_bmg.js} +3 -3
  104. package/src/assets/web-panel/assets/index-Bh8BPtqR.js +1 -0
  105. package/src/assets/web-panel/assets/{index-Cf-O_g_8.js → index-BnQgRjsm.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CKyEivf8.js → index-BpYKLrUT.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CoJAO1Lm.js → index-BuNFCZCx.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-1SdDS6lR.js → index-ByHO3SqZ.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DnjPdvR6.js → index-C2zmOsyD.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Bf-ctERC.js → index-CChQBM1d.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DCdRAgjy.js → index-CChaISMb.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Crk5NTb0.js → index-CILVyK3b.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-9gdI7uUW.js → index-CL0ixCxk.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BJZf9DhV.js → index-CS63r8h3.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DCqRS6da.js → index-CVZWiUE_.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DonCnfMr.js → index-Ce0Bf1YF.js} +1 -1
  117. package/src/assets/web-panel/assets/index-CeVrHLzZ.js +1 -0
  118. package/src/assets/web-panel/assets/{index-CloCgBUR.js → index-Ck17i0OD.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-wcCL-miV.js → index-Cpn19c9k.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BTrBGBJs.js → index-CqWk1FLG.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-e4fXH_WO.js → index-CwoDpKzW.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DvUTDYXX.js → index-D-1SqEpQ.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CdGY9P8a.js → index-D4UY5Z60.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DKrvvWm4.js → index-D8KvuDz0.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-lpaGoTH3.js → index-DNMAAUVk.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-YJkzy8ZF.js → index-DYLZY4uh.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-FxZzRyE1.js → index-DaokIHt3.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DHVLJ8q0.js → index-Q7mmL6w4.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Cs2rmLFt.js → index-SO6lgMg0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-z1ZylsLq.js → index-iahNhZwm.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-d5BVd-cL.js → index-l08afIbV.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D7HimK0M.js → index-rIxxfdTN.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-C1zO1KnY.js → initDefaultProps-CG9z1c6w.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-CWLtEGmC.js → motion-B1Ky7Zff.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DzD_C3Vm.js → move-DME8X2P1.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-D880PYJl.js → mtc-parser-cuJYSWB7.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-CFR_z2ov.js → omit-UI_EE0uZ.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-srIhgrSC.js → pickAttrs-BIoE_Z_V.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-C1rXpibP.js → placementArrow-B48-9HKN.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-C30gRcSS.js → responsiveObserve-D7x_GDgD.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-CvtKiMfV.js → slide-DjzC5_7m.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DNHO7ITG.js → statusUtils-C6BIymhh.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-Dt_Sl-g4.js → styleChecker-B4dGrdD9.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Cjev42Gh.js → useFlexGapSupport-Bken4aNE.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-Baxglj2V.js → useFs-BMlqECqv.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-B4NkcLaP.js → usePersonalDataHub-DLdrfmMa.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-mIRkdT7o.js → vnode-CKJQmxa0.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-HzI5DlH_.js → zoom-CaZunuau.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/agenda.js +22 -6
  151. package/src/commands/agent.js +3 -3
  152. package/src/commands/background-session.js +11 -4
  153. package/src/commands/batch.js +79 -27
  154. package/src/commands/changelog.js +15 -4
  155. package/src/commands/eval.js +21 -6
  156. package/src/commands/hook.js +2 -2
  157. package/src/commands/loop.js +9 -2
  158. package/src/commands/skill.js +2 -0
  159. package/src/commands/statusline.js +3 -3
  160. package/src/data/changelog.json +293 -51
  161. package/src/harness/background-task-manager.js +18 -6
  162. package/src/harness/background-task-worker.js +11 -18
  163. package/src/harness/mcp-client.js +9 -15
  164. package/src/harness/worktree-isolator.js +18 -21
  165. package/src/lib/agent-core.js +5 -0
  166. package/src/lib/agent-ipc-bus.js +12 -3
  167. package/src/lib/agent-team/team-worktree.js +28 -6
  168. package/src/lib/agent-worktree.js +20 -19
  169. package/src/lib/async-hook-supervisor.cjs +134 -24
  170. package/src/lib/async-hook-supervisor.js +47 -0
  171. package/src/lib/background-agent-supervisor.js +35 -12
  172. package/src/lib/background-task-manager.js +5 -1
  173. package/src/lib/changelog.js +57 -0
  174. package/src/lib/chrome-connector.js +6 -2
  175. package/src/lib/claude-code-bridge.js +24 -8
  176. package/src/lib/cli-anything-bridge.js +82 -25
  177. package/src/lib/doctor-checkup.js +18 -6
  178. package/src/lib/eval/tasks.js +25 -31
  179. package/src/lib/hook-runner.cjs +71 -36
  180. package/src/lib/hook-runner.js +55 -0
  181. package/src/lib/host-adb-bridge.js +18 -3
  182. package/src/lib/lsp/__tests__/benchmark.test.js +61 -0
  183. package/src/lib/lsp/__tests__/lsp-client.test.js +6 -1
  184. package/src/lib/lsp/benchmark.js +20 -4
  185. package/src/lib/lsp/lsp-client.js +6 -4
  186. package/src/lib/lsp/lsp-server-registry.js +0 -2
  187. package/src/lib/orchestrator.js +8 -2
  188. package/src/lib/packer/pack-update-applier.js +14 -2
  189. package/src/lib/packer/smoke-runner.js +18 -5
  190. package/src/lib/paths.js +1 -1
  191. package/src/lib/plugin-monitor-supervisor.js +20 -13
  192. package/src/lib/plugin-runtime/install.js +10 -3
  193. package/src/lib/repl-bang-memorize.js +10 -2
  194. package/src/lib/repl-goal.js +19 -2
  195. package/src/lib/settings-hook-events.cjs +13 -8
  196. package/src/lib/settings-hook-events.js +20 -0
  197. package/src/lib/skill-packs/generator.js +18 -9
  198. package/src/lib/skill-process-broker.js +71 -0
  199. package/src/lib/slash-commands.js +10 -2
  200. package/src/lib/status-line.cjs +28 -7
  201. package/src/lib/status-line.js +33 -0
  202. package/src/repl/agent-repl.js +48 -43
  203. package/src/runtime/agent-core.js +133 -49
  204. package/src/runtime/headless-runner.js +25 -10
  205. package/src/runtime/headless-stream.js +74 -4
  206. package/src/runtime/session-slash-commands.js +506 -0
  207. package/src/skills/video-editing/extractors/audio-extractor.js +13 -5
  208. package/src/skills/video-editing/extractors/video-extractor.js +13 -3
  209. package/src/skills/video-editing/media-process.js +20 -0
  210. package/src/skills/video-editing/render/audio-mix.js +13 -3
  211. package/src/skills/video-editing/render/ffmpeg-concat.js +7 -2
  212. package/src/skills/video-editing/render/ffmpeg-extract.js +7 -2
  213. package/src/workers/background-agent-worker.js +6 -2
  214. package/src/assets/web-panel/assets/ChatBubbleRenderer-CGHYrugQ.js +0 -1
  215. package/src/assets/web-panel/assets/MobileProjects-NZvvfDME.js +0 -1
  216. package/src/assets/web-panel/assets/Skills-BDHh17P0.js +0 -1
  217. package/src/assets/web-panel/assets/Tasks-DYQ_6lxj.js +0 -1
  218. package/src/assets/web-panel/assets/Terminal-CjTZPa37.js +0 -3
  219. package/src/assets/web-panel/assets/devWarning-BT46Y_QI.js +0 -1
  220. package/src/assets/web-panel/assets/index-B7nuIywP.js +0 -1
  221. package/src/assets/web-panel/assets/index-ycwAfC-i.js +0 -1
@@ -19,8 +19,6 @@
19
19
  import fs from "fs";
20
20
  import path from "path";
21
21
  import { fileURLToPath } from "url";
22
- import { spawn } from "child_process";
23
- import { execFileSync } from "child_process";
24
22
  import chalk from "chalk";
25
23
  import { logger } from "../lib/logger.js";
26
24
  import { runBatch } from "../lib/agent-batch.js";
@@ -31,6 +29,12 @@ import {
31
29
  mergeWorktree,
32
30
  } from "../harness/worktree-isolator.js";
33
31
  import { findProjectRoot } from "../lib/project-detector.js";
32
+ import executionBroker from "../lib/process-execution-broker/index.js";
33
+
34
+ export const _processDeps = {
35
+ spawn: executionBroker.spawn.bind(executionBroker),
36
+ execFileSync: executionBroker.execFileSync.bind(executionBroker),
37
+ };
34
38
 
35
39
  const BIN = path.resolve(
36
40
  path.dirname(fileURLToPath(import.meta.url)),
@@ -183,6 +187,26 @@ function sanitize(key) {
183
187
  return String(key).replace(/[^a-zA-Z0-9._-]/g, "-");
184
188
  }
185
189
 
190
+ function spawnBatchProcess(command, args, options, origin) {
191
+ return _processDeps.spawn(command, args, {
192
+ ...options,
193
+ origin,
194
+ policy: "allow",
195
+ scope: "batch",
196
+ });
197
+ }
198
+
199
+ function runBatchGit(args, cwd, options, origin) {
200
+ return _processDeps.execFileSync("git", args, {
201
+ ...options,
202
+ cwd,
203
+ origin,
204
+ policy: "allow",
205
+ scope: "batch",
206
+ shell: false,
207
+ });
208
+ }
209
+
186
210
  function spawnAgent(prompt, cwd, opts = {}) {
187
211
  return new Promise((resolve, reject) => {
188
212
  const args = [
@@ -196,11 +220,17 @@ function spawnAgent(prompt, cwd, opts = {}) {
196
220
  "text",
197
221
  ];
198
222
  if (opts.model) args.push("--model", opts.model);
199
- const child = spawn(process.execPath, args, {
200
- cwd,
201
- env: { ...process.env, CLAUDECODE: "1" },
202
- windowsHide: true,
203
- });
223
+ const child = spawnBatchProcess(
224
+ process.execPath,
225
+ args,
226
+ {
227
+ cwd,
228
+ env: { ...process.env, CLAUDECODE: "1" },
229
+ windowsHide: true,
230
+ shell: false,
231
+ },
232
+ "batch:agent-run",
233
+ );
204
234
  let err = "";
205
235
  child.stderr?.on("data", (d) => (err += d.toString("utf8")));
206
236
  child.on("error", (e) => reject(new Error(e.message)));
@@ -214,12 +244,17 @@ function spawnAgent(prompt, cwd, opts = {}) {
214
244
 
215
245
  function runTestCommand(command, cwd) {
216
246
  return new Promise((resolve, reject) => {
217
- const child = spawn(command, {
218
- cwd,
219
- shell: true,
220
- env: process.env,
221
- windowsHide: true,
222
- });
247
+ const child = spawnBatchProcess(
248
+ command,
249
+ [],
250
+ {
251
+ cwd,
252
+ shell: true,
253
+ env: process.env,
254
+ windowsHide: true,
255
+ },
256
+ "batch:test-command",
257
+ );
223
258
  let err = "";
224
259
  child.stderr?.on("data", (d) => (err += d.toString("utf8")));
225
260
  child.on("error", (e) => reject(new Error(e.message)));
@@ -234,11 +269,13 @@ function runTestCommand(command, cwd) {
234
269
  /** `git add -A` staged numstat totals for a worktree. */
235
270
  function gitDiffStat(cwd) {
236
271
  try {
237
- execFileSync("git", ["add", "-A"], { cwd, stdio: "ignore" });
238
- const out = execFileSync("git", ["diff", "--cached", "--numstat"], {
272
+ runBatchGit(["add", "-A"], cwd, { stdio: "ignore" }, "batch:git-diff");
273
+ const out = runBatchGit(
274
+ ["diff", "--cached", "--numstat"],
239
275
  cwd,
240
- encoding: "utf8",
241
- });
276
+ { encoding: "utf8" },
277
+ "batch:git-diff",
278
+ );
242
279
  let insertions = 0;
243
280
  let deletions = 0;
244
281
  let filesChanged = 0;
@@ -258,11 +295,13 @@ function gitDiffStat(cwd) {
258
295
 
259
296
  function gitCommitAll(cwd, message) {
260
297
  try {
261
- execFileSync("git", ["add", "-A"], { cwd, stdio: "ignore" });
262
- execFileSync("git", ["commit", "-m", message, "--no-verify"], {
298
+ runBatchGit(["add", "-A"], cwd, { stdio: "ignore" }, "batch:git-commit");
299
+ runBatchGit(
300
+ ["commit", "-m", message, "--no-verify"],
263
301
  cwd,
264
- stdio: "ignore",
265
- });
302
+ { stdio: "ignore" },
303
+ "batch:git-commit",
304
+ );
266
305
  return true;
267
306
  } catch {
268
307
  return false; // nothing to commit / commit failed
@@ -289,11 +328,17 @@ async function decomposeGoal(goal, parts, opts = {}) {
289
328
  "plan",
290
329
  ];
291
330
  if (opts.model) args.push("--model", opts.model);
292
- const child = spawn(process.execPath, args, {
293
- cwd: opts.repoDir || process.cwd(),
294
- env: { ...process.env, CLAUDECODE: "1" },
295
- windowsHide: true,
296
- });
331
+ const child = spawnBatchProcess(
332
+ process.execPath,
333
+ args,
334
+ {
335
+ cwd: opts.repoDir || process.cwd(),
336
+ env: { ...process.env, CLAUDECODE: "1" },
337
+ windowsHide: true,
338
+ shell: false,
339
+ },
340
+ "batch:decompose",
341
+ );
297
342
  let out = "";
298
343
  let err = "";
299
344
  child.stdout?.on("data", (d) => (out += d.toString("utf8")));
@@ -342,4 +387,11 @@ function formatEvent(ev) {
342
387
  }
343
388
  }
344
389
 
345
- export const _internal = { decomposeGoal, gitDiffStat, DECOMPOSE_SCHEMA };
390
+ export const _internal = {
391
+ decomposeGoal,
392
+ gitDiffStat,
393
+ gitCommitAll,
394
+ runTestCommand,
395
+ spawnAgent,
396
+ DECOMPOSE_SCHEMA,
397
+ };
@@ -1,6 +1,6 @@
1
1
  import chalk from "chalk";
2
2
  import { VERSION } from "../constants.js";
3
- import { loadChangelog } from "../lib/changelog.js";
3
+ import { latestCliVersion, loadChangelog } from "../lib/changelog.js";
4
4
  import logger from "../lib/logger.js";
5
5
 
6
6
  /**
@@ -82,10 +82,21 @@ export function registerChangelogCommand(program) {
82
82
  .action((version, options) => {
83
83
  const data = loadChangelog();
84
84
  const releases = data.releases || [];
85
+ const jsonPayload = (selected) =>
86
+ JSON.stringify(
87
+ {
88
+ ...data,
89
+ installedVersion: VERSION,
90
+ latestDocumentedVersion: latestCliVersion(releases),
91
+ releases: selected,
92
+ },
93
+ null,
94
+ 2,
95
+ );
85
96
 
86
97
  if (releases.length === 0) {
87
98
  if (options.json) {
88
- logger.log(JSON.stringify({ releases: [] }, null, 2));
99
+ logger.log(jsonPayload([]));
89
100
  } else {
90
101
  logger.warn("No changelog data is bundled with this build.");
91
102
  }
@@ -97,7 +108,7 @@ export function registerChangelogCommand(program) {
97
108
  selected = matchVersion(releases, version);
98
109
  if (selected.length === 0) {
99
110
  if (options.json) {
100
- logger.log(JSON.stringify({ releases: [] }, null, 2));
111
+ logger.log(jsonPayload([]));
101
112
  } else {
102
113
  logger.warn(`No CLI release notes found for "${version}".`);
103
114
  logger.info(
@@ -114,7 +125,7 @@ export function registerChangelogCommand(program) {
114
125
  }
115
126
 
116
127
  if (options.json) {
117
- logger.log(JSON.stringify({ ...data, releases: selected }, null, 2));
128
+ logger.log(jsonPayload(selected));
118
129
  return;
119
130
  }
120
131
 
@@ -11,15 +11,22 @@
11
11
  import fs from "fs";
12
12
  import path from "path";
13
13
  import { fileURLToPath } from "url";
14
- import { spawn, spawnSync } from "child_process";
15
14
  import { runEvalSuite } from "../lib/eval/runner.js";
16
15
  import { getSuite } from "../lib/eval/tasks.js";
16
+ import executionBroker from "../lib/process-execution-broker/index.js";
17
17
  import {
18
18
  TelemetryRecorder,
19
19
  formatTelemetry,
20
20
  } from "../lib/telemetry/span-recorder.js";
21
21
  import { computeTrend, formatTrend } from "../lib/eval/trend.js";
22
22
 
23
+ export const _deps = {
24
+ platform: process.platform,
25
+ kill: process.kill.bind(process),
26
+ spawn: executionBroker.spawn.bind(executionBroker),
27
+ spawnSync: executionBroker.spawnSync.bind(executionBroker),
28
+ };
29
+
23
30
  /** Append a run summary as one JSONL line to the history file. */
24
31
  function appendHistory(file, record) {
25
32
  fs.appendFileSync(file, JSON.stringify(record) + "\n", "utf8");
@@ -55,18 +62,22 @@ const BIN = path.resolve(__dirname, "..", "..", "bin", "chainlesschain.js");
55
62
  */
56
63
  function killAgentTree(child) {
57
64
  if (!child || !child.pid) return;
58
- if (process.platform === "win32") {
65
+ if (_deps.platform === "win32") {
59
66
  try {
60
- spawnSync("taskkill", ["/PID", String(child.pid), "/T", "/F"], {
67
+ _deps.spawnSync("taskkill", ["/PID", String(child.pid), "/T", "/F"], {
61
68
  windowsHide: true,
62
69
  timeout: 10000,
70
+ origin: "eval:agent-tree-kill",
71
+ policy: "allow",
72
+ scope: "eval",
73
+ shell: false,
63
74
  });
64
75
  } catch {
65
76
  /* fall through to the direct kill below */
66
77
  }
67
78
  } else {
68
79
  try {
69
- process.kill(-child.pid, "SIGKILL"); // negative pid = process group
80
+ _deps.kill(-child.pid, "SIGKILL"); // negative pid = process group
70
81
  return;
71
82
  } catch {
72
83
  /* not a group leader / already gone — fall through */
@@ -105,12 +116,16 @@ function makeHeadlessRunAgent(opts = {}) {
105
116
  if (opts.model) args.push("--model", opts.model);
106
117
  if (opts.provider) args.push("--provider", opts.provider);
107
118
  }
108
- const child = spawn(process.execPath, args, {
119
+ const child = _deps.spawn(process.execPath, args, {
109
120
  cwd,
110
121
  env: { ...process.env, CLAUDECODE: "1" },
111
122
  windowsHide: true,
112
123
  // Own process group on POSIX so a timeout can reap the whole tree.
113
- detached: process.platform !== "win32",
124
+ detached: _deps.platform !== "win32",
125
+ origin: "eval:agent-run",
126
+ policy: "allow",
127
+ scope: "eval",
128
+ shell: false,
114
129
  });
115
130
  let out = "";
116
131
  let err = "";
@@ -173,7 +173,7 @@ export function registerHookCommand(program) {
173
173
  return;
174
174
  }
175
175
 
176
- const { runHooks } = await import("../lib/hook-runner.cjs");
176
+ const { runHooks } = await import("../lib/hook-runner.js");
177
177
  const outcome = runHooks(matched, payload, {
178
178
  cwd: process.cwd(),
179
179
  event,
@@ -283,7 +283,7 @@ export function registerHookCommand(program) {
283
283
  // observe-only + --run: re-collect and execute the matching hooks.
284
284
  const { loadHooks, collectHooks } =
285
285
  await import("../lib/settings-hooks.cjs");
286
- const { runHooks } = await import("../lib/hook-runner.cjs");
286
+ const { runHooks } = await import("../lib/hook-runner.js");
287
287
  const { hooks } = loadHooks({ cwd: process.cwd() });
288
288
  const matched = collectHooks(
289
289
  hooks,
@@ -23,10 +23,10 @@
23
23
  * only builds the concrete iteration (spawn + tee output) and wires SIGINT.
24
24
  */
25
25
 
26
- import { spawn } from "node:child_process";
27
26
  import { fileURLToPath } from "node:url";
28
27
  import chalk from "chalk";
29
28
  import { logger } from "../lib/logger.js";
29
+ import executionBroker from "../lib/process-execution-broker/index.js";
30
30
  import {
31
31
  runLoop,
32
32
  parseDuration,
@@ -42,6 +42,10 @@ import {
42
42
  sessionExists,
43
43
  } from "../harness/jsonl-session-store.js";
44
44
 
45
+ export const _deps = {
46
+ spawn: executionBroker.spawn.bind(executionBroker),
47
+ };
48
+
45
49
  /**
46
50
  * Appended to the prompt under `--dynamic` so the model can self-pace: it ends
47
51
  * its reply with at most one control directive the loop parses (parseLoopDirectives).
@@ -66,10 +70,13 @@ const BIN_PATH = fileURLToPath(
66
70
  */
67
71
  function spawnIteration(cmd, args, { shell, onChild, capture }) {
68
72
  return new Promise((resolve) => {
69
- const child = spawn(cmd, args, {
73
+ const child = _deps.spawn(cmd, args, {
70
74
  shell,
71
75
  stdio: capture ? ["inherit", "pipe", "pipe"] : "inherit",
72
76
  env: process.env,
77
+ origin: "loop:iteration",
78
+ policy: "allow",
79
+ scope: "loop",
73
80
  });
74
81
  if (onChild) onChild(child);
75
82
 
@@ -10,6 +10,7 @@ import chalk from "chalk";
10
10
  import ora from "ora";
11
11
  import fs from "fs";
12
12
  import path from "path";
13
+ import { createSkillProcessBroker } from "../lib/skill-process-broker.js";
13
14
  import { logger } from "../lib/logger.js";
14
15
  import {
15
16
  CLISkillLoader,
@@ -368,6 +369,7 @@ export function registerSkillCommand(program) {
368
369
  projectRoot: process.cwd(),
369
370
  workspacePath: process.cwd(),
370
371
  workspaceRoot: process.cwd(),
372
+ processBroker: createSkillProcessBroker(s),
371
373
  };
372
374
 
373
375
  const result = await handler.execute(task, context, s);
@@ -27,12 +27,12 @@ export function registerStatuslineCommand(program) {
27
27
  .action(async (options) => {
28
28
  try {
29
29
  const { loadStatusLineConfig, buildContext, renderStatusLine } =
30
- await import("../lib/status-line.cjs");
30
+ await import("../lib/status-line.js");
31
31
  const cfg = loadStatusLineConfig({ cwd: process.cwd() });
32
32
  if (!cfg) {
33
33
  logger.log(
34
34
  chalk.gray(
35
- 'No statusLine configured. Add to .claude/settings.json:\n' +
35
+ "No statusLine configured. Add to .claude/settings.json:\n" +
36
36
  ' { "statusLine": { "type": "command", "command": "./status.sh" } }',
37
37
  ),
38
38
  );
@@ -73,7 +73,7 @@ export function registerStatuslineCommand(program) {
73
73
  .option("--json", "Output as JSON")
74
74
  .action(async (options) => {
75
75
  try {
76
- const { loadStatusLineConfig } = await import("../lib/status-line.cjs");
76
+ const { loadStatusLineConfig } = await import("../lib/status-line.js");
77
77
  const cfg = loadStatusLineConfig({ cwd: process.cwd() });
78
78
  if (options.json) {
79
79
  console.log(JSON.stringify(cfg, null, 2));