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
@@ -183,12 +183,12 @@ function persistRecentDenial(record, options = {}) {
183
183
  * user's attention (e.g. waiting on a permission/risk confirmation). A hook can
184
184
  * ring a bell / send a desktop notification. Best-effort, never blocks.
185
185
  */
186
- async function _fireNotification(message, type = "info") {
186
+ async function _fireNotification(message, type = "info", session = null) {
187
187
  // Fire settings.json observe hooks first (best-effort)
188
188
  if (_settingsHooks) {
189
189
  try {
190
190
  const { runObserveHooks } =
191
- await import("../lib/settings-hook-events.cjs");
191
+ await import("../lib/settings-hook-events.js");
192
192
  runObserveHooks(
193
193
  _settingsHooks,
194
194
  "Notification",
@@ -196,7 +196,7 @@ async function _fireNotification(message, type = "info") {
196
196
  message,
197
197
  type,
198
198
  cwd: process.cwd(),
199
- session_id: _session?.sessionId || null,
199
+ session_id: session?.sessionId || null,
200
200
  },
201
201
  { cwd: process.cwd() },
202
202
  );
@@ -205,10 +205,10 @@ async function _fireNotification(message, type = "info") {
205
205
  }
206
206
  }
207
207
  // Fire database-registered Notification hooks (interceptable/suppressible)
208
- if (_session) {
208
+ if (session) {
209
209
  try {
210
210
  const result = await fireNotification(_hookDb, message, {
211
- session: _session,
211
+ session,
212
212
  type,
213
213
  });
214
214
  if (result?.directive?.suppress) {
@@ -750,6 +750,8 @@ export async function startAgentRepl(options = {}) {
750
750
  }
751
751
  await _fireNotification(
752
752
  `Permission needed: ${riskLevel || "medium"}-risk ${tool || "run_shell"}${args?.command ? " — " + args.command : ""}`,
753
+ "info",
754
+ _sessionHandle,
753
755
  );
754
756
  const local = askGateApprovalLocally({ tool, args, riskLevel });
755
757
  if (!_remoteApproval?.bridge) return local.promise;
@@ -840,6 +842,8 @@ export async function startAgentRepl(options = {}) {
840
842
  }
841
843
  await _fireNotification(
842
844
  `Permission needed: ${tool}${rule ? " (" + rule + ")" : ""}`,
845
+ "info",
846
+ _sessionHandle,
843
847
  );
844
848
  const local = askPermissionLocally({ tool, args, rule, reason });
845
849
  if (!_remoteApproval?.bridge) return local.promise;
@@ -1142,7 +1146,7 @@ export async function startAgentRepl(options = {}) {
1142
1146
  if (_settingsHooks && _loadedReplInstructions) {
1143
1147
  try {
1144
1148
  const { runInstructionsLoadedHooks } =
1145
- await import("../lib/settings-hook-events.cjs");
1149
+ await import("../lib/settings-hook-events.js");
1146
1150
  const ctx = runInstructionsLoadedHooks(_settingsHooks, {
1147
1151
  files: _loadedReplInstructions.files,
1148
1152
  cwd: process.cwd(),
@@ -1158,7 +1162,7 @@ export async function startAgentRepl(options = {}) {
1158
1162
  if (_settingsHooks) {
1159
1163
  try {
1160
1164
  const { runSessionStartHooks } =
1161
- await import("../lib/settings-hook-events.cjs");
1165
+ await import("../lib/settings-hook-events.js");
1162
1166
  const ctx = runSessionStartHooks(_settingsHooks, {
1163
1167
  source: "startup",
1164
1168
  cwd: process.cwd(),
@@ -1466,7 +1470,7 @@ export async function startAgentRepl(options = {}) {
1466
1470
  if (_settingsHooks && messages.some((m) => m.role !== "system")) {
1467
1471
  try {
1468
1472
  const { runObserveHooks } =
1469
- await import("../lib/settings-hook-events.cjs");
1473
+ await import("../lib/settings-hook-events.js");
1470
1474
  runObserveHooks(
1471
1475
  _settingsHooks,
1472
1476
  "SessionResume",
@@ -1764,31 +1768,34 @@ export async function startAgentRepl(options = {}) {
1764
1768
 
1765
1769
  // MCP elicitation in the interactive REPL uses the same readline surface as
1766
1770
  // approvals, while MCPClient retains the protocol-level response shape.
1767
- const mcpElicitationClients = [
1768
- _adhocMcp?.mcpClient,
1769
- _bundleMcpClient,
1770
- ].filter((client) => client?.setElicitationHandler);
1771
+ const mcpElicitationClients = [_adhocMcp?.mcpClient, _bundleMcpClient].filter(
1772
+ (client) => client?.setElicitationHandler,
1773
+ );
1771
1774
  for (const client of mcpElicitationClients) {
1772
1775
  client.setElicitationHandler(
1773
1776
  (request) =>
1774
1777
  new Promise((resolve) => {
1775
- const label = request.message || "MCP server requests additional input";
1776
- rl.question(chalk.yellow(`\n MCP [${request.server}] ${label}\n > `), (answer) => {
1777
- const trimmed = String(answer || "").trim();
1778
- if (!trimmed) {
1779
- resolve({ action: "cancel" });
1780
- } else {
1781
- let content = { value: trimmed };
1782
- try {
1783
- const parsed = JSON.parse(trimmed);
1784
- if (parsed && typeof parsed === "object") content = parsed;
1785
- } catch {
1786
- // Plain text remains a valid single-field elicitation answer.
1778
+ const label =
1779
+ request.message || "MCP server requests additional input";
1780
+ rl.question(
1781
+ chalk.yellow(`\n MCP [${request.server}] ${label}\n > `),
1782
+ (answer) => {
1783
+ const trimmed = String(answer || "").trim();
1784
+ if (!trimmed) {
1785
+ resolve({ action: "cancel" });
1786
+ } else {
1787
+ let content = { value: trimmed };
1788
+ try {
1789
+ const parsed = JSON.parse(trimmed);
1790
+ if (parsed && typeof parsed === "object") content = parsed;
1791
+ } catch {
1792
+ // Plain text remains a valid single-field elicitation answer.
1793
+ }
1794
+ resolve({ action: "accept", content });
1787
1795
  }
1788
- resolve({ action: "accept", content });
1789
- }
1790
- rl.prompt();
1791
- });
1796
+ rl.prompt();
1797
+ },
1798
+ );
1792
1799
  }),
1793
1800
  { timeoutMs: options.mcpElicitationTimeoutMs },
1794
1801
  );
@@ -1896,7 +1903,7 @@ export async function startAgentRepl(options = {}) {
1896
1903
  // turn — the session stays open, the current work is suspended. The
1897
1904
  // keypress handler can't await, so fire observe-only fire-and-forget.
1898
1905
  if (_settingsHooks) {
1899
- import("../lib/settings-hook-events.cjs")
1906
+ import("../lib/settings-hook-events.js")
1900
1907
  .then(({ runObserveHooks }) =>
1901
1908
  runObserveHooks(
1902
1909
  _settingsHooks,
@@ -2058,7 +2065,7 @@ export async function startAgentRepl(options = {}) {
2058
2065
  const _costStore = newCostStore(); // running token spend for `/cost`
2059
2066
  let _renderStatus = null;
2060
2067
  try {
2061
- const slm = await import("../lib/status-line.cjs");
2068
+ const slm = await import("../lib/status-line.js");
2062
2069
  const _sl = slm.default || slm;
2063
2070
  const _slCfg = _sl.loadStatusLineConfig({ cwd: process.cwd() });
2064
2071
  _customStatus = !!_slCfg;
@@ -3153,12 +3160,12 @@ export async function startAgentRepl(options = {}) {
3153
3160
  if (_settingsHooks && oldCwd !== newCwd) {
3154
3161
  try {
3155
3162
  const { runCwdChangedHooks, dispatchAsyncHooks } =
3156
- await import("../lib/settings-hook-events.cjs");
3163
+ await import("../lib/settings-hook-events.js");
3157
3164
  const payload = { oldCwd, newCwd, sessionId };
3158
3165
  runCwdChangedHooks(_settingsHooks, payload);
3159
3166
  if (!_asyncHookSupervisor) {
3160
3167
  const { AsyncHookSupervisor } =
3161
- await import("../lib/async-hook-supervisor.cjs");
3168
+ await import("../lib/async-hook-supervisor.js");
3162
3169
  _asyncHookSupervisor = new AsyncHookSupervisor({
3163
3170
  persistStats: true,
3164
3171
  });
@@ -3739,7 +3746,7 @@ export async function startAgentRepl(options = {}) {
3739
3746
  if (_settingsHooks) {
3740
3747
  try {
3741
3748
  const { runObserveHooks, dispatchAsyncHooks } =
3742
- await import("../lib/settings-hook-events.cjs");
3749
+ await import("../lib/settings-hook-events.js");
3743
3750
  const payload = {
3744
3751
  session_id: sessionId || null,
3745
3752
  source: "reload-plugins",
@@ -3747,7 +3754,7 @@ export async function startAgentRepl(options = {}) {
3747
3754
  runObserveHooks(_settingsHooks, "ConfigChange", payload, { cwd });
3748
3755
  if (!_asyncHookSupervisor) {
3749
3756
  const { AsyncHookSupervisor } =
3750
- await import("../lib/async-hook-supervisor.cjs");
3757
+ await import("../lib/async-hook-supervisor.js");
3751
3758
  _asyncHookSupervisor = new AsyncHookSupervisor({
3752
3759
  persistStats: true,
3753
3760
  });
@@ -5099,7 +5106,7 @@ export async function startAgentRepl(options = {}) {
5099
5106
  if (_settingsHooks) {
5100
5107
  try {
5101
5108
  const { runUserPromptSubmitHooks } =
5102
- await import("../lib/settings-hook-events.cjs");
5109
+ await import("../lib/settings-hook-events.js");
5103
5110
  const ups = runUserPromptSubmitHooks(_settingsHooks, {
5104
5111
  prompt: userContent,
5105
5112
  cwd: process.cwd(),
@@ -5122,10 +5129,10 @@ export async function startAgentRepl(options = {}) {
5122
5129
  // turn without blocking it; its result/rewake surfaces on a later turn
5123
5130
  // via the async-hook drain below. Lazily create the supervisor.
5124
5131
  const { dispatchAsyncHooks } =
5125
- await import("../lib/settings-hook-events.cjs");
5132
+ await import("../lib/settings-hook-events.js");
5126
5133
  if (!_asyncHookSupervisor) {
5127
5134
  const { AsyncHookSupervisor } =
5128
- await import("../lib/async-hook-supervisor.cjs");
5135
+ await import("../lib/async-hook-supervisor.js");
5129
5136
  _asyncHookSupervisor = new AsyncHookSupervisor({
5130
5137
  persistStats: true,
5131
5138
  });
@@ -5433,7 +5440,7 @@ export async function startAgentRepl(options = {}) {
5433
5440
  // fire-and-forget; their results/rewakes drain into the next turn above.
5434
5441
  if (_settingsHooks && !_asyncHookSupervisor) {
5435
5442
  const { AsyncHookSupervisor } =
5436
- await import("../lib/async-hook-supervisor.cjs");
5443
+ await import("../lib/async-hook-supervisor.js");
5437
5444
  _asyncHookSupervisor = new AsyncHookSupervisor({ persistStats: true });
5438
5445
  }
5439
5446
  const {
@@ -5579,7 +5586,6 @@ export async function startAgentRepl(options = {}) {
5579
5586
  try {
5580
5587
  const rg = await import("../lib/repl-goal.js");
5581
5588
  const fsMod = await import("node:fs");
5582
- const cpMod = await import("node:child_process");
5583
5589
  const judge = async (cond, { finalText }) => {
5584
5590
  const { chatWithTools } = await import("../runtime/agent-core.js");
5585
5591
  const { firstBalancedJson } =
@@ -5621,7 +5627,6 @@ export async function startAgentRepl(options = {}) {
5621
5627
  response || "",
5622
5628
  {
5623
5629
  cwd: process.cwd(),
5624
- spawnSync: cpMod.spawnSync,
5625
5630
  existsSync: fsMod.existsSync,
5626
5631
  judge,
5627
5632
  },
@@ -5772,7 +5777,7 @@ export async function startAgentRepl(options = {}) {
5772
5777
  if (_settingsHooks) {
5773
5778
  try {
5774
5779
  const { runObserveHooks, dispatchAsyncHooks } =
5775
- await import("../lib/settings-hook-events.cjs");
5780
+ await import("../lib/settings-hook-events.js");
5776
5781
  runObserveHooks(
5777
5782
  _settingsHooks,
5778
5783
  "Stop",
@@ -5781,7 +5786,7 @@ export async function startAgentRepl(options = {}) {
5781
5786
  );
5782
5787
  if (!_asyncHookSupervisor) {
5783
5788
  const { AsyncHookSupervisor } =
5784
- await import("../lib/async-hook-supervisor.cjs");
5789
+ await import("../lib/async-hook-supervisor.js");
5785
5790
  _asyncHookSupervisor = new AsyncHookSupervisor({
5786
5791
  persistStats: true,
5787
5792
  });
@@ -5879,7 +5884,7 @@ export async function startAgentRepl(options = {}) {
5879
5884
  if (_settingsHooks) {
5880
5885
  try {
5881
5886
  const { runObserveHooks } =
5882
- await import("../lib/settings-hook-events.cjs");
5887
+ await import("../lib/settings-hook-events.js");
5883
5888
  runObserveHooks(
5884
5889
  _settingsHooks,
5885
5890
  "SessionEnd",
@@ -16,15 +16,14 @@
16
16
 
17
17
  import fs from "fs";
18
18
  import path from "path";
19
- import { execSync, spawn, spawnSync } from "child_process";
20
19
  import broker from "../lib/process-execution-broker/index.js";
21
20
  import os from "os";
22
21
  import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
23
22
  import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
24
23
  import sharedPermissionRules from "../lib/permission-rules.cjs";
25
24
  import sharedSettingsHooks from "../lib/settings-hooks.cjs";
26
- import sharedHookRunner from "../lib/hook-runner.cjs";
27
- import sharedHookEvents from "../lib/settings-hook-events.cjs";
25
+ import sharedHookRunner from "../lib/hook-runner.js";
26
+ import sharedHookEvents from "../lib/settings-hook-events.js";
28
27
  import { mergeProviderOptions } from "../lib/provider-options.js";
29
28
  import { applyCredentialProxy } from "../lib/credential-proxy.js";
30
29
  import { describeBackgroundCommand } from "../lib/terminal-context.js";
@@ -113,6 +112,33 @@ const {
113
112
  withDeliveryId,
114
113
  } = sharedHookEvents;
115
114
 
115
+ const searchProcessRunner = broker.execSync.bind(broker);
116
+ const runCodeProcessRunner = broker.execFileSync.bind(broker);
117
+
118
+ export const _agentToolProcessDeps = {
119
+ runSearch: searchProcessRunner,
120
+ runCode: runCodeProcessRunner,
121
+ };
122
+
123
+ function runSearchProcess(command, options = {}) {
124
+ return _agentToolProcessDeps.runSearch(command, {
125
+ ...options,
126
+ origin: "agent-core:search-files",
127
+ policy: "allow",
128
+ scope: "agent-core",
129
+ });
130
+ }
131
+
132
+ function runCodeProcess(file, args, options = {}, origin = "run-code") {
133
+ return _agentToolProcessDeps.runCode(file, args, {
134
+ ...options,
135
+ origin: `agent-core:${origin}`,
136
+ policy: "allow",
137
+ scope: "agent-core",
138
+ shell: false,
139
+ });
140
+ }
141
+
116
142
  // ─── Background shell tasks ────────────────────────────────────────────────
117
143
  //
118
144
  // run_shell is synchronous (execSync) and capped at a foreground timeout, which
@@ -231,25 +257,54 @@ function _releaseBgChildHandles(task) {
231
257
  }
232
258
  }
233
259
 
260
+ const backgroundTaskRunner = broker.spawn.bind(broker);
261
+ const backgroundTaskSyncRunner = broker.spawnSync.bind(broker);
262
+
263
+ export const _backgroundProcessDeps = {
264
+ run: backgroundTaskRunner,
265
+ runSync: backgroundTaskSyncRunner,
266
+ };
267
+
268
+ export function _runBackgroundTaskkill(pid, { sync = false } = {}) {
269
+ const args = ["/pid", String(pid), "/T", "/F"];
270
+ const options = {
271
+ windowsHide: true,
272
+ origin: "agent-core:background-taskkill",
273
+ policy: "allow",
274
+ scope: "agent-core",
275
+ };
276
+ return sync
277
+ ? _backgroundProcessDeps.runSync("taskkill", args, options)
278
+ : _backgroundProcessDeps.run("taskkill", args, options);
279
+ }
280
+
281
+ const gitProcessRunner = broker.spawnSync.bind(broker);
282
+
283
+ export const _gitProcessDeps = {
284
+ run: gitProcessRunner,
285
+ };
286
+
234
287
  function _killTask(task) {
235
288
  const child = task?.child;
236
289
  if (!child || child.killed || task?.status !== "running") return false;
237
290
  try {
238
291
  if (process.platform === "win32") {
239
292
  if (child.pid) {
240
- const tk = spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
241
- windowsHide: true,
242
- });
243
- // A spawn that fails to launch emits an async 'error' event — with no
244
- // listener Node rethrows it as an UNCAUGHT exception (the try/catch
245
- // here can't catch the async emit), crashing the CLI. Handle it and
246
- // fall back to a direct kill.
247
- tk.on("error", () => {
293
+ const tk = _runBackgroundTaskkill(child.pid);
294
+ const fallbackDirectKill = () => {
248
295
  try {
249
- child.kill();
296
+ if (!child.killed) child.kill("SIGKILL");
250
297
  } catch {
251
298
  /* already dead */
252
299
  }
300
+ };
301
+ // A launch failure emits 'error'; a permissions/policy failure instead
302
+ // launches taskkill successfully and exits non-zero. Both must fall
303
+ // back or the background command remains alive while teardown reports
304
+ // success.
305
+ tk.once("error", fallbackDirectKill);
306
+ tk.once("close", (code) => {
307
+ if (code !== 0) fallbackDirectKill();
253
308
  });
254
309
  } else {
255
310
  child.kill();
@@ -310,9 +365,13 @@ function _killTaskSync(task) {
310
365
  try {
311
366
  if (process.platform === "win32") {
312
367
  if (child.pid) {
313
- spawnSync("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
314
- windowsHide: true,
315
- });
368
+ const killed = _runBackgroundTaskkill(child.pid, { sync: true });
369
+ if (killed.error || killed.status !== 0) {
370
+ // Restricted runners can execute taskkill but receive a non-zero
371
+ // access/policy result. Direct termination is the synchronous
372
+ // last-resort for the child handle we own.
373
+ child.kill("SIGKILL");
374
+ }
316
375
  } else {
317
376
  child.kill();
318
377
  }
@@ -693,6 +752,21 @@ export function reloadSkills() {
693
752
  let _cachedPython = null;
694
753
  let _cachedEnvInfo = null;
695
754
 
755
+ const environmentProbeRunner = broker.execFileSync.bind(broker);
756
+
757
+ export const _environmentProcessDeps = {
758
+ run: environmentProbeRunner,
759
+ };
760
+
761
+ function runEnvironmentProbe(file, args, options = {}) {
762
+ return _environmentProcessDeps.run(file, args, {
763
+ ...options,
764
+ origin: "agent-core:environment-probe",
765
+ policy: "allow",
766
+ scope: "agent-core",
767
+ });
768
+ }
769
+
696
770
  /**
697
771
  * Get cached Python interpreter info (reuses cli-anything-bridge detection).
698
772
  * @returns {{ found: boolean, command?: string, version?: string }}
@@ -716,7 +790,7 @@ export function getEnvironmentInfo() {
716
790
  let pipAvailable = false;
717
791
  if (py.found) {
718
792
  try {
719
- execSync(`${py.command} -m pip --version`, {
793
+ runEnvironmentProbe(py.command, ["-m", "pip", "--version"], {
720
794
  encoding: "utf-8",
721
795
  timeout: 10000,
722
796
  stdio: ["pipe", "pipe", "pipe"],
@@ -729,7 +803,7 @@ export function getEnvironmentInfo() {
729
803
 
730
804
  let nodeVersion = null;
731
805
  try {
732
- nodeVersion = execSync("node --version", {
806
+ nodeVersion = runEnvironmentProbe(process.execPath, ["--version"], {
733
807
  encoding: "utf-8",
734
808
  timeout: 5000,
735
809
  }).trim();
@@ -739,7 +813,7 @@ export function getEnvironmentInfo() {
739
813
 
740
814
  let gitAvailable = false;
741
815
  try {
742
- execSync("git --version", {
816
+ runEnvironmentProbe("git", ["--version"], {
743
817
  encoding: "utf-8",
744
818
  timeout: 5000,
745
819
  stdio: ["pipe", "pipe", "pipe"],
@@ -1387,11 +1461,11 @@ export async function executeTool(name, args, context = {}) {
1387
1461
  override.capabilityGranted ?? admission.capabilityGranted,
1388
1462
  policyAllowed:
1389
1463
  override.policyAllowed ??
1390
- (context.hostManagedToolPolicy ?
1391
- ((context.hostManagedToolPolicy?.tools ||
1392
- context.hostManagedToolPolicy?.toolPolicies || {})[name]
1393
- ?.allowed !== false) :
1394
- admission.policyAllowed),
1464
+ (context.hostManagedToolPolicy
1465
+ ? (context.hostManagedToolPolicy?.tools ||
1466
+ context.hostManagedToolPolicy?.toolPolicies ||
1467
+ {})[name]?.allowed !== false
1468
+ : admission.policyAllowed),
1395
1469
  permissionGranted:
1396
1470
  override.permissionGranted ?? admission.permissionGranted,
1397
1471
  budgetOk: override.budgetOk ?? admission.budgetOk,
@@ -3158,9 +3232,8 @@ async function executeToolInner(
3158
3232
  // from an ambient system command in the process audit log.
3159
3233
  let pluginBinProvenance = null;
3160
3234
  try {
3161
- const { resolvePluginBinCommand } = await import(
3162
- "../lib/plugin-runtime/bin.js"
3163
- );
3235
+ const { resolvePluginBinCommand } =
3236
+ await import("../lib/plugin-runtime/bin.js");
3164
3237
  pluginBinProvenance = resolvePluginBinCommand(args.command, { cwd });
3165
3238
  } catch {
3166
3239
  pluginBinProvenance = null;
@@ -3551,12 +3624,15 @@ async function executeToolInner(
3551
3624
  // command-execution bypass for a prompt-injected agent. Quoted args (a
3552
3625
  // commit message) keep their content via the quote-aware tokenizer.
3553
3626
  const gitArgs = tokenizeShellWords(normalizedCommand);
3554
- const res = spawnSync("git", gitArgs, {
3627
+ const res = _gitProcessDeps.run("git", gitArgs, {
3555
3628
  cwd: args.cwd || cwd,
3556
3629
  encoding: "utf8",
3557
3630
  timeout: 60000,
3558
3631
  maxBuffer: 1024 * 1024,
3559
3632
  windowsHide: true,
3633
+ origin: "agent-core:git-command",
3634
+ policy: "allow",
3635
+ scope: "agent-core",
3560
3636
  });
3561
3637
  const readOnly = isReadOnlyGitCommand(normalizedCommand);
3562
3638
  if (res.error) {
@@ -4157,7 +4233,7 @@ async function executeToolInner(
4157
4233
  };
4158
4234
  try {
4159
4235
  if (!fs.existsSync(root)) continue;
4160
- const output = execSync(cmd, {
4236
+ const output = runSearchProcess(cmd, {
4161
4237
  cwd: root,
4162
4238
  encoding: "utf8",
4163
4239
  timeout: 10000,
@@ -4428,7 +4504,7 @@ async function executeToolInner(
4428
4504
  onWarn: (msg) => {
4429
4505
  // Non-fatal — logged as warning, skipped servers captured
4430
4506
  // in mountResult.skipped.
4431
- // eslint-disable-next-line no-console
4507
+
4432
4508
  console.warn(msg);
4433
4509
  },
4434
4510
  });
@@ -4763,7 +4839,7 @@ async function _executeRunCode(args, cwd) {
4763
4839
  const start = Date.now();
4764
4840
  let output;
4765
4841
  try {
4766
- output = execSync(`${interpreter} "${scriptPath}"`, {
4842
+ output = runCodeProcess(interpreter, [scriptPath], {
4767
4843
  cwd,
4768
4844
  encoding: "utf8",
4769
4845
  timeout: timeoutSec * 1000,
@@ -4863,12 +4939,18 @@ async function _executeRunCode(args, cwd) {
4863
4939
 
4864
4940
  // Attempt pip install
4865
4941
  try {
4866
- execSync(`${interpreter} -m pip install ${packageName}`, {
4867
- encoding: "utf-8",
4868
- timeout: 120000,
4869
- maxBuffer: 2 * 1024 * 1024,
4870
- stdio: ["pipe", "pipe", "pipe"],
4871
- });
4942
+ runCodeProcess(
4943
+ interpreter,
4944
+ ["-m", "pip", "install", packageName],
4945
+ {
4946
+ cwd,
4947
+ encoding: "utf-8",
4948
+ timeout: 120000,
4949
+ maxBuffer: 2 * 1024 * 1024,
4950
+ stdio: ["pipe", "pipe", "pipe"],
4951
+ },
4952
+ "run-code-install",
4953
+ );
4872
4954
  recordInstallAudit({
4873
4955
  package: packageName,
4874
4956
  interpreter,
@@ -4879,12 +4961,17 @@ async function _executeRunCode(args, cwd) {
4879
4961
 
4880
4962
  // Retry execution
4881
4963
  const retryStart = Date.now();
4882
- const retryOutput = execSync(`${interpreter} "${scriptPath}"`, {
4883
- cwd,
4884
- encoding: "utf8",
4885
- timeout: timeoutSec * 1000,
4886
- maxBuffer: 5 * 1024 * 1024,
4887
- });
4964
+ const retryOutput = runCodeProcess(
4965
+ interpreter,
4966
+ [scriptPath],
4967
+ {
4968
+ cwd,
4969
+ encoding: "utf8",
4970
+ timeout: timeoutSec * 1000,
4971
+ maxBuffer: 5 * 1024 * 1024,
4972
+ },
4973
+ "run-code-retry",
4974
+ );
4888
4975
  const retryDuration = Date.now() - retryStart;
4889
4976
 
4890
4977
  return {
@@ -5618,10 +5705,7 @@ async function _executeSpawnSubAgent(args, ctx) {
5618
5705
  task: subCtx.task,
5619
5706
  background: payload?.background === true,
5620
5707
  });
5621
- } else if (
5622
- type === "sub-agent.completed" ||
5623
- type === "sub-agent.failed"
5624
- ) {
5708
+ } else if (type === "sub-agent.completed" || type === "sub-agent.failed") {
5625
5709
  emitHooksV2Event("TaskCompleted", {
5626
5710
  task_id: subCtx.id,
5627
5711
  session_id: parentSessionId,
@@ -7944,9 +8028,9 @@ export async function* agentLoop(messages, options) {
7944
8028
  let toolArgs;
7945
8029
  try {
7946
8030
  toolArgs =
7947
- typeof call.function.arguments === "string"
7948
- ? JSON.parse(call.function.arguments)
7949
- : call.function.arguments;
8031
+ typeof call.function.arguments === "string"
8032
+ ? JSON.parse(call.function.arguments)
8033
+ : call.function.arguments;
7950
8034
  } catch {
7951
8035
  toolArgs = {};
7952
8036
  }