eve 0.50.0 → 0.51.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 (450) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/src/acp/adapter.js +1 -1
  3. package/dist/src/channel/types.d.ts +12 -19
  4. package/dist/src/chunks/{use-eve-agent-DUMU6dap.js → use-eve-agent-B4xN7-fK.js} +4 -4
  5. package/dist/src/chunks/{use-eve-agent-B5I-k6Ek.js → use-eve-agent-C3vUG5g2.js} +4 -4
  6. package/dist/src/cli/acp/command.d.ts +1 -1
  7. package/dist/src/cli/acp/command.js +2 -2
  8. package/dist/src/cli/agent-command.d.ts +5 -0
  9. package/dist/src/cli/agent-command.js +1 -0
  10. package/dist/src/cli/application-command.d.ts +2 -0
  11. package/dist/src/cli/commands/build.d.ts +1 -1
  12. package/dist/src/cli/commands/build.js +1 -1
  13. package/dist/src/cli/commands/deploy.d.ts +2 -0
  14. package/dist/src/cli/commands/deploy.js +1 -1
  15. package/dist/src/cli/commands/init-agent-workspace.d.ts +14 -0
  16. package/dist/src/cli/commands/init-agent-workspace.js +1 -0
  17. package/dist/src/cli/commands/init-repl.js +1 -1
  18. package/dist/src/cli/commands/init.d.ts +2 -13
  19. package/dist/src/cli/commands/init.js +1 -1
  20. package/dist/src/cli/commands/integration-connect.js +1 -1
  21. package/dist/src/cli/commands/link.d.ts +2 -0
  22. package/dist/src/cli/commands/link.js +1 -1
  23. package/dist/src/cli/commands/preconditions.d.ts +15 -0
  24. package/dist/src/cli/commands/preconditions.js +1 -1
  25. package/dist/src/cli/commands/register-integration-commands.d.ts +1 -1
  26. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  27. package/dist/src/cli/commands/register-registry-commands.js +2 -2
  28. package/dist/src/cli/commands/registry.js +1 -1
  29. package/dist/src/cli/dev/environment.d.ts +1 -1
  30. package/dist/src/cli/dev/environment.js +1 -1
  31. package/dist/src/cli/dev/local-server-process.js +1 -1
  32. package/dist/src/cli/dev/tui/runner.js +1 -1
  33. package/dist/src/cli/invoke/command.d.ts +1 -1
  34. package/dist/src/cli/invoke/command.js +1 -1
  35. package/dist/src/cli/option-parsers.d.ts +1 -0
  36. package/dist/src/cli/option-parsers.js +1 -1
  37. package/dist/src/cli/run.js +3 -3
  38. package/dist/src/client/agent-info-schema.d.ts +0 -1
  39. package/dist/src/client/agent-info-schema.js +1 -1
  40. package/dist/src/client/message-action-parts.js +1 -1
  41. package/dist/src/compiled/.vendor-stamp.json +1 -1
  42. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  43. package/dist/src/compiler/extension-compatibility.js +1 -1
  44. package/dist/src/compiler/manifest.js +1 -1
  45. package/dist/src/compiler/normalize-agent-config.js +1 -1
  46. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  47. package/dist/src/compiler/normalize-manifest.js +1 -1
  48. package/dist/src/context/build-dynamic-tools.js +1 -1
  49. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  50. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  51. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -0
  52. package/dist/src/context/keys.d.ts +0 -3
  53. package/dist/src/context/keys.js +1 -1
  54. package/dist/src/discover/project.js +1 -1
  55. package/dist/src/evals/cli/eval.js +1 -1
  56. package/dist/src/evals/mock-model.js +1 -1
  57. package/dist/src/eve-channel/index.js +1 -1
  58. package/dist/src/execution/activity-work-id.js +1 -1
  59. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  60. package/dist/src/execution/channel-context.js +1 -1
  61. package/dist/src/execution/coordination-dispatch-shared.d.ts +103 -0
  62. package/dist/src/execution/coordination-dispatch-shared.js +1 -0
  63. package/dist/src/execution/coordination-dispatch-step.d.ts +7 -0
  64. package/dist/src/execution/coordination-dispatch-step.js +1 -0
  65. package/dist/src/execution/create-session-step.d.ts +1 -2
  66. package/dist/src/execution/create-session-step.js +1 -1
  67. package/dist/src/execution/deliver-payloads.js +1 -1
  68. package/dist/src/execution/dispatch-action-failures.d.ts +5 -5
  69. package/dist/src/execution/dispatch-action-failures.js +1 -1
  70. package/dist/src/execution/dispatch-start-operation.d.ts +1 -1
  71. package/dist/src/execution/dispatch-start-operation.js +1 -1
  72. package/dist/src/execution/durable-session-store.d.ts +1 -1
  73. package/dist/src/execution/eve-workflow-attributes.d.ts +1 -1
  74. package/dist/src/execution/inline-turn.js +1 -1
  75. package/dist/src/execution/next-driver-action.d.ts +7 -10
  76. package/dist/src/execution/node-step.d.ts +1 -2
  77. package/dist/src/execution/node-step.js +1 -1
  78. package/dist/src/execution/pending-turn-state.d.ts +1 -2
  79. package/dist/src/execution/pending-turn-state.js +1 -1
  80. package/dist/src/execution/proxied-deliver-step.js +1 -1
  81. package/dist/src/execution/route-child-delivery.js +1 -1
  82. package/dist/src/execution/runtime-context.js +1 -1
  83. package/dist/src/execution/session-command-inbox.d.ts +2 -3
  84. package/dist/src/execution/session.d.ts +1 -1
  85. package/dist/src/execution/session.js +2 -2
  86. package/dist/src/execution/settle-cancelled-turn-step.d.ts +1 -1
  87. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  88. package/dist/src/execution/stable-workflow-names.d.ts +1 -1
  89. package/dist/src/execution/stable-workflow-names.js +1 -1
  90. package/dist/src/execution/task-event-callback.js +1 -1
  91. package/dist/src/execution/tasks/child/steps.d.ts +18 -18
  92. package/dist/src/execution/tasks/child/steps.js +1 -1
  93. package/dist/src/execution/tasks/child/update-step.d.ts +6 -0
  94. package/dist/src/execution/tasks/child/update-step.js +1 -0
  95. package/dist/src/execution/tasks/child/update.d.ts +7 -10
  96. package/dist/src/execution/tasks/child/update.js +1 -1
  97. package/dist/src/execution/tasks/child/workflow.d.ts +21 -29
  98. package/dist/src/execution/tasks/child/workflow.js +1 -1
  99. package/dist/src/execution/tasks/parent/control-shared.d.ts +6 -17
  100. package/dist/src/execution/tasks/parent/control-shared.js +1 -1
  101. package/dist/src/execution/tasks/parent/delegate.d.ts +15 -50
  102. package/dist/src/execution/tasks/parent/delegate.js +1 -1
  103. package/dist/src/execution/tasks/parent/dispatch.d.ts +19 -34
  104. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  105. package/dist/src/execution/tasks/parent/hitl-proxy-steps.d.ts +5 -15
  106. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  107. package/dist/src/execution/tasks/parent/run-parent.d.ts +2 -2
  108. package/dist/src/execution/tasks/parent/task-cancel.d.ts +11 -0
  109. package/dist/src/execution/tasks/parent/task-cancel.js +1 -0
  110. package/dist/src/execution/tasks/parent/tool-execution.d.ts +2 -3
  111. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  112. package/dist/src/execution/terminate-child-sessions-step.js +1 -1
  113. package/dist/src/execution/tools/subagent/accept-event-step.d.ts +7 -0
  114. package/dist/src/execution/tools/subagent/accept-event-step.js +1 -0
  115. package/dist/src/execution/tools/subagent/emit-called-step.d.ts +9 -0
  116. package/dist/src/execution/tools/subagent/emit-called-step.js +1 -0
  117. package/dist/src/execution/tools/subagent/invoke-agent.d.ts +51 -0
  118. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -0
  119. package/dist/src/execution/tools/subagent/invoke-preparation.d.ts +37 -0
  120. package/dist/src/execution/tools/subagent/invoke-preparation.js +1 -0
  121. package/dist/src/execution/tools/subagent/invoke-step.d.ts +55 -0
  122. package/dist/src/execution/tools/subagent/invoke-step.js +1 -0
  123. package/dist/src/execution/tools/subagent/receipt-identity.d.ts +11 -0
  124. package/dist/src/execution/tools/subagent/receipt-identity.js +1 -0
  125. package/dist/src/execution/{dispatch-runtime-actions-start.d.ts → tools/subagent/start.d.ts} +17 -5
  126. package/dist/src/execution/tools/subagent/start.js +1 -0
  127. package/dist/src/execution/tools/subagent/task-agent-requests.d.ts +24 -0
  128. package/dist/src/execution/tools/subagent/task-agent-requests.js +1 -0
  129. package/dist/src/execution/tools/subagent/task-cancel.d.ts +10 -0
  130. package/dist/src/execution/tools/subagent/task-cancel.js +1 -0
  131. package/dist/src/execution/tools/tasks.d.ts +10 -0
  132. package/dist/src/execution/tools/tasks.js +1 -0
  133. package/dist/src/execution/{tool-run → tools/workflow}/answer.d.ts +1 -1
  134. package/dist/src/execution/tools/workflow/answer.js +1 -0
  135. package/dist/src/execution/tools/workflow/ask.d.ts +22 -0
  136. package/dist/src/execution/tools/workflow/ask.js +1 -0
  137. package/dist/src/execution/tools/workflow/background.d.ts +18 -0
  138. package/dist/src/execution/tools/workflow/background.js +1 -0
  139. package/dist/src/execution/tools/workflow/body.d.ts +25 -0
  140. package/dist/src/execution/tools/workflow/body.js +1 -0
  141. package/dist/src/execution/tools/workflow/cancel.d.ts +11 -0
  142. package/dist/src/execution/tools/workflow/cancel.js +1 -0
  143. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.d.ts +7 -0
  144. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.js +1 -0
  145. package/dist/src/execution/tools/workflow/messages.d.ts +88 -0
  146. package/dist/src/execution/tools/workflow/messages.js +1 -0
  147. package/dist/src/execution/tools/workflow/owner-inbox.d.ts +13 -0
  148. package/dist/src/execution/tools/workflow/owner-inbox.js +1 -0
  149. package/dist/src/execution/tools/workflow/owner.d.ts +13 -0
  150. package/dist/src/execution/tools/workflow/owner.js +1 -0
  151. package/dist/src/execution/tools/workflow/run-control.d.ts +18 -0
  152. package/dist/src/execution/tools/workflow/run-control.js +1 -0
  153. package/dist/src/execution/tools/workflow/start.d.ts +33 -0
  154. package/dist/src/execution/tools/workflow/start.js +1 -0
  155. package/dist/src/execution/tools/workflow/types.d.ts +26 -0
  156. package/dist/src/execution/tools/workflow/types.js +1 -0
  157. package/dist/src/execution/tools/workflow/workflow.d.ts +3 -0
  158. package/dist/src/execution/tools/workflow/workflow.js +1 -0
  159. package/dist/src/execution/turn-workflow-tool-run.d.ts +16 -0
  160. package/dist/src/execution/turn-workflow-tool-run.js +1 -0
  161. package/dist/src/execution/turn-workflow.js +1 -1
  162. package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
  163. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  164. package/dist/src/execution/wire/session-inbox-encoder.d.ts +6 -2
  165. package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
  166. package/dist/src/execution/wire/session-inbox-wire.d.ts +3 -3
  167. package/dist/src/execution/wire/session-inbox-wire.js +1 -1
  168. package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
  169. package/dist/src/execution/wire/session-inbox-wire.v4.d.ts +267 -0
  170. package/dist/src/execution/wire/session-inbox-wire.v4.js +1 -0
  171. package/dist/src/execution/wire/session-inbox-wire.v4.migration.d.ts +3 -0
  172. package/dist/src/execution/wire/session-inbox-wire.v4.migration.js +1 -0
  173. package/dist/src/execution/workflow-entry-finalization.d.ts +6 -0
  174. package/dist/src/execution/workflow-entry-finalization.js +1 -1
  175. package/dist/src/execution/workflow-entry.d.ts +2 -1
  176. package/dist/src/execution/workflow-entry.js +1 -1
  177. package/dist/src/execution/workflow-runtime.d.ts +1 -1
  178. package/dist/src/execution/workflow-runtime.js +1 -1
  179. package/dist/src/execution/workflow-steps.js +1 -1
  180. package/dist/src/framework/sources/registry.js +1 -1
  181. package/dist/src/harness/advertised-tools.d.ts +1 -7
  182. package/dist/src/harness/advertised-tools.js +1 -1
  183. package/dist/src/harness/background-tools.d.ts +8 -2
  184. package/dist/src/harness/{runtime-actions.d.ts → coordination.d.ts} +40 -27
  185. package/dist/src/harness/coordination.js +1 -0
  186. package/dist/src/harness/emission.d.ts +9 -2
  187. package/dist/src/harness/emission.js +1 -1
  188. package/dist/src/harness/execute-tool.d.ts +52 -0
  189. package/dist/src/harness/hitl/session-limit-input-requests.js +1 -1
  190. package/dist/src/harness/input-requests.js +1 -1
  191. package/dist/src/harness/proxy-input-requests.d.ts +6 -2
  192. package/dist/src/harness/stale-input-responses.js +1 -1
  193. package/dist/src/harness/step-hooks.d.ts +1 -2
  194. package/dist/src/harness/step-hooks.js +1 -1
  195. package/dist/src/harness/tool-call-action.js +1 -1
  196. package/dist/src/harness/tool-call-input-errors.js +1 -1
  197. package/dist/src/harness/tool-loop.js +2 -2
  198. package/dist/src/harness/tools.js +1 -1
  199. package/dist/src/harness/turn-tag-state.d.ts +3 -1
  200. package/dist/src/harness/types.d.ts +4 -7
  201. package/dist/src/harness/workflow-interrupt-state.js +1 -1
  202. package/dist/src/harness/workflow-lifecycle.d.ts +10 -0
  203. package/dist/src/harness/workflow-lifecycle.js +1 -1
  204. package/dist/src/harness/workflow-sandbox.d.ts +1 -1
  205. package/dist/src/harness/workflow-sandbox.js +2 -2
  206. package/dist/src/harness/workflow-subagent-limit.d.ts +7 -7
  207. package/dist/src/harness/workflow-subagent-limit.js +1 -1
  208. package/dist/src/harness/workflow-task-state.d.ts +9 -0
  209. package/dist/src/harness/workflow-task-state.js +1 -0
  210. package/dist/src/harness/workflow-tool-runs.d.ts +27 -0
  211. package/dist/src/harness/workflow-tool-runs.js +1 -0
  212. package/dist/src/instrumentation/native-events.js +1 -1
  213. package/dist/src/instrumentation/parent-lineage.js +1 -1
  214. package/dist/src/internal/agent-name.d.ts +4 -0
  215. package/dist/src/internal/agent-name.js +1 -0
  216. package/dist/src/internal/agent-workspace.d.ts +15 -0
  217. package/dist/src/internal/agent-workspace.js +1 -0
  218. package/dist/src/internal/application/package.js +1 -1
  219. package/dist/src/internal/authored-definition/core.js +1 -1
  220. package/dist/src/internal/nitro/host/build-application.js +1 -1
  221. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  222. package/dist/src/internal/nitro/host/start-production-server.js +3 -3
  223. package/dist/src/internal/nitro/routes/runtime-stack.js +1 -1
  224. package/dist/src/internal/project-context.d.ts +26 -0
  225. package/dist/src/internal/project-context.js +1 -0
  226. package/dist/src/internal/vercel/assemble-eve-services.d.ts +17 -0
  227. package/dist/src/internal/vercel/assemble-eve-services.js +1 -0
  228. package/dist/src/internal/vercel/build-agent-workspace.d.ts +3 -0
  229. package/dist/src/internal/vercel/build-agent-workspace.js +1 -0
  230. package/dist/src/internal/vercel/build-command.d.ts +4 -0
  231. package/dist/src/internal/vercel/build-command.js +1 -0
  232. package/dist/src/internal/vercel/eve-service-contribution.d.ts +27 -0
  233. package/dist/src/internal/vercel/eve-service-contribution.js +1 -0
  234. package/dist/src/internal/vercel/vercel-service-config-operations.d.ts +18 -0
  235. package/dist/src/internal/vercel/vercel-service-config-operations.js +1 -0
  236. package/dist/src/internal/vercel/vercel-service-name.d.ts +6 -0
  237. package/dist/src/internal/vercel/vercel-service-name.js +1 -0
  238. package/dist/src/internal/vercel/vercel-services-config.d.ts +53 -0
  239. package/dist/src/internal/vercel/vercel-services-config.js +1 -0
  240. package/dist/src/internal/workflow-bundle/builder.js +1 -1
  241. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  242. package/dist/src/protocol/message.d.ts +2 -0
  243. package/dist/src/protocol/message.js +1 -1
  244. package/dist/src/public/channels/slack/action-status.js +1 -1
  245. package/dist/src/public/memory/file/backends/vercel-blob.js +1 -1
  246. package/dist/src/public/next/index.js +1 -1
  247. package/dist/src/public/next/vercel-output-config.js +1 -1
  248. package/dist/src/public/workflow/index.d.ts +3 -1
  249. package/dist/src/public/workflow/index.js +1 -1
  250. package/dist/src/runtime/actions/results.d.ts +3 -3
  251. package/dist/src/runtime/actions/results.js +1 -1
  252. package/dist/src/runtime/agent/bootstrap-model-utils.js +1 -1
  253. package/dist/src/runtime/agent/bootstrap.d.ts +1 -0
  254. package/dist/src/runtime/agent/bootstrap.js +1 -1
  255. package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
  256. package/dist/src/runtime/channels/registry.js +1 -1
  257. package/dist/src/runtime/prompt/compose.d.ts +0 -1
  258. package/dist/src/runtime/prompt/compose.js +1 -1
  259. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  260. package/dist/src/runtime/resolve-agent.js +1 -1
  261. package/dist/src/runtime/sessions/turn.d.ts +16 -1
  262. package/dist/src/runtime/subagents/registry.js +1 -1
  263. package/dist/src/runtime/subagents/workflow-reference.d.ts +5 -0
  264. package/dist/src/runtime/subagents/workflow-reference.js +1 -0
  265. package/dist/src/runtime/subagents/workflow.d.ts +8 -0
  266. package/dist/src/runtime/subagents/workflow.js +1 -0
  267. package/dist/src/runtime/tools/registry.js +1 -1
  268. package/dist/src/setup/integrations/discord/setup.js +1 -1
  269. package/dist/src/setup/integrations/file-memory/vercel.js +1 -1
  270. package/dist/src/setup/integrations/linear/setup.js +1 -1
  271. package/dist/src/setup/integrations/linq/setup.js +3 -3
  272. package/dist/src/setup/integrations/shopify/setup.js +1 -1
  273. package/dist/src/setup/scaffold/create/project.js +1 -1
  274. package/dist/src/setup/scaffold/update/channels.d.ts +4 -12
  275. package/dist/src/setup/scaffold/update/channels.js +1 -1
  276. package/dist/src/shared/action-types.d.ts +74 -14
  277. package/dist/src/shared/action-types.js +1 -1
  278. package/dist/src/shared/json.js +1 -1
  279. package/dist/src/shared/workflow-sandbox.d.ts +1 -1
  280. package/dist/src/{execution/subagent-adapter-state.d.ts → subagents/adapter-state.d.ts} +2 -0
  281. package/dist/src/{execution/subagent-adapter-state.js → subagents/adapter-state.js} +1 -1
  282. package/dist/src/subagents/adapter.js +1 -0
  283. package/dist/src/{harness → subagents}/agent-handle-errors.d.ts +6 -0
  284. package/dist/src/subagents/agent-handle-errors.js +1 -0
  285. package/dist/src/subagents/callback-route.js +1 -0
  286. package/dist/src/subagents/callback-step.js +1 -0
  287. package/dist/src/{execution/agent-continuation-bundle.d.ts → subagents/continuation-bundle.d.ts} +1 -1
  288. package/dist/src/subagents/continuation-bundle.js +1 -0
  289. package/dist/src/{execution/subagent-event-proxy-step.d.ts → subagents/event-proxy-step.d.ts} +2 -8
  290. package/dist/src/subagents/event-proxy-step.js +1 -0
  291. package/dist/src/subagents/handle-dispatch.d.ts +54 -0
  292. package/dist/src/subagents/handle-dispatch.js +1 -0
  293. package/dist/src/{harness → subagents}/handles/prompt.d.ts +4 -4
  294. package/dist/src/{harness → subagents}/handles/prompt.js +1 -1
  295. package/dist/src/{harness → subagents}/handles/query.d.ts +8 -2
  296. package/dist/src/subagents/handles/query.js +1 -0
  297. package/dist/src/subagents/handles/rebase.d.ts +4 -0
  298. package/dist/src/subagents/handles/rebase.js +1 -0
  299. package/dist/src/{harness → subagents}/handles/store.d.ts +90 -15
  300. package/dist/src/subagents/handles/store.js +1 -0
  301. package/dist/src/subagents/handles/transitions.d.ts +103 -0
  302. package/dist/src/subagents/handles/transitions.js +1 -0
  303. package/dist/src/{execution/delegated-parent-notification.d.ts → subagents/parent-notification.d.ts} +1 -7
  304. package/dist/src/subagents/parent-notification.js +1 -0
  305. package/dist/src/subagents/parent-result.js +1 -0
  306. package/dist/src/{execution/remote-agent-dispatch.d.ts → subagents/remote-dispatch.d.ts} +3 -2
  307. package/dist/src/subagents/remote-dispatch.js +1 -0
  308. package/dist/src/{execution/subagent-start-local.d.ts → subagents/start-local.d.ts} +5 -6
  309. package/dist/src/subagents/start-local.js +1 -0
  310. package/dist/src/{execution/subagent-start-remote.d.ts → subagents/start-remote.d.ts} +5 -5
  311. package/dist/src/subagents/start-remote.js +1 -0
  312. package/dist/src/{execution/subagent-tool.d.ts → subagents/tool.d.ts} +5 -3
  313. package/dist/src/subagents/tool.js +1 -0
  314. package/dist/src/svelte/index.js +1 -1
  315. package/dist/src/svelte/use-eve-agent.js +1 -1
  316. package/dist/src/tasks/json.js +1 -1
  317. package/dist/src/tasks/session-index.d.ts +2 -3
  318. package/dist/src/tasks/session-index.js +1 -1
  319. package/dist/src/tasks/task-id.d.ts +3 -4
  320. package/dist/src/tasks/task-id.js +1 -1
  321. package/dist/src/tasks/transitions.d.ts +3 -47
  322. package/dist/src/tasks/transitions.js +1 -1
  323. package/dist/src/tasks/types.d.ts +69 -247
  324. package/dist/src/tasks/types.js +1 -1
  325. package/dist/src/tools/dynamic.d.ts +3 -1
  326. package/dist/src/tools/framework/agent.d.ts +18 -2
  327. package/dist/src/tools/framework/agent.js +1 -1
  328. package/dist/src/tools/framework/task-cancel.d.ts +2 -6
  329. package/dist/src/tools/framework/task-contract.d.ts +44 -65
  330. package/dist/src/tools/framework/task-contract.js +1 -1
  331. package/dist/src/tools/framework/task-update.d.ts +1 -0
  332. package/dist/src/tools/framework/task-update.js +1 -1
  333. package/dist/src/vue/index.js +1 -1
  334. package/dist/src/vue/use-eve-agent.js +1 -1
  335. package/docs/concepts/built-in-tools.md +9 -90
  336. package/docs/concepts/context-control.md +2 -2
  337. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  338. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  339. package/docs/guides/deployment/vercel.mdx +20 -2
  340. package/docs/guides/dynamic-capabilities.md +2 -2
  341. package/docs/guides/frontend/overview.mdx +1 -1
  342. package/docs/guides/instrumentation-providers.md +242 -0
  343. package/docs/guides/instrumentation.md +2 -0
  344. package/docs/guides/meta.json +1 -0
  345. package/docs/guides/remote-agents.md +8 -9
  346. package/docs/reference/cli.md +5 -2
  347. package/docs/sandbox.mdx +2 -0
  348. package/docs/subagents/index.mdx +9 -8
  349. package/docs/tools/overview.mdx +11 -10
  350. package/docs/tools/workflows.mdx +52 -18
  351. package/package.json +1 -1
  352. package/dist/src/execution/agent-continuation-bundle.js +0 -1
  353. package/dist/src/execution/agent-handle-dispatch.d.ts +0 -79
  354. package/dist/src/execution/agent-handle-dispatch.js +0 -1
  355. package/dist/src/execution/delegated-parent-notification.js +0 -1
  356. package/dist/src/execution/delegated-parent-result.js +0 -1
  357. package/dist/src/execution/delegation-tool.d.ts +0 -10
  358. package/dist/src/execution/delegation-tool.js +0 -1
  359. package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +0 -165
  360. package/dist/src/execution/dispatch-runtime-actions-shared.js +0 -1
  361. package/dist/src/execution/dispatch-runtime-actions-start.js +0 -1
  362. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +0 -18
  363. package/dist/src/execution/dispatch-runtime-actions-step.js +0 -1
  364. package/dist/src/execution/dispatch-workflow-runtime-actions-step.d.ts +0 -18
  365. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +0 -1
  366. package/dist/src/execution/finalize-terminal-session.d.ts +0 -17
  367. package/dist/src/execution/finalize-terminal-session.js +0 -1
  368. package/dist/src/execution/prepared-agent-action.d.ts +0 -7
  369. package/dist/src/execution/prepared-agent-action.js +0 -1
  370. package/dist/src/execution/remote-agent-dispatch.js +0 -1
  371. package/dist/src/execution/session-callback-route.js +0 -1
  372. package/dist/src/execution/session-callback-step.js +0 -1
  373. package/dist/src/execution/subagent-adapter.js +0 -1
  374. package/dist/src/execution/subagent-event-proxy-step.js +0 -1
  375. package/dist/src/execution/subagent-start-local.js +0 -1
  376. package/dist/src/execution/subagent-start-remote.js +0 -1
  377. package/dist/src/execution/subagent-tool.js +0 -1
  378. package/dist/src/execution/tasks/child/instructions.d.ts +0 -3
  379. package/dist/src/execution/tasks/child/instructions.js +0 -1
  380. package/dist/src/execution/tasks/parent/agent-identity.d.ts +0 -13
  381. package/dist/src/execution/tasks/parent/agent-identity.js +0 -1
  382. package/dist/src/execution/tasks/parent/agent-views.d.ts +0 -7
  383. package/dist/src/execution/tasks/parent/agent-views.js +0 -1
  384. package/dist/src/execution/tasks/parent/continuation-dispatch.d.ts +0 -43
  385. package/dist/src/execution/tasks/parent/continuation-dispatch.js +0 -1
  386. package/dist/src/execution/tasks/parent/dispatch-task-step.d.ts +0 -19
  387. package/dist/src/execution/tasks/parent/dispatch-task-step.js +0 -1
  388. package/dist/src/execution/tool-run/answer.js +0 -1
  389. package/dist/src/execution/tool-run/background.d.ts +0 -14
  390. package/dist/src/execution/tool-run/background.js +0 -1
  391. package/dist/src/execution/tool-run/cancel.d.ts +0 -7
  392. package/dist/src/execution/tool-run/cancel.js +0 -1
  393. package/dist/src/execution/tool-run/dispatch.d.ts +0 -24
  394. package/dist/src/execution/tool-run/dispatch.js +0 -1
  395. package/dist/src/execution/tool-run/emit-run-report-step.d.ts +0 -7
  396. package/dist/src/execution/tool-run/emit-run-report-step.js +0 -1
  397. package/dist/src/execution/tool-run/messages.d.ts +0 -70
  398. package/dist/src/execution/tool-run/messages.js +0 -1
  399. package/dist/src/execution/tool-run/owner-inbox.d.ts +0 -11
  400. package/dist/src/execution/tool-run/owner-inbox.js +0 -1
  401. package/dist/src/execution/tool-run/owner.d.ts +0 -13
  402. package/dist/src/execution/tool-run/owner.js +0 -1
  403. package/dist/src/execution/tool-run/run-control.d.ts +0 -18
  404. package/dist/src/execution/tool-run/run-control.js +0 -1
  405. package/dist/src/execution/tool-run/start.d.ts +0 -11
  406. package/dist/src/execution/tool-run/start.js +0 -1
  407. package/dist/src/execution/tool-run/types.d.ts +0 -21
  408. package/dist/src/execution/tool-run/types.js +0 -1
  409. package/dist/src/execution/tool-run/workflow.d.ts +0 -9
  410. package/dist/src/execution/tool-run/workflow.js +0 -1
  411. package/dist/src/execution/tools/subagent/local.d.ts +0 -40
  412. package/dist/src/execution/tools/subagent/local.js +0 -1
  413. package/dist/src/execution/tools/subagent/remote.d.ts +0 -26
  414. package/dist/src/execution/tools/subagent/remote.js +0 -1
  415. package/dist/src/harness/agent-handle-errors.js +0 -1
  416. package/dist/src/harness/handles/query.js +0 -1
  417. package/dist/src/harness/handles/store.js +0 -1
  418. package/dist/src/harness/handles/transitions.d.ts +0 -167
  419. package/dist/src/harness/handles/transitions.js +0 -1
  420. package/dist/src/harness/runtime-actions.js +0 -1
  421. package/dist/src/harness/subagent-depth.d.ts +0 -10
  422. package/dist/src/harness/subagent-depth.js +0 -1
  423. package/dist/src/harness/tool-runs.d.ts +0 -21
  424. package/dist/src/harness/tool-runs.js +0 -1
  425. package/dist/src/harness/workflow-runtime-action-state.d.ts +0 -9
  426. package/dist/src/harness/workflow-runtime-action-state.js +0 -1
  427. package/dist/src/runtime/actions/keys.d.ts +0 -14
  428. package/dist/src/runtime/actions/keys.js +0 -1
  429. package/dist/src/tasks/wire.d.ts +0 -25
  430. package/dist/src/tasks/wire.js +0 -1
  431. /package/dist/src/execution/{tool-run → tools/workflow}/owner-channels.d.ts +0 -0
  432. /package/dist/src/execution/{tool-run → tools/workflow}/owner-channels.js +0 -0
  433. /package/dist/src/execution/{tool-run → tools/workflow}/resume-hook-step.d.ts +0 -0
  434. /package/dist/src/execution/{tool-run → tools/workflow}/resume-hook-step.js +0 -0
  435. /package/dist/src/{execution/subagent-adapter.d.ts → subagents/adapter.d.ts} +0 -0
  436. /package/dist/src/{execution/session-callback-route.d.ts → subagents/callback-route.d.ts} +0 -0
  437. /package/dist/src/{execution/session-callback-step.d.ts → subagents/callback-step.d.ts} +0 -0
  438. /package/dist/src/{harness → subagents}/handles/operation-id.d.ts +0 -0
  439. /package/dist/src/{harness → subagents}/handles/operation-id.js +0 -0
  440. /package/dist/src/{harness → subagents}/handles/state-key.d.ts +0 -0
  441. /package/dist/src/{harness → subagents}/handles/state-key.js +0 -0
  442. /package/dist/src/{execution/subagent-hitl-proxy.d.ts → subagents/hitl-proxy.d.ts} +0 -0
  443. /package/dist/src/{execution/subagent-hitl-proxy.js → subagents/hitl-proxy.js} +0 -0
  444. /package/dist/src/{execution/subagent-invocation.d.ts → subagents/invocation.d.ts} +0 -0
  445. /package/dist/src/{execution/subagent-invocation.js → subagents/invocation.js} +0 -0
  446. /package/dist/src/{execution/delegated-parent-result.d.ts → subagents/parent-result.d.ts} +0 -0
  447. /package/dist/src/{execution/remote-agent-route-url.d.ts → subagents/remote-route-url.d.ts} +0 -0
  448. /package/dist/src/{execution/remote-agent-route-url.js → subagents/remote-route-url.js} +0 -0
  449. /package/dist/src/{harness/subagent-token-budget.d.ts → subagents/token-budget.d.ts} +0 -0
  450. /package/dist/src/{harness/subagent-token-budget.js → subagents/token-budget.js} +0 -0
