@pellux/goodvibes-sdk 0.37.2 → 1.0.0

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 (555) hide show
  1. package/dist/contracts/artifacts/operator-contract.json +3171 -929
  2. package/dist/daemon.d.ts +2 -0
  3. package/dist/daemon.d.ts.map +1 -1
  4. package/dist/daemon.js +4 -0
  5. package/dist/events/communication.d.ts +21 -1
  6. package/dist/events/communication.d.ts.map +1 -1
  7. package/dist/events/surfaces.d.ts +25 -3
  8. package/dist/events/surfaces.d.ts.map +1 -1
  9. package/dist/events/surfaces.js +22 -1
  10. package/dist/events/workflows.d.ts +7 -6
  11. package/dist/events/workflows.d.ts.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/platform/agents/archetypes.d.ts.map +1 -1
  15. package/dist/platform/agents/archetypes.js +7 -0
  16. package/dist/platform/agents/index.d.ts +1 -0
  17. package/dist/platform/agents/index.d.ts.map +1 -1
  18. package/dist/platform/agents/index.js +1 -0
  19. package/dist/platform/agents/message-bus-core.d.ts +7 -0
  20. package/dist/platform/agents/message-bus-core.d.ts.map +1 -1
  21. package/dist/platform/agents/message-bus-core.js +2 -1
  22. package/dist/platform/agents/orchestrator-runner.d.ts +50 -1
  23. package/dist/platform/agents/orchestrator-runner.d.ts.map +1 -1
  24. package/dist/platform/agents/orchestrator-runner.js +172 -7
  25. package/dist/platform/agents/orchestrator.d.ts +78 -6
  26. package/dist/platform/agents/orchestrator.d.ts.map +1 -1
  27. package/dist/platform/agents/orchestrator.js +95 -18
  28. package/dist/platform/agents/planner-decomposition-runner.d.ts +38 -0
  29. package/dist/platform/agents/planner-decomposition-runner.d.ts.map +1 -0
  30. package/dist/platform/agents/planner-decomposition-runner.js +113 -0
  31. package/dist/platform/agents/turn-knowledge-injection.d.ts +192 -0
  32. package/dist/platform/agents/turn-knowledge-injection.d.ts.map +1 -0
  33. package/dist/platform/agents/turn-knowledge-injection.js +269 -0
  34. package/dist/platform/agents/worktree.d.ts +126 -8
  35. package/dist/platform/agents/worktree.d.ts.map +1 -1
  36. package/dist/platform/agents/worktree.js +240 -19
  37. package/dist/platform/agents/wrfc-controller.d.ts +46 -0
  38. package/dist/platform/agents/wrfc-controller.d.ts.map +1 -1
  39. package/dist/platform/agents/wrfc-controller.js +213 -32
  40. package/dist/platform/agents/wrfc-gate-runtime.d.ts +9 -0
  41. package/dist/platform/agents/wrfc-gate-runtime.d.ts.map +1 -1
  42. package/dist/platform/agents/wrfc-gate-runtime.js +7 -3
  43. package/dist/platform/agents/wrfc-gates.d.ts +1 -1
  44. package/dist/platform/agents/wrfc-gates.d.ts.map +1 -1
  45. package/dist/platform/agents/wrfc-gates.js +7 -1
  46. package/dist/platform/agents/wrfc-types.d.ts +23 -3
  47. package/dist/platform/agents/wrfc-types.d.ts.map +1 -1
  48. package/dist/platform/automation/types.d.ts +9 -1
  49. package/dist/platform/automation/types.d.ts.map +1 -1
  50. package/dist/platform/calendar/calendar-api-shared.d.ts +25 -0
  51. package/dist/platform/calendar/calendar-api-shared.d.ts.map +1 -0
  52. package/dist/platform/calendar/calendar-api-shared.js +100 -0
  53. package/dist/platform/calendar/calendar-connector.d.ts +79 -0
  54. package/dist/platform/calendar/calendar-connector.d.ts.map +1 -0
  55. package/dist/platform/calendar/calendar-connector.js +155 -0
  56. package/dist/platform/calendar/google-calendar-api.d.ts +25 -0
  57. package/dist/platform/calendar/google-calendar-api.d.ts.map +1 -0
  58. package/dist/platform/calendar/google-calendar-api.js +89 -0
  59. package/dist/platform/calendar/http-fetch-adapter.d.ts +25 -0
  60. package/dist/platform/calendar/http-fetch-adapter.d.ts.map +1 -0
  61. package/dist/platform/calendar/http-fetch-adapter.js +25 -0
  62. package/dist/platform/calendar/ics-parser.d.ts +35 -0
  63. package/dist/platform/calendar/ics-parser.d.ts.map +1 -0
  64. package/dist/platform/calendar/ics-parser.js +236 -0
  65. package/dist/platform/calendar/index.d.ts +41 -0
  66. package/dist/platform/calendar/index.d.ts.map +1 -0
  67. package/dist/platform/calendar/index.js +49 -0
  68. package/dist/platform/calendar/merged-calendar-model.d.ts +67 -0
  69. package/dist/platform/calendar/merged-calendar-model.d.ts.map +1 -0
  70. package/dist/platform/calendar/merged-calendar-model.js +181 -0
  71. package/dist/platform/calendar/microsoft-graph-api.d.ts +25 -0
  72. package/dist/platform/calendar/microsoft-graph-api.d.ts.map +1 -0
  73. package/dist/platform/calendar/microsoft-graph-api.js +95 -0
  74. package/dist/platform/calendar/oauth-flow.d.ts +62 -0
  75. package/dist/platform/calendar/oauth-flow.d.ts.map +1 -0
  76. package/dist/platform/calendar/oauth-flow.js +305 -0
  77. package/dist/platform/calendar/oauth-providers.d.ts +43 -0
  78. package/dist/platform/calendar/oauth-providers.d.ts.map +1 -0
  79. package/dist/platform/calendar/oauth-providers.js +120 -0
  80. package/dist/platform/calendar/oauth-token-store.d.ts +72 -0
  81. package/dist/platform/calendar/oauth-token-store.d.ts.map +1 -0
  82. package/dist/platform/calendar/oauth-token-store.js +189 -0
  83. package/dist/platform/calendar/oauth-types.d.ts +274 -0
  84. package/dist/platform/calendar/oauth-types.d.ts.map +1 -0
  85. package/dist/platform/calendar/oauth-types.js +22 -0
  86. package/dist/platform/calendar/rrule.d.ts +39 -0
  87. package/dist/platform/calendar/rrule.d.ts.map +1 -0
  88. package/dist/platform/calendar/rrule.js +261 -0
  89. package/dist/platform/calendar/subscription-store.d.ts +118 -0
  90. package/dist/platform/calendar/subscription-store.d.ts.map +1 -0
  91. package/dist/platform/calendar/subscription-store.js +293 -0
  92. package/dist/platform/calendar/types.d.ts +170 -0
  93. package/dist/platform/calendar/types.d.ts.map +1 -0
  94. package/dist/platform/calendar/types.js +21 -0
  95. package/dist/platform/companion/companion-chat-attachments.d.ts +29 -0
  96. package/dist/platform/companion/companion-chat-attachments.d.ts.map +1 -0
  97. package/dist/platform/companion/companion-chat-attachments.js +121 -0
  98. package/dist/platform/companion/companion-chat-broker-bridge.d.ts +40 -0
  99. package/dist/platform/companion/companion-chat-broker-bridge.d.ts.map +1 -0
  100. package/dist/platform/companion/companion-chat-broker-bridge.js +14 -0
  101. package/dist/platform/companion/companion-chat-broker-sync.d.ts +38 -0
  102. package/dist/platform/companion/companion-chat-broker-sync.d.ts.map +1 -0
  103. package/dist/platform/companion/companion-chat-broker-sync.js +80 -0
  104. package/dist/platform/companion/companion-chat-gc.d.ts +63 -0
  105. package/dist/platform/companion/companion-chat-gc.d.ts.map +1 -0
  106. package/dist/platform/companion/companion-chat-gc.js +38 -0
  107. package/dist/platform/companion/companion-chat-manager.d.ts +67 -20
  108. package/dist/platform/companion/companion-chat-manager.d.ts.map +1 -1
  109. package/dist/platform/companion/companion-chat-manager.js +130 -144
  110. package/dist/platform/companion/companion-chat-persistence.d.ts +9 -1
  111. package/dist/platform/companion/companion-chat-persistence.d.ts.map +1 -1
  112. package/dist/platform/companion/companion-chat-persistence.js +10 -2
  113. package/dist/platform/companion/companion-chat-routes.d.ts +2 -1
  114. package/dist/platform/companion/companion-chat-routes.d.ts.map +1 -1
  115. package/dist/platform/companion/companion-chat-routes.js +37 -4
  116. package/dist/platform/config/credential-status.d.ts +28 -0
  117. package/dist/platform/config/credential-status.d.ts.map +1 -0
  118. package/dist/platform/config/credential-status.js +75 -0
  119. package/dist/platform/config/index.d.ts +25 -0
  120. package/dist/platform/config/index.d.ts.map +1 -1
  121. package/dist/platform/config/index.js +18 -0
  122. package/dist/platform/config/manager.d.ts +18 -0
  123. package/dist/platform/config/manager.d.ts.map +1 -1
  124. package/dist/platform/config/manager.js +36 -2
  125. package/dist/platform/config/migrations.d.ts +48 -0
  126. package/dist/platform/config/migrations.d.ts.map +1 -0
  127. package/dist/platform/config/migrations.js +54 -0
  128. package/dist/platform/config/schema-domain-core.d.ts +10 -1
  129. package/dist/platform/config/schema-domain-core.d.ts.map +1 -1
  130. package/dist/platform/config/schema-domain-core.js +46 -3
  131. package/dist/platform/config/schema-types.d.ts +13 -7
  132. package/dist/platform/config/schema-types.d.ts.map +1 -1
  133. package/dist/platform/config/schema.d.ts.map +1 -1
  134. package/dist/platform/config/schema.js +2 -0
  135. package/dist/platform/control-plane/approval-broker.d.ts +11 -0
  136. package/dist/platform/control-plane/approval-broker.d.ts.map +1 -1
  137. package/dist/platform/control-plane/approval-broker.js +17 -1
  138. package/dist/platform/control-plane/approval-hunk-apply.d.ts +77 -0
  139. package/dist/platform/control-plane/approval-hunk-apply.d.ts.map +1 -0
  140. package/dist/platform/control-plane/approval-hunk-apply.js +80 -0
  141. package/dist/platform/control-plane/gateway-disabled-response.d.ts +20 -0
  142. package/dist/platform/control-plane/gateway-disabled-response.d.ts.map +1 -0
  143. package/dist/platform/control-plane/gateway-disabled-response.js +24 -0
  144. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts +68 -0
  145. package/dist/platform/control-plane/gateway-scope-enforcement.d.ts.map +1 -0
  146. package/dist/platform/control-plane/gateway-scope-enforcement.js +91 -0
  147. package/dist/platform/control-plane/gateway-utils.d.ts +17 -0
  148. package/dist/platform/control-plane/gateway-utils.d.ts.map +1 -1
  149. package/dist/platform/control-plane/gateway-utils.js +30 -0
  150. package/dist/platform/control-plane/gateway.d.ts +12 -2
  151. package/dist/platform/control-plane/gateway.d.ts.map +1 -1
  152. package/dist/platform/control-plane/gateway.js +27 -31
  153. package/dist/platform/control-plane/index.d.ts +6 -1
  154. package/dist/platform/control-plane/index.d.ts.map +1 -1
  155. package/dist/platform/control-plane/index.js +4 -0
  156. package/dist/platform/control-plane/invoke-input-validation.d.ts +56 -0
  157. package/dist/platform/control-plane/invoke-input-validation.d.ts.map +1 -0
  158. package/dist/platform/control-plane/invoke-input-validation.js +163 -0
  159. package/dist/platform/control-plane/method-catalog-admin.d.ts.map +1 -1
  160. package/dist/platform/control-plane/method-catalog-admin.js +12 -1
  161. package/dist/platform/control-plane/method-catalog-calendar.d.ts +16 -0
  162. package/dist/platform/control-plane/method-catalog-calendar.d.ts.map +1 -1
  163. package/dist/platform/control-plane/method-catalog-calendar.js +21 -0
  164. package/dist/platform/control-plane/method-catalog-channels.d.ts.map +1 -1
  165. package/dist/platform/control-plane/method-catalog-channels.js +32 -3
  166. package/dist/platform/control-plane/method-catalog-control-automation.d.ts.map +1 -1
  167. package/dist/platform/control-plane/method-catalog-control-automation.js +19 -34
  168. package/dist/platform/control-plane/method-catalog-control-companion.d.ts +15 -0
  169. package/dist/platform/control-plane/method-catalog-control-companion.d.ts.map +1 -0
  170. package/dist/platform/control-plane/method-catalog-control-companion.js +133 -0
  171. package/dist/platform/control-plane/method-catalog-control-core.d.ts.map +1 -1
  172. package/dist/platform/control-plane/method-catalog-control-core.js +104 -122
  173. package/dist/platform/control-plane/method-catalog-control.d.ts.map +1 -1
  174. package/dist/platform/control-plane/method-catalog-control.js +4 -0
  175. package/dist/platform/control-plane/method-catalog-email.d.ts +17 -0
  176. package/dist/platform/control-plane/method-catalog-email.d.ts.map +1 -1
  177. package/dist/platform/control-plane/method-catalog-email.js +21 -0
  178. package/dist/platform/control-plane/method-catalog-events.d.ts +28 -0
  179. package/dist/platform/control-plane/method-catalog-events.d.ts.map +1 -1
  180. package/dist/platform/control-plane/method-catalog-events.js +74 -1
  181. package/dist/platform/control-plane/method-catalog-fleet.d.ts +24 -0
  182. package/dist/platform/control-plane/method-catalog-fleet.d.ts.map +1 -0
  183. package/dist/platform/control-plane/method-catalog-fleet.js +65 -0
  184. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts +84 -0
  185. package/dist/platform/control-plane/method-catalog-route-reconcile.d.ts.map +1 -0
  186. package/dist/platform/control-plane/method-catalog-route-reconcile.js +103 -0
  187. package/dist/platform/control-plane/method-catalog-shared.d.ts +29 -0
  188. package/dist/platform/control-plane/method-catalog-shared.d.ts.map +1 -1
  189. package/dist/platform/control-plane/method-catalog.d.ts +9 -0
  190. package/dist/platform/control-plane/method-catalog.d.ts.map +1 -1
  191. package/dist/platform/control-plane/method-catalog.js +32 -3
  192. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts +8 -0
  193. package/dist/platform/control-plane/operator-contract-schemas-admin.d.ts.map +1 -1
  194. package/dist/platform/control-plane/operator-contract-schemas-admin.js +22 -1
  195. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts +18 -0
  196. package/dist/platform/control-plane/operator-contract-schemas-fleet.d.ts.map +1 -0
  197. package/dist/platform/control-plane/operator-contract-schemas-fleet.js +182 -0
  198. package/dist/platform/control-plane/operator-contract-schemas-permissions.d.ts.map +1 -1
  199. package/dist/platform/control-plane/operator-contract-schemas-permissions.js +5 -0
  200. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts +29 -0
  201. package/dist/platform/control-plane/operator-contract-schemas-runtime.d.ts.map +1 -1
  202. package/dist/platform/control-plane/operator-contract-schemas-runtime.js +57 -3
  203. package/dist/platform/control-plane/operator-contract-schemas.d.ts +1 -0
  204. package/dist/platform/control-plane/operator-contract-schemas.d.ts.map +1 -1
  205. package/dist/platform/control-plane/operator-contract-schemas.js +1 -0
  206. package/dist/platform/control-plane/operator-contract.d.ts.map +1 -1
  207. package/dist/platform/control-plane/operator-contract.js +8 -0
  208. package/dist/platform/control-plane/routes/checkpoints.d.ts +39 -0
  209. package/dist/platform/control-plane/routes/checkpoints.d.ts.map +1 -0
  210. package/dist/platform/control-plane/routes/checkpoints.js +166 -0
  211. package/dist/platform/control-plane/routes/fleet.d.ts +53 -0
  212. package/dist/platform/control-plane/routes/fleet.d.ts.map +1 -0
  213. package/dist/platform/control-plane/routes/fleet.js +153 -0
  214. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts +30 -0
  215. package/dist/platform/control-plane/routes/gateway-verb-error.d.ts.map +1 -0
  216. package/dist/platform/control-plane/routes/gateway-verb-error.js +36 -0
  217. package/dist/platform/control-plane/routes/index.d.ts +0 -6
  218. package/dist/platform/control-plane/routes/index.d.ts.map +1 -1
  219. package/dist/platform/control-plane/routes/index.js +5 -5
  220. package/dist/platform/control-plane/routes/invocation-params.d.ts +23 -0
  221. package/dist/platform/control-plane/routes/invocation-params.d.ts.map +1 -0
  222. package/dist/platform/control-plane/routes/invocation-params.js +9 -0
  223. package/dist/platform/control-plane/routes/register-w3-s2.d.ts +26 -0
  224. package/dist/platform/control-plane/routes/register-w3-s2.d.ts.map +1 -0
  225. package/dist/platform/control-plane/routes/register-w3-s2.js +8 -0
  226. package/dist/platform/control-plane/routes/session-search.d.ts +37 -0
  227. package/dist/platform/control-plane/routes/session-search.d.ts.map +1 -0
  228. package/dist/platform/control-plane/routes/session-search.js +113 -0
  229. package/dist/platform/control-plane/session-broker-gc.d.ts +16 -0
  230. package/dist/platform/control-plane/session-broker-gc.d.ts.map +1 -1
  231. package/dist/platform/control-plane/session-broker-gc.js +23 -6
  232. package/dist/platform/control-plane/session-broker-helpers.d.ts +3 -3
  233. package/dist/platform/control-plane/session-broker-helpers.d.ts.map +1 -1
  234. package/dist/platform/control-plane/session-broker-inputs.d.ts +18 -0
  235. package/dist/platform/control-plane/session-broker-inputs.d.ts.map +1 -1
  236. package/dist/platform/control-plane/session-broker-inputs.js +34 -0
  237. package/dist/platform/control-plane/session-broker-sessions.d.ts +102 -3
  238. package/dist/platform/control-plane/session-broker-sessions.d.ts.map +1 -1
  239. package/dist/platform/control-plane/session-broker-sessions.js +179 -5
  240. package/dist/platform/control-plane/session-broker-state.d.ts +20 -1
  241. package/dist/platform/control-plane/session-broker-state.d.ts.map +1 -1
  242. package/dist/platform/control-plane/session-broker-state.js +67 -5
  243. package/dist/platform/control-plane/session-broker.d.ts +51 -38
  244. package/dist/platform/control-plane/session-broker.d.ts.map +1 -1
  245. package/dist/platform/control-plane/session-broker.js +183 -75
  246. package/dist/platform/control-plane/session-store-importer.d.ts +57 -0
  247. package/dist/platform/control-plane/session-store-importer.d.ts.map +1 -0
  248. package/dist/platform/control-plane/session-store-importer.js +227 -0
  249. package/dist/platform/control-plane/session-types.d.ts +142 -7
  250. package/dist/platform/control-plane/session-types.d.ts.map +1 -1
  251. package/dist/platform/core/adaptive-planner.d.ts +50 -0
  252. package/dist/platform/core/adaptive-planner.d.ts.map +1 -1
  253. package/dist/platform/core/adaptive-planner.js +49 -0
  254. package/dist/platform/core/execution-plan.d.ts +43 -1
  255. package/dist/platform/core/execution-plan.d.ts.map +1 -1
  256. package/dist/platform/core/execution-plan.js +46 -10
  257. package/dist/platform/core/index.d.ts +2 -0
  258. package/dist/platform/core/index.d.ts.map +1 -1
  259. package/dist/platform/core/index.js +2 -0
  260. package/dist/platform/core/orchestrator-runtime.d.ts +31 -0
  261. package/dist/platform/core/orchestrator-runtime.d.ts.map +1 -1
  262. package/dist/platform/core/orchestrator-tool-runtime.d.ts +7 -0
  263. package/dist/platform/core/orchestrator-tool-runtime.d.ts.map +1 -1
  264. package/dist/platform/core/orchestrator-tool-runtime.js +10 -0
  265. package/dist/platform/core/orchestrator-turn-loop.d.ts +35 -1
  266. package/dist/platform/core/orchestrator-turn-loop.d.ts.map +1 -1
  267. package/dist/platform/core/orchestrator-turn-loop.js +121 -3
  268. package/dist/platform/core/orchestrator.d.ts +67 -0
  269. package/dist/platform/core/orchestrator.d.ts.map +1 -1
  270. package/dist/platform/core/orchestrator.js +89 -1
  271. package/dist/platform/core/plan-decomposition.d.ts +196 -0
  272. package/dist/platform/core/plan-decomposition.d.ts.map +1 -0
  273. package/dist/platform/core/plan-decomposition.js +417 -0
  274. package/dist/platform/core/plan-proposal.d.ts +204 -0
  275. package/dist/platform/core/plan-proposal.d.ts.map +1 -0
  276. package/dist/platform/core/plan-proposal.js +296 -0
  277. package/dist/platform/core/wrfc-routing.d.ts +1 -0
  278. package/dist/platform/core/wrfc-routing.d.ts.map +1 -1
  279. package/dist/platform/core/wrfc-routing.js +51 -1
  280. package/dist/platform/daemon/boot.d.ts +63 -0
  281. package/dist/platform/daemon/boot.d.ts.map +1 -0
  282. package/dist/platform/daemon/boot.js +60 -0
  283. package/dist/platform/daemon/cli.js +2 -1
  284. package/dist/platform/daemon/control-plane.d.ts.map +1 -1
  285. package/dist/platform/daemon/control-plane.js +50 -1
  286. package/dist/platform/daemon/facade-composition.d.ts.map +1 -1
  287. package/dist/platform/daemon/facade-composition.js +6 -0
  288. package/dist/platform/daemon/facade.d.ts +18 -6
  289. package/dist/platform/daemon/facade.d.ts.map +1 -1
  290. package/dist/platform/daemon/facade.js +50 -43
  291. package/dist/platform/daemon/http/router-route-contexts.d.ts +1 -0
  292. package/dist/platform/daemon/http/router-route-contexts.d.ts.map +1 -1
  293. package/dist/platform/daemon/http/router-route-contexts.js +1 -0
  294. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts +13 -0
  295. package/dist/platform/daemon/http/router-session-broker-adapter.d.ts.map +1 -0
  296. package/dist/platform/daemon/http/router-session-broker-adapter.js +27 -0
  297. package/dist/platform/daemon/http/router.d.ts +1 -1
  298. package/dist/platform/daemon/http/router.d.ts.map +1 -1
  299. package/dist/platform/daemon/http/router.js +7 -22
  300. package/dist/platform/daemon/http/runtime-route-types.d.ts +42 -4
  301. package/dist/platform/daemon/http/runtime-route-types.d.ts.map +1 -1
  302. package/dist/platform/daemon/index.d.ts +2 -0
  303. package/dist/platform/daemon/index.d.ts.map +1 -1
  304. package/dist/platform/daemon/index.js +1 -0
  305. package/dist/platform/daemon/service-manager.d.ts +16 -0
  306. package/dist/platform/daemon/service-manager.d.ts.map +1 -1
  307. package/dist/platform/daemon/service-manager.js +79 -15
  308. package/dist/platform/intelligence/tree-sitter/service.d.ts.map +1 -1
  309. package/dist/platform/intelligence/tree-sitter/service.js +16 -2
  310. package/dist/platform/knowledge/browser-history/readers.d.ts.map +1 -1
  311. package/dist/platform/knowledge/browser-history/readers.js +15 -5
  312. package/dist/platform/knowledge/knowledge-api.d.ts +26 -0
  313. package/dist/platform/knowledge/knowledge-api.d.ts.map +1 -1
  314. package/dist/platform/knowledge/knowledge-api.js +11 -0
  315. package/dist/platform/knowledge/project-planning/service.d.ts +14 -1
  316. package/dist/platform/knowledge/project-planning/service.d.ts.map +1 -1
  317. package/dist/platform/knowledge/project-planning/service.js +77 -0
  318. package/dist/platform/knowledge/project-planning/types.d.ts +32 -0
  319. package/dist/platform/knowledge/project-planning/types.d.ts.map +1 -1
  320. package/dist/platform/orchestration/bookkeeping.d.ts +12 -0
  321. package/dist/platform/orchestration/bookkeeping.d.ts.map +1 -0
  322. package/dist/platform/orchestration/bookkeeping.js +91 -0
  323. package/dist/platform/orchestration/budget.d.ts +22 -0
  324. package/dist/platform/orchestration/budget.d.ts.map +1 -0
  325. package/dist/platform/orchestration/budget.js +35 -0
  326. package/dist/platform/orchestration/cancellation.d.ts +31 -0
  327. package/dist/platform/orchestration/cancellation.d.ts.map +1 -0
  328. package/dist/platform/orchestration/cancellation.js +25 -0
  329. package/dist/platform/orchestration/controller-compat.d.ts +46 -0
  330. package/dist/platform/orchestration/controller-compat.d.ts.map +1 -0
  331. package/dist/platform/orchestration/controller-compat.js +27 -0
  332. package/dist/platform/orchestration/dirty-guard.d.ts +32 -0
  333. package/dist/platform/orchestration/dirty-guard.d.ts.map +1 -0
  334. package/dist/platform/orchestration/dirty-guard.js +147 -0
  335. package/dist/platform/orchestration/engine.d.ts +82 -0
  336. package/dist/platform/orchestration/engine.d.ts.map +1 -0
  337. package/dist/platform/orchestration/engine.js +623 -0
  338. package/dist/platform/orchestration/index.d.ts +20 -0
  339. package/dist/platform/orchestration/index.d.ts.map +1 -0
  340. package/dist/platform/orchestration/index.js +11 -0
  341. package/dist/platform/orchestration/persistence.d.ts +24 -0
  342. package/dist/platform/orchestration/persistence.d.ts.map +1 -0
  343. package/dist/platform/orchestration/persistence.js +179 -0
  344. package/dist/platform/orchestration/phase-runner.d.ts +114 -0
  345. package/dist/platform/orchestration/phase-runner.d.ts.map +1 -0
  346. package/dist/platform/orchestration/phase-runner.js +347 -0
  347. package/dist/platform/orchestration/proposal-workstream.d.ts +56 -0
  348. package/dist/platform/orchestration/proposal-workstream.d.ts.map +1 -0
  349. package/dist/platform/orchestration/proposal-workstream.js +76 -0
  350. package/dist/platform/orchestration/scheduler.d.ts +64 -0
  351. package/dist/platform/orchestration/scheduler.d.ts.map +1 -0
  352. package/dist/platform/orchestration/scheduler.js +73 -0
  353. package/dist/platform/orchestration/types.d.ts +535 -0
  354. package/dist/platform/orchestration/types.d.ts.map +1 -0
  355. package/dist/platform/orchestration/types.js +47 -0
  356. package/dist/platform/orchestration/worktree-isolation.d.ts +33 -0
  357. package/dist/platform/orchestration/worktree-isolation.d.ts.map +1 -0
  358. package/dist/platform/orchestration/worktree-isolation.js +248 -0
  359. package/dist/platform/presentation/glyphs.d.ts +91 -0
  360. package/dist/platform/presentation/glyphs.d.ts.map +1 -0
  361. package/dist/platform/presentation/glyphs.js +93 -0
  362. package/dist/platform/presentation/index.d.ts +28 -0
  363. package/dist/platform/presentation/index.d.ts.map +1 -0
  364. package/dist/platform/presentation/index.js +27 -0
  365. package/dist/platform/presentation/thinking-phrases.d.ts +12 -0
  366. package/dist/platform/presentation/thinking-phrases.d.ts.map +1 -0
  367. package/dist/platform/presentation/thinking-phrases.js +32 -0
  368. package/dist/platform/presentation/tones.d.ts +121 -0
  369. package/dist/platform/presentation/tones.d.ts.map +1 -0
  370. package/dist/platform/presentation/tones.js +145 -0
  371. package/dist/platform/presentation/waiting-wording.d.ts +54 -0
  372. package/dist/platform/presentation/waiting-wording.d.ts.map +1 -0
  373. package/dist/platform/presentation/waiting-wording.js +51 -0
  374. package/dist/platform/providers/runtime-snapshot.d.ts.map +1 -1
  375. package/dist/platform/providers/runtime-snapshot.js +12 -2
  376. package/dist/platform/runtime/bootstrap-services.d.ts +62 -2
  377. package/dist/platform/runtime/bootstrap-services.d.ts.map +1 -1
  378. package/dist/platform/runtime/bootstrap-services.js +217 -50
  379. package/dist/platform/runtime/daemon-version-compat.d.ts +39 -0
  380. package/dist/platform/runtime/daemon-version-compat.d.ts.map +1 -0
  381. package/dist/platform/runtime/daemon-version-compat.js +75 -0
  382. package/dist/platform/runtime/detached-daemon-runtime.d.ts +26 -0
  383. package/dist/platform/runtime/detached-daemon-runtime.d.ts.map +1 -0
  384. package/dist/platform/runtime/detached-daemon-runtime.js +49 -0
  385. package/dist/platform/runtime/emitters/communication.d.ts +11 -0
  386. package/dist/platform/runtime/emitters/communication.d.ts.map +1 -1
  387. package/dist/platform/runtime/emitters/communication.js +9 -0
  388. package/dist/platform/runtime/emitters/workflows.d.ts +1 -1
  389. package/dist/platform/runtime/emitters/workflows.d.ts.map +1 -1
  390. package/dist/platform/runtime/events/index.d.ts +13 -0
  391. package/dist/platform/runtime/events/index.d.ts.map +1 -1
  392. package/dist/platform/runtime/events/index.js +13 -0
  393. package/dist/platform/runtime/feature-flags/flags.d.ts.map +1 -1
  394. package/dist/platform/runtime/feature-flags/flags.js +56 -1
  395. package/dist/platform/runtime/fleet/adapters/agent.d.ts +56 -0
  396. package/dist/platform/runtime/fleet/adapters/agent.d.ts.map +1 -0
  397. package/dist/platform/runtime/fleet/adapters/agent.js +143 -0
  398. package/dist/platform/runtime/fleet/adapters/automation.d.ts +30 -0
  399. package/dist/platform/runtime/fleet/adapters/automation.d.ts.map +1 -0
  400. package/dist/platform/runtime/fleet/adapters/automation.js +41 -0
  401. package/dist/platform/runtime/fleet/adapters/background-process.d.ts +12 -0
  402. package/dist/platform/runtime/fleet/adapters/background-process.d.ts.map +1 -0
  403. package/dist/platform/runtime/fleet/adapters/background-process.js +46 -0
  404. package/dist/platform/runtime/fleet/adapters/code-index.d.ts +21 -0
  405. package/dist/platform/runtime/fleet/adapters/code-index.d.ts.map +1 -0
  406. package/dist/platform/runtime/fleet/adapters/code-index.js +44 -0
  407. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts +69 -0
  408. package/dist/platform/runtime/fleet/adapters/orchestration.d.ts.map +1 -0
  409. package/dist/platform/runtime/fleet/adapters/orchestration.js +329 -0
  410. package/dist/platform/runtime/fleet/adapters/schedule.d.ts +14 -0
  411. package/dist/platform/runtime/fleet/adapters/schedule.d.ts.map +1 -0
  412. package/dist/platform/runtime/fleet/adapters/schedule.js +28 -0
  413. package/dist/platform/runtime/fleet/adapters/trigger.d.ts +12 -0
  414. package/dist/platform/runtime/fleet/adapters/trigger.d.ts.map +1 -0
  415. package/dist/platform/runtime/fleet/adapters/trigger.js +22 -0
  416. package/dist/platform/runtime/fleet/adapters/watcher.d.ts +13 -0
  417. package/dist/platform/runtime/fleet/adapters/watcher.d.ts.map +1 -0
  418. package/dist/platform/runtime/fleet/adapters/watcher.js +47 -0
  419. package/dist/platform/runtime/fleet/adapters/workflow.d.ts +11 -0
  420. package/dist/platform/runtime/fleet/adapters/workflow.d.ts.map +1 -0
  421. package/dist/platform/runtime/fleet/adapters/workflow.js +34 -0
  422. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts +35 -0
  423. package/dist/platform/runtime/fleet/adapters/wrfc.d.ts.map +1 -0
  424. package/dist/platform/runtime/fleet/adapters/wrfc.js +275 -0
  425. package/dist/platform/runtime/fleet/index.d.ts +10 -0
  426. package/dist/platform/runtime/fleet/index.d.ts.map +1 -0
  427. package/dist/platform/runtime/fleet/index.js +6 -0
  428. package/dist/platform/runtime/fleet/registry.d.ts +113 -0
  429. package/dist/platform/runtime/fleet/registry.d.ts.map +1 -0
  430. package/dist/platform/runtime/fleet/registry.js +664 -0
  431. package/dist/platform/runtime/fleet/types.d.ts +199 -0
  432. package/dist/platform/runtime/fleet/types.d.ts.map +1 -0
  433. package/dist/platform/runtime/fleet/types.js +2 -0
  434. package/dist/platform/runtime/operator-client.d.ts +20 -2
  435. package/dist/platform/runtime/operator-client.d.ts.map +1 -1
  436. package/dist/platform/runtime/operator-client.js +11 -1
  437. package/dist/platform/runtime/provider-accounts/registry.d.ts.map +1 -1
  438. package/dist/platform/runtime/provider-accounts/registry.js +11 -1
  439. package/dist/platform/runtime/runtime-knowledge-api.d.ts +1 -1
  440. package/dist/platform/runtime/runtime-knowledge-api.d.ts.map +1 -1
  441. package/dist/platform/runtime/runtime-knowledge-api.js +1 -0
  442. package/dist/platform/runtime/services.d.ts +48 -0
  443. package/dist/platform/runtime/services.d.ts.map +1 -1
  444. package/dist/platform/runtime/services.js +95 -2
  445. package/dist/platform/runtime/session-spine/client.d.ts +234 -0
  446. package/dist/platform/runtime/session-spine/client.d.ts.map +1 -0
  447. package/dist/platform/runtime/session-spine/client.js +449 -0
  448. package/dist/platform/runtime/session-spine/index.d.ts +12 -0
  449. package/dist/platform/runtime/session-spine/index.d.ts.map +1 -0
  450. package/dist/platform/runtime/session-spine/index.js +11 -0
  451. package/dist/platform/runtime/session-spine/union-cache.d.ts +225 -0
  452. package/dist/platform/runtime/session-spine/union-cache.d.ts.map +1 -0
  453. package/dist/platform/runtime/session-spine/union-cache.js +333 -0
  454. package/dist/platform/runtime/shell-command-ops.d.ts +3 -1
  455. package/dist/platform/runtime/shell-command-ops.d.ts.map +1 -1
  456. package/dist/platform/runtime/transports/daemon-http-client-validators.d.ts.map +1 -1
  457. package/dist/platform/runtime/transports/daemon-http-client-validators.js +22 -0
  458. package/dist/platform/runtime/transports/daemon-http-client.d.ts.map +1 -1
  459. package/dist/platform/runtime/transports/daemon-http-client.js +25 -2
  460. package/dist/platform/runtime/transports/http-types.d.ts +9 -2
  461. package/dist/platform/runtime/transports/http-types.d.ts.map +1 -1
  462. package/dist/platform/state/canonical-memory.d.ts +95 -0
  463. package/dist/platform/state/canonical-memory.d.ts.map +1 -0
  464. package/dist/platform/state/canonical-memory.js +155 -0
  465. package/dist/platform/state/code-index-chunking.d.ts +49 -0
  466. package/dist/platform/state/code-index-chunking.d.ts.map +1 -0
  467. package/dist/platform/state/code-index-chunking.js +111 -0
  468. package/dist/platform/state/code-index-db.d.ts +53 -0
  469. package/dist/platform/state/code-index-db.d.ts.map +1 -0
  470. package/dist/platform/state/code-index-db.js +101 -0
  471. package/dist/platform/state/code-index-reindex.d.ts +73 -0
  472. package/dist/platform/state/code-index-reindex.d.ts.map +1 -0
  473. package/dist/platform/state/code-index-reindex.js +156 -0
  474. package/dist/platform/state/code-index-store.d.ts +175 -0
  475. package/dist/platform/state/code-index-store.d.ts.map +1 -0
  476. package/dist/platform/state/code-index-store.js +620 -0
  477. package/dist/platform/state/index.d.ts +12 -2
  478. package/dist/platform/state/index.d.ts.map +1 -1
  479. package/dist/platform/state/index.js +6 -1
  480. package/dist/platform/state/knowledge-injection.d.ts +23 -0
  481. package/dist/platform/state/knowledge-injection.d.ts.map +1 -1
  482. package/dist/platform/state/knowledge-injection.js +34 -19
  483. package/dist/platform/state/memory-recall-contract.d.ts +63 -0
  484. package/dist/platform/state/memory-recall-contract.d.ts.map +1 -0
  485. package/dist/platform/state/memory-recall-contract.js +94 -0
  486. package/dist/platform/state/memory-store.d.ts +2 -0
  487. package/dist/platform/state/memory-store.d.ts.map +1 -1
  488. package/dist/platform/state/memory-store.js +4 -0
  489. package/dist/platform/state/memory-vector-store.d.ts +1 -13
  490. package/dist/platform/state/memory-vector-store.d.ts.map +1 -1
  491. package/dist/platform/state/memory-vector-store.js +18 -39
  492. package/dist/platform/state/sqlite-store.d.ts +2 -0
  493. package/dist/platform/state/sqlite-store.d.ts.map +1 -1
  494. package/dist/platform/state/sqlite-store.js +4 -0
  495. package/dist/platform/state/sqlite-vec-loader.d.ts +25 -0
  496. package/dist/platform/state/sqlite-vec-loader.d.ts.map +1 -0
  497. package/dist/platform/state/sqlite-vec-loader.js +43 -0
  498. package/dist/platform/state/vibe-projection.d.ts +67 -0
  499. package/dist/platform/state/vibe-projection.d.ts.map +1 -0
  500. package/dist/platform/state/vibe-projection.js +115 -0
  501. package/dist/platform/tools/agent/index.d.ts.map +1 -1
  502. package/dist/platform/tools/agent/index.js +8 -0
  503. package/dist/platform/tools/agent/manager.d.ts +140 -1
  504. package/dist/platform/tools/agent/manager.d.ts.map +1 -1
  505. package/dist/platform/tools/agent/manager.js +143 -1
  506. package/dist/platform/tools/agent/schema.d.ts +26 -0
  507. package/dist/platform/tools/agent/schema.d.ts.map +1 -1
  508. package/dist/platform/tools/agent/schema.js +2 -2
  509. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts +13 -0
  510. package/dist/platform/tools/agent/wrfc-batch-policy.d.ts.map +1 -1
  511. package/dist/platform/tools/agent/wrfc-batch-policy.js +60 -0
  512. package/dist/platform/tools/exec/runtime.d.ts +10 -0
  513. package/dist/platform/tools/exec/runtime.d.ts.map +1 -1
  514. package/dist/platform/tools/exec/runtime.js +161 -49
  515. package/dist/platform/tools/exec/schema.d.ts +3 -1
  516. package/dist/platform/tools/exec/schema.d.ts.map +1 -1
  517. package/dist/platform/tools/exec/schema.js +2 -1
  518. package/dist/platform/tools/fetch/runtime.d.ts +7 -0
  519. package/dist/platform/tools/fetch/runtime.d.ts.map +1 -1
  520. package/dist/platform/tools/fetch/runtime.js +8 -6
  521. package/dist/platform/tools/index.d.ts +2 -0
  522. package/dist/platform/tools/index.d.ts.map +1 -1
  523. package/dist/platform/tools/index.js +2 -0
  524. package/dist/platform/tools/registry.d.ts +9 -3
  525. package/dist/platform/tools/registry.d.ts.map +1 -1
  526. package/dist/platform/tools/registry.js +9 -3
  527. package/dist/platform/tools/state/index.d.ts +9 -0
  528. package/dist/platform/tools/state/index.d.ts.map +1 -1
  529. package/dist/platform/tools/state/index.js +60 -3
  530. package/dist/platform/types/foundation-contract.d.ts +1 -1
  531. package/dist/platform/types/foundation-contract.d.ts.map +1 -1
  532. package/dist/platform/types/index.d.ts +1 -1
  533. package/dist/platform/types/index.d.ts.map +1 -1
  534. package/dist/platform/types/tools.d.ts +14 -1
  535. package/dist/platform/types/tools.d.ts.map +1 -1
  536. package/dist/platform/version.js +1 -1
  537. package/package.json +29 -9
  538. package/dist/platform/control-plane/routes/automation.d.ts +0 -3
  539. package/dist/platform/control-plane/routes/automation.d.ts.map +0 -1
  540. package/dist/platform/control-plane/routes/automation.js +0 -63
  541. package/dist/platform/control-plane/routes/context.d.ts +0 -2
  542. package/dist/platform/control-plane/routes/context.d.ts.map +0 -1
  543. package/dist/platform/control-plane/routes/context.js +0 -1
  544. package/dist/platform/control-plane/routes/operator.d.ts +0 -8
  545. package/dist/platform/control-plane/routes/operator.d.ts.map +0 -1
  546. package/dist/platform/control-plane/routes/operator.js +0 -415
  547. package/dist/platform/control-plane/routes/remote.d.ts +0 -3
  548. package/dist/platform/control-plane/routes/remote.d.ts.map +0 -1
  549. package/dist/platform/control-plane/routes/remote.js +0 -35
  550. package/dist/platform/control-plane/routes/sessions.d.ts +0 -3
  551. package/dist/platform/control-plane/routes/sessions.d.ts.map +0 -1
  552. package/dist/platform/control-plane/routes/sessions.js +0 -43
  553. package/dist/platform/control-plane/routes/tasks.d.ts +0 -3
  554. package/dist/platform/control-plane/routes/tasks.d.ts.map +0 -1
  555. package/dist/platform/control-plane/routes/tasks.js +0 -22
