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
@@ -17,10 +17,10 @@
17
17
  * All process/fs access goes through `_deps` for tests.
18
18
  */
19
19
 
20
- import { spawnSync as spawnSyncDefault } from "child_process";
21
20
  import fsDefault from "fs";
22
21
  import pathDefault from "path";
23
22
  import { findProjectRoot } from "./project-instructions.js";
23
+ import executionBroker from "./process-execution-broker/index.js";
24
24
 
25
25
  export const BANG_TIMEOUT_MS = 120_000;
26
26
  export const BANG_MAX_BUFFER = 10 * 1024 * 1024;
@@ -32,7 +32,7 @@ export const BANG_OUTPUT_CAP = 30_000;
32
32
  export const MEMO_NOTE_MAX = 4_000;
33
33
 
34
34
  export const _deps = {
35
- spawnSync: spawnSyncDefault,
35
+ spawnSync: (...args) => executionBroker.spawnSync(...args),
36
36
  fs: fsDefault,
37
37
  path: pathDefault,
38
38
  };
@@ -83,12 +83,20 @@ export function runBangCommand(line, opts = {}) {
83
83
  timeout: BANG_TIMEOUT_MS,
84
84
  maxBuffer: BANG_MAX_BUFFER,
85
85
  cwd,
86
+ origin: "repl:bang-command",
87
+ policy: "allow",
88
+ scope: "repl",
89
+ shell: false,
86
90
  })
87
91
  : spawnSync("/bin/sh", ["-c", cmd], {
88
92
  encoding: "utf-8",
89
93
  timeout: BANG_TIMEOUT_MS,
90
94
  maxBuffer: BANG_MAX_BUFFER,
91
95
  cwd,
96
+ origin: "repl:bang-command",
97
+ policy: "allow",
98
+ scope: "repl",
99
+ shell: false,
92
100
  });
93
101
 
94
102
  const exitCode = res.status == null ? (res.error ? -1 : 0) : res.status;
@@ -19,6 +19,23 @@ import {
19
19
  GoalConditionEngine,
20
20
  GOAL_DECISION,
21
21
  } from "./goal-condition-engine.js";
22
+ import executionBroker from "./process-execution-broker/index.js";
23
+
24
+ const brokerRunner = executionBroker.spawnSync.bind(executionBroker);
25
+
26
+ export const _processDeps = {
27
+ run: brokerRunner,
28
+ };
29
+
30
+ function runReplGoalCommand(command, options = {}) {
31
+ return _processDeps.run(command, [], {
32
+ ...options,
33
+ timeout: options.timeout ?? 30000,
34
+ origin: "repl-goal:exit-zero",
35
+ policy: "allow",
36
+ scope: "repl-goal",
37
+ });
38
+ }
22
39
 
23
40
  // Interactive sessions are human-paced, so the turn-count budget is generous —
24
41
  // it exists only as a backstop (the engine hard-caps at 100 regardless). The
@@ -94,7 +111,7 @@ export function renderGoalVerdict(decision, events) {
94
111
  /**
95
112
  * Evaluate the session goal against a completed turn's final text. Deterministic
96
113
  * conditions run inline (contains/regex on the text; exit-zero/file-exists via
97
- * injected `spawnSync`/`existsSync`); a model condition delegates to `judge`.
114
+ * injected process runner/`existsSync`); a model condition delegates to `judge`.
98
115
  *
99
116
  * @param {GoalConditionEngine} engine
100
117
  * @param {string} finalText the assistant's answer this turn
@@ -110,7 +127,7 @@ export async function evaluateReplGoalTurn(engine, finalText, deps = {}) {
110
127
  evaluation = runDeterministicCheck(cond, {
111
128
  lastOutput: finalText,
112
129
  cwd: deps.cwd,
113
- spawnSync: deps.spawnSync,
130
+ spawnSync: deps.spawnSync || runReplGoalCommand,
114
131
  existsSync: deps.existsSync,
115
132
  });
116
133
  } else if (typeof deps.judge === "function") {
@@ -17,7 +17,8 @@
17
17
  */
18
18
 
19
19
  const { collectHooks } = require("./settings-hooks.cjs");
20
- const { runHooks } = require("./hook-runner.cjs");
20
+ const hookRunner = require("./hook-runner.cjs");
21
+ const _deps = { runHooks: hookRunner.runHooks };
21
22
  const { buildHookEnvelope } = require("./hook-event-bus.cjs");
22
23
  const hookEventLog = require("./hook-event-log.cjs");
23
24
 
@@ -143,7 +144,7 @@ function runUserPromptSubmitHooks(
143
144
  },
144
145
  { sessionId },
145
146
  );