@@ -0,0 +1 @@
1
+ import{resumeHook}from"#internal/workflow/runtime.js";async function forwardLocalTaskUpdateStep(e){"use step";await resumeHook(e.parentContinuationToken,e.update)}export{forwardLocalTaskUpdateStep};
@@ -1,11 +1,8 @@
1
1
  import type { ChannelAdapter } from "#channel/adapter.js";
2
- import type { RuntimeActionResult } from "#shared/action-types.js";
3
- import type { TaskControlInvocation } from "#shared/dispatch-action.js";
4
- /** Sends one child-authored progress update over its existing parent transport. */
5
- export declare function executeTaskUpdate(input: {
6
- readonly action: TaskControlInvocation;
7
- readonly adapter: ChannelAdapter | undefined;
8
- readonly updateIndex: number;
9
- readonly updateEpoch: string;
10
- readonly serializedContext: Record<string, unknown> | undefined;
11
- }): Promise<RuntimeActionResult>;
2
+ import type { TaskInboundUpdate } from "#tasks/types.js";
3
+ /** Delivers a task update through the local child adapter or remote callback. */
4
+ export declare function deliverTaskUpdate(input: {
5
+ readonly adapter?: ChannelAdapter;
6
+ readonly callback: unknown;
7
+ readonly update: TaskInboundUpdate;
8
+ }): Promise<string | undefined>;
@@ -1 +1 @@
1
- import{SessionCallbackKey}from"#context/keys.js";import{resumeHook}from"#internal/workflow/runtime.js";import{readTaskIdFromInboxToken}from"#tasks/task-inbox-token.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#execution/subagent-adapter-state.js";import{fireTaskUpdateCallbackStep}from"#execution/session-callback-step.js";import{createTaskControlError}from"#execution/tasks/parent/control-shared.js";async function executeTaskUpdate(n){let r=readUpdateMessage(n.action.input);if(r===void 0)return createTaskControlError(n.action,"Provide a non-empty `message`.");let i=n.serializedContext?.[SessionCallbackKey.name];if(i!==void 0){let e=await fireTaskUpdateCallbackStep({callback:i,callId:n.action.callId,updateIndex:n.updateIndex,updateEpoch:n.updateEpoch,message:r});return e===void 0?createTaskControlError(n.action,`This session is not owned by a parent task.`):createTaskUpdateResult(n.action,e)}let a=n.adapter;if(a?.kind!==SUBAGENT_ADAPTER_KIND||!isSubagentAdapterState(a.state))return createTaskControlError(n.action,`This session is not owned by a parent task.`);let o=a.state.parentContinuationToken,s=readTaskIdFromInboxToken(o);return s===void 0?createTaskControlError(n.action,`This session is not owned by a parent task.`):(await resumeHook(o,{callId:n.action.callId,updateIndex:n.updateIndex,updateEpoch:n.updateEpoch,kind:`task-update`,message:r}),createTaskUpdateResult(n.action,s))}function readUpdateMessage(e){return typeof e.message==`string`&&e.message.trim()!==``?e.message:void 0}function createTaskUpdateResult(e,t){return{callId:e.callId,kind:`tool-result`,output:{status:`sent`,taskId:t},toolName:e.toolName}}export{executeTaskUpdate};
1
+ import{fireTaskUpdateCallbackStep}from"#subagents/callback-step.js";import{forwardLocalTaskUpdateStep}from"#execution/tasks/child/update-step.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";async function deliverTaskUpdate(e){let t=e.adapter?.state;return e.adapter?.kind===SUBAGENT_ADAPTER_KIND&&isSubagentAdapterState(t)&&t.taskId!==void 0?(await forwardLocalTaskUpdateStep({parentContinuationToken:t.parentContinuationToken,update:e.update}),t.taskId):await fireTaskUpdateCallbackStep({callback:e.callback,callId:e.update.callId,message:e.update.message,updateEpoch:e.update.updateEpoch,updateIndex:e.update.updateIndex})}export{deliverTaskUpdate};
@@ -1,34 +1,26 @@
1
- import type { ActivityObserverConfig } from "#channel/types.js";
2
- import { type TaskView } from "#tasks/types.js";
3
- /** Input for one durable task run. */
1
+ import { type WorkflowBodyDefinition } from "#execution/tools/workflow/body.js";
2
+ import { type TaskInputRequest, type TaskView } from "#tasks/types.js";
4
3
  export interface TaskRunWorkflowInput {
5
- /** Activity sink and work identity for best-effort terminal settlement. */
6
- readonly activityObserver?: ActivityObserverConfig;
7
- /** Private task inbox token; a routing credential, never model-visible. */
8
- readonly taskInboxToken: string;
9
- /** The creation view, normally `working`. */
10
4
  readonly initialView: TaskView;
11
- /** Parent session delivery token used to wake the task's owning parent. */
12
5
  readonly parentContinuationToken: string;
6
+ readonly taskInboxToken: string;
7
+ readonly workflow?: WorkflowBodyDefinition;
8
+ }
9
+ /** A workflow-body question routed through the task that owns the workflow tool run. */
10
+ interface WorkflowToolRunTaskInputRequestBase {
11
+ readonly kind: "task-input-request";
12
+ readonly replyTo: string;
13
+ readonly sequence: number;
14
+ readonly stepIndex: number;
15
+ readonly turnId: string;
13
16
  }