@@ -1,5 +1,18 @@
1
1
  import type { AgentInput } from './schema.js';
2
2
  type BatchTask = NonNullable<AgentInput['tasks']>[number];
3
+ /**
4
+ * True when the text explicitly asks for a parallel / per-unit / separate-agent
5
+ * fan-out. Exported for the TUI collapse guard so both guards honour the same
6
+ * explicit-intent precedent.
7
+ */
8
+ export declare function userRequestsParallelFanout(text: string | undefined): boolean;
9
+ /**
10
+ * True when a constraint's text describes the agent topology (parallelism /
11
+ * spawn-count / separate-agent-per-unit) a fan-out collapse removes. Consulted by
12
+ * the WRFC controller — only for chains created via a collapse — to mark such a
13
+ * constraint system-unsatisfiable so it can never fail the review.
14
+ */
15
+ export declare function isFanoutShapeConstraintText(text: string | undefined): boolean;
3
16
  export interface WrfcBatchPolicyDecision {
4
17
  readonly kind: 'independent' | 'collapse-to-wrfc';
5
18
  readonly reason?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"wrfc-batch-policy.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/agent/wrfc-batch-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AA4B1D,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,0BAA0B,CAAC;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,OAAO,CAIxF;AA0ED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAAC,EACrD,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAwCnF;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAC5C,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAoBnF;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD,GAAG,0BAA0B,CA2B7B;AAoED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,CAsJlF"}