146
- const outcome = runHooks(sync, payload, {
147
+ const outcome = _deps.runHooks(sync, payload, {
147
148
  cwd,
148
149
  event: "UserPromptSubmit",
149
150
  });
@@ -211,7 +212,10 @@ function runSessionStartHooks(settingsHooks, { source, cwd, sessionId } = {}) {
211
212
  },
212
213
  { sessionId },
213
214
  );
214
- const outcome = runHooks(matched, payload, { cwd, event: "SessionStart" });
215
+ const outcome = _deps.runHooks(matched, payload, {
216
+ cwd,
217
+ event: "SessionStart",
218
+ });
215
219
  return { additionalContext: aggregateContext(outcome.results) };
216
220
  }
217
221
 
@@ -247,7 +251,7 @@ function runCwdChangedHooks(
247
251
  },
248
252
  { sessionId },
249
253
  );
250
- const outcome = runHooks(sync, payload, {
254
+ const outcome = _deps.runHooks(sync, payload, {
251
255
  cwd: newCwd || cwd,
252
256
  event: "CwdChanged",
253
257
  });
@@ -291,7 +295,7 @@ function runWorktreeCreateHooks(
291
295
  },
292
296
  { sessionId },
293
297
  );
294
- const outcome = runHooks(sync, payload, {
298
+ const outcome = _deps.runHooks(sync, payload, {
295
299
  cwd: cwd || worktreePath,
296
300
  event: "WorktreeCreate",
297
301
  });
@@ -337,7 +341,7 @@ function runWorktreeRemoveHooks(
337
341
  },
338
342
  { sessionId },
339
343
  );
340
- const outcome = runHooks(sync, payload, {
344
+ const outcome = _deps.runHooks(sync, payload, {
341
345
  cwd: cwd || worktreePath,
342
346
  event: "WorktreeRemove",
343
347
  });
@@ -386,7 +390,7 @@ function runInstructionsLoadedHooks(
386
390
  },
387
391
  { sessionId },
388
392
  );
389
- const outcome = runHooks(sync, payload, {
393
+ const outcome = _deps.runHooks(sync, payload, {
390
394
  cwd,
391
395
  event: "InstructionsLoaded",
392
396
  });
@@ -417,7 +421,7 @@ function runObserveHooks(
417
421
  const matched = collectHooks(settingsHooks, event, matchTarget || "");
418
422
  const { sync } = partitionAsyncHooks(matched);
419
423
  if (sync.length === 0) return { decision: "continue", results: [] };
420
- return runHooks(
424
+ return _deps.runHooks(
421
425
  sync,
422
426
  withDeliveryId(
423
427
  event,
@@ -440,4 +444,5 @@ module.exports = {
440
444
  aggregateContext,
441
445
  partitionAsyncHooks,
442
446
  dispatchAsyncHooks,
447
+ _deps,
443
448
  };
@@ -0,0 +1,20 @@
1
+ import { runHooks } from "./hook-runner.js";
2
+ import events from "./settings-hook-events.cjs";
3
+
4
+ events._deps.runHooks = runHooks;
5
+
6
+ export const {
7
+ withDeliveryId,
8
+ runUserPromptSubmitHooks,
9
+ runSessionStartHooks,
10
+ runCwdChangedHooks,
11
+ runWorktreeCreateHooks,
12
+ runWorktreeRemoveHooks,
13
+ runInstructionsLoadedHooks,
14
+ runObserveHooks,
15
+ aggregateContext,
16
+ partitionAsyncHooks,
17
+ dispatchAsyncHooks,
18
+ } = events;
19
+
20
+ export default events;
@@ -115,6 +115,7 @@ cli-version-hash: "${hash}"
115
115
  tags: [${allTags}]
116
116
  user-invocable: true
117
117
  handler: handler.js
118
+ capabilities: [shell-exec]
118
119
  ---
119
120
 
120
121
  # ${domainDef.displayName}
@@ -176,7 +177,6 @@ export function generateDirectHandler(domainKey, domainDef) {
176
177
  * 自动生成 — 请勿手动修改,运行 \`chainlesschain skill sync-cli\` 重新生成
177
178
  */
178
179
 
179
- const { spawnSync } = require("child_process");
180
180
 
181
181
  /** 解析输入字符串为指令+参数数组 */
182
182
  function parseInput(input) {
@@ -241,7 +241,7 @@ ${commandGuide}
241
241
  const useJson = JSON_SUPPORTED_COMMANDS.has(command) && !cliArgs.includes("--json");
242
242
  if (useJson) cliArgs.push("--json");
243
243
 
244
- // Security: spawnSync uses shell:true (needed to run the chainlesschain.cmd
244
+ // Security: Broker execution uses shell:true (needed to run the chainlesschain.cmd
245
245
  // shim on Windows), which joins cliArgs into a shell command. Reject shell
246
246
  // metacharacters so a crafted skill input can't inject commands.
247
247
  const unsafeArg = cliArgs.find((a) => /[;&|\`$<>()\\n\\r]/.test(a));
@@ -252,11 +252,16 @@ ${commandGuide}
252
252
  };
253
253
  }
254
254
 
255
- // Execute via child process
256
- const result = spawnSync("chainlesschain", cliArgs, {
255
+ const processBroker = context?.processBroker;
256
+ if (!processBroker || typeof processBroker.runSync !== "function") {
257
+ return { success: false, error: "Process Broker unavailable for skill execution." };
258
+ }
259
+
260
+ // Execute via the host-scoped Process Broker facade.
261
+ const result = processBroker.runSync("chainlesschain", cliArgs, {
257
262
  encoding: "utf-8",
258
263
  shell: true,
259
- cwd: context.projectRoot || process.cwd(),
264
+ cwd: context?.projectRoot || process.cwd(),
260
265
  timeout: 30000,
261
266
  env: { ...process.env },
262
267
  });
@@ -407,7 +412,6 @@ export function generateHybridHandler(domainKey, domainDef) {
407
412
  * 自动生成 — 请勿手动修改,运行 \`chainlesschain skill sync-cli\` 重新生成
408
413
  */
409
414
 
410
- const { spawnSync } = require("child_process");
411
415
 
412
416
  const AGENT_ONLY_COMMANDS = new Set([${agentCmds}]);
413
417
  const VALID_COMMANDS = new Set(["${commandList}"]);
@@ -470,7 +474,7 @@ const handler = {
470
474
  // Direct execution for other commands
471
475
  const cliArgs = [...args, "--quiet"];
472
476
 
473
- // Security: spawnSync uses shell:true (needed to run the chainlesschain.cmd
477
+ // Security: Broker execution uses shell:true (needed to run the chainlesschain.cmd
474
478
  // shim on Windows), which joins cliArgs into a shell command. Reject shell
475
479
  // metacharacters so a crafted skill input can't inject commands.
476
480
  const unsafeArg = cliArgs.find((a) => /[;&|\`$<>()\\n\\r]/.test(a));
@@ -481,10 +485,15 @@ const handler = {
481
485
  };
482
486
  }
483
487
 
484
- const result = spawnSync("chainlesschain", cliArgs, {
488
+ const processBroker = context?.processBroker;
489
+ if (!processBroker || typeof processBroker.runSync !== "function") {
490
+ return { success: false, error: "Process Broker unavailable for skill execution." };
491
+ }
492
+
493
+ const result = processBroker.runSync("chainlesschain", cliArgs, {
485
494
  encoding: "utf-8",
486
495
  shell: true,
487
- cwd: context.projectRoot || process.cwd(),
496
+ cwd: context?.projectRoot || process.cwd(),
488
497
  timeout: 30000,
489
498
  env: { ...process.env },
490
499
  });
@@ -0,0 +1,71 @@
1
+ import executionBroker from "./process-execution-broker/index.js";
2
+
3
+ const defaultRunSync = executionBroker.spawnSync.bind(executionBroker);
4
+ const defaultRunFileSync = executionBroker.execFileSync.bind(executionBroker);
5
+
6
+ function skillIdentity(skill = {}) {
7
+ const identity = String(
8
+ skill.id || skill.name || skill.skillName || "unknown",
9
+ )
10
+ .trim()
11
+ .replace(/[^a-zA-Z0-9._:-]+/g, "-")
12
+ .slice(0, 96);
13
+ return identity || "unknown";
14
+ }
15
+
16
+ function declaresShellExecution(skill = {}) {
17
+ return (
18
+ Array.isArray(skill.capabilities) &&
19
+ skill.capabilities.some(
20
+ (capability) => String(capability).toLowerCase() === "shell-exec",
21
+ )
22
+ );
23
+ }
24
+
25
+ /**
26
+ * Create the narrow process facade exposed to a skill handler.
27
+ *
28
+ * The host, not the handler, owns provenance and permission metadata. Generated
29
+ * handlers can choose argv and ordinary process options, but cannot relabel the
30
+ * execution or bypass the Broker boundary.
31
+ */
32
+ export function createSkillProcessBroker(
33
+ skill,
34
+ { runSync = defaultRunSync, runFileSync = defaultRunFileSync } = {},
35
+ ) {
36
+ if (!declaresShellExecution(skill)) return null;
37
+
38
+ const identity = skillIdentity(skill);
39
+ const metadata = Object.freeze({
40
+ origin: `skill:${identity}`,
41
+ policy: "allow",
42
+ scope: "skill",
43
+ pluginId: skill?.pluginId || skill?.plugin?.id || null,
44
+ pluginVersion: skill?.pluginVersion || skill?.plugin?.version || null,
45
+ pluginSource: skill?.pluginSource || skill?.plugin?.source || null,
46
+ });
47
+
48
+ return Object.freeze({
49
+ runSync(file, args = [], options = {}) {
50
+ return runSync(file, args, {
51
+ ...options,
52
+ ...metadata,
53
+ });
54
+ },
55
+
56
+ runFileSync(file, args = [], options = {}) {
57
+ return runFileSync(file, args, {
58
+ ...options,
59
+ ...metadata,
60
+ shell: false,
61
+ });
62
+ },
63
+ });
64
+ }
65
+
66
+ export const _skillProcessDefaults = {
67
+ runSync: defaultRunSync,
68
+ runFileSync: defaultRunFileSync,
69
+ };
70
+
71
+ export { declaresShellExecution as skillDeclaresShellExecution };
@@ -21,11 +21,15 @@
21
21
  import fsDefault from "node:fs";
22
22
  import pathDefault from "node:path";
23
23
  import { homedir } from "node:os";
24
- import { execSync as execSyncDefault } from "node:child_process";
25
24
  import { expandFileRefs } from "../runtime/file-ref-expander.js";
26
25
  import { projectRootBase } from "./project-root.cjs";
26
+ import executionBroker from "./process-execution-broker/index.js";
27
27
 
28
- const _deps = { fs: fsDefault, path: pathDefault, execSync: execSyncDefault };
28
+ const _deps = {
29
+ fs: fsDefault,
30
+ path: pathDefault,
31
+ execSync: (...args) => executionBroker.execSync(...args),
32
+ };
29
33
 
30
34
  /**
31
35
  * Split `--- ... ---` frontmatter from the body and camelCase the keys (so
@@ -191,6 +195,10 @@ function runBangs(text, { cwd, execSync }) {
191
195
  encoding: "utf-8",
192
196
  timeout: BANG_TIMEOUT_MS,
193
197
  stdio: ["ignore", "pipe", "pipe"],
198
+ origin: "slash-command:bang",
199
+ policy: "allow",
200
+ scope: "slash-command",
201
+ shell: true,
194
202
  });
195
203
  return String(out).trim();
196
204
  } catch (err) {
@@ -13,15 +13,14 @@
13
13
  *
14
14
  * Best-effort throughout: a missing config, a broken command, or a timeout just
15
15
  * yields no status line — it never blocks or breaks the REPL. `_deps` injection
16
- * (spawnSync / settings reader) for tests.
16
+ * (process runner / settings reader) for tests.
17
17
  */
18
18
 
19
- const cpDefault = require("node:child_process");
20
19
  const path = require("node:path");
21
20
  const { settingsPaths, readSettingsFile } = require("./settings-loader.cjs");
22
21
 
23
22
  const _deps = {
24
- spawnSync: cpDefault.spawnSync,
23
+ runProcess: null,
25
24
  // injectable so tests don't touch real settings files
26
25
  readSettings: (cwd, settingsFile) => {
27
26
  const out = [];
@@ -181,7 +180,7 @@ function isStatusLineDisabled({ cwd = process.cwd(), settingsFile } = {}) {
181
180
  function renderStatusLine(
182
181
  config,
183
182
  context = {},
184
- { cwd, timeout = 5000, columns, rows } = {},
183
+ { cwd, timeout = 5000, columns, rows, runProcess } = {},
185
184
  ) {
186
185
  if (!config || !config.command) return null;
187
186
  // Claude-Code parity (2.1.153): hand the command the terminal width/height so
@@ -194,7 +193,9 @@ function renderStatusLine(
194
193
  if (rws != null) env.LINES = String(rws);
195
194
  let res;
196
195
  try {
197
- res = _deps.spawnSync(config.command, {
196
+ const runner = runProcess || _deps.runProcess;
197
+ if (typeof runner !== "function") return null;
198
+ res = runner(config.command, [], {
198
199
  input: JSON.stringify(context),
199
200
  cwd: cwd || process.cwd(),
200
201
  env,
@@ -202,6 +203,9 @@ function renderStatusLine(
202
203
  timeout,
203
204
  shell: true,
204
205
  maxBuffer: 1024 * 1024,
206
+ origin: "status-line:command",
207
+ policy: "allow",
208
+ scope: "status-line",
205
209
  });
206
210
  } catch {
207
211
  return null; // spawn failure → no status line
@@ -216,11 +220,28 @@ function renderStatusLine(
216
220
  }
217
221
 
218
222
  /** Convenience: load + render in one call (used by the REPL each turn). */
219
- function getStatusLine({ cwd, settingsFile, sessionId, model, provider, projectDir, timeout, columns, rows } = {}) {
223
+ function getStatusLine({
224
+ cwd,
225
+ settingsFile,
226
+ sessionId,
227
+ model,
228
+ provider,
229
+ projectDir,
230
+ timeout,
231
+ columns,
232
+ rows,
233
+ runProcess,
234
+ } = {}) {
220
235
  const config = loadStatusLineConfig({ cwd, settingsFile });
221
236
  if (!config) return null;
222
237
  const context = buildContext({ sessionId, model, provider, cwd, projectDir });
223
- return renderStatusLine(config, context, { cwd, timeout, columns, rows });
238
+ return renderStatusLine(config, context, {
239
+ cwd,
240
+ timeout,
241
+ columns,
242
+ rows,
243
+ runProcess,
244
+ });
224
245
  }
225
246
 
226
247
  module.exports = {
@@ -0,0 +1,33 @@
1
+ import statusLine from "./status-line.cjs";
2
+ import executionBroker from "./process-execution-broker/index.js";
3
+
4
+ const brokerRunner = executionBroker.spawnSync.bind(executionBroker);
5
+
6
+ export function renderStatusLine(config, context, options = {}) {
7
+ return statusLine.renderStatusLine(config, context, {
8
+ ...options,
9
+ runProcess:
10
+ options.runProcess || statusLine._deps.runProcess || brokerRunner,
11
+ });
12
+ }
13
+
14
+ export function getStatusLine(options = {}) {
15
+ return statusLine.getStatusLine({
16
+ ...options,
17
+ runProcess:
18
+ options.runProcess || statusLine._deps.runProcess || brokerRunner,
19
+ });
20
+ }
21
+
22
+ export const {
23
+ loadStatusLineConfig,
24
+ buildContext,
25
+ formatTokens,
26
+ shortenPath,
27
+ renderDefaultStatusLine,
28
+ isStatusLineDisabled,
29
+ terminalSize,
30
+ _deps,
31
+ } = statusLine;
32
+
33
+ export default { ...statusLine, renderStatusLine, getStatusLine };