14
- /**
15
- * The durable task run: single writer for one task's lifecycle.
16
- *
17
- * Consumes commands and child wire payloads over its private hook,
18
- * applies the pure transition function, and appends a full `TaskView`
19
- * per accepted command to its `eve.task` run stream. Competing
20
- * completion, cancellation, and input transitions serialize here;
21
- * rejected commands (for example a late child result after `cancelled`)
22
- * change nothing.
23
- *
24
- * Wake policy: a transition into a ready status — terminal or
25
- * `input_required` — and an explicit child `task_update` deliver a
26
- * framework notification to the parent session. A parked parent starts
27
- * a turn; an active turn observes the delivery at its next safe boundary.
28
- *
29
- * The run ends when the task reaches a terminal status. Its view
30
- * stream stays readable, so terminal tasks remain peekable; the
31
- * disposed hook makes any later command fail loudly instead of queueing
32
- * against a finished task.
33
- */
17
+ export type WorkflowToolRunTaskInputRequest = WorkflowToolRunTaskInputRequestBase & ({
18
+ readonly request: TaskInputRequest;
19
+ readonly requests?: never;
20
+ } | {
21
+ readonly request?: never;
22
+ readonly requests: readonly TaskInputRequest[];
23
+ });
24
+ /** Owns lifecycle for one background task and consumes its executor traffic. */
34
25
  export declare function taskRunWorkflow(input: TaskRunWorkflowInput): Promise<void>;