1
+ {"version":3,"file":"wrfc-batch-policy.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/agent/wrfc-batch-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,KAAK,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAiD1D;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE7E;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,yBAAyB,GAAG,0BAA0B,CAAC;IACxE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE9E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,OAAO,CAIxF;AA0ED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAAC,EACrD,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAwCnF;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,EAC5C,YAAY,EAAE,MAAM,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;CAAE,CAoBnF;AAED,wBAAgB,iCAAiC,CAAC,IAAI,EAAE;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;CACxD,GAAG,0BAA0B,CA2B7B;AAoED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,uBAAuB,CAmLlF"}
@@ -12,6 +12,40 @@ const ROLE_ACTION_RE = /\b(?:test|tests|testing|review|reviews|reviewing|verify|
12
12
  const IMPLEMENTATION_ACTION_RE = /\b(?:build|implement|create|add|write|fix|repair|update|refactor|change|modify|deliver|make)\b/i;
13
13
  const DESIGN_ONLY_ACTION_RE = /\b(?:design|plan|outline|specify|propose|describe)\b/i;
14
14
  const NO_WRITE_RE = /\b(?:do\s+not|don't|without)\s+(?:write|modify|edit|create|change)\s+(?:files?|code|source|implementation)\b|\bno[-\s]?write\b|\bread[-\s]?only\b/i;
15
+ /**
16
+ * High-precision detector for an EXPLICIT user request to run separate agents in
17
+ * parallel / one per unit of work. This is user intent, exactly like
18
+ * userProhibitsDelegation is (see wrfc-routing.ts): when the user asks for a
19
+ * parallel fan-out, the topology guard must not silently collapse it into one
20
+ * chain. Conservative by design — a plain "build X" never matches; only phrasings
21
+ * that name a parallel/per-item/separate-agent shape do.
22
+ */
23
+ const PARALLEL_FANOUT_REQUEST_RE = /\b(?:in\s+parallel|concurrent(?:ly)?)\b|\b(?:separate|independent|dedicated|its?\s+own|one)\s+(?:sub[-\s]?)?agents?\b|\b(?:sub[-\s]?)?agents?\s+(?:in\s+parallel|per\b|for\s+each\b)|\b(?:one|a\s+separate|a\s+dedicated)\s+(?:sub[-\s]?)?agent\s+per\b|\bfan[-\s]?out\b|\bper[-\s]?file\s+(?:sub[-\s]?)?agents?\b/i;
24
+ /**
25
+ * Detects a constraint whose satisfaction depends on the agent TOPOLOGY the guard
26
+ * just removed — parallelism, spawn count, or per-unit separate-agent shape. Used
27
+ * ONLY in combination with a recorded fanoutCollapse (never as a blanket drop): a
28
+ * constraint matching this shape after a fan-out was collapsed cannot be satisfied
29
+ * by any fix agent, because the system removed its precondition.
30
+ */
31
+ const FANOUT_SHAPE_CONSTRAINT_RE = /\b(?:in\s+parallel|parallel(?:ism|ly)?|concurrent(?:ly|cy)?)\b|\b(?:separate|independent|dedicated|distinct|individual|its?\s+own|one|multiple|several)\s+(?:sub[-\s]?)?agents?\b|\b(?:sub[-\s]?)?agents?\s+(?:in\s+parallel|per\b|for\s+each\b|running\s+concurrently)|\b(?:one|a\s+separate|a\s+dedicated|a\s+distinct)\s+(?:sub[-\s]?)?agent\s+per\b|\bfan[-\s]?out\b|\bper[-\s]?file\s+(?:sub[-\s]?)?agents?\b|\bspawn(?:ing)?\s+(?:a\s+)?(?:separate|multiple|several|\d+)\b/i;
32
+ /**
33
+ * True when the text explicitly asks for a parallel / per-unit / separate-agent
34
+ * fan-out. Exported for the TUI collapse guard so both guards honour the same
35
+ * explicit-intent precedent.
36
+ */
37
+ export function userRequestsParallelFanout(text) {
38
+ return typeof text === 'string' && PARALLEL_FANOUT_REQUEST_RE.test(text);
39
+ }
40
+ /**
41
+ * True when a constraint's text describes the agent topology (parallelism /
42
+ * spawn-count / separate-agent-per-unit) a fan-out collapse removes. Consulted by
43
+ * the WRFC controller — only for chains created via a collapse — to mark such a
44
+ * constraint system-unsatisfiable so it can never fail the review.
45
+ */
46
+ export function isFanoutShapeConstraintText(text) {
47
+ return typeof text === 'string' && FANOUT_SHAPE_CONSTRAINT_RE.test(text);
48
+ }
15
49
  export function isRootReviewRoleTemplate(template) {
16
50
  return ROOT_REVIEW_ROLE_TEMPLATES.has((template ?? '').trim().toLowerCase());
17
51
  }
@@ -238,6 +272,21 @@ export function evaluateWrfcBatchPolicy(input) {
238
272
  if (!wantsWrfc || implementationTaskIndexes.length <= 1) {
239
273
  return { kind: 'independent' };
240
274
  }
275
+ // Ruling (WO UX-A item 1): an explicit parallel / per-unit fan-out request is
276
+ // user intent, exactly like userProhibitsDelegation. When the user explicitly
277
+ // asked for separate agents in parallel and the batch is a set of independent
278
+ // implementation deliverables (NOT role-fragmentation — that branch is handled
279
+ // below), do NOT collapse: honour the request and let the deliverables fan out
280
+ // (each keeps its own reviewMode). This prevents the unsatisfiable-constraint
281
+ // billing loop at the source; the collapse paths below still carry a
282
+ // fanoutCollapse marker as defense-in-depth for the collapses that do happen.
283
+ const explicitParallel = userRequestsParallelFanout(normalizeTaskText(input.authoritativeTask) ?? normalizeTaskText(input.task));
284
+ if (explicitParallel) {
285
+ return {
286
+ kind: 'independent',
287
+ reason: `explicit parallel fan-out requested for ${implementationTaskIndexes.length} independent deliverables; honoring the request instead of collapsing into one chain`,
288
+ };
289
+ }
241
290
  const authoritativeTask = normalizeTaskText(input.authoritativeTask)
242
291
  ?? normalizeTaskText(input.task)
243
292
  ?? `Complete and integrate ${implementationTaskIndexes.length} reviewed deliverables.`;
@@ -280,6 +329,10 @@ export function evaluateWrfcBatchPolicy(input) {
280
329
  dangerously_disable_wrfc: false,
281
330
  cohort: input.cohort,
282
331
  wrfcSubtasks: implementationTaskIndexes.map((index) => normalizeCompoundSubtask(tasks[index], authoritativeTask)),
332
+ fanoutCollapse: {
333
+ requestedAgentCount: implementationTaskIndexes.length,
334
+ requestedShape: `${implementationTaskIndexes.length} separate implementation agents`,
335
+ },
283
336
  };
284
337
  return {
285
338
  kind: 'collapse-to-wrfc',
@@ -344,6 +397,13 @@ export function evaluateWrfcBatchPolicy(input) {
344
397
  parentNodeId: ownerTask.parentNodeId ?? input.parentNodeId,
345
398
  dangerously_disable_wrfc: false,
346
399
  cohort: input.cohort,
400
+ // A role-fragmentation collapse never honours "separate reviewer/tester roots"
401
+ // (those are lifecycle phases, not what the user asked for). But if the user
402
+ // ALSO asked for a parallel fan-out, record it so any parallelism/spawn-count
403
+ // constraint the collapse invalidated cannot fail the review.
404
+ ...(userRequestsParallelFanout(normalizeTaskText(input.authoritativeTask) ?? normalizeTaskText(input.task))
405
+ ? { fanoutCollapse: { requestedAgentCount: tasks.length, requestedShape: `${tasks.length} separate agents` } }
406
+ : {}),
347
407
  };
348
408
  return {
349
409
  kind: 'collapse-to-wrfc',
@@ -18,5 +18,15 @@ export declare function isRetryableExecResult(result: ExecCommandResult, allowed
18
18
  export declare function createExecTool(processManager: ProcessManager, options?: {
19
19
  readonly featureFlags?: Pick<FeatureFlagManager, 'isEnabled'> | null | undefined;
20
20
  readonly overflowHandler?: OverflowHandler | undefined;
21
+ /**
22
+ * Default working directory used when a call omits the top-level
23
+ * working_dir (and no single command supplies one to promote). Callers
24
+ * register this tool with the session/project working directory they
25
+ * already have in hand (see tools/index.ts registerAllTools) so the
26
+ * parameter stays genuinely optional for the model instead of a
27
+ * mandatory-in-practice field that fails a call after the user has
28
+ * already approved it.
29
+ */
30
+ readonly defaultWorkingDirectory?: string | undefined;
21
31
  }): Tool;
22
32
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/exec/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAqB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAA+B,iBAAiB,EAAiB,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAse/E;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,GAC3D,OAAO,CA2CT;AA8ID,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CACnD,GACL,IAAI,CA6FN"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/exec/runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAGjD,OAAO,EAAqB,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,KAAK,EAA+B,iBAAiB,EAAiB,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAykB/E;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,aAAa,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,GAC3D,OAAO,CA8CT;AAsJD,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE;IACP,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACjF,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD;;;;;;;;OAQG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClD,GACL,IAAI,CA8FN"}
@@ -30,11 +30,28 @@ function decodeCmd(cmdInput) {
30
30
  return cmdInput.cmd;
31
31
  throw new Error('Each command must have either cmd or cmd_base64');
32
32
  }
33
- function requireWorkingDirectory(input) {
34
- if (!input.working_dir || input.working_dir.trim().length === 0) {
35
- throw new Error('exec requires an explicit working_dir');
33
+ /**
34
+ * Resolve the effective working directory for an exec call.
35
+ *
36
+ * An explicit `working_dir` on the input always wins. Otherwise falls back to
37
+ * `defaultWorkingDirectory` — the session/tool-context working directory,
38
+ * threaded in by the caller (see createExecTool) — so a model that omits
39
+ * working_dir still runs in a sensible place instead of failing outright
40
+ * after the user has already approved the call (the approval card's
41
+ * "Directory" line is sourced from the same session working directory
42
+ * independently of this arg, so it was already showing the truth the whole
43
+ * time — see permissions/prompt.ts on the TUI side). Throws only when
44
+ * neither is available, which should not happen in practice since every
45
+ * tool-registration path supplies a defaultWorkingDirectory.
46
+ */
47
+ function requireWorkingDirectory(input, defaultWorkingDirectory) {
48
+ const explicit = input.working_dir?.trim();
49
+ if (explicit)
50
+ return explicit;
51
+ if (defaultWorkingDirectory && defaultWorkingDirectory.trim().length > 0) {
52
+ return defaultWorkingDirectory;
36
53
  }
37
- return input.working_dir;
54
+ throw new Error('exec requires an explicit working_dir');
38
55
  }
39
56
  function normalizeExecInput(input) {
40
57
  const hasTopLevelWorkingDir = Boolean(input.working_dir?.trim());
@@ -107,6 +124,40 @@ function applyExpectations(result, expect, exitCode) {
107
124
  function buildTimedOutResult(cmdStr, cwd, durationMs, progressFile) {
108
125
  return { cmd: cmdStr, exit_code: null, stdout: '', stderr: '', success: false, timed_out: true, duration_ms: durationMs, cwd, ...(progressFile ? { progress_file: progressFile } : {}) };
109
126
  }
127
+ /** Wave-4 cooperative cancellation (wo701): mirrors buildTimedOutResult's shape for the AbortSignal path. */
128
+ function buildCancelledResult(cmdStr, cwd, durationMs) {
129
+ return { cmd: cmdStr, exit_code: null, stdout: '', stderr: '', success: false, cancelled: true, duration_ms: durationMs, cwd };
130
+ }
131
+ /**
132
+ * Grace window for draining a killed child's stdout/stderr after a
133
+ * timeout/abort stop before returning regardless. Kept well under the
134
+ * cancellation-latency budget the cooperative-cancellation tests assert
135
+ * (< 5s).
136
+ */
137
+ const POST_STOP_DRAIN_GRACE_MS = 500;
138
+ /**
139
+ * Wave-4 cooperative cancellation (wo701): after a timeout/abort kill the
140
+ * child has already been SIGKILL'd, but a grandchild that inherited the
141
+ * stdout/stderr pipe can hold it open, so reading those streams to EOF may
142
+ * never settle. Awaiting the full IO promise unbounded here could therefore
143
+ * block until the grandchild's own duration elapses (observed as a hang under
144
+ * loaded CI). A cancelled/timed-out result never depends on fully-drained
145
+ * content, so bound the wait to a short grace window and return regardless.
146
+ * The still-pending IO promise is defused so it can never surface as an
147
+ * unhandled rejection; the grace timer is unref'd so it cannot keep the event
148
+ * loop (or a test runner) alive.
149
+ */
150
+ async function drainAfterStop(io, graceMs) {
151
+ const settled = io.then(() => undefined, () => undefined);
152
+ let timer;
153
+ const grace = new Promise((resolve) => {
154
+ timer = setTimeout(resolve, graceMs);
155
+ timer.unref?.();
156
+ });
157
+ await Promise.race([settled, grace]);
158
+ if (timer)
159
+ clearTimeout(timer);
160
+ }
110
161
  function getProgressDirectory(workingDirectory) {
111
162
  return join(workingDirectory, ...OVERFLOW_SUBDIR);
112
163
  }
@@ -144,7 +195,7 @@ async function spawnBackground(processManager, cmd, cwd, env) {
144
195
  function handleBgSpecialCommand(processManager, cmd) {
145
196
  return processManager.handleCommand(cmd);
146
197
  }
147
- async function runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout) {
198
+ async function runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal) {
148
199
  const guardResult = await guardExecCommand(cmdStr, DEFAULT_ALLOWED_CLASSES, featureFlags);
149
200
  if (!guardResult.allowed) {
150
201
  const denial = formatDenialResponse(guardResult, cmdStr);
@@ -163,18 +214,25 @@ async function runCommand(processManager, overflowHandler, featureFlags, cmdStr,
163
214
  const timeoutMs = cmdInput.timeout_ms ?? globalTimeout;
164
215
  const mergedEnv = { ...buildCleanEnv(), ...cmdInput.env };
165
216
  const startTime = Date.now();
217
+ // Wave-4 cooperative cancellation (wo701) is wired for the foreground and
218
+ // progress-streamed paths (the common cases — progress auto-engages once
219
+ // timeout_ms exceeds PROGRESS_AUTO_THRESHOLD_MS, which the 120s default
220
+ // timeout always does). `until`-pattern commands are explicitly deferred
221
+ // (see the WO report) — the timeout kill-timer they already have still
222
+ // applies, just not an external AbortSignal.
166
223
  if (cmdInput.until) {
167
224
  return runUntil(processManager, overflowHandler, cmdStr, cmdInput, cwd, mergedEnv, timeoutMs, startTime);
168
225
  }
169
226
  const useProgress = cmdInput.progress === true || timeoutMs > PROGRESS_AUTO_THRESHOLD_MS;
170
227
  if (useProgress) {
171
- return runCommandWithProgress(processManager, overflowHandler, cmdStr, cmdInput, workingDirectory, cwd, mergedEnv, timeoutMs, startTime);
228
+ return runCommandWithProgress(processManager, overflowHandler, cmdStr, cmdInput, workingDirectory, cwd, mergedEnv, timeoutMs, startTime, signal);
172
229
  }
173
230
  const proc = Bun.spawn(['/bin/sh', '-c', cmdStr], { ...(cwd !== undefined ? { cwd } : {}), env: mergedEnv, stdout: 'pipe', stderr: 'pipe' });
174
231
  let timedOut = false;
232
+ let cancelled = false;
175
233
  let killTimer;
176
- let timeoutResolve;
177
- const timeoutSentinel = new Promise((res) => { timeoutResolve = res; });
234
+ let stopResolve;
235
+ const stopSentinel = new Promise((res) => { stopResolve = res; });
178
236
  killTimer = setTimeout(async () => {
179
237
  timedOut = true;
180
238
  try {
@@ -186,9 +244,31 @@ async function runCommand(processManager, overflowHandler, featureFlags, cmdStr,
186
244
  // The process may have already exited before kill.
187
245
  logger.debug('[ExecRuntime] kill on timeout failed (process may have exited)', { error: String(err) });
188
246
  }
189
- timeoutResolve();
247
+ stopResolve();
190
248
  }, timeoutMs);
191
249
  killTimer.unref?.();
250
+ const onAbort = () => {
251
+ if (timedOut || cancelled)
252
+ return;
253
+ cancelled = true;
254
+ void (async () => {
255
+ try {
256
+ proc.kill('SIGTERM');
257
+ await sleep(200);
258
+ proc.kill('SIGKILL');
259
+ }
260
+ catch (err) {
261
+ logger.debug('[ExecRuntime] kill on cancellation failed (process may have exited)', { error: String(err) });
262
+ }
263
+ stopResolve();
264
+ })();
265
+ };
266
+ if (signal) {
267
+ if (signal.aborted)
268
+ onAbort();
269
+ else
270
+ signal.addEventListener('abort', onAbort, { once: true });
271
+ }
192
272
  try {
193
273
  const procPromise = Promise.all([
194
274
  new Response(proc.stdout).text(),
@@ -198,20 +278,18 @@ async function runCommand(processManager, overflowHandler, featureFlags, cmdStr,
198
278
  let procResult;
199
279
  await Promise.race([
200
280
  procPromise.then((r) => { procResult = r; }),
201
- timeoutSentinel,
281
+ stopSentinel,
202
282
  ]);
203
283
  clearTimeout(killTimer);
204
- if (timedOut) {
205
- try {
206
- await procPromise;
207
- }
208
- catch (error) {
209
- logger.debug('exec foreground command collection failed after timeout', {
210
- command: cmdStr,
211
- error: summarizeError(error),
212
- });
213
- }
214
- return buildTimedOutResult(cmdStr, cwd, Date.now() - startTime);
284
+ if (signal)
285
+ signal.removeEventListener('abort', onAbort);
286
+ if (timedOut || cancelled) {
287
+ // Bounded drain: the child is already killed; never block past a short
288
+ // grace window on streams an orphaned grandchild may keep open.
289
+ await drainAfterStop(procPromise, POST_STOP_DRAIN_GRACE_MS);
290
+ return timedOut
291
+ ? buildTimedOutResult(cmdStr, cwd, Date.now() - startTime)
292
+ : buildCancelledResult(cmdStr, cwd, Date.now() - startTime);
215
293
  }
216
294
  const [stdoutRaw, stderrRaw, exitCode] = procResult;
217
295
  const stdoutResult = truncate(overflowHandler, stdoutRaw, 'stdout');
@@ -233,16 +311,19 @@ async function runCommand(processManager, overflowHandler, featureFlags, cmdStr,
233
311
  }
234
312
  catch (err) {
235
313
  clearTimeout(killTimer);
314
+ if (signal)
315
+ signal.removeEventListener('abort', onAbort);
236
316
  throw err;
237
317
  }
238
318
  }
239
- async function runCommandWithProgress(_processManager, overflowHandler, cmdStr, cmdInput, workingDirectory, cwd, mergedEnv, timeoutMs, startTime) {
319
+ async function runCommandWithProgress(_processManager, overflowHandler, cmdStr, cmdInput, workingDirectory, cwd, mergedEnv, timeoutMs, startTime, signal) {
240
320
  const progressFile = initProgressFile(cmdStr, workingDirectory);
241
321
  const proc = Bun.spawn(['/bin/sh', '-c', cmdStr], { ...(cwd !== undefined ? { cwd } : {}), env: mergedEnv, stdout: 'pipe', stderr: 'pipe' });
242
322
  let timedOut = false;
323
+ let cancelled = false;
243
324
  let killTimer;
244
- let timeoutResolve;
245
- const timeoutSentinel = new Promise((res) => { timeoutResolve = res; });
325
+ let stopResolve;
326
+ const stopSentinel = new Promise((res) => { stopResolve = res; });
246
327
  killTimer = setTimeout(async () => {
247
328
  timedOut = true;
248
329
  try {
@@ -254,9 +335,32 @@ async function runCommandWithProgress(_processManager, overflowHandler, cmdStr,
254
335
  logger.debug('[ExecRuntime] kill on streamed timeout failed (process may have exited)', { error: String(err) });
255
336
  }
256
337
  progressFile.append('# Timed out\n');
257
- timeoutResolve();
338
+ stopResolve();
258
339
  }, timeoutMs);
259
340
  killTimer.unref?.();
341
+ const onAbort = () => {
342
+ if (timedOut || cancelled)
343
+ return;
344
+ cancelled = true;
345
+ void (async () => {
346
+ try {
347
+ proc.kill('SIGTERM');
348
+ await sleep(200);
349
+ proc.kill('SIGKILL');
350
+ }
351
+ catch (err) {
352
+ logger.debug('[ExecRuntime] kill on cancellation failed (process may have exited)', { error: String(err) });
353
+ }
354
+ progressFile.append('# Cancelled\n');
355
+ stopResolve();
356
+ })();
357
+ };
358
+ if (signal) {
359
+ if (signal.aborted)
360
+ onAbort();
361
+ else
362
+ signal.addEventListener('abort', onAbort, { once: true });
363
+ }
260
364
  let stdoutBuf = '';
261
365
  let stderrBuf = '';
262
366
  const warnings = [];
@@ -304,19 +408,18 @@ async function runCommandWithProgress(_processManager, overflowHandler, cmdStr,
304
408
  }
305
409
  };
306
410
  const ioPromise = Promise.all([readStdout(), readStderr(), proc.exited]);
307
- await Promise.race([ioPromise, timeoutSentinel]);
411
+ await Promise.race([ioPromise, stopSentinel]);
308
412
  clearTimeout(killTimer);
309
- if (timedOut) {
310
- try {
311
- await ioPromise;
312
- }
313
- catch (error) {
314
- logger.debug('exec progress command IO collection failed after timeout', {
315
- command: cmdStr,
316
- error: summarizeError(error),
317
- });
318
- }
319
- return { ...buildTimedOutResult(cmdStr, cwd, Date.now() - startTime, progressFile.path), stdout: stdoutBuf, stderr: stderrBuf };
413
+ if (signal)
414
+ signal.removeEventListener('abort', onAbort);
415
+ if (timedOut || cancelled) {
416
+ // Bounded drain: the child is already killed; never block past a short
417
+ // grace window on streams an orphaned grandchild may keep open. stdoutBuf/
418
+ // stderrBuf already hold whatever the background readers captured so far.
419
+ await drainAfterStop(ioPromise, POST_STOP_DRAIN_GRACE_MS);
420
+ return timedOut
421
+ ? { ...buildTimedOutResult(cmdStr, cwd, Date.now() - startTime, progressFile.path), stdout: stdoutBuf, stderr: stderrBuf }
422
+ : { ...buildCancelledResult(cmdStr, cwd, Date.now() - startTime), stdout: stdoutBuf, stderr: stderrBuf, progress_file: progressFile.path };
320
423
  }
321
424
  const ioResult = await ioPromise.catch((error) => {
322
425
  logger.warn('exec progress command IO collection failed', {
@@ -440,6 +543,10 @@ export function isRetryableExecResult(result, allowed) {
440
543
  // Timed-out commands are never auto-retried — callers must decide
441
544
  if (result.timed_out)
442
545
  return false;
546
+ // Cancelled commands (Wave 4, wo701) must never be retried — retrying
547
+ // after an operator/engine kill would defeat the cancellation entirely.
548
+ if (result.cancelled)
549
+ return false;
443
550
  const combined = `${result.stdout}\n${result.stderr}`;
444
551
  // Terminal errors — always skip retry
445
552
  const TERMINAL_PATTERNS = [
@@ -476,9 +583,9 @@ export function isRetryableExecResult(result, allowed) {
476
583
  }
477
584
  return false;
478
585
  }
479
- async function runWithRetry(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout) {
586
+ async function runWithRetry(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal) {
480
587
  if (!cmdInput.retry) {
481
- return runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout);
588
+ return runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal);
482
589
  }
483
590
  const maxRetries = Math.min(cmdInput.retry.max ?? 3, 10);
484
591
  const delayMs = cmdInput.retry.delay_ms ?? 1000;
@@ -487,7 +594,7 @@ async function runWithRetry(processManager, overflowHandler, featureFlags, cmdSt
487
594
  const retryOn = cmdInput.retry.on;
488
595
  let lastResult;
489
596
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
490
- lastResult = await runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout);
597
+ lastResult = await runCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal);
491
598
  if (lastResult.success) {
492
599
  return { ...lastResult, retries: attempt };
493
600
  }
@@ -504,18 +611,21 @@ async function runWithRetry(processManager, overflowHandler, featureFlags, cmdSt
504
611
  }
505
612
  return { ...lastResult, retries: maxRetries };
506
613
  }
507
- async function executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout) {
614
+ async function executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal) {
508
615
  const bgSpecial = handleBgSpecialCommand(processManager, cmdStr);
509
616
  if (bgSpecial)
510
617
  return bgSpecial;
511
618
  if (cmdInput.background) {
619
+ // Background processes intentionally outlive this tool call — cancelling
620
+ // the caller's item/agent must not kill a process the user asked to
621
+ // detach, so `signal` is deliberately not threaded here.
512
622
  return spawnBackground(processManager, cmdStr, resolveCwd(cmdInput.cwd, workingDirectory), cmdInput.env);
513
623
  }
514
- return runWithRetry(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout);
624
+ return runWithRetry(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal);
515
625
  }
516
- async function executeResolvedCommands(processManager, overflowHandler, featureFlags, resolvedCmds, parallel, workingDirectory, globalTimeout, failFast) {
626
+ async function executeResolvedCommands(processManager, overflowHandler, featureFlags, resolvedCmds, parallel, workingDirectory, globalTimeout, failFast, signal) {
517
627
  if (parallel) {
518
- return mapWithConcurrency(resolvedCmds, MAX_PARALLEL_EXEC_COMMANDS, ({ cmdStr, cmdInput }) => executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout));
628
+ return mapWithConcurrency(resolvedCmds, MAX_PARALLEL_EXEC_COMMANDS, ({ cmdStr, cmdInput }) => executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal));
519
629
  }
520
630
  const results = [];
521
631
  let stopped = false;
@@ -524,7 +634,7 @@ async function executeResolvedCommands(processManager, overflowHandler, featureF
524
634
  results.push({ cmd: cmdStr, exit_code: null, stdout: '', stderr: '', success: false, skipped: true });
525
635
  continue;
526
636
  }
527
- const result = await executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout);
637
+ const result = await executeResolvedCommand(processManager, overflowHandler, featureFlags, cmdStr, cmdInput, workingDirectory, globalTimeout, signal);
528
638
  results.push(result);
529
639
  if (failFast && !result.success) {
530
640
  stopped = true;
@@ -550,6 +660,7 @@ function formatResult(result, verbosity) {
550
660
  stderr: firstStderr,
551
661
  ...(result.expectation_error && { expectation_error: result.expectation_error }),
552
662
  ...(result.timed_out && { timed_out: true }),
663
+ ...(result.cancelled && { cancelled: true }),
553
664
  ...(result.process_id && { process_id: result.process_id, pid: result.pid }),
554
665
  ...(result.progress_file && { progress_file: result.progress_file }),
555
666
  ...(result.warnings && { warnings: result.warnings }),
@@ -567,6 +678,7 @@ function formatResult(result, verbosity) {
567
678
  stderr: result.stderr,
568
679
  ...(result.expectation_error && { expectation_error: result.expectation_error }),
569
680
  ...(result.timed_out && { timed_out: true }),
681
+ ...(result.cancelled && { cancelled: true }),
570
682
  ...(result.process_id && { process_id: result.process_id, pid: result.pid }),
571
683
  ...(result.stdout_truncated && { stdout_truncated: true }),
572
684
  ...(result.stderr_truncated && { stderr_truncated: true }),
@@ -593,7 +705,7 @@ export function createExecTool(processManager, options = {}) {
593
705
  supportsProgress: true,
594
706
  supportsStreamingOutput: true,
595
707
  },
596
- async execute(args) {
708
+ async execute(args, opts) {
597
709
  try {
598
710
  if (!Array.isArray(args['commands']) || args['commands'].length === 0) {
599
711
  return { success: false, error: 'commands must be a non-empty array' };
@@ -602,7 +714,7 @@ export function createExecTool(processManager, options = {}) {
602
714
  return { success: false, error: `Too many commands: maximum ${MAX_EXEC_COMMANDS} per exec call` };
603
715
  }
604
716
  const input = normalizeExecInput(args);
605
- const workingDirectory = requireWorkingDirectory(input);
717
+ const workingDirectory = requireWorkingDirectory(input, options.defaultWorkingDirectory);
606
718
  const verbosity = input.verbosity ?? 'standard';
607
719
  const globalTimeout = input.timeout_ms ?? DEFAULT_TIMEOUT_MS;
608
720
  const failFast = input.fail_fast === true || input.stop_on_error === true;
@@ -627,7 +739,7 @@ export function createExecTool(processManager, options = {}) {
627
739
  }
628
740
  resolvedCmds.push({ cmdStr, cmdInput });
629
741
  }
630
- const results = await executeResolvedCommands(processManager, overflowHandler, featureFlags, resolvedCmds, input.parallel === true, workingDirectory, globalTimeout, failFast);
742
+ const results = await executeResolvedCommands(processManager, overflowHandler, featureFlags, resolvedCmds, input.parallel === true, workingDirectory, globalTimeout, failFast, opts?.signal);
631
743
  const formatted = results.map((r) => formatResult(r, verbosity));
632
744
  const allSuccess = results.every((r) => r.success);
633
745
  const responseData = formatted.length === 1 ? { ...formatted[0] } : { commands: formatted, total: formatted.length };
@@ -641,7 +753,7 @@ export function createExecTool(processManager, options = {}) {
641
753
  const failed = results.filter((r) => !r.success);
642
754
  const errorSummary = failed.length > 0
643
755
  ? `${failed.length} of ${results.length} command(s) failed: `
644
- + failed.map((r) => `'${r.cmd}'${r.skipped ? ' (skipped)' : ` exit ${r.exit_code}${r.timed_out ? ' (timed out)' : ''}`}`).join('; ')
756
+ + failed.map((r) => `'${r.cmd}'${r.skipped ? ' (skipped)' : ` exit ${r.exit_code}${r.timed_out ? ' (timed out)' : r.cancelled ? ' (cancelled)' : ''}`}`).join('; ')
645
757
  : undefined;
646
758
  return {
647
759
  success: allSuccess,
@@ -133,7 +133,7 @@ export declare const EXEC_TOOL_SCHEMA: {
133
133
  };
134
134
  readonly working_dir: {
135
135
  readonly type: "string";
136
- readonly description: "Global working directory applied to all commands unless overridden per-command.";
136
+ readonly description: string;
137
137
  };
138
138
  readonly timeout_ms: {
139
139
  readonly type: "integer";
@@ -269,6 +269,8 @@ export interface ExecCommandResult {
269
269
  expectation_error?: string | undefined;
270
270
  /** Set when command exceeded timeout. */
271
271
  timed_out?: boolean | undefined;
272
+ /** Set when an external AbortSignal cancelled the command (Wave 4, wo701 — orchestration engine cancellation). Never combined with timed_out. */
273
+ cancelled?: boolean | undefined;
272
274
  /** Set when command ran in background. */
273
275
  process_id?: string | undefined;
274
276
  pid?: number | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/exec/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/exec/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoNnB,CAAC;AAIX,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,CAAC;IAC9C,0EAA0E;IAC1E,EAAE,CAAC,EAAE,aAAa,CAAC,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC,GAAG,SAAS,CAAC;CACrE;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,oFAAoF;IACpF,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,yEAAyE;IACzE,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAChC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,uFAAuF;IACvF,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,EAAE,UAAU,EAAE,GAAG,SAAS,CAAC;IACpC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,2BAA2B;IAC3B,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACrC;AAID,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,yCAAyC;IACzC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,iJAAiJ;IACjJ,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,uBAAuB;IACvB,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACjC;AAGD,YAAY,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -131,7 +131,8 @@ export const EXEC_TOOL_SCHEMA = {
131
131
  },
132
132
  working_dir: {
133
133
  type: 'string',
134
- description: 'Global working directory applied to all commands unless overridden per-command.',
134
+ description: 'Global working directory applied to all commands unless overridden per-command.'
135
+ + ' Optional — defaults to the session\'s working directory when omitted.',
135
136
  },
136
137
  timeout_ms: {
137
138
  type: 'integer',
@@ -6,6 +6,13 @@ import type { FeatureFlagManager } from '../../runtime/feature-flags/index.js';
6
6
  export interface FetchRuntimeDeps {
7
7
  readonly serviceRegistry?: Pick<ServiceRegistry, 'resolveAuth'> | null | undefined;
8
8
  readonly featureFlags?: Pick<FeatureFlagManager, 'isEnabled'> | null | undefined;
9
+ /**
10
+ * Wave-4 cooperative cancellation (wo701): an externally-supplied signal,
11
+ * combined with each request's own per-URL timeout signal via
12
+ * `AbortSignal.any`. Optional and additive — omitted, behavior is
13
+ * unchanged from before this field existed.
14
+ */
15
+ readonly signal?: AbortSignal | undefined;
9
16
  }
10
17
  interface CacheEntry {
11
18
  data: FetchUrlResult;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/fetch/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAsF,MAAM,aAAa,CAAC;AAClI,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAUxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAM/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACnF,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CAClF;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AASD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAC/D,OAAO,CAAC,eAAe,CAAK;IAE5B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOtE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAiBxC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAkFpF;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAE5G;AAseD,wBAAgB,eAAe,CAC7B,IAAI,GAAE,gBAAqB,EAC3B,OAAO,sBAA4B,GAClC,IAAI,CAiCN"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../../src/platform/tools/fetch/runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAsF,MAAM,aAAa,CAAC;AAClI,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAUxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAM/E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACnF,QAAQ,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;IACjF;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AASD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiC;IAC/D,OAAO,CAAC,eAAe,CAAK;IAE5B,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOtE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAiBxC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC;CAkFpF;AAED,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAE5G;AA0eD,wBAAgB,eAAe,CAC7B,IAAI,GAAE,gBAAqB,EAC3B,OAAO,sBAA4B,GAClC,IAAI,CAqCN"}
@@ -165,8 +165,9 @@ function encodeFormBodyData(bodyData) {
165
165
  }
166
166
  return params.toString();
167
167
  }
168
- async function fetchOneRaw(urlInput, headers, method, body, effectiveUrl, trustTierConfig, sanitizationEnabled) {
169
- const { signal, dispose } = createTimeoutController(urlInput.timeout_ms ?? DEFAULT_TIMEOUT_MS);
168
+ async function fetchOneRaw(urlInput, headers, method, body, effectiveUrl, trustTierConfig, sanitizationEnabled, externalSignal) {
169
+ const { signal: timeoutSignal, dispose } = createTimeoutController(urlInput.timeout_ms ?? DEFAULT_TIMEOUT_MS);
170
+ const signal = externalSignal ? AbortSignal.any([timeoutSignal, externalSignal]) : timeoutSignal;
170
171
  try {
171
172
  return sanitizationEnabled
172
173
  ? await fetchWithValidatedRedirects({
@@ -353,14 +354,14 @@ async function fetchOne(urlInput, opts, runtime) {
353
354
  const { headers, body: requestBody } = await prepareFetchRequest(urlInput, deps);
354
355
  const startTime = performance.now();
355
356
  try {
356
- let response = await fetchOneRaw(urlInput, headers, method, requestBody, effectiveUrl, trustTierConfig, sanitizationEnabled);
357
+ let response = await fetchOneRaw(urlInput, headers, method, requestBody, effectiveUrl, trustTierConfig, sanitizationEnabled, deps.signal);
357
358
  const retryOnAuth = urlInput.retry_on_auth ?? (urlInput.service !== undefined);
358
359
  if (response.status === 401 && retryOnAuth && urlInput.service && !(requestBody instanceof FormData)) {
359
360
  const refreshedHeaders = await deps.serviceRegistry?.resolveAuth(urlInput.service);
360
361
  if (refreshedHeaders) {
361
362
  const retryHeaders = { ...headers };
362
363
  Object.assign(retryHeaders, refreshedHeaders);
363
- response = await fetchOneRaw(urlInput, retryHeaders, method, requestBody, effectiveUrl, trustTierConfig, sanitizationEnabled);
364
+ response = await fetchOneRaw(urlInput, retryHeaders, method, requestBody, effectiveUrl, trustTierConfig, sanitizationEnabled, deps.signal);
364
365
  }
365
366
  }
366
367
  const durationMs = Math.round(performance.now() - startTime);
@@ -503,13 +504,14 @@ export function createFetchTool(deps = {}, runtime = new FetchRuntimeService())
503
504
  supportsProgress: true,
504
505
  supportsStreamingOutput: true,
505
506
  },
506
- async execute(args) {
507
+ async execute(args, opts) {
507
508
  if (!Array.isArray(args.urls) || args.urls.length === 0) {
508
509
  return { success: false, error: 'Missing or empty "urls" array' };
509
510
  }
510
511
  try {
511
512
  const input = { ...args, urls: args.urls };
512
- const output = await runtime.execute(input, deps);
513
+ const effectiveDeps = opts?.signal ? { ...deps, signal: opts.signal } : deps;
514
+ const output = await runtime.execute(input, effectiveDeps);
513
515
  return { success: true, output: JSON.stringify(output) };
514
516
  }
515
517
  catch (err) {