26
+ export {};
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId,readTaskUsage}from"#tasks/types.js";import{appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep}from"#execution/tasks/child/steps.js";import{applyTaskTransition}from"#tasks/transitions.js";import{translateTaskInboundPayload}from"#tasks/wire.js";import{createChannelReader,raceChannelReads}from"#execution/tool-run/owner-channels.js";import{openRunOwnerChannels}from"#execution/tool-run/owner.js";import{runOutcomeToTaskCommand,runReportToTaskUpdate,runRequestToInputRequestPayload}from"#execution/tool-run/owner-inbox.js";function isTaskRunFinished(e,t){return!isTerminalTaskStatus(e.status)||!t?!1:e.status!==`cancelled`||e.executor?.lifecycle===`terminal`}async function taskRunWorkflow(a){"use workflow";let o=createHook({token:a.taskInboxToken}),l=createChannelReader(`commands`,o),u=a.initialView.metadata.kind===`tool`?openRunOwnerChannels(a.taskInboxToken):void 0,d=u===void 0?[l]:[...u.readers,l],f=!1;try{try{await claimHookOwnership(o),f=!0}catch(e){if(isHookConflictError(e))return;throw e}let e=a.initialView,n,s=[],c=[],l=!1,u=0,p=new Map;for(await appendTaskViewStep({activityObserver:a.activityObserver,view:e});!isTaskRunFinished(e,l);){let t=await raceChannelReads(d);if(t.next.done===!0)return;t.channel===`request`&&p.set(t.next.value.answerToken,{runId:t.next.value.from.runId});let r=t.channel===`report`?runReportToTaskUpdate(t.next.value,e.taskId,u++):t.channel===`request`?runRequestToInputRequestPayload(t.next.value):t.channel===`outcome`?{command:runOutcomeToTaskCommand(t.next.value),kind:`task-command`}:t.next.value,o=r.kind===`subagent-authorization-event`?{...r,kind:`authorization-event`}:r;if(o.kind===`authorization-event`&&(o.event.type===`approval.candidate`||o.event.type===`approval.settled`))continue;let f=o.kind===`task-command`&&o.command.kind===`ready`,m=o.kind===`task-command`&&o.command.kind===`reject-dispatch`;if((f||m)&&(l=!0),o.kind===`subagent-input-request`&&(n=o),o.kind===`authorization-event`&&s.push(o),o.kind===`task-update`){l&&!isTerminalTaskStatus(e.status)?await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:o,view:e}):c.push(o);continue}let h=e.status===`cancelled`&&o.kind===`runtime-action-result`,g=o.kind===`input-response`,_;if(h)_={kind:`settle-executor`,usage:readTaskUsage(o.results[0]?.outcome?.usageDelta)};else if(g){if(e.status!==`input_required`)continue;_=await resolveAnsweredCommand(e,o,p.get(o.childContinuationToken))}else _=translateTaskInboundPayload(o);if(_===void 0)continue;if(f&&isTerminalTaskStatus(e.status)){for(let t of c)await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:t,view:e});c=[],await wakeTaskParentStep({token:a.parentContinuationToken,view:e});continue}let v=applyTaskTransition(e,_);if(v.action!==`accepted`)continue;let y=!isTerminalTaskStatus(e.status)&&isTerminalTaskStatus(v.view.status),b=!isReadyTaskStatus(e.status)&&isReadyTaskStatus(v.view.status);e=v.view,await appendTaskViewStep({activityObserver:a.activityObserver,view:e});let x=l&&!y?s:[];for(let t of x)await wakeTaskAuthorizationParentStep({request:t,taskId:e.taskId,token:a.parentContinuationToken});if(l&&c.length>0&&!isTerminalTaskStatus(e.status)){for(let t of c)await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:t,view:e});c=[]}(y||x.length>0)&&(s=[]),n!==void 0&&l&&e.status===`input_required`?(await wakeTaskInputRequestParentStep({request:n,taskId:e.taskId,token:a.parentContinuationToken}),n=void 0):!m&&x.length===0&&l&&(y||b&&n===void 0)&&await wakeTaskParentStep({token:a.parentContinuationToken,view:e}),e.status!==`input_required`&&(n=void 0)}}finally{f&&(await u?.dispose(),await disposeHook(o))}}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));return i.length===0?void 0:await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}export{taskRunWorkflow};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId}from"#tasks/types.js";import{appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAgentRequestParentStep,wakeTaskAuthorizationParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep,wakeWorkflowTaskInputRequestParentStep}from"#execution/tasks/child/steps.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{deriveWorkflowToolRunOwner}from"#execution/tools/workflow/messages.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerChannels}from"#execution/tools/workflow/owner.js";import{workflowToolRunOutcomeToTaskCommand,workflowToolRunReportToTaskUpdate,workflowToolRunRequestToTaskInputRequest}from"#execution/tools/workflow/owner-inbox.js";import{applyTaskTransition}from"#tasks/transitions.js";async function taskRunWorkflow(a){"use workflow";let o=createHook({token:a.taskInboxToken}),c=openWorkflowToolRunOwnerChannels(a.taskInboxToken),l=[...c.readers,createChannelReader(`commands`,o)],u=!1,d=a.initialView,f=!1,p=!1,m,h=[],g=0,_={ownerRequests:[]},v=new Map,y=new AbortController,b,x=a.workflow===void 0;try{try{await claimHookOwnership(o),u=!0}catch(e){if(isHookConflictError(e))return;throw e}for(await appendTaskViewStep({view:d});!isFinished();){let e=await raceChannelReads(b===void 0?l:[...l,b]);if(e.channel===`body`){if(x=!0,b=void 0,e.next.done)continue;await applyPayload({command:workflowToolRunOutcomeToTaskCommand({from:createWorkflowBodyRef({...a.workflow,execution:`background`}),result:e.next.value}),kind:`task-command`}),d.status===`cancelled`&&f&&!p&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d});continue}if(e.next.done)return;if(e.channel===`report`){await applyPayload(workflowToolRunReportToTaskUpdate(e.next.value,d.taskId,g++));continue}if(e.channel===`outcome`){await applyPayload({command:workflowToolRunOutcomeToTaskCommand(e.next.value),kind:`task-command`});continue}if(e.channel===`request`){let t=e.next.value,n=t.request.kind;if(n===`agent-invoke`||n===`agent-settled`||n===`authorization-request`){await handleOwnerRequest(t);continue}t.requestCoordinates===void 0&&v.set(t.replyTo,{runId:t.from.runId}),await applyPayload(workflowToolRunRequestToTaskInputRequest(t));continue}await applyPayload(e.next.value)}}finally{u&&(await c.dispose(),await disposeHook(o))}function isFinished(){return isTerminalTaskStatus(d.status)&&f&&x}async function handleUpdate(e){f&&!isTerminalTaskStatus(d.status)?await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d}):h.push(e)}async function applyPayload(e){let t=e.kind===`task-command`&&e.command.kind===`ready`,n=e.kind===`task-command`&&e.command.kind===`reject-dispatch`;if((t||n)&&(f=!0),n&&(p=!0),(t||n)&&(n||isTerminalTaskStatus(d.status)?x=!0:a.workflow!==void 0&&b===void 0&&!x&&(b=createChannelReader(`body`,awaitBodyResult(executeWorkflowBody({...a.workflow,execution:`background`,owner:deriveWorkflowToolRunOwner(a.taskInboxToken)},y.signal)))),await flushPendingTraffic()),e.kind===`task-input-request`&&(m=e),e.kind===`task-update`){await handleUpdate(e);return}let r;if(e.kind===`input-response`)r=d.status===`input_required`?await resolveAnsweredCommand(d,e,v.get(e.childContinuationToken)):void 0;else if(e.kind===`task-input-request`)r={inputRequests:e.requests??[e.request],kind:`require-input`};else if(e.kind===`task-command`)r=e.command;else return;if(r===void 0)return;if(t&&isTerminalTaskStatus(d.status)){await flushUpdates(!0),await wakeTaskParentStep({token:a.parentContinuationToken,view:d});return}let o=d,s=applyTaskTransition(d,r);s.action===`accepted`&&(d=s.view,await appendTaskViewStep({view:d}),r.kind===`cancel`&&(y.abort(Error(`Task ${d.taskId} was cancelled.`)),b===void 0&&(x=!0)),isTerminalTaskStatus(d.status)||await flushUpdates(),m!==void 0&&f&&d.status===`input_required`?(await wakeWorkflowTaskInputRequestParentStep({request:m,taskId:d.taskId,token:a.parentContinuationToken}),m=void 0):!p&&f&&(r.kind!==`cancel`||x)&&(!isTerminalTaskStatus(o.status)&&isTerminalTaskStatus(d.status)||!isReadyTaskStatus(o.status)&&isReadyTaskStatus(d.status)&&m===void 0)&&await wakeTaskParentStep({token:a.parentContinuationToken,view:d}),d.status!==`input_required`&&(m=void 0))}async function flushUpdates(e=!1){if(!(!f||isTerminalTaskStatus(d.status)&&!e)){for(let e of h)await wakeTaskUpdateParentStep({token:a.parentContinuationToken,update:e,view:d});h=[]}}async function handleOwnerRequest(e){if(!(p||isTerminalTaskStatus(d.status))){if(!f){_.ownerRequests.push(e);return}await wakeTaskOwnerRequestParent(e)}}async function flushPendingTraffic(){if(!p)for(let e of _.ownerRequests)await wakeTaskOwnerRequestParent(e);_.ownerRequests.length=0}async function wakeTaskOwnerRequestParent(e){if(e.request.kind===`authorization-request`){await wakeTaskAuthorizationParentStep({request:e.request,taskId:d.taskId,token:a.parentContinuationToken});return}await wakeTaskAgentRequestParentStep({request:e,taskId:d.taskId,token:a.parentContinuationToken})}}async function*awaitBodyResult(e){yield await e}async function resolveAnsweredCommand(e,t,n){if(t.taskId!==e.taskId)return;let r=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),i=t.inputResponses.map(e=>e.requestId).filter(e=>r.has(e));if(i.length!==0)return await deliverTaskInputResponsesStep({answer:t,answerHook:n,requestIds:i})===`delivered`?{kind:`answered`,requestIds:i}:void 0}export{taskRunWorkflow};
@@ -1,9 +1,7 @@
1
- import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
2
- import { type AgentHandle } from "#harness/handles/store.js";
3
- import type { RuntimeActionResult } from "#shared/action-types.js";
4
- import type { TaskControlInvocation } from "#shared/dispatch-action.js";
1
+ import type { HarnessSession as RuntimeSession } from "#harness/types.js";
2
+ import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#shared/action-types.js";
5
3
  import { type SessionTaskIndexEntry } from "#tasks/session-index.js";
6
- import { type TaskView } from "#tasks/types.js";
4
+ import type { TaskView } from "#tasks/types.js";
7
5
  /**
8
6
  * Result and lookup helpers shared by the task-control executors
9
7
  * (`task_cancel` in the dispatch module,
@@ -20,18 +18,9 @@ export declare function lookupTaskEntries(session: RuntimeSession, taskIds: read
20
18
  /** Reads the latest view of every entry, defaulting to `working`. */
21
19
  export declare function readTaskViews(entries: readonly SessionTaskIndexEntry[]): Promise<TaskView[]>;
22
20
  export declare function readTaskView(entry: SessionTaskIndexEntry): Promise<TaskView>;
23
- /** Finds the persistent address record for one task-owned agent. */
24
- export declare function findTaskAgentAddress(session: RuntimeSession, agentId: string): Extract<AgentHandle, {
25
- phase: "addressed";
26
- }> | undefined;
27
- /** Returns the one nonterminal task owning an agent, if any. */
28
- export declare function findActiveTaskForAgent(session: RuntimeSession, agentId: string, parentTurnId?: string, parentStepIndex?: number): Promise<{
29
- readonly entry: SessionTaskIndexEntry;
30
- readonly view: TaskView;
31
- } | undefined>;
32
21
  /** One successful task-control result carrying full task views. */
33
- export declare function createTaskViewsResult(action: TaskControlInvocation, views: readonly TaskView[]): RuntimeActionResult;
22
+ export declare function createTaskViewsResult(action: RuntimeToolCallActionRequest, views: readonly TaskView[]): RuntimeActionResult;
34
23
  /** One task-control error the model can act on. */
35
- export declare function createTaskControlError(action: TaskControlInvocation, message: string): RuntimeActionResult;
24
+ export declare function createTaskControlError(action: RuntimeToolCallActionRequest, message: string): RuntimeActionResult;
36
25
  /** The ownership error for ids outside this session's task index. */
37
- export declare function createUnknownTasksError(action: TaskControlInvocation, unknown: readonly string[]): RuntimeActionResult;
26
+ export declare function createUnknownTasksError(action: RuntimeToolCallActionRequest, unknown: readonly string[]): RuntimeActionResult;
@@ -1 +1 @@
1
- import{getAgentHandleStore}from"#harness/handles/store.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{findSessionTaskEntry,getSessionTaskIndex}from"#tasks/session-index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{readSubagentTaskMetadata}from"#tasks/types.js";import{taskViewsToJson}from"#tasks/json.js";function lookupTaskEntries(e,t){let r=[],i=[];for(let a of t){let t=findSessionTaskEntry(e.state,a);t===void 0?i.push(a):r.push(t)}return i.length>0?{kind:`unknown`,unknown:i}:{entries:r,kind:`found`}}async function readTaskViews(e){return Promise.all(e.map(readTaskView))}async function readTaskView(e){try{return await readLatestTaskView({taskRunId:e.taskRunId})??createPendingTaskView(e)}catch(t){if(isTaskWorkflowTargetGone(t)&&e.terminalView!==void 0)return e.terminalView;throw t}}function createPendingTaskView(e){let t={metadata:e.metadata,status:`working`,taskId:e.taskId};return e.executor===void 0?t:{...t,executor:{binding:e.executor}}}function findTaskAgentAddress(t,n){return(getAgentHandleStore(t.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===n)}async function findActiveTaskForAgent(e,t,n,i){let o=getSessionTaskIndex(e.state).filter(e=>readSubagentTaskMetadata(e)?.agentId===t),s=await readTaskViews(o);return o.flatMap((e,t)=>{let r=s[t];return r!==void 0&&(e.createdByTurnId===n&&e.createdByStepIndex===i||r.status===`working`||r.status===`input_required`)?[{entry:e,view:r}]:[]})[0]}function createTaskViewsResult(e,t){return{callId:e.callId,kind:`tool-result`,output:taskViewsToJson(t),toolName:e.toolName}}function createTaskControlError(e,t){return{callId:e.callId,isError:!0,kind:`tool-result`,output:{message:t},toolName:e.toolName}}function createUnknownTasksError(e,t){return createTaskControlError(e,`Unknown task ids: ${t.join(`, `)}. Tasks belong to the session that created them.`)}export{createTaskControlError,createTaskViewsResult,createUnknownTasksError,findActiveTaskForAgent,findTaskAgentAddress,lookupTaskEntries,readTaskView,readTaskViews};
1
+ import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{findSessionTaskEntry}from"#tasks/session-index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{taskViewsToJson}from"#tasks/json.js";function lookupTaskEntries(e,n){let r=[],i=[];for(let a of n){let n=findSessionTaskEntry(e.state,a);n===void 0?i.push(a):r.push(n)}return i.length>0?{kind:`unknown`,unknown:i}:{entries:r,kind:`found`}}async function readTaskViews(e){return Promise.all(e.map(readTaskView))}async function readTaskView(t){try{return await readLatestTaskView({taskRunId:t.taskRunId})??createPendingTaskView(t)}catch(e){if(isTaskWorkflowTargetGone(e)&&t.terminalView!==void 0)return t.terminalView;throw e}}function createPendingTaskView(e){let t={metadata:e.metadata,status:`working`,taskId:e.taskId};return e.executor===void 0?t:{...t,executor:{binding:e.executor}}}function createTaskViewsResult(e,t){return{callId:e.callId,kind:`tool-result`,output:taskViewsToJson(t),toolName:e.toolName}}function createTaskControlError(e,t){return{callId:e.callId,isError:!0,kind:`tool-result`,output:{message:t},toolName:e.toolName}}function createUnknownTasksError(e,t){return createTaskControlError(e,`Unknown task ids: ${t.join(`, `)}. Tasks belong to the session that created them.`)}export{createTaskControlError,createTaskViewsResult,createUnknownTasksError,lookupTaskEntries,readTaskView,readTaskViews};
@@ -1,72 +1,41 @@
1
1
  /**
2
- * Delegation policy for the subagent dispatch path: derives task identity,
3
- * builds metadata and the parked-tool-call receipt, records the session
4
- * index, and defines failure semantics for an unacknowledged dispatch.
2
+ * Generic task creation, readiness acknowledgement, and dispatch rejection.
5
3
  * Task-run transport (start/command/view) lives in `run-parent.ts`, which
6
- * this module composes and which other non-delegation callers share.
4
+ * Callers compose these primitives around their own executor policy.
7
5
  */
8
- import type { ActivityObserverConfig } from "#channel/types.js";
9
- import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
10
- import type { RuntimeSubagentChildResult } from "#shared/action-types.js";
6
+ import type { HarnessSession } from "#harness/types.js";
11
7
  import type { JsonValue } from "#shared/json.js";
12
8
  import type { TaskExecutorBinding } from "#tools/task.js";
13
- import { type DurableTaskMetadata } from "#tasks/types.js";
9
+ import { type TaskMetadata } from "#tasks/types.js";
14
10
  /** A prepared background task: identity plus its started durable run. */
15
11
  export interface BackgroundTask {
16
12
  readonly taskInboxToken: string;
17
13
  readonly createdByStepIndex?: number;
18
14
  readonly createdByTurnId: string;
19
15
  readonly executor?: TaskExecutorBinding;
20
- readonly metadata: DurableTaskMetadata;
16
+ readonly metadata: TaskMetadata;
21
17
  readonly taskId: string;
22
18
  readonly taskRunId: string;
23
19
  }
24
- /** A subagent task also carries its deterministic agent-handle operation. */
25
- export interface DelegatedTask extends BackgroundTask {
26
- readonly operationId: string;
27
- }
28
- /**
29
- * Creates the durable task record for one delegated subagent call,
30
- * before the child dispatch side effect. The task must exist first so
31
- * a fast child always finds a live command hook; a duplicate replay
32
- * re-derives the same token and the loser exits on the hook claim.
33
- */
34
- export declare function beginDelegatedTask(input: {
35
- readonly activityObserver?: ActivityObserverConfig;
36
- readonly agentId: string;
20
+ type BackgroundTaskDraft = Omit<BackgroundTask, "taskRunId">;
21
+ /** Derives the replay-stable task identity before its owning run is started. */
22
+ export declare function prepareBackgroundTask(input: {
37
23
  readonly callId: string;
38
- readonly mode: "local" | "remote";
39
- readonly name: string;
24
+ readonly metadata: TaskMetadata;
40
25
  readonly parentSessionId: string;
41
26
  readonly parentStepIndex?: number;
42
27
  readonly parentTurnId: string;
43
- readonly session: RuntimeSession;
44
- }): Promise<DelegatedTask>;
45
- /** Creates a replay-stable task run before a background tool starts external work. */
28
+ readonly session: HarnessSession;
29
+ }): BackgroundTaskDraft;
30
+ /** Starts a lifecycle-only task run for a non-workflow external executor. */
46
31
  export declare function beginBackgroundTask(input: {
47
- readonly activityObserver?: ActivityObserverConfig;
48
32
  readonly callId: string;
49
- readonly metadata: DurableTaskMetadata;
33
+ readonly metadata: TaskMetadata;
50
34
  readonly parentSessionId: string;
51
35
  readonly parentStepIndex?: number;
52
36
  readonly parentTurnId: string;
53
- readonly session: RuntimeSession;
37
+ readonly session: HarnessSession;
54
38
  }): Promise<BackgroundTask>;
55
- /**
56
- * Settles a delegated dispatch that acknowledged a child: persists the task
57
- * in the session index and returns the receipt that resolves the originating
58
- * tool call. Agent identity and routing remain in the persistent address
59
- * record; task state owns execution availability.
60
- */
61
- export declare function settleDelegatedDispatch(input: {
62
- readonly callId: string;
63
- readonly session: RuntimeSession;
64
- readonly subagentName: string;
65
- readonly task: DelegatedTask;
66
- }): Promise<{
67
- readonly receipt: RuntimeSubagentChildResult;
68
- readonly session: RuntimeSession;
69
- }>;
70
39
  /** Releases task events only after the parent session index committed. */
71
40
  export declare function acknowledgeDelegatedTasksStep(input: {
72
41
  readonly tasks: readonly {
@@ -75,13 +44,9 @@ export declare function acknowledgeDelegatedTasksStep(input: {
75
44
  readonly taskRunId: string;
76
45
  }[];
77
46
  }): Promise<void>;
78
- /** Fails an indexed task whose child dispatch was definitively rejected. */
79
- export declare function failDelegatedDispatch(input: {
80
- readonly error: JsonValue;
81
- readonly task: DelegatedTask;
82
- }): Promise<void>;
83
47
  /** Silently terminates a task whose child dispatch failed before parent indexing. */
84
48
  export declare function rejectDelegatedDispatch(input: {
85
49
  readonly error: JsonValue;
86
50
  readonly task: BackgroundTask;
87
51
  }): Promise<void>;
52
+ export {};
@@ -1 +1 @@
1
- import{sessionCommandHookToken}from"#execution/session-command-token.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";import{readLatestTaskView,sendTaskCommand,sendTaskCommandToOwner,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{createSubagentTaskMetadata,isTerminalTaskStatus,readSubagentTaskMetadata}from"#tasks/types.js";import{deriveTaskId,deriveTaskInboxToken}from"#tasks/task-id.js";async function beginDelegatedTask(e){return{...await beginBackgroundTask({activityObserver:e.activityObserver,callId:e.callId,metadata:createSubagentTaskMetadata({agentId:e.agentId,mode:e.mode,name:e.name}),parentSessionId:e.parentSessionId,parentStepIndex:e.parentStepIndex,parentTurnId:e.parentTurnId,session:e.session}),operationId:deriveAgentOperationId({callId:e.callId,parentSessionId:e.parentSessionId,parentTurnId:e.parentTurnId})}}async function beginBackgroundTask(t){let n=deriveTaskId({callId:t.callId,parentSessionId:t.parentSessionId,parentTurnId:t.parentTurnId}),r=deriveTaskInboxToken({parentContinuationToken:t.session.continuationToken,taskId:n});await startTaskRun({activityObserver:t.activityObserver,taskInboxToken:r,initialView:{metadata:t.metadata,status:`working`,taskId:n},parentContinuationToken:sessionCommandHookToken(t.session.sessionId)});let i=await waitForTaskCommandOwner({taskInboxToken:r});return{taskInboxToken:r,createdByStepIndex:t.parentStepIndex??0,createdByTurnId:t.parentTurnId,metadata:t.metadata,taskId:n,taskRunId:i.runId}}async function settleDelegatedDispatch(e){let t=readSubagentTaskMetadata(e.task);if(t===void 0)throw Error(`Task "${e.task.taskId}" is not a subagent task.`);let n={agentId:t.agentId,status:`working`,taskId:e.task.taskId};return{receipt:{backgroundTask:{status:n.status,taskId:n.taskId},callId:e.callId,kind:`subagent-result`,origin:`child`,outcome:{kind:`parked`,result:{kind:`succeeded`,output:`Delegated as background task ${e.task.taskId} (working).`},usageDelta:{cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0}},output:n,subagentName:e.subagentName},session:recordSessionTask(e.session,{taskInboxToken:e.task.taskInboxToken,createdByStepIndex:e.task.createdByStepIndex,createdByTurnId:e.task.createdByTurnId,metadata:e.task.metadata,operationId:e.task.operationId,taskId:e.task.taskId,taskRunId:e.task.taskRunId})}}async function acknowledgeDelegatedTasksStep(e){"use step";for(let t of e.tasks){if(await sendTaskCommandToOwner({command:{kind:`ready`},taskInboxToken:t.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})!==void 0)continue;let e=await readLatestTaskView({taskRunId:t.taskRunId});if(!(e!==void 0&&isTerminalTaskStatus(e.status)))throw Error(`Task run "${t.taskId}" did not accept its readiness command.`)}}async function failDelegatedDispatch(e){await sendTaskCommand({command:{data:e.error,kind:`fail`},taskInboxToken:e.task.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})}async function rejectDelegatedDispatch(e){await sendTaskCommand({command:{data:e.error,kind:`reject-dispatch`},taskInboxToken:e.task.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})}export{acknowledgeDelegatedTasksStep,beginBackgroundTask,beginDelegatedTask,failDelegatedDispatch,rejectDelegatedDispatch,settleDelegatedDispatch};
1
+ import{sessionCommandHookToken}from"#execution/session-command-token.js";import{readLatestTaskView,sendTaskCommand,sendTaskCommandToOwner,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{isTerminalTaskStatus}from"#tasks/types.js";import{deriveTaskId,deriveTaskInboxToken}from"#tasks/task-id.js";function prepareBackgroundTask(e){let t=deriveTaskId({callId:e.callId,parentSessionId:e.parentSessionId,parentTurnId:e.parentTurnId});return{taskInboxToken:deriveTaskInboxToken({parentContinuationToken:e.session.continuationToken,taskId:t}),createdByStepIndex:e.parentStepIndex??0,createdByTurnId:e.parentTurnId,metadata:e.metadata,taskId:t}}async function beginBackgroundTask(t){let n=prepareBackgroundTask(t);await startTaskRun({taskInboxToken:n.taskInboxToken,initialView:{metadata:n.metadata,status:`working`,taskId:n.taskId},parentContinuationToken:sessionCommandHookToken(t.session.sessionId)});let r=await waitForTaskCommandOwner({taskInboxToken:n.taskInboxToken});return{...n,taskRunId:r.runId}}async function acknowledgeDelegatedTasksStep(e){"use step";for(let n of e.tasks){if(await sendTaskCommandToOwner({command:{kind:`ready`},taskInboxToken:n.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})!==void 0)continue;let e=await readLatestTaskView({taskRunId:n.taskRunId});if(!(e!==void 0&&isTerminalTaskStatus(e.status)))throw Error(`Task run "${n.taskId}" did not accept its readiness command.`)}}async function rejectDelegatedDispatch(e){await sendTaskCommand({command:{data:e.error,kind:`reject-dispatch`},taskInboxToken:e.task.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})}export{acknowledgeDelegatedTasksStep,beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch};
@@ -1,24 +1,22 @@
1
- import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
2
1
  import type { ChannelAdapter } from "#channel/adapter.js";
3
- import type { DelegatedTask } from "#execution/tasks/parent/delegate.js";
4
- import type { RuntimeActionResult } from "#shared/action-types.js";
5
- import type { PendingDispatchAction, PendingTaskControlAction } from "#shared/dispatch-action.js";
6
- import type { CompiledBundle } from "#runtime/sessions/runtime-context-keys.js";
2
+ import type { HarnessSession as RuntimeSession } from "#harness/types.js";
3
+ import type { BackgroundTask } from "#execution/tasks/parent/delegate.js";
4
+ import { type TaskExecutorCancel } from "#execution/tasks/parent/task-cancel.js";
5
+ import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#shared/action-types.js";
7
6
  import type { SessionTaskIndexEntry } from "#tasks/session-index.js";
8
- import { type SubagentExecutorData, type TaskView } from "#tasks/types.js";
9
- /** True for task-control calls dispatched outside the model loop. */
10
- export declare function isTaskControlAction(action: PendingDispatchAction): action is PendingTaskControlAction;
11
- /**
12
- * Executes one task-control call inside the dispatch step, which holds
13
- * the durable session state (ownership index) and world access the
14
- * tools need.
15
- *
16
- * Returns the current session alongside the action result.
17
- */
7
+ import { type TaskInboundUpdate, type TaskView } from "#tasks/types.js";
8
+ export type DeliverTaskUpdate = (input: {
9
+ readonly adapter?: ChannelAdapter;
10
+ readonly callback: unknown;
11
+ readonly update: TaskInboundUpdate;
12
+ }) => Promise<string | undefined>;
13
+ export declare function isTaskControlAction(action: RuntimeToolCallActionRequest): boolean;
18
14
  export declare function executeTaskControlAction(input: {
19
- readonly action: PendingTaskControlAction;
15
+ readonly action: RuntimeToolCallActionRequest;
20
16
  readonly adapter?: ChannelAdapter;
21
- readonly bundle: CompiledBundle;
17
+ readonly bundle: import("#runtime/sessions/runtime-context-keys.js").CompiledBundle;
18
+ readonly cancelOwnedWork?: TaskExecutorCancel;
19
+ readonly deliverUpdate?: DeliverTaskUpdate;
22
20
  readonly parentStepIndex?: number;
23
21
  readonly parentTurnId: string;
24
22
  readonly serializedContext?: Record<string, unknown>;
@@ -26,25 +24,12 @@ export declare function executeTaskControlAction(input: {
26
24
  }): Promise<{
27
25
  readonly result: RuntimeActionResult;
28
26
  readonly session: RuntimeSession;
29
- readonly pendingTask?: DelegatedTask;
27
+ readonly pendingTask?: BackgroundTask;
30
28
  }>;
31
- /** Commits task cancellation, then propagates it to the addressed executor. */
29
+ /** Commits cancellation, then stops task-owned child work and its lifecycle run. */
32
30
  export declare function cancelOwnedTask(input: {
33
- readonly bundle: CompiledBundle;
31
+ readonly cancelOwnedWork?: TaskExecutorCancel;
34
32
  readonly entry: SessionTaskIndexEntry;
35
33
  readonly serializedContext?: Record<string, unknown>;
36
- readonly session: RuntimeSession;
34
+ readonly session?: RuntimeSession;
37
35
  }): Promise<TaskView>;
38
- /**
39
- * Sends the cooperative abort to the child identified by a subagent
40
- * executor binding. Failures are logged, never thrown: the task is already
41
- * terminal when this runs, so the worst outcome is a child that runs to
42
- * completion and has its callback refused.
43
- */
44
- export declare function propagateSubagentExecutorCancel(input: {
45
- readonly bundle: CompiledBundle | undefined;
46
- readonly childTurnId?: string;
47
- readonly executor: SubagentExecutorData;
48
- readonly serializedContext?: Record<string, unknown>;
49
- readonly taskId: string;
50
- }): Promise<void>;
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{requestWorkflowTurnCancellation}from"#execution/workflow-runtime.js";import{cancelRemoteAgentTurn,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders}from"#execution/remote-agent-dispatch.js";import{deserializeContext}from"#context/serialize.js";import{cancelToolRun}from"#execution/tool-run/cancel.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{readWorkflowToolExecutor}from"#execution/tool-run/background.js";import{sendTaskCommand}from"#execution/tasks/parent/run-parent.js";import{isTerminalTaskStatus,readSubagentExecutor,readSubagentTaskMetadata}from"#tasks/types.js";import{createTaskControlError,createTaskViewsResult,createUnknownTasksError,findTaskAgentAddress,lookupTaskEntries,readTaskView}from"#execution/tasks/parent/control-shared.js";import{executeTaskUpdate}from"#execution/tasks/child/update.js";const log=createLogger(`execution.tasks.dispatch`);function isTaskControlAction(e){return e.target.kind===`task-cancel`||e.target.kind===`task-update`}async function executeTaskControlAction(e){let{action:t,session:n}=e;if(t.target.kind===`task-update`)return{result:await executeTaskUpdate({action:t,adapter:e.adapter,updateIndex:e.parentStepIndex??0,updateEpoch:e.parentTurnId,serializedContext:e.serializedContext}),session:n};let r=readTaskIds(t.input);if(r===void 0||r.length===0)return{result:createTaskControlError(t,"Provide a non-empty `taskIds` array."),session:n};let i=lookupTaskEntries(n,r);if(i.kind===`unknown`)return{result:createUnknownTasksError(t,i.unknown),session:n};let a=i.entries,o=[];for(let t of a)o.push(await cancelOwnedTask({bundle:e.bundle,entry:t,serializedContext:e.serializedContext,session:n}));return{result:createTaskViewsResult(t,o),session:n}}async function cancelOwnedTask(e){let{entry:t}=e,n=await sendTaskCommand({command:{kind:`cancel`},taskInboxToken:t.taskInboxToken}),r=await readTaskView(t);for(let e=0;e<10&&!isTerminalTaskStatus(r.status);e+=1)await new Promise(e=>setTimeout(e,250)),r=await readTaskView(t);if(!isTerminalTaskStatus(r.status))throw Error(`Task "${t.taskId}" did not commit cancellation before timeout.`);let i=r;return i.status===`cancelled`&&n===`delivered`&&await propagateTaskCancel({bundle:e.bundle,serializedContext:e.serializedContext,entry:t,session:e.session,view:i}),i}async function propagateTaskCancel(e){let t=readWorkflowToolExecutor(e.view.executor?.binding);if(t!==void 0){await cancelToolRun(t,`Task ${e.entry.taskId} was cancelled.`),await sendTaskCommand({command:{kind:`settle-executor`},taskInboxToken:e.entry.taskInboxToken});return}let n=readSubagentTaskMetadata(e.view);if(n===void 0)return;let r=readSubagentExecutor(e.view.executor)??findTaskAgentAddress(e.session,n.agentId);r!==void 0&&(e.view.executor?.childSessionId!==void 0&&e.view.executor.childSessionId!==r.address.sessionId||await propagateSubagentExecutorCancel({bundle:e.bundle,childTurnId:e.view.executor?.childTurnId,executor:r,serializedContext:e.serializedContext,taskId:e.view.taskId}))}async function propagateSubagentExecutorCancel(e){let{address:s,identity:c}=e.executor,l=s.sessionId,u=e.childTurnId;try{if(s.kind===`agent/remote`){if(e.bundle===void 0)throw Error(`No compiled bundle is available to resolve the remote agent.`);let t=s.credentialResolver,n;if(t===void 0&&e.serializedContext!==void 0){let t=getDynamicSubagentSelection(await deserializeContext(e.serializedContext),c.nodeId);n=t?.kind===`remote`?t.remoteAgent:void 0}let d=t===void 0?resolveRemoteAgentForAction({dynamicRemoteAgent:n,nodeId:c.nodeId,remoteAgentName:c.name,registry:e.bundle.subagentRegistry.subagentsByNodeId}):{name:c.name,url:s.url},f=t===void 0&&d.url!==s.url,p=f?{}:t?.resolverId===void 0?t===void 0?void 0:{}:await resolveRemoteAgentStreamHeaders({bundle:e.bundle,name:c.name,resolverId:t.resolverId,url:s.url}),m=f?{name:c.name,url:s.url}:{...d,url:s.url},h={remote:m,sessionId:l,taskId:e.taskId};if(p!==void 0&&(h.headers=p),u!==void 0&&(h.turnId=u),(await cancelRemoteAgentTurn(h)).status===`no_active_turn`){let t={remote:m,sessionId:l,taskId:e.taskId};p!==void 0&&(t.headers=p),await cancelRemoteAgentTurn(t)}return}let t={sessionId:l,taskId:e.taskId};u!==void 0&&(t.turnId=u),(await requestWorkflowTurnCancellation(t)).status===`no_active_turn`&&await requestWorkflowTurnCancellation({sessionId:l,taskId:e.taskId})}catch(n){logError(log,`task cancel propagation failed; the child may run to completion`,n,{childSessionId:l,taskId:e.taskId})}}function readTaskIds(e){let t=e.taskIds;if(Array.isArray(t))return t.filter(e=>typeof e==`string`&&e.trim()!==``)}export{cancelOwnedTask,executeTaskControlAction,isTaskControlAction,propagateSubagentExecutorCancel};
1
+ import{sendTaskCommand}from"#execution/tasks/parent/run-parent.js";import{isTerminalTaskStatus}from"#tasks/types.js";import{createTaskControlError,createTaskViewsResult,createUnknownTasksError,lookupTaskEntries,readTaskView}from"#execution/tasks/parent/control-shared.js";import{cancelTaskOwnedWork}from"#execution/tasks/parent/task-cancel.js";import{TASK_CANCEL_TOOL_NAME,TASK_TOOL_NAMES,TASK_UPDATE_TOOL_NAME}from"#tools/framework/task-contract.js";function isTaskControlAction(e){return e.kind===`tool-call`&&TASK_TOOL_NAMES.has(e.toolName)}async function executeTaskControlAction(e){let{action:t,session:o}=e;if(t.toolName===TASK_UPDATE_TOOL_NAME){let r=t.input.message;if(typeof r!=`string`||r.trim()===``)return{result:createTaskControlError(t,"Provide a non-empty `message`."),session:o};let i={callId:t.callId,kind:`task-update`,message:r,updateEpoch:e.parentTurnId,updateIndex:e.parentStepIndex??0},a=await e.deliverUpdate?.({adapter:e.adapter,callback:e.serializedContext?.[`eve.sessionCallback`],update:i});return{result:a===void 0?createTaskControlError(t,`task_update requires a task-owned session.`):{callId:t.callId,kind:`tool-result`,output:{status:`sent`,taskId:a},toolName:t.toolName},session:o}}let s=readTaskIds(t.input);if(s===void 0||s.length===0)return{result:createTaskControlError(t,"Provide a non-empty `taskIds` array."),session:o};let c=lookupTaskEntries(o,s);if(c.kind===`unknown`)return{result:createUnknownTasksError(t,c.unknown),session:o};if(t.toolName!==TASK_CANCEL_TOOL_NAME)return{result:createTaskControlError(t,`Unsupported task control "${t.toolName}".`),session:o};let l=[];for(let t of c.entries)l.push(await cancelOwnedTask({cancelOwnedWork:e.cancelOwnedWork,entry:t,serializedContext:e.serializedContext,session:o}));return{result:createTaskViewsResult(t,l),session:o}}async function cancelOwnedTask(n){let r=await sendTaskCommand({command:{kind:`cancel`},taskInboxToken:n.entry.taskInboxToken}),i=await readTaskView(n.entry);for(let e=0;e<10&&!isTerminalTaskStatus(i.status);e+=1)await new Promise(e=>setTimeout(e,250)),i=await readTaskView(n.entry);if(!isTerminalTaskStatus(i.status))throw Error(`Task "${n.entry.taskId}" did not commit cancellation before timeout.`);return i.status!==`cancelled`||r!==`delivered`||await cancelTaskOwnedWork({cancelOwnedWork:n.cancelOwnedWork,entry:n.entry,serializedContext:n.serializedContext,session:n.session}),i}function readTaskIds(e){let t=e.taskIds;if(Array.isArray(t))return t.filter(e=>typeof e==`string`&&e.trim()!==``)}export{cancelOwnedTask,executeTaskControlAction,isTaskControlAction};
@@ -1,28 +1,18 @@
1
- import type { SubagentInputRequestHookPayload } from "#channel/types.js";
2
- import type { SubagentAuthorizationEventHookPayload } from "#channel/types.js";
3
1
  import { type DurableSessionState } from "#execution/durable-session-store.js";
4
- import { type TaskView } from "#tasks/types.js";
5
- /** Validates and durably records one task-owned child HITL route batch. */
2
+ import type { TaskInputRequestDelivery, TaskView } from "#tasks/types.js";
3
+ /** Validates and records a generic task-owned workflow request. */
6
4
  export declare function recordTaskInputRequestStep(input: {
7
- readonly hookPayload: SubagentInputRequestHookPayload;
8
- readonly serializedContext: Record<string, unknown>;
5
+ readonly request: TaskInputRequestDelivery;
9
6
  readonly sessionState: DurableSessionState;
10
- readonly taskId: string;
11
7
  }): Promise<{
12
8
  readonly accepted: false;
13
9
  readonly sessionState: DurableSessionState;
14
10
  } | {
15
11
  readonly accepted: true;
16
- readonly hookPayload: SubagentInputRequestHookPayload;
12
+ readonly request: TaskInputRequestDelivery;
17
13
  readonly sessionState: DurableSessionState;
18
14
  }>;
19
- /** Validates that one task authorization event came from its owned child address. */
20
- export declare function acceptTaskAuthorizationEventStep(input: {
21
- readonly hookPayload: SubagentAuthorizationEventHookPayload;
22
- readonly sessionState: DurableSessionState;
23
- readonly taskId: string;
24
- }): Promise<boolean>;
25
- /** Caches terminal task views before their workflow runs can expire. */
15
+ /** Caches terminal task views before their workflow runs expire. */
26
16
  export declare function recordTerminalTaskViewsStep(input: {
27
17
  readonly sessionState: DurableSessionState;
28
18
  readonly views: readonly TaskView[];
@@ -1 +1 @@
1
- import{createEveTaskInputRoutePath}from"#protocol/routes.js";import{isInputRequest}from"#shared/input.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{removeTaskAgentAddressFromState}from"#harness/handles/transitions.js";import{createRemoteTaskInputCallbackUrl}from"#execution/workflow-callback-url.js";import{readDurableSession}from"#execution/durable-session-store.js";import{createTaskInputRequestId,toProxyInputRequestEntries,upsertProxyInputRequestState}from"#harness/proxy-input-requests.js";import{readWorkflowToolExecutor}from"#execution/tool-run/background.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{cacheTerminalTaskView,findSessionTaskEntry}from"#tasks/session-index.js";import{createTaskInputCapabilityToken}from"#execution/task-input-capability.js";import{isTerminalTaskStatus,readSubagentTaskMetadata}from"#tasks/types.js";async function recordTaskInputRequestStep(n){"use step";let r=await readDurableSession(n.sessionState),a=findSessionTaskEntry(r.state,n.taskId);if(a===void 0)return{accepted:!1,sessionState:n.sessionState};let c=await readLatestTaskView({taskRunId:a.taskRunId}),l=n.hookPayload.event.requests.map(e=>e.requestId),u=c?.inputRequests?.map(e=>typeof e==`object`&&e&&!Array.isArray(e)?Reflect.get(e,`requestId`):void 0)??[];if(c?.status!==`input_required`||!n.hookPayload.event.requests.every(isInputRequest)||new Set(l).size!==l.length||l.length!==u.length||l.some((e,t)=>e!==u[t]))return{accepted:!1,sessionState:n.sessionState};let d=readWorkflowToolExecutor(c.executor?.binding);if(d!==void 0&&d.runId!==n.hookPayload.childSessionId)return{accepted:!1,sessionState:n.sessionState};let f=d===void 0?findAddressedTaskHandle(r.state,a):void 0;if(d===void 0){let e=readSubagentTaskMetadata(a),t=readSubagentTaskMetadata(c);if(f===void 0||f.address.sessionId!==n.hookPayload.childSessionId||t?.mode!==(f.address.kind===`agent/remote`?`remote`:`local`)||t.agentId!==e?.agentId||c.executor?.childSessionId!==n.hookPayload.childSessionId)return{accepted:!1,sessionState:n.sessionState}}let p=namespaceTaskInputRequests(n.hookPayload,n.taskId),m=toProxyInputRequestEntries(p,n.taskId).map(([e,t],r)=>{let i=n.hookPayload.event.requests[r].requestId;return[e,{...t,childRequestId:i}]});if(f?.address.kind===`agent/remote`){let t=createRemoteTaskInputCallbackUrl(f.address.url,createEveTaskInputRoutePath(createTaskInputCapabilityToken(n.hookPayload.childContinuationToken)));m=m.map(([e,n])=>[e,{...n,childResponseUrl:t}])}let h=upsertProxyInputRequestState({entries:m,forChildContinuationToken:n.hookPayload.childContinuationToken,state:r.state});return{accepted:!0,hookPayload:p,sessionState:{...n.sessionState,hasProxyInputRequests:!0,snapshot:{session:{...r,state:h},version:n.sessionState.version}}}}function findAddressedTaskHandle(e,t){let r=readSubagentTaskMetadata(t)?.agentId;if(r!==void 0)return(getAgentHandleStore(e)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===r)}function namespaceTaskInputRequests(e,t){return{...e,event:{...e.event,requests:e.event.requests.map(e=>({...e,requestId:createTaskInputRequestId(t,e.requestId)}))}}}async function acceptTaskAuthorizationEventStep(e){"use step";let t=await readDurableSession(e.sessionState),r=findSessionTaskEntry(t.state,e.taskId);if(r===void 0)return!1;let i=readSubagentTaskMetadata(r);if(i===void 0)return!1;let a=(getAgentHandleStore(t.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===i.agentId);if(a?.phase!==`addressed`||a.address.sessionId!==e.hookPayload.childSessionId)return!1;let o=await readLatestTaskView({taskRunId:r.taskRunId}),s=o===void 0?void 0:readSubagentTaskMetadata(o);return o!==void 0&&!isTerminalTaskStatus(o.status)&&o.executor?.childSessionId===e.hookPayload.childSessionId&&s?.agentId===i.agentId}async function recordTerminalTaskViewsStep(e){"use step";let t=await readDurableSession(e.sessionState),n=t.state;for(let t of e.views)if(n=cacheTerminalTaskView(n,t),t.executor?.lifecycle===`terminal`){let e=readSubagentTaskMetadata(t);e!==void 0&&(n=removeTaskAgentAddressFromState(n,e.agentId))}return n===t.state?e.sessionState:{...e.sessionState,snapshot:{session:{...t,state:n},version:e.sessionState.version}}}export{acceptTaskAuthorizationEventStep,recordTaskInputRequestStep,recordTerminalTaskViewsStep};
1
+ import{createEveTaskInputRoutePath}from"#protocol/routes.js";import{isInputRequest}from"#shared/input.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{createTaskInputRequestId,upsertProxyInputRequestState}from"#harness/proxy-input-requests.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{cacheTerminalTaskView,findSessionTaskEntry}from"#tasks/session-index.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{createTaskInputCapabilityToken}from"#execution/task-input-capability.js";import{createRemoteTaskInputCallbackUrl}from"#execution/workflow-callback-url.js";async function recordTaskInputRequestStep(i){"use step";let a=await readDurableSession(i.sessionState),o=findSessionTaskEntry(a.state,i.request.taskId),s=i.request.requests??[i.request.request];if(o===void 0||s.length===0||!s.every(isInputRequest))return{accepted:!1,sessionState:i.sessionState};let c=await readLatestTaskView({taskRunId:o.taskRunId}),l=s.map(e=>e.requestId);if(c?.status!==`input_required`||c.inputRequests.length!==l.length||!c.inputRequests.every((e,t)=>typeof e==`object`&&!!e&&!Array.isArray(e)&&Reflect.get(e,`requestId`)===l[t]))return{accepted:!1,sessionState:i.sessionState};let u=s.map(e=>({...e,requestId:createTaskInputRequestId(i.request.taskId,e.requestId)})),d=getAgentHandleStore(a.state)?.handles.find(e=>e.phase===`claimed`&&e.ownerId===i.request.taskId),f=d?.phase===`claimed`&&d.address.kind===`agent/remote`?createRemoteTaskInputCallbackUrl(d.address.url,createEveTaskInputRoutePath(createTaskInputCapabilityToken(i.request.replyTo))):void 0,p=upsertProxyInputRequestState({entries:s.map((e,t)=>{let n=u[t],r={childContinuationToken:i.request.replyTo,childRequestId:e.requestId,kind:e.kind,taskId:i.request.taskId};return f!==void 0&&(r.childResponseUrl=f),[n.requestId,r]}),forChildContinuationToken:i.request.replyTo,state:a.state});return{accepted:!0,request:i.request.requests===void 0?{...i.request,request:u[0]}:{...i.request,request:void 0,requests:u},sessionState:{...i.sessionState,hasProxyInputRequests:!0,snapshot:{session:{...a,state:p},version:i.sessionState.version}}}}async function recordTerminalTaskViewsStep(e){"use step";let t=await readDurableSession(e.sessionState),r=t;for(let t of e.views){if(findSessionTaskEntry(r.state,t.taskId)===void 0)continue;let e=cacheTerminalTaskView(r.state,t);e!==r.state&&(r={...r,state:e}),r=applyTaskAgentHandleCommand(r,{kind:`release-owner`,ownerId:t.taskId}).session}return r===t?e.sessionState:{...e.sessionState,snapshot:{session:r,version:e.sessionState.version}}}export{recordTaskInputRequestStep,recordTerminalTaskViewsStep};
@@ -3,8 +3,8 @@ import { type TaskCommand, type TaskRunInboundPayload, type TaskView } from "#ta
3
3
  /**
4
4
  * Node-side controls for durable task runs — the generic transport layer.
5
5
  * This module only speaks `TaskCommand`/`TaskView`; it knows nothing about
6
- * subagents, receipts, or the session index. Caller-specific policy (e.g.
7
- * subagent delegation in `delegate.ts`) composes these primitives.
6
+ * executor implementations, receipts, or the session index. Caller-specific
7
+ * policy composes these primitives.
8
8
  *
9
9
  * Every export must be called from inside a `"use step"` body; none of
10
10
  * these are steps themselves so dispatch and tool steps can compose them
@@ -0,0 +1,11 @@
1
+ import type { SessionTaskIndexEntry } from "#tasks/session-index.js";
2
+ export interface TaskExecutorCancelContext {
3
+ readonly entry: SessionTaskIndexEntry;
4
+ readonly serializedContext?: Record<string, unknown>;
5
+ readonly session?: unknown;
6
+ }
7
+ export type TaskExecutorCancel = (input: TaskExecutorCancelContext) => Promise<void>;
8
+ /** Cancels policy-specific work associated with one task. */
9
+ export declare function cancelTaskOwnedWork(input: TaskExecutorCancelContext & {
10
+ readonly cancelOwnedWork?: TaskExecutorCancel;
11
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import{cancelRun,getRun,getWorld}from"#internal/workflow/runtime.js";import{cancelWorkflowToolRun}from"#execution/tools/workflow/cancel.js";import{readWorkflowToolExecutorAddress}from"#execution/tools/workflow/types.js";async function cancelTaskOwnedWork(t){let n=readWorkflowToolExecutorAddress(t.entry.executor);n!==void 0&&await cancelWorkflowToolRun(n,`Task ${t.entry.taskId} was cancelled.`),await t.cancelOwnedWork?.(t);let r=Date.now()+1e3;for(;Date.now()<r;){try{let e=await getRun(t.entry.taskRunId).status;if(e!==`pending`&&e!==`running`)return}catch{return}await new Promise(e=>setTimeout(e,50))}try{await cancelRun(await getWorld(),t.entry.taskRunId,{cancelReason:`Task ${t.entry.taskId} was cancelled.`})}catch{}}export{cancelTaskOwnedWork};
@@ -10,7 +10,7 @@ export declare function runBackgroundStep(ctx: ContextContainer, session: Harnes
10
10
  /**
11
11
  * Makes background tool work transactional with the harness step.
12
12
  *
13
- * Concretely: when the model calls a background tool (e.g. a subagent spawn),
13
+ * Concretely: when the model calls a background tool,
14
14
  * the tool does real external work mid-step — it creates a task run and
15
15
  * delivers commands to its inbox — while the step itself can still fail. This
16
16
  * provider scopes that work to the step so it either lands with the step or
@@ -23,8 +23,7 @@ export declare function runBackgroundStep(ctx: ContextContainer, session: Harnes
23
23
  *
24
24
  * - `commit` — step succeeded. Compensates executions that never settled
25
25
  * (the tool neither delegated nor completed its task), then records the
26
- * task entries and executor-owned session writes onto the session being
27
- * persisted.
26
+ * task entries onto the session being persisted.
28
27
  * - `rollback` — step failed. Compensates incomplete executions, and settled
29
28
  * ones too — unless the cause is turn cancellation: those tasks are already
30
29
  * running, so they are retained for {@link readRetainedBackgroundToolResult}
@@ -1 +1 @@
1
- import{createEveCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{parseJsonValue}from"#shared/json.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{recordTaskAgentAddress}from"#harness/handles/transitions.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{cancelToolRun}from"#execution/tool-run/cancel.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{propagateSubagentExecutorCancel}from"#execution/tasks/parent/dispatch.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{readWorkflowToolExecutor}from"#execution/tool-run/background.js";import{CallbackBaseUrlKey,isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{readSubagentExecutor}from"#tasks/types.js";import{beginBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskDelegated,isTaskDelegated}from"#tools/task.js";function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t,e.get(BundleKey))}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{bundle;executions=new Map;records=[];retained=!1;initialSession;constructor(e,t){this.bundle=t,this.initialSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await compensateBackgroundToolExecution(t,Error(`Background tool execution did not delegate or complete its task.`),this.bundle),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await compensateBackgroundToolExecution(n,e,this.bundle),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await compensateBackgroundToolExecution(t,e,this.bundle)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records){if(!e.settled||e.task===void 0)continue;let n=readSubagentExecutor(e.task.executor);n!==void 0&&(t=recordTaskAgentAddress(t,n)),t=recordSessionTask(t,e.task)}return t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(r){let a={settled:!1};this.records.push(a);let o=getHarnessEmissionState(this.initialSession.state),s=await beginBackgroundTask({callId:r.options.toolCallId,metadata:{kind:`tool`,name:r.definition.name},parentSessionId:this.initialSession.sessionId,parentStepIndex:o.stepIndex,parentTurnId:activeTurnId(o),session:this.initialSession});a.task=s;let c=loadContext().get(CallbackBaseUrlKey),l={taskId:s.taskId,token:s.taskInboxToken,...c===void 0?{}:{url:createWorkflowCallbackUrl(c,createEveCallbackRoutePath(s.taskInboxToken))}},u={batch:r.batch.calls,binding:l,delegated:({executor:e,receipt:t})=>createTaskDelegated({binding:l,executor:e,receipt:t}),send:createTaskSender(s,r.options.toolCallId),session:this.initialSession,task:s},d=r.definition.execute(r.toolInput,r.options,u);if(isAsyncIterable(d))throw Error(`Background tools cannot return AsyncIterable output.`);let f=await d;return isAuthorizationSignal(f)?f:isTaskDelegated(f)?(await deliverTaskCommand(s,{executor:f.executor,kind:`bind`}),a.task={...s,executor:f.executor},a.settled=!0,f.receipt):(await deliverTaskCommand(s,{data:parseJsonValue(f),kind:`complete`}),a.settled=!0,f)}};function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function createTaskSender(e,t){let n=0;return async r=>{if(r.kind!==`update`){await deliverTaskCommand(e,r);return}if(await sendTaskInboundPayload({payload:{callId:t,kind:`task-update`,message:r.message,updateEpoch:e.taskId,updateIndex:n++},taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${r.kind}".`)}}async function compensateBackgroundToolExecution(e,t,n){let r=[];for(let i of e.toReversed()){if(i.task===void 0)continue;try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:i.task})}catch(e){r.push(e)}let e=readSubagentExecutor(i.task.executor);e!==void 0&&await propagateSubagentExecutorCancel({bundle:n,executor:e,taskId:i.task.taskId});let a=readWorkflowToolExecutor(i.task.executor);a!==void 0&&await cancelToolRun(a,`The step that started the tool failed.`)}if(r.length>0)throw AggregateError([t,...r],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
1
+ import{createEveCallbackRoutePath}from"#protocol/routes.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{loadContext}from"#context/container.js";import{parseJsonValue}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{parseWorkflowToolInput}from"#execution/tools/workflow/background.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveAgentOperationId}from"#subagents/handles/operation-id.js";import{getAgentHandleStore,writeHandles}from"#subagents/handles/store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{runStep}from"#context/run-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE,formatAgentBusyMessage}from"#subagents/agent-handle-errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{CallbackBaseUrlKey,isAuthorizationSignal}from"#harness/authorization.js";import{sendTaskCommand,sendTaskInboundPayload,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{applyTaskAgentHandleCommand}from"#subagents/handles/transitions.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{BackgroundToolExecutorKey}from"#harness/background-tools.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createTaskDelegated,isTaskDelegated}from"#tools/task.js";import{beginBackgroundTask,prepareBackgroundTask,rejectDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{createSubagentReceiptIdentity}from"#execution/tools/subagent/receipt-identity.js";const IN_PROCESS_WORKFLOW_EXECUTOR={data:{},kind:`workflow-task`};function runBackgroundStep(e,t,n){return runStep(e,t,n,[backgroundToolExecutionProvider])}const backgroundToolExecutionProvider={key:BackgroundToolExecutorKey,create(e,t){return{value:new BackgroundToolExecutionScope(t)}},async commit(e,t){return await requireExecutionScope(e).commit(t)},async rollback(e,t){await requireExecutionScope(e).rollback(t)},decorateStepResult(e,t){return requireExecutionScope(e).decorate(t)}};function readRetainedBackgroundToolResult(e){let t=e.get(BackgroundToolExecutorKey);return t instanceof BackgroundToolExecutionScope?t.retainedResult():void 0}var BackgroundToolExecutionScope=class{executions=new Map;records=[];agentHandleSession;agentHandlesChanged=!1;retained=!1;initialSession;constructor(e){this.initialSession=e,this.agentHandleSession=e}execute(e){let t=this.executions.get(e.options.toolCallId);if(t!==void 0)return t;if(!e.batch.calls.some(t=>t.callId===e.options.toolCallId))throw Error(`Background tool call "${e.options.toolCallId}" was not registered before execution.`);let n=this.start(e);return this.executions.set(e.options.toolCallId,n),n}async readAgentViews(){return(getAgentHandleStore(this.agentHandleSession.state)?.handles??[]).flatMap(e=>e.phase===`reserved`?[]:e.phase===`available`?[{availability:`available`,id:e.identity.id,name:e.identity.name}]:e.phase===`claimed`?[{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:e.ownerId,taskStatus:`working`}]:[])}async commit(e){let t=this.records.filter(e=>!e.settled);return t.length>0&&await this.compensate(t,Error(`Background tool execution did not delegate or complete its task.`)),this.apply(e)}decorate(e){let t=this.resultFields();return t===void 0?e:{...e,...t}}async rollback(e){let t=this.records.filter(e=>e.settled),n=this.records.filter(e=>!e.settled);if(n.length>0&&await this.compensate(n,e),t.length!==0){if(isTurnCancellation(e)){this.retained=!0;return}await this.compensate(t,e)}}retainedResult(){return this.retained?this.resultFields():void 0}apply(e){let t=e;for(let e of this.records)!e.settled||e.task===void 0||(t=recordSessionTask(t,e.task));return this.agentHandlesChanged&&(t=writeHandles(t,getAgentHandleStore(this.agentHandleSession.state)?.handles??[])),t}resultFields(){let e=this.records.flatMap(e=>e.settled&&e.task!==void 0?[e.task]:[]);if(e.length!==0)return{backgroundTaskSession:this.apply(this.initialSession),backgroundTasks:e.map(({taskInboxToken:e,taskId:t,taskRunId:n})=>({taskInboxToken:e,taskId:t,taskRunId:n}))}}async start(t){let i={settled:!1};this.records.push(i);let a=getHarnessEmissionState(this.initialSession.state),o=loadContext(),c=await this.startTask({ctx:o,emission:a,input:t,record:i}),l=c.task;i.task=l;let u=o.get(CallbackBaseUrlKey),d={taskId:l.taskId,token:l.taskInboxToken,...u===void 0?{}:{url:createWorkflowCallbackUrl(u,createEveCallbackRoutePath(l.taskInboxToken))}},f={batch:t.batch.calls,binding:d,delegated:({executor:e,receipt:t})=>createTaskDelegated({binding:d,executor:e,receipt:t}),send:createTaskSender(l,t.options.toolCallId),session:this.initialSession,task:l};if(t.definition.workflowId!==void 0)return i.settled=!0,{...c.receipt,status:`working`,taskId:l.taskId};let p=t.definition.execute(t.toolInput,t.options,f);if(isAsyncIterable(p))throw Error(`Background tools cannot return AsyncIterable output.`);let m=await p;return isAuthorizationSignal(m)?m:isTaskDelegated(m)?(m.executor!==void 0&&(await deliverTaskCommand(l,{executor:m.executor,kind:`bind`}),i.task={...l,executor:m.executor}),i.settled=!0,c.receipt===void 0?m.receipt:{...m.receipt,...c.receipt}):(await deliverTaskCommand(l,{data:parseJsonValue(m),kind:`complete`}),i.settled=!0,m)}async startTask(e){let n=e.input.definition.workflowId===void 0?void 0:{...e.input.definition,workflowId:e.input.definition.workflowId},r=n===void 0?void 0:parseWorkflowToolInput(e.input.toolInput,e.input.definition.name),a=activeTurnId(e.emission),s=n?.resultKind===`subagent`&&r!==void 0?projectSubagentTask({ctx:e.ctx,input:r,name:e.input.definition.name,nodeId:n.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:a}}):void 0;if(s!==void 0&&s.identity===void 0&&!hasAgentHandle(this.agentHandleSession,s.metadata.agentId)){let{agentId:t,...i}=r;r=i,s=projectSubagentTask({ctx:e.ctx,input:i,name:e.input.definition.name,nodeId:n.nodeId??e.input.definition.name,taskInput:{callId:e.input.options.toolCallId,parentSessionId:this.initialSession.sessionId,parentTurnId:a}})}let l={callId:e.input.options.toolCallId,metadata:s?.metadata??{kind:`tool`,name:e.input.definition.name},parentSessionId:this.initialSession.sessionId,parentStepIndex:e.emission.stepIndex,parentTurnId:a,session:this.initialSession};if(n===void 0)return{task:await beginBackgroundTask({callId:l.callId,metadata:l.metadata,parentSessionId:l.parentSessionId,parentStepIndex:l.parentStepIndex,parentTurnId:l.parentTurnId,session:l.session})};if(r===void 0)throw Error(`Background workflow tool "${e.input.definition.name}" has no input.`);let u=prepareBackgroundTask(l);if(n.resultKind===`subagent`&&s!==void 0&&s.identity!==void 0){let t=s.identity;if(this.applyAgentHandleCommand({identity:t.identity,callId:l.callId,kind:`reserve`,operationId:t.operation.id,ownerId:u.taskId}).kind!==`ready`)throw Error(`Agent handle store rejected start operation "${t.operation.id}".`);e.record.reservation={agentId:t.identity.id,operationId:t.operation.id}}if(n.resultKind===`subagent`&&s!==void 0&&s.identity===void 0){let t=deriveAgentOperationId({callId:l.callId,parentSessionId:l.parentSessionId,parentTurnId:a}),n=this.applyAgentHandleCommand({agentId:s.metadata.agentId,callId:l.callId,expectedTarget:s.metadata.mode,invokedName:s.metadata.name,kind:`claim`,operationId:t,ownerId:u.taskId});readClaimedHandle(n)?e.record.claim={operationId:t,taskId:u.taskId}:throwAgentClaimError(s.metadata.agentId,n)}await startTaskRun({initialView:{metadata:u.metadata,status:`working`,taskId:u.taskId},parentContinuationToken:sessionCommandHookToken(this.initialSession.sessionId),taskInboxToken:u.taskInboxToken,workflow:{callId:l.callId,executeInput:n.executeInput?.(r),input:r,resultKind:n.resultKind,session:buildCallbackContext().session,stepIndex:e.emission.stepIndex,toolName:e.input.definition.name,workflowId:n.workflowId}});let d=await waitForTaskCommandOwner({taskInboxToken:u.taskInboxToken}),f={...u,executor:IN_PROCESS_WORKFLOW_EXECUTOR,taskRunId:d.runId};return e.record.task=f,n.resultKind!==`subagent`||s===void 0?{task:f}:(s.identity,{receipt:s.receipt,task:f})}applyAgentHandleCommand(e){let t=applyTaskAgentHandleCommand(this.agentHandleSession,e);return t.session!==this.agentHandleSession&&(this.agentHandleSession=t.session,this.agentHandlesChanged=!0),t.result}async compensate(e,t){let n=[];for(let r of e.toReversed()){if(r.task!==void 0)try{await rejectDelegatedDispatch({error:{code:`PARENT_STEP_FAILED`,message:t instanceof Error?t.message:String(t)},task:r.task})}catch(e){n.push(e)}r.claim!==void 0&&this.applyAgentHandleCommand({kind:`release-owner`,ownerId:r.claim.taskId}),r.reservation!==void 0&&r.task!==void 0&&this.applyAgentHandleCommand({agentId:r.reservation.agentId,kind:`remove`,ownerId:r.task.taskId})}if(n.length>0)throw AggregateError([t,...n],`Background tool execution failed and its tasks could not all be rejected.`,{cause:t})}};function hasAgentHandle(e,t){return getAgentHandleStore(e.state)?.handles.some(e=>e.identity.id===t)===!0}function projectSubagentTask(e){let t=e.input.agentId;if(typeof t==`string`&&t.trim()!==``)return{metadata:{agentId:t,kind:`subagent`,mode:readSubagentTaskMode(e.ctx,e.nodeId),name:e.name},receipt:{agentId:t}};let n=createSubagentReceiptIdentity({callId:e.taskInput.callId,nodeId:e.nodeId,parentSessionId:e.taskInput.parentSessionId,parentTurnId:e.taskInput.parentTurnId,subagentName:e.name});return{identity:n,metadata:{agentId:n.identity.id,kind:`subagent`,mode:readSubagentTaskMode(e.ctx,e.nodeId),name:e.name},receipt:{agentId:n.identity.id}}}function readSubagentTaskMode(e,t){let n=getDynamicSubagentSelection(e,t);return n===void 0?(e.get(BundleKey)?.subagentRegistry.subagentsByNodeId.get(t))?.definition.kind===`remote`?`remote`:`local`:n.kind===`remote`?`remote`:`local`}function requireExecutionScope(e){if(!(e instanceof BackgroundToolExecutionScope))throw Error(`The background tool executor is not owned by the task runtime.`);return e}async function deliverTaskCommand(e,t){if(await sendTaskCommand({command:t,taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${t.kind}".`)}function createTaskSender(e,t){let n=0;return async r=>{if(r.kind!==`update`){await deliverTaskCommand(e,r);return}if(await sendTaskInboundPayload({payload:{callId:t,kind:`task-update`,message:r.message,updateEpoch:e.taskId,updateIndex:n++},taskInboxToken:e.taskInboxToken})!==`delivered`)throw Error(`Task run "${e.taskId}" did not accept "${r.kind}".`)}}function readClaimedHandle(e){return e.kind===`ready`&&e.handle?.phase===`claimed`}function throwAgentClaimError(e,t){throw t.kind===`mismatch`?Error(JSON.stringify({code:AGENT_MISMATCH,message:`Agent "${e}" no longer matches this subagent definition. Start a new agent instead.`})):t.kind===`busy`?Error(JSON.stringify({code:AGENT_BUSY,message:formatAgentBusyMessage({agentId:e,agentName:t.handle.identity.name,ownerId:`ownerId`in t.handle?t.handle.ownerId:void 0})})):Error(JSON.stringify({code:AGENT_UNREACHABLE,message:`Agent with id "${e}" is no longer reachable.`}))}export{backgroundToolExecutionProvider,readRetainedBackgroundToolResult,runBackgroundStep};
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{cancelRun,getWorld}from"#internal/workflow/runtime.js";import{resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders}from"#execution/remote-agent-dispatch.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{cancelOwnedTask}from"#execution/tasks/parent/dispatch.js";import{getSessionTaskIndex}from"#tasks/session-index.js";const log=createLogger(`execution.terminate-child-sessions`);async function terminateChildSessionsStep(e){"use step";let o;try{o=await readDurableSession(e.sessionState)}catch(n){logError(log,`failed to read child sessions for termination`,n,{parentSessionId:e.sessionState.sessionId});return}let s=readSessionTaskIndex(o.state,o.sessionId),c=getAgentHandleStore(o.state)?.handles??[],l=c.some(e=>e.phase!==`starting`&&e.address.kind===`agent/remote`),u;if(s.length>0||l){if(e.serializedContext===void 0)throw Error(`Child finalization requires serialized runtime context.`);let t=await deserializeContext(e.serializedContext);u={bundle:t.require(BundleKey),ctx:t}}if(s.length>0){let{bundle:n,ctx:r}=u,i=resolveEffectiveAgentRuntime(n,r),a=hydrateDurableSession({durable:o,turnAgent:i.turnAgent});for(let r of s)try{await cancelOwnedTask({bundle:n,entry:r,serializedContext:e.serializedContext,session:a})}catch(e){logError(log,`failed to cancel task during parent finalization`,e,{parentSessionId:o.sessionId,taskId:r.taskId})}}if(c.length!==0)for(let e of c){if(e.phase===`starting`){log.debug(`skipping starting child without a session id`,{agentId:e.identity.id,kind:e.target.kind,parentSessionId:o.sessionId});continue}try{if(e.address.kind===`agent/remote`)if(e.address.credentialResolver!==void 0){let t=e.address.credentialResolver.resolverId;await resetRemoteAgentSession({headers:t===void 0?{}:await resolveRemoteAgentStreamHeaders({bundle:u.bundle,name:e.identity.name,resolverId:t,url:e.address.url}),remote:{name:e.identity.name,url:e.address.url},sessionId:e.address.sessionId})}else{let t=getDynamicSubagentSelection(u.ctx,e.identity.nodeId),n=resolveRemoteAgentForAction({dynamicRemoteAgent:t?.kind===`remote`?t.remoteAgent:void 0,nodeId:e.identity.nodeId,registry:u.bundle.subagentRegistry.subagentsByNodeId,remoteAgentName:e.identity.name});n.url===e.address.url?await resetRemoteAgentSession({remote:n,sessionId:e.address.sessionId}):await resetRemoteAgentSession({headers:{},remote:{name:e.identity.name,url:e.address.url},sessionId:e.address.sessionId})}else await cancelRun(await getWorld(),e.address.sessionId,{cancelReason:`Parent session ended`})}catch(n){logError(log,`failed to terminate child session`,n,{agentId:e.identity.id,childSessionId:e.address.sessionId,kind:e.address.kind,parentSessionId:o.sessionId})}}}function readSessionTaskIndex(e,n){try{return getSessionTaskIndex(e)}catch(e){return logError(log,`failed to read the task index during parent finalization`,e,{parentSessionId:n}),[]}}export{terminateChildSessionsStep};
1
+ import{createLogger,logError}from"#internal/logging.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{cancelRun,getWorld}from"#internal/workflow/runtime.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders}from"#subagents/remote-dispatch.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{cancelOwnedTask}from"#execution/tasks/parent/dispatch.js";import{cancelBackgroundAgentTask}from"#execution/tools/subagent/task-cancel.js";import{getSessionTaskIndex}from"#tasks/session-index.js";const log=createLogger(`execution.terminate-child-sessions`);async function terminateChildSessionsStep(e){"use step";let o;try{o=await readDurableSession(e.sessionState)}catch(n){logError(log,`failed to read child sessions for termination`,n,{parentSessionId:e.sessionState.sessionId});return}let s=readSessionTaskIndex(o.state,o.sessionId),c=getAgentHandleStore(o.state)?.handles??[],l=c.some(e=>`address`in e&&e.address.kind===`agent/remote`),u;if(s.length>0||l){if(e.serializedContext===void 0)throw Error(`Child finalization requires serialized runtime context.`);let t=await deserializeContext(e.serializedContext);u={bundle:t.require(BundleKey),ctx:t}}if(s.length>0){let{bundle:n,ctx:r}=u,i=resolveEffectiveAgentRuntime(n,r),a=hydrateDurableSession({durable:o,turnAgent:i.turnAgent});for(let n of s)try{await cancelOwnedTask({cancelOwnedWork:cancelBackgroundAgentTask,entry:n,serializedContext:e.serializedContext,session:a})}catch(e){logError(log,`failed to cancel task during parent finalization`,e,{parentSessionId:o.sessionId,taskId:n.taskId})}}if(c.length!==0)for(let e of c){if(!(`address`in e)){log.debug(`skipping unaddressed child`,{agentId:e.identity.id,parentSessionId:o.sessionId});continue}try{if(e.address.kind===`agent/remote`)if(e.address.credentialResolver!==void 0){let t=e.address.credentialResolver.resolverId;await resetRemoteAgentSession({headers:t===void 0?{}:await resolveRemoteAgentStreamHeaders({bundle:u.bundle,name:e.identity.name,resolverId:t,url:e.address.url}),remote:{name:e.identity.name,url:e.address.url},sessionId:e.address.sessionId})}else{let t=getDynamicSubagentSelection(u.ctx,e.identity.nodeId),n=resolveRemoteAgentForAction({dynamicRemoteAgent:t?.kind===`remote`?t.remoteAgent:void 0,nodeId:e.identity.nodeId,registry:u.bundle.subagentRegistry.subagentsByNodeId,remoteAgentName:e.identity.name});n.url===e.address.url?await resetRemoteAgentSession({remote:n,sessionId:e.address.sessionId}):await resetRemoteAgentSession({headers:{},remote:{name:e.identity.name,url:e.address.url},sessionId:e.address.sessionId})}else await cancelRun(await getWorld(),e.address.sessionId,{cancelReason:`Parent session ended`})}catch(n){logError(log,`failed to terminate child session`,n,{agentId:e.identity.id,childSessionId:e.address.sessionId,kind:e.address.kind,parentSessionId:o.sessionId})}}}function readSessionTaskIndex(e,n){try{return getSessionTaskIndex(e)}catch(e){return logError(log,`failed to read the task index during parent finalization`,e,{parentSessionId:n}),[]}}export{terminateChildSessionsStep};
@@ -0,0 +1,7 @@
1
+ import { type DurableSessionState } from "#execution/durable-session-store.js";
2
+ import { type TaskAuthorizationEventDelivery } from "#tasks/types.js";
3
+ /** Validates that a task child's authorization event came from an agent the task owns. */
4
+ export declare function acceptTaskAuthorizationEventStep(input: {
5
+ readonly delivery: TaskAuthorizationEventDelivery;
6
+ readonly sessionState: DurableSessionState;
7
+ }): Promise<boolean>;
@@ -0,0 +1 @@
1
+ import{readDurableSession}from"#execution/durable-session-store.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{findSessionTaskEntry}from"#tasks/session-index.js";import{isTerminalTaskStatus}from"#tasks/types.js";async function acceptTaskAuthorizationEventStep(t){"use step";let{hookPayload:n,taskId:r}=t.delivery,i=await readDurableSession(t.sessionState),a=findSessionTaskEntry(i.state,r);if(a===void 0)return!1;let o=getAgentHandleStore(i.state)?.handles??[],s=o.find(e=>e.phase===`claimed`&&e.ownerId===r&&e.identity.name===n.subagentName&&e.address.sessionId===n.childSessionId),c=o.filter(e=>e.phase===`reserved`&&e.ownerId===r&&e.identity.name===n.subagentName);if(s===void 0&&c.length!==1)return!1;let l=await readLatestTaskView({taskRunId:a.taskRunId});return l!==void 0&&!isTerminalTaskStatus(l.status)}export{acceptTaskAuthorizationEventStep};
@@ -0,0 +1,9 @@
1
+ import { type UnstampedMessageStreamEvent } from "#protocol/message.js";
2
+ /** Emits an already-projected task-owned `subagent.called` event on the parent stream. */
3
+ export declare function emitTaskSubagentCalledStep(input: {
4
+ readonly event: UnstampedMessageStreamEvent;
5
+ readonly parentWritable: WritableStream<Uint8Array>;
6
+ readonly serializedContext: Record<string, unknown>;
7
+ }): Promise<{
8
+ readonly serializedContext: Record<string, unknown>;
9
+ }>;
@@ -0,0 +1 @@
1
+ import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{buildAdapterContext}from"#channel/adapter-context.js";async function emitTaskSubagentCalledStep(e){"use step";let t=await deserializeContext(e.serializedContext),n=t.require(ChannelKey),r=await callAdapterEventHandler(n,e.event,buildAdapterContext(n,t)),i=e.parentWritable.getWriter();try{await i.write(encodeMessageStreamEvent(stampMessageStreamEvent(r)))}finally{i.releaseLock()}return{serializedContext:serializeContext(t)}}export{emitTaskSubagentCalledStep};