eve 0.47.6 → 0.48.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 (400) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/src/channel/adapter.js +1 -1
  3. package/dist/src/channel/delivery-metadata.d.ts +1 -0
  4. package/dist/src/channel/delivery-metadata.js +1 -1
  5. package/dist/src/channel/session.js +1 -1
  6. package/dist/src/channel/types.d.ts +10 -8
  7. package/dist/src/chunks/{use-eve-agent-DkUB0Ok4.js → use-eve-agent-BZnOzAVd.js} +25 -6
  8. package/dist/src/chunks/{use-eve-agent-DjYwFJF7.js → use-eve-agent-Bgp6INfi.js} +25 -6
  9. package/dist/src/cli/commands/init.js +1 -1
  10. package/dist/src/cli/commands/integration-connect.d.ts +2 -1
  11. package/dist/src/cli/commands/integration-connect.js +1 -1
  12. package/dist/src/cli/commands/register-integration-commands.d.ts +3 -1
  13. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  14. package/dist/src/cli/commands/registry-declared-setups.js +1 -1
  15. package/dist/src/cli/commands/registry-install-transaction.d.ts +23 -0
  16. package/dist/src/cli/commands/registry-install-transaction.js +1 -0
  17. package/dist/src/cli/commands/registry-package.js +1 -1
  18. package/dist/src/cli/commands/registry.js +1 -1
  19. package/dist/src/cli/commands/setup-headless.d.ts +6 -0
  20. package/dist/src/cli/commands/setup-headless.js +1 -1
  21. package/dist/src/cli/dev/command-options.d.ts +2 -0
  22. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  23. package/dist/src/cli/dev/tui/blocks.js +1 -1
  24. package/dist/src/cli/dev/tui/line-editor.d.ts +4 -0
  25. package/dist/src/cli/dev/tui/line-editor.js +3 -3
  26. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  27. package/dist/src/cli/dev/tui/registry-result-message.d.ts +17 -0
  28. package/dist/src/cli/dev/tui/registry-result-message.js +3 -0
  29. package/dist/src/cli/dev/tui/runner.d.ts +13 -4
  30. package/dist/src/cli/dev/tui/runner.js +1 -1
  31. package/dist/src/cli/dev/tui/setup-commands.d.ts +9 -3
  32. package/dist/src/cli/dev/tui/setup-commands.js +2 -3
  33. package/dist/src/cli/dev/tui/setup-flow.d.ts +15 -5
  34. package/dist/src/cli/dev/tui/setup-panel.d.ts +6 -1
  35. package/dist/src/cli/dev/tui/setup-panel.js +4 -4
  36. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +1 -0
  37. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -1
  38. package/dist/src/cli/dev/tui/stream-format.d.ts +8 -0
  39. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  40. package/dist/src/cli/dev/tui/subagent-pump.d.ts +3 -0
  41. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  42. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  43. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  44. package/dist/src/cli/dev/tui/tui.d.ts +3 -4
  45. package/dist/src/cli/dev/tui/tui.js +1 -1
  46. package/dist/src/cli/run.js +2 -2
  47. package/dist/src/client/agent-info-schema.d.ts +1 -1
  48. package/dist/src/client/agent-info-schema.js +1 -1
  49. package/dist/src/client/open-stream.d.ts +1 -0
  50. package/dist/src/client/open-stream.js +1 -1
  51. package/dist/src/client/session.js +1 -1
  52. package/dist/src/compiled/.vendor-stamp.json +2 -1
  53. package/dist/src/compiled/@opentelemetry/api/index.d.ts +6 -0
  54. package/dist/src/compiled/@workflow/builders/LICENSE.md +201 -0
  55. package/dist/src/compiled/@workflow/builders/index.d.ts +62 -0
  56. package/dist/src/compiled/@workflow/builders/index.js +1 -0
  57. package/dist/src/compiler/extension-compatibility.d.ts +2 -2
  58. package/dist/src/compiler/extension-compatibility.js +1 -1
  59. package/dist/src/compiler/manifest.d.ts +7 -17
  60. package/dist/src/compiler/manifest.js +1 -1
  61. package/dist/src/compiler/normalize-manifest.js +1 -1
  62. package/dist/src/compiler/normalize-tool.d.ts +0 -1
  63. package/dist/src/compiler/normalize-tool.js +1 -1
  64. package/dist/src/context/build-dynamic-tools.d.ts +2 -2
  65. package/dist/src/context/build-dynamic-tools.js +1 -1
  66. package/dist/src/context/container.d.ts +7 -0
  67. package/dist/src/context/container.js +1 -1
  68. package/dist/src/context/dynamic-tool-lifecycle.d.ts +16 -9
  69. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  70. package/dist/src/context/dynamic-tool-metadata.d.ts +44 -0
  71. package/dist/src/context/dynamic-tool-metadata.js +1 -0
  72. package/dist/src/context/keys.d.ts +14 -22
  73. package/dist/src/context/keys.js +1 -1
  74. package/dist/src/eve-channel/index.js +1 -1
  75. package/dist/src/eve-channel/request.d.ts +0 -1
  76. package/dist/src/eve-channel/request.js +2 -2
  77. package/dist/src/eve-channel/types.d.ts +7 -7
  78. package/dist/src/execution/accepted-delivery-deployment.d.ts +7 -0
  79. package/dist/src/execution/accepted-delivery-deployment.js +1 -0
  80. package/dist/src/execution/cancel-descendant-turns-step.d.ts +4 -1
  81. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  82. package/dist/src/execution/create-session-step.js +1 -1
  83. package/dist/src/execution/delegation-tool.d.ts +1 -2
  84. package/dist/src/execution/delegation-tool.js +1 -1
  85. package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +14 -4
  86. package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
  87. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  88. package/dist/src/execution/dispatch-turn-step.js +1 -1
  89. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
  90. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.d.ts +2 -0
  91. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.js +1 -0
  92. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +25 -3
  93. package/dist/src/execution/durable-session-migrations/turn-workflow.js +1 -1
  94. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  95. package/dist/src/execution/finalize-terminal-session.d.ts +17 -0
  96. package/dist/src/execution/finalize-terminal-session.js +1 -0
  97. package/dist/src/execution/inline-turn.d.ts +29 -0
  98. package/dist/src/execution/inline-turn.js +1 -0
  99. package/dist/src/execution/next-driver-action.d.ts +4 -0
  100. package/dist/src/execution/node-step.js +1 -1
  101. package/dist/src/execution/parked-delivery-wait.js +1 -1
  102. package/dist/src/execution/pending-turn-state.d.ts +1 -0
  103. package/dist/src/execution/pending-turn-state.js +1 -1
  104. package/dist/src/execution/prepared-agent-action.d.ts +7 -0
  105. package/dist/src/execution/prepared-agent-action.js +1 -0
  106. package/dist/src/execution/proxied-deliver-step.js +1 -1
  107. package/dist/src/execution/remote-agent-dispatch.d.ts +2 -0
  108. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  109. package/dist/src/execution/session-command-token.d.ts +2 -0
  110. package/dist/src/execution/session-command-token.js +1 -1
  111. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  112. package/dist/src/execution/stable-workflow-names.d.ts +12 -0
  113. package/dist/src/execution/stable-workflow-names.js +1 -0
  114. package/dist/src/execution/subagent-event-proxy-step.d.ts +3 -0
  115. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  116. package/dist/src/execution/subagent-hitl-proxy.d.ts +2 -1
  117. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  118. package/dist/src/execution/subagent-start-local.d.ts +3 -0
  119. package/dist/src/execution/subagent-start-local.js +1 -1
  120. package/dist/src/execution/subagent-start-remote.d.ts +2 -0
  121. package/dist/src/execution/subagent-start-remote.js +1 -1
  122. package/dist/src/execution/subagent-tool.d.ts +1 -0
  123. package/dist/src/execution/subagent-tool.js +1 -1
  124. package/dist/src/execution/tasks/child/steps.d.ts +2 -0
  125. package/dist/src/execution/tasks/child/steps.js +1 -1
  126. package/dist/src/execution/tasks/child/update.d.ts +3 -2
  127. package/dist/src/execution/tasks/child/workflow.js +1 -1
  128. package/dist/src/execution/tasks/parent/control-shared.d.ts +5 -4
  129. package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
  130. package/dist/src/execution/tasks/parent/dispatch.d.ts +4 -3
  131. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  132. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  133. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  134. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  135. package/dist/src/execution/terminal-session-event.d.ts +13 -0
  136. package/dist/src/execution/terminal-session-event.js +1 -0
  137. package/dist/src/execution/terminal-session-failure-step.d.ts +1 -0
  138. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  139. package/dist/src/execution/tool-run/answer.d.ts +3 -0
  140. package/dist/src/execution/tool-run/answer.js +1 -0
  141. package/dist/src/execution/tool-run/background.d.ts +14 -0
  142. package/dist/src/execution/tool-run/background.js +1 -0
  143. package/dist/src/execution/tool-run/cancel.d.ts +7 -0
  144. package/dist/src/execution/tool-run/cancel.js +1 -0
  145. package/dist/src/execution/tool-run/dispatch.d.ts +24 -0
  146. package/dist/src/execution/tool-run/dispatch.js +1 -0
  147. package/dist/src/execution/tool-run/emit-run-report-step.d.ts +7 -0
  148. package/dist/src/execution/tool-run/emit-run-report-step.js +1 -0
  149. package/dist/src/execution/tool-run/messages.d.ts +70 -0
  150. package/dist/src/execution/tool-run/messages.js +1 -0
  151. package/dist/src/execution/tool-run/owner-channels.d.ts +29 -0
  152. package/dist/src/execution/tool-run/owner-channels.js +1 -0
  153. package/dist/src/execution/tool-run/owner-inbox.d.ts +11 -0
  154. package/dist/src/execution/tool-run/owner-inbox.js +1 -0
  155. package/dist/src/execution/tool-run/owner.d.ts +13 -0
  156. package/dist/src/execution/tool-run/owner.js +1 -0
  157. package/dist/src/execution/tool-run/resume-hook-step.d.ts +4 -0
  158. package/dist/src/execution/tool-run/resume-hook-step.js +1 -0
  159. package/dist/src/execution/tool-run/run-control.d.ts +18 -0
  160. package/dist/src/execution/tool-run/run-control.js +1 -0
  161. package/dist/src/execution/tool-run/start.d.ts +11 -0
  162. package/dist/src/execution/tool-run/start.js +1 -0
  163. package/dist/src/execution/tool-run/types.d.ts +21 -0
  164. package/dist/src/execution/tool-run/types.js +1 -0
  165. package/dist/src/execution/tool-run/workflow.d.ts +9 -0
  166. package/dist/src/execution/tool-run/workflow.js +1 -0
  167. package/dist/src/execution/tools/subagent/local.d.ts +3 -4
  168. package/dist/src/execution/tools/subagent/local.js +1 -1
  169. package/dist/src/execution/tools/subagent/remote.d.ts +4 -1
  170. package/dist/src/execution/tools/subagent/remote.js +1 -1
  171. package/dist/src/execution/turn-cancellation-control.d.ts +2 -0
  172. package/dist/src/execution/turn-cancellation-control.js +1 -1
  173. package/dist/src/execution/turn-control-receiver.js +1 -1
  174. package/dist/src/execution/turn-dispatch.d.ts +4 -2
  175. package/dist/src/execution/turn-dispatch.js +1 -1
  176. package/dist/src/execution/turn-execution-cursor.js +1 -1
  177. package/dist/src/execution/turn-workflow.js +1 -1
  178. package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
  179. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  180. package/dist/src/execution/wire/session-inbox-encoder.d.ts +6 -2
  181. package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
  182. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  183. package/dist/src/execution/wire/session-inbox-wire.js +1 -1
  184. package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
  185. package/dist/src/execution/wire/session-inbox-wire.v2-migration.d.ts +0 -2
  186. package/dist/src/execution/wire/session-inbox-wire.v2-migration.js +1 -1
  187. package/dist/src/execution/wire/session-inbox-wire.v2.migration.d.ts +3 -0
  188. package/dist/src/execution/wire/session-inbox-wire.v2.migration.js +1 -0
  189. package/dist/src/execution/wire/session-inbox-wire.v3.d.ts +480 -0
  190. package/dist/src/execution/wire/session-inbox-wire.v3.js +1 -0
  191. package/dist/src/execution/wire/session-inbox-wire.v3.migration.d.ts +3 -0
  192. package/dist/src/execution/wire/session-inbox-wire.v3.migration.js +1 -0
  193. package/dist/src/execution/workflow-entry-finalization.d.ts +22 -0
  194. package/dist/src/execution/workflow-entry-finalization.js +1 -0
  195. package/dist/src/execution/workflow-entry.d.ts +1 -1
  196. package/dist/src/execution/workflow-entry.js +1 -1
  197. package/dist/src/execution/workflow-registry.d.ts +5 -0
  198. package/dist/src/execution/workflow-registry.js +1 -0
  199. package/dist/src/execution/workflow-runtime.d.ts +9 -11
  200. package/dist/src/execution/workflow-runtime.js +1 -1
  201. package/dist/src/execution/workflow-steps.js +1 -1
  202. package/dist/src/execution/workflow-webhook-route.d.ts +4 -0
  203. package/dist/src/execution/workflow-webhook-route.js +1 -0
  204. package/dist/src/framework/sources/registry.js +1 -1
  205. package/dist/src/harness/advertised-tools.d.ts +3 -0
  206. package/dist/src/harness/advertised-tools.js +1 -1
  207. package/dist/src/harness/approval-delivery-coordinator.d.ts +6 -0
  208. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  209. package/dist/src/harness/attachment-staging.js +1 -1
  210. package/dist/src/harness/background-tools.d.ts +2 -0
  211. package/dist/src/harness/emission.js +1 -1
  212. package/dist/src/harness/execute-tool.d.ts +2 -28
  213. package/dist/src/harness/hitl/pending-input-resolution.js +1 -1
  214. package/dist/src/harness/input-extraction.d.ts +3 -0
  215. package/dist/src/harness/input-extraction.js +1 -1
  216. package/dist/src/harness/input-requests.js +1 -1
  217. package/dist/src/harness/messages.js +1 -1
  218. package/dist/src/harness/proxy-input-requests.d.ts +10 -0
  219. package/dist/src/harness/proxy-input-requests.js +1 -1
  220. package/dist/src/harness/runtime-actions.d.ts +11 -3
  221. package/dist/src/harness/runtime-actions.js +1 -1
  222. package/dist/src/harness/session-limit-enforcement.js +1 -1
  223. package/dist/src/harness/stale-input-responses.d.ts +2 -1
  224. package/dist/src/harness/stale-input-responses.js +1 -1
  225. package/dist/src/harness/subagent-depth.d.ts +3 -4
  226. package/dist/src/harness/subagent-depth.js +1 -1
  227. package/dist/src/harness/tool-loop.js +2 -2
  228. package/dist/src/harness/tool-runs.d.ts +21 -0
  229. package/dist/src/harness/tool-runs.js +1 -0
  230. package/dist/src/harness/tools.d.ts +0 -2
  231. package/dist/src/harness/tools.js +1 -1
  232. package/dist/src/harness/types.d.ts +6 -7
  233. package/dist/src/harness/workflow-runtime-action-state.d.ts +3 -3
  234. package/dist/src/harness/workflow-runtime-action-state.js +1 -1
  235. package/dist/src/harness/workflow-sandbox.js +1 -1
  236. package/dist/src/harness/workflow-subagent-limit.d.ts +4 -4
  237. package/dist/src/instrumentation/ai-sdk-telemetry.d.ts +1 -0
  238. package/dist/src/instrumentation/ai-sdk-telemetry.js +1 -1
  239. package/dist/src/instrumentation/content-policy.d.ts +3 -1
  240. package/dist/src/instrumentation/content-policy.js +1 -1
  241. package/dist/src/instrumentation/runtime.d.ts +5 -2
  242. package/dist/src/instrumentation/runtime.js +1 -1
  243. package/dist/src/internal/application/build-output-environment.d.ts +2 -0
  244. package/dist/src/internal/application/build-output-environment.js +1 -0
  245. package/dist/src/internal/application/package.js +1 -1
  246. package/dist/src/internal/application/paths.d.ts +1 -2
  247. package/dist/src/internal/application/paths.js +1 -1
  248. package/dist/src/internal/attachments/errors.d.ts +3 -0
  249. package/dist/src/internal/authored-definition/schema-backed.d.ts +6 -2
  250. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  251. package/dist/src/internal/authored-module-loader.d.ts +7 -1
  252. package/dist/src/internal/authored-module-loader.js +3 -3
  253. package/dist/src/internal/authored-package-boundary.js +1 -1
  254. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  255. package/dist/src/internal/authored-runtime-modules.js +1 -1
  256. package/dist/src/internal/client-context.d.ts +2 -0
  257. package/dist/src/internal/client-context.js +1 -0
  258. package/dist/src/internal/nitro/dev-client-address.d.ts +2 -0
  259. package/dist/src/internal/nitro/dev-client-address.js +1 -1
  260. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  261. package/dist/src/internal/nitro/development-generation.js +1 -1
  262. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  263. package/dist/src/internal/nitro/host/dev-authored-source-watcher.d.ts +2 -2
  264. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  265. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  266. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  267. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  268. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  269. package/dist/src/internal/workflow-bundle/authored-workflow-directives.d.ts +17 -0
  270. package/dist/src/internal/workflow-bundle/authored-workflow-directives.js +1 -0
  271. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +19 -0
  272. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -0
  273. package/dist/src/internal/workflow-bundle/builder-support.d.ts +17 -2
  274. package/dist/src/internal/workflow-bundle/builder-support.js +4 -3
  275. package/dist/src/internal/workflow-bundle/builder.d.ts +2 -2
  276. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  277. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.d.ts +2 -0
  278. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.js +1 -1
  279. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +3 -0
  280. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  281. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  282. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +6 -2
  283. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  284. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +3 -0
  285. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  286. package/dist/src/internal/workflow-bundle/workflow-directive-ast.d.ts +7 -0
  287. package/dist/src/internal/workflow-bundle/workflow-directive-ast.js +1 -0
  288. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +15 -1
  289. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -4
  290. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  291. package/dist/src/protocol/baggage.d.ts +6 -0
  292. package/dist/src/protocol/baggage.js +1 -0
  293. package/dist/src/protocol/routes.d.ts +2 -2
  294. package/dist/src/public/channels/slack/attachments.js +1 -1
  295. package/dist/src/public/channels/teams/attachments.d.ts +2 -2
  296. package/dist/src/public/channels/teams/attachments.js +1 -1
  297. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  298. package/dist/src/public/channels/telegram/attachments.js +1 -1
  299. package/dist/src/public/definitions/remote-agent.d.ts +6 -3
  300. package/dist/src/public/local-dev.d.ts +9 -0
  301. package/dist/src/public/local-dev.js +1 -0
  302. package/dist/src/public/next/vercel-output-config.js +1 -1
  303. package/dist/src/public/workflow/index.d.ts +3 -0
  304. package/dist/src/public/workflow/index.js +1 -0
  305. package/dist/src/public/workflow-modules.d.js +1 -0
  306. package/dist/src/public/workflow-modules.d.ts +11 -0
  307. package/dist/src/runtime/actions/keys.d.ts +3 -0
  308. package/dist/src/runtime/actions/keys.js +1 -1
  309. package/dist/src/runtime/agent/bootstrap.js +1 -1
  310. package/dist/src/runtime/loaders/bundled-artifacts.js +1 -1
  311. package/dist/src/runtime/local-dev-capability.d.ts +55 -0
  312. package/dist/src/runtime/local-dev-capability.js +1 -0
  313. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  314. package/dist/src/runtime/resolve-agent.js +1 -1
  315. package/dist/src/runtime/resolve-tool.js +1 -1
  316. package/dist/src/runtime/sessions/runtime-session.d.ts +1 -0
  317. package/dist/src/runtime/sessions/runtime-session.js +1 -1
  318. package/dist/src/runtime/sessions/turn.d.ts +3 -0
  319. package/dist/src/runtime/subagents/registry.js +1 -1
  320. package/dist/src/runtime/tools/registry.d.ts +1 -0
  321. package/dist/src/runtime/tools/registry.js +1 -1
  322. package/dist/src/runtime/types.d.ts +2 -2
  323. package/dist/src/services/dev-client/client-options.d.ts +1 -0
  324. package/dist/src/services/dev-client/client-options.js +1 -1
  325. package/dist/src/services/dev-client/runtime-artifacts.d.ts +2 -0
  326. package/dist/src/services/dev-client/runtime-artifacts.js +1 -1
  327. package/dist/src/setup/connection-connector.d.ts +4 -2
  328. package/dist/src/setup/connection-connector.js +2 -2
  329. package/dist/src/setup/flows/login.js +1 -1
  330. package/dist/src/setup/flows/model.js +1 -1
  331. package/dist/src/setup/flows/provider.d.ts +5 -0
  332. package/dist/src/setup/flows/provider.js +4 -4
  333. package/dist/src/setup/flows/registry-session.d.ts +24 -7
  334. package/dist/src/setup/flows/registry-session.js +1 -1
  335. package/dist/src/setup/flows/registry.d.ts +35 -29
  336. package/dist/src/setup/flows/registry.js +2 -1
  337. package/dist/src/setup/integrations/web/setup.d.ts +0 -2
  338. package/dist/src/setup/integrations/web/setup.js +1 -1
  339. package/dist/src/setup/prompter.d.ts +24 -4
  340. package/dist/src/setup/prompter.js +1 -1
  341. package/dist/src/setup/scaffold/create/project.js +2 -2
  342. package/dist/src/setup/vercel-project.js +0 -0
  343. package/dist/src/shared/dispatch-action.d.ts +30 -0
  344. package/dist/src/shared/dispatch-action.js +1 -0
  345. package/dist/src/shared/forwarded-trace-policy.d.ts +28 -0
  346. package/dist/src/shared/forwarded-trace-policy.js +1 -0
  347. package/dist/src/shared/instrumentation-decision.d.ts +3 -0
  348. package/dist/src/shared/instrumentation-decision.js +1 -1
  349. package/dist/src/shared/workflow-sandbox.d.ts +1 -1
  350. package/dist/src/svelte/index.js +1 -1
  351. package/dist/src/svelte/use-eve-agent.js +1 -1
  352. package/dist/src/tasks/json.js +1 -1
  353. package/dist/src/tools/behavior.d.ts +61 -0
  354. package/dist/src/tools/behavior.js +1 -0
  355. package/dist/src/tools/definition.d.ts +39 -3
  356. package/dist/src/tools/durable-callbacks.d.ts +1 -0
  357. package/dist/src/tools/framework/agent.d.ts +2 -11
  358. package/dist/src/tools/framework/agent.js +1 -1
  359. package/dist/src/tools/framework/ask-question.d.ts +2 -14
  360. package/dist/src/tools/framework/ask-question.js +1 -1
  361. package/dist/src/tools/framework/task-cancel.d.ts +2 -7
  362. package/dist/src/tools/framework/task-cancel.js +1 -1
  363. package/dist/src/tools/framework/task-contract.d.ts +0 -2
  364. package/dist/src/tools/framework/task-contract.js +1 -1
  365. package/dist/src/tools/framework/task-update.d.ts +2 -7
  366. package/dist/src/tools/framework/task-update.js +1 -1
  367. package/dist/src/tools/native-definition.d.ts +6 -0
  368. package/dist/src/tools/native-definition.js +1 -0
  369. package/dist/src/tools/provided/load-skill.js +1 -1
  370. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  371. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  372. package/dist/src/tracing/agent-otel-provider.js +2 -2
  373. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  374. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  375. package/dist/src/tracing/agent-trace-context-store.d.ts +1 -1
  376. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  377. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  378. package/dist/src/tracing/otel-declaration.d.ts +5 -3
  379. package/dist/src/tracing/otel-registration.d.ts +3 -1
  380. package/dist/src/tracing/otel-registration.js +1 -1
  381. package/dist/src/vue/index.js +1 -1
  382. package/dist/src/vue/use-eve-agent.js +1 -1
  383. package/docs/channels/custom.mdx +2 -0
  384. package/docs/channels/eve.mdx +5 -1
  385. package/docs/channels/teams.mdx +6 -1
  386. package/docs/concepts/sessions-runs-and-streaming.md +4 -2
  387. package/docs/guides/auth-and-route-protection.md +5 -1
  388. package/docs/guides/client/messages.mdx +6 -0
  389. package/docs/guides/dev-tui.md +30 -18
  390. package/docs/guides/remote-agents.md +25 -0
  391. package/docs/reference/cli.md +2 -2
  392. package/docs/reference/typescript-api.md +24 -0
  393. package/docs/tools/meta.json +1 -1
  394. package/docs/tools/overview.mdx +7 -0
  395. package/docs/tools/workflows.mdx +288 -0
  396. package/package.json +17 -1
  397. package/dist/src/execution/tools/tasks.d.ts +0 -18
  398. package/dist/src/execution/tools/tasks.js +0 -1
  399. package/dist/src/internal/authored-directive-prologue.d.ts +0 -4
  400. package/dist/src/internal/authored-directive-prologue.js +0 -1
@@ -1 +1 @@
1
- import{readDurableSession,replaceDurableSessionSnapshot}from"#execution/durable-session-store.js";import{createTaskInputRequestId,retireProxyInputRequests}from"#harness/proxy-input-requests.js";import{coalesceDeliverPayloads}from"#execution/deliver-payloads.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{sendTaskInboundPayload}from"#execution/tasks/parent/run-parent.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{findSessionTaskEntry}from"#tasks/session-index.js";async function routeProxiedDeliverStep(n){"use step";let l=await readDurableSession(n.sessionState),u=!(`delivery`in n),d=`delivery`in n?n.delivery:{auth:n.auth,kind:`deliver`,payloads:[n.payload]},f=new Map,p=new Map,m;for(let[e,t]of d.payloads.entries()){let n=routeDeliverPayload({allowRoute:(e,t)=>t.taskId===void 0||findSessionTaskEntry(l.state,t.taskId)!==void 0,payload:t,state:l.state});m??=n.parentAction,n.forSelf!==void 0&&f.set(e,n.forSelf);for(let[t,r]of n.forChildren.entries()){let i=r.taskId===void 0?r.childContinuationToken:[r.childContinuationToken,r.childResponseUrl??``,r.taskId].join(`\0`),a=p.get(i)??{childContinuationToken:r.childContinuationToken,childResponseUrl:r.childResponseUrl,metadata:[],payloads:[],retireRequestIds:[],sourcePayloadIndexes:[],taskId:r.taskId},o=a.payloads.length;if(a.payloads.push(r.payload),a.retireRequestIds.push(...r.retireRequestIds),a.sourcePayloadIndexes.push(e),n.forSelf===void 0&&t===0)for(let t of d.deliveryMetadata??[])t.payloadIndex===e&&a.metadata.push({...t,payloadIndex:o});p.set(i,a)}}let h=!1;for(let e of p.values()){let t=e.taskId;if(t!==void 0){let n=findSessionTaskEntry(l.state,t);if(n===void 0){mergeStrandedResponses(f,e,t);continue}if(await sendTaskInboundPayload({taskInboxToken:n.taskInboxToken,payload:{auth:d.auth,childContinuationToken:e.childContinuationToken,childResponseUrl:e.childResponseUrl,inputResponses:coalesceDeliverPayloads(e.payloads).inputResponses??[],kind:`input-response`,taskId:t}})===`unreachable`){mergeStrandedResponses(f,e,t);continue}l=retireProxyInputRequests(l,e.retireRequestIds),h=!0;continue}let n={...d,deliveryMetadata:e.metadata.length===0?void 0:e.metadata,payloads:e.payloads};await resumeSessionInbox(e.childContinuationToken,n),l=retireProxyInputRequests(l,e.retireRequestIds),h=!0}let g={serializedContext:n.serializedContext??{},sessionState:h?replaceDurableSessionSnapshot({session:l,state:n.sessionState}):n.sessionState};if(m!==void 0)return{...g,...m};let _=[...f].sort(([e],[t])=>e-t),v=_.flatMap(([e],t)=>(d.deliveryMetadata??[]).filter(t=>t.payloadIndex===e).map(e=>({...e,payloadIndex:t}))),y=_.length===0?void 0:u?coalesceDeliverPayloads(_.map(([,e])=>e)):{...d,deliveryMetadata:v.length===0?void 0:v,payloads:_.map(([,e])=>e)};return{...g,kind:`continue`,remainder:y}}function mergeStrandedResponses(e,t,r){for(let[i,a]of t.payloads.entries()){let o=t.sourcePayloadIndexes[i];if(o===void 0)continue;let s=(a.inputResponses??[]).map(e=>({...e,requestId:createTaskInputRequestId(r,e.requestId)}));if(s.length===0)continue;let c=e.get(o);e.set(o,{...c,inputResponses:[...c?.inputResponses??[],...s]})}}export{routeProxiedDeliverStep};
1
+ import{readDurableSession,replaceDurableSessionSnapshot}from"#execution/durable-session-store.js";import{createTaskInputRequestId,retireProxyInputRequests}from"#harness/proxy-input-requests.js";import{coalesceDeliverPayloads}from"#execution/deliver-payloads.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{sendTaskInboundPayload}from"#execution/tasks/parent/run-parent.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{resumeToolRunAnswers}from"#execution/tool-run/answer.js";import{findSessionTaskEntry}from"#tasks/session-index.js";async function routeProxiedDeliverStep(n){"use step";let l=await readDurableSession(n.sessionState),u=!(`delivery`in n),d=`delivery`in n?n.delivery:{auth:n.auth,kind:`deliver`,payloads:[n.payload]},f=new Map,p=new Map,m;for(let[e,t]of d.payloads.entries()){let n=routeDeliverPayload({allowRoute:(e,t)=>t.taskId===void 0||findSessionTaskEntry(l.state,t.taskId)!==void 0,payload:t,state:l.state});m??=n.parentAction,n.forSelf!==void 0&&f.set(e,n.forSelf);for(let[t,r]of n.forChildren.entries()){let i=r.taskId===void 0?r.childContinuationToken:[r.childContinuationToken,r.childResponseUrl??``,r.taskId].join(`\0`),a=p.get(i)??{answerHook:r.answerHook,childContinuationToken:r.childContinuationToken,childResponseUrl:r.childResponseUrl,metadata:[],payloads:[],retireRequestIds:[],sourcePayloadIndexes:[],taskId:r.taskId},o=a.payloads.length;if(a.payloads.push(r.payload),a.retireRequestIds.push(...r.retireRequestIds),a.sourcePayloadIndexes.push(e),n.forSelf===void 0&&t===0)for(let t of d.deliveryMetadata??[])t.payloadIndex===e&&a.metadata.push({...t,payloadIndex:o});p.set(i,a)}}let h=!1;for(let e of p.values()){let t=e.taskId;if(t!==void 0){let n=findSessionTaskEntry(l.state,t);if(n===void 0){mergeStrandedResponses(f,e,t);continue}if(await sendTaskInboundPayload({taskInboxToken:n.taskInboxToken,payload:{auth:d.auth,childContinuationToken:e.childContinuationToken,childResponseUrl:e.childResponseUrl,inputResponses:coalesceDeliverPayloads(e.payloads).inputResponses??[],kind:`input-response`,taskId:t}})===`unreachable`){mergeStrandedResponses(f,e,t);continue}l=retireProxyInputRequests(l,e.retireRequestIds),h=!0;continue}if(e.answerHook!==void 0){await resumeToolRunAnswers(e.childContinuationToken,coalesceDeliverPayloads(e.payloads).inputResponses),l=retireProxyInputRequests(l,e.retireRequestIds),h=!0;continue}let n={...d,deliveryMetadata:e.metadata.length===0?void 0:e.metadata,payloads:e.payloads};await resumeSessionInbox(e.childContinuationToken,n),l=retireProxyInputRequests(l,e.retireRequestIds),h=!0}let g={serializedContext:n.serializedContext??{},sessionState:h?replaceDurableSessionSnapshot({session:l,state:n.sessionState}):n.sessionState};if(m!==void 0)return{...g,...m};let _=[...f].sort(([e],[t])=>e-t),v=_.flatMap(([e],t)=>(d.deliveryMetadata??[]).filter(t=>t.payloadIndex===e).map(e=>({...e,payloadIndex:t}))),y=_.length===0?void 0:u?coalesceDeliverPayloads(_.map(([,e])=>e)):{...d,deliveryMetadata:v.length===0?void 0:v,payloads:_.map(([,e])=>e)};return{...g,kind:`continue`,remainder:y}}function mergeStrandedResponses(e,t,r){for(let[i,a]of t.payloads.entries()){let o=t.sourcePayloadIndexes[i];if(o===void 0)continue;let s=(a.inputResponses??[]).map(e=>({...e,requestId:createTaskInputRequestId(r,e.requestId)}));if(s.length===0)continue;let c=e.get(o);e.set(o,{...c,inputResponses:[...c?.inputResponses??[],...s]})}}export{routeProxiedDeliverStep};
@@ -1,5 +1,6 @@
1
1
  import { type ResetResponse } from "#protocol/reset-session.js";
2
2
  import type { ActivityObserverConfig, CancelTurnResult, SessionAuthContext, SessionTraceContext } from "#channel/types.js";
3
+ import type { ChannelAudience } from "#shared/channel-audience.js";
3
4
  import type { HarnessSession } from "#harness/types.js";
4
5
  import type { RuntimeRemoteAgentCallActionRequest } from "#shared/action-types.js";
5
6
  import type { RuntimeSubagentRegistry } from "#runtime/subagents/registry.js";
@@ -16,6 +17,7 @@ export declare function startRemoteAgentSession(input: {
16
17
  readonly auth?: SessionAuthContext | null;
17
18
  readonly callbackBaseUrl: string | undefined;
18
19
  readonly callbackToken?: string;
20
+ readonly originAudience?: ChannelAudience;
19
21
  readonly activityObserver?: ActivityObserverConfig;
20
22
  /** The root initiator's principal, forwarded alongside {@link auth}. */
21
23
  readonly initiatorAuth?: SessionAuthContext | null;
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{ResetResponseSchema}from"#protocol/reset-session.js";import{formatTraceparent}from"#protocol/traceparent.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{readTaskIdFromInboxToken}from"#tasks/task-inbox-token.js";import{AgentHandleError}from"#protocol/agent-handle-error.js";import{createRemoteAgentRouteUrl}from"#execution/remote-agent-route-url.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),sessionId:z.string().min(1),status:z.literal(`accepted`)});var RemoteAgentCancelRequestError=class extends Error{retryable;constructor(e,t){super(e),this.name=`RemoteAgentCancelRequestError`,this.retryable=t.retryable}};async function startRemoteAgentSession(e){let n=e.callbackToken??e.session.continuationToken;if(!n)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let r=buildForwardedPrincipalField(e),i={capabilities:{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,taskId:readTaskIdFromInboxToken(n),token:n,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(n))},message:formatRemoteAgentCallInputMessage({action:e.action,remote:e.remote}),mode:`conversation`,outputSchema:normalizeRequestedOutputSchema(e.action.input.outputSchema)??e.remote.outputSchema};e.activityObserver!==void 0&&(i.activityObserver=e.activityObserver),r!==void 0&&(i.forwardedPrincipal=r),e.operationId!==void 0&&(i.operationId=e.operationId);let a=await resolveRemoteAgentRequestHeaders(e.remote),o=formatTraceparent(e.parentTraceContext);if(o!==void 0){for(let e of Object.keys(a))e.toLowerCase()===`traceparent`&&delete a[e];a.traceparent=o}let s=await fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(i),headers:{"content-type":`application/json`,...a},method:`POST`});if(!s.ok)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${s.status}.`);let c;try{c=await s.json()}catch{throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON.`)}let l=CreateSessionResponseSchema.safeParse(c);if(!l.success)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid.`);return{sessionId:l.data.sessionId}}async function continueRemoteAgentSession(e){let t=buildForwardedPrincipalField(e),n={activityObserver:e.activityObserver,callback:e.callback,message:e.message,outputSchema:e.outputSchema};t!==void 0&&(n.forwardedPrincipal=t);let r=await fetch(createRemoteAgentContinueUrl(e.remote,e.sessionId),{body:JSON.stringify(n),headers:{"content-type":`application/json`,...await resolveRemoteAgentRequestHeaders(e.remote)},method:`POST`});if(!r.ok){let n=await readRemoteAgentErrorCode(r),i=r.status===404||n===AgentHandleError.SessionNotResumable.code,a=r.status===400&&t!==void 0?` The receiver may support forwarded principals only on session creation; upgrade it before retrying.`:``;throw new RemoteAgentContinueRequestError(`Remote agent "${e.remote.name}" continue-session request failed${i?` permanently`:``} with HTTP ${r.status}.${a}`,{deliveryAmbiguous:isAmbiguousRemoteContinueStatus(r.status),retryable:!i})}}var RemoteAgentContinueRequestError=class extends Error{deliveryAmbiguous;retryable;constructor(e,t){super(e),this.name=`RemoteAgentContinueRequestError`,this.deliveryAmbiguous=t.deliveryAmbiguous,this.retryable=t.retryable}};function isRetryableRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.retryable}function isAmbiguousRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.deliveryAmbiguous}function isAmbiguousRemoteContinueStatus(e){return e===408||e===425||e>=500}async function readRemoteAgentErrorCode(e){let t;try{t=await e.json()}catch{return}if(typeof t!=`object`||!t)return;let n=Reflect.get(t,`code`);return typeof n==`string`?n:void 0}function buildForwardedPrincipalField(e){if(e.remote.forwardPrincipal!==!0||e.auth===null||e.auth===void 0)return;let t={current:e.auth};return e.initiatorAuth!==null&&e.initiatorAuth!==void 0&&(t.initiator=e.initiatorAuth),t}async function cancelRemoteAgentTurn(e){let t=e.headers??await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentCancelTurnUrl(e.remote,e.sessionId),{body:e.turnId===void 0&&e.taskId===void 0?void 0:JSON.stringify({taskId:e.taskId,turnId:e.turnId}),headers:t,method:`POST`});if(!n.ok)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn request failed with HTTP ${n.status}.`,{retryable:isRetryableRemoteCancelStatus(n.status)});let r;try{r=await n.json()}catch{throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was not valid JSON.`,{retryable:!1})}let i=CancelTurnResponseSchema.safeParse(r);if(!i.success||i.data.status===`accepted`&&i.data.sessionId!==e.sessionId)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was invalid.`,{retryable:!1});return i.data.status===`accepted`?{sessionId:i.data.sessionId,status:`accepted`}:{status:`no_active_turn`}}async function resetRemoteAgentSession(e){let t=e.headers??await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionResetRoutePath(e.sessionId)),{body:JSON.stringify({reason:`Parent session ended`}),headers:{"content-type":`application/json`,...t},method:`POST`});if(!n.ok)throw Error(`Remote agent "${e.remote.name}" reset-session request failed with HTTP ${n.status}.`);let i=ResetResponseSchema.safeParse(await n.json());if(!i.success||i.data.status===`reset`&&i.data.previousSessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" reset-session response was invalid.`);return i.data}function isRetryableRemoteAgentCancelError(e){return!(e instanceof RemoteAgentCancelRequestError)||e.retryable}function resolveRemoteAgentForAction(e){let t=e.registry.get(e.nodeId)?.definition;if(e.dynamicRemoteAgent!==void 0){if(t===void 0)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);let n=resolveDynamicRemoteAgentCredentials(e.dynamicRemoteAgent),r=e.dynamicRemoteAgent,i={description:r.description,kind:`remote`,logicalPath:t.logicalPath,name:e.remoteAgentName,nodeId:e.nodeId,outputSchema:r.outputSchema,path:r.path,sourceId:t.sourceId,sourceKind:`module`,url:r.url};return r.forwardPrincipal!==void 0&&(i.forwardPrincipal=r.forwardPrincipal),n.auth!==void 0&&(i.auth=n.auth),n.headers!==void 0&&(i.headers=n.headers),i}if(t?.kind!==`remote`)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);return t}async function resolveRemoteAgentStreamHeaders(e){if(e.resolverId===void 0)return{};let t=new Set([e.bundle.graph.root,...e.bundle.graph.nodesByNodeId.values()]);for(let n of t){let t=n.subagentRegistry.subagentsByNodeId.get(e.resolverId)?.definition;if(t!==void 0){if(t.kind!==`remote`||t.name!==e.name||t.url!==e.url)throw Error(`Remote child stream resolver does not match the authored remote agent.`);return await resolveRemoteAgentRequestHeaders(t)}}return await resolveRemoteAgentRequestHeaders(resolveDynamicRemoteAgentCredentials({credentialsStepId:e.resolverId,description:``,path:``,url:e.url}))}function resolveDynamicRemoteAgentCredentials(e){if(e.credentialsStepId===void 0)return{};let t=getStepRegistry().get(e.credentialsStepId);if(t===void 0)throw Error(`Dynamic remote subagent credentials function "${e.credentialsStepId}" is not registered.`);let n=expectObjectRecord(t(),`Dynamic remote subagent credentials are invalid.`),r={};return n.auth!==void 0&&(r.auth=expectFunction(n.auth,`Dynamic remote subagent auth is invalid.`)),n.headers!==void 0&&(r.headers=resolveDynamicRemoteAgentHeaders(n.headers)),r}function resolveDynamicRemoteAgentHeaders(e){if(typeof e==`function`)return e;let t=expectObjectRecord(e,`Dynamic remote subagent headers are invalid.`);for(let e of Object.values(t))if(typeof e!=`string`)throw Error(`Dynamic remote subagent headers are invalid.`);return t}function getStepRegistry(){let e=Symbol.for(`@workflow/core//registeredSteps`),t=globalThis,n=t[e];return n===void 0&&(n=new Map,t[e]=n),n}function createRemoteAgentSessionUrl(e){return createRemoteAgentRouteUrl(e.url,e.path)}function createRemoteAgentCancelTurnUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionCancelRoutePath(t))}function createRemoteAgentContinueUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionRoutePath(t))}function isRetryableRemoteCancelStatus(e){return e===408||e===425||e===429||e>=500}async function resolveRemoteAgentRequestHeaders(e){let t={};return e.headers!==void 0&&Object.assign(t,typeof e.headers==`function`?await e.headers():e.headers),e.auth!==void 0&&Object.assign(t,(await e.auth()).headers),t}function formatRemoteAgentCallInputMessage(e){let t=typeof e.action.input.message==`string`?e.action.input.message:``;return formatSubagentInput({description:e.remote.description,message:t,name:e.action.remoteAgentName,type:`remote`}).message}export{RemoteAgentContinueRequestError,cancelRemoteAgentTurn,continueRemoteAgentSession,isAmbiguousRemoteAgentContinueError,isRetryableRemoteAgentCancelError,isRetryableRemoteAgentContinueError,resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders,startRemoteAgentSession};
1
+ import{z}from"#compiled/zod/index.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{ResetResponseSchema}from"#protocol/reset-session.js";import{formatTraceparent}from"#protocol/traceparent.js";import{writeForwardedAudienceBaggage}from"#protocol/baggage.js";import{decisionToTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{readTaskIdFromInboxToken}from"#tasks/task-inbox-token.js";import{AgentHandleError}from"#protocol/agent-handle-error.js";import{createRemoteAgentRouteUrl}from"#execution/remote-agent-route-url.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),sessionId:z.string().min(1),status:z.literal(`accepted`)});var RemoteAgentCancelRequestError=class extends Error{retryable;constructor(e,t){super(e),this.name=`RemoteAgentCancelRequestError`,this.retryable=t.retryable}};async function startRemoteAgentSession(e){let n=e.callbackToken??e.session.continuationToken;if(!n)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let r=buildForwardedPrincipalField(e),i={capabilities:{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,taskId:readTaskIdFromInboxToken(n),token:n,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(n))},message:formatRemoteAgentCallInputMessage({action:e.action,remote:e.remote}),mode:`conversation`,outputSchema:normalizeRequestedOutputSchema(e.action.input.outputSchema)??e.remote.outputSchema};e.activityObserver!==void 0&&(i.activityObserver=e.activityObserver),r!==void 0&&(i.forwardedPrincipal=r),e.operationId!==void 0&&(i.operationId=e.operationId);let a=await resolveRemoteAgentRequestHeaders(e.remote),o=formatTraceparent(e.parentTraceContext);o!==void 0&&setHeader(a,`traceparent`,o),setHeader(a,`baggage`,writeForwardedAudienceBaggage(readHeader(a,`baggage`),buildForwardedTraceAssertion({forwardedPrincipal:r,originAudience:e.originAudience,parentTraceContext:e.parentTraceContext,traceparent:o})));let s=await fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(i),headers:{"content-type":`application/json`,...a},method:`POST`});if(!s.ok)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${s.status}.`);let c;try{c=await s.json()}catch{throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON.`)}let l=CreateSessionResponseSchema.safeParse(c);if(!l.success)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid.`);return{sessionId:l.data.sessionId}}function buildForwardedTraceAssertion(e){let t=decisionToTraceContentCeiling(e.parentTraceContext?.decision);if(!(e.forwardedPrincipal===void 0||e.parentTraceContext===void 0||(e.parentTraceContext.traceFlags&1)!=1||e.traceparent===void 0||t===void 0))return{ceiling:t,originAudience:e.originAudience??`unknown`}}async function continueRemoteAgentSession(e){let t=buildForwardedPrincipalField(e),n={activityObserver:e.activityObserver,callback:e.callback,message:e.message,outputSchema:e.outputSchema};t!==void 0&&(n.forwardedPrincipal=t);let r=await fetch(createRemoteAgentContinueUrl(e.remote,e.sessionId),{body:JSON.stringify(n),headers:{"content-type":`application/json`,...await resolveRemoteAgentRequestHeaders(e.remote)},method:`POST`});if(!r.ok){let n=await readRemoteAgentErrorCode(r),i=r.status===404||n===AgentHandleError.SessionNotResumable.code,a=r.status===400&&t!==void 0?` The receiver may support forwarded principals only on session creation; upgrade it before retrying.`:``;throw new RemoteAgentContinueRequestError(`Remote agent "${e.remote.name}" continue-session request failed${i?` permanently`:``} with HTTP ${r.status}.${a}`,{deliveryAmbiguous:isAmbiguousRemoteContinueStatus(r.status),retryable:!i})}}var RemoteAgentContinueRequestError=class extends Error{deliveryAmbiguous;retryable;constructor(e,t){super(e),this.name=`RemoteAgentContinueRequestError`,this.deliveryAmbiguous=t.deliveryAmbiguous,this.retryable=t.retryable}};function isRetryableRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.retryable}function isAmbiguousRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.deliveryAmbiguous}function isAmbiguousRemoteContinueStatus(e){return e===408||e===425||e>=500}async function readRemoteAgentErrorCode(e){let t;try{t=await e.json()}catch{return}if(typeof t!=`object`||!t)return;let n=Reflect.get(t,`code`);return typeof n==`string`?n:void 0}function buildForwardedPrincipalField(e){if(e.remote.forwardPrincipal!==!0||e.auth===null||e.auth===void 0)return;let t={current:e.auth};return e.initiatorAuth!==null&&e.initiatorAuth!==void 0&&(t.initiator=e.initiatorAuth),t}async function cancelRemoteAgentTurn(e){let t=e.headers??await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentCancelTurnUrl(e.remote,e.sessionId),{body:e.turnId===void 0&&e.taskId===void 0?void 0:JSON.stringify({taskId:e.taskId,turnId:e.turnId}),headers:t,method:`POST`});if(!n.ok)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn request failed with HTTP ${n.status}.`,{retryable:isRetryableRemoteCancelStatus(n.status)});let r;try{r=await n.json()}catch{throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was not valid JSON.`,{retryable:!1})}let i=CancelTurnResponseSchema.safeParse(r);if(!i.success||i.data.status===`accepted`&&i.data.sessionId!==e.sessionId)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was invalid.`,{retryable:!1});return i.data.status===`accepted`?{sessionId:i.data.sessionId,status:`accepted`}:{status:`no_active_turn`}}function readHeader(e,t){let n=Object.keys(e).find(e=>e.toLowerCase()===t);return n===void 0?void 0:e[n]}function setHeader(e,t,n){for(let n of Object.keys(e))n.toLowerCase()===t&&delete e[n];n!==void 0&&(e[t]=n)}async function resetRemoteAgentSession(e){let t=e.headers??await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionResetRoutePath(e.sessionId)),{body:JSON.stringify({reason:`Parent session ended`}),headers:{"content-type":`application/json`,...t},method:`POST`});if(!n.ok)throw Error(`Remote agent "${e.remote.name}" reset-session request failed with HTTP ${n.status}.`);let i=ResetResponseSchema.safeParse(await n.json());if(!i.success||i.data.status===`reset`&&i.data.previousSessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" reset-session response was invalid.`);return i.data}function isRetryableRemoteAgentCancelError(e){return!(e instanceof RemoteAgentCancelRequestError)||e.retryable}function resolveRemoteAgentForAction(e){let t=e.registry.get(e.nodeId)?.definition;if(e.dynamicRemoteAgent!==void 0){if(t===void 0)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);let n=resolveDynamicRemoteAgentCredentials(e.dynamicRemoteAgent),r=e.dynamicRemoteAgent,i={description:r.description,kind:`remote`,logicalPath:t.logicalPath,name:e.remoteAgentName,nodeId:e.nodeId,outputSchema:r.outputSchema,path:r.path,sourceId:t.sourceId,sourceKind:`module`,url:r.url};return r.forwardPrincipal!==void 0&&(i.forwardPrincipal=r.forwardPrincipal),n.auth!==void 0&&(i.auth=n.auth),n.headers!==void 0&&(i.headers=n.headers),i}if(t?.kind!==`remote`)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);return t}async function resolveRemoteAgentStreamHeaders(e){if(e.resolverId===void 0)return{};let t=new Set([e.bundle.graph.root,...e.bundle.graph.nodesByNodeId.values()]);for(let n of t){let t=n.subagentRegistry.subagentsByNodeId.get(e.resolverId)?.definition;if(t!==void 0){if(t.kind!==`remote`||t.name!==e.name||t.url!==e.url)throw Error(`Remote child stream resolver does not match the authored remote agent.`);return await resolveRemoteAgentRequestHeaders(t)}}return await resolveRemoteAgentRequestHeaders(resolveDynamicRemoteAgentCredentials({credentialsStepId:e.resolverId,description:``,path:``,url:e.url}))}function resolveDynamicRemoteAgentCredentials(e){if(e.credentialsStepId===void 0)return{};let t=getStepRegistry().get(e.credentialsStepId);if(t===void 0)throw Error(`Dynamic remote subagent credentials function "${e.credentialsStepId}" is not registered.`);let n=expectObjectRecord(t(),`Dynamic remote subagent credentials are invalid.`),r={};return n.auth!==void 0&&(r.auth=expectFunction(n.auth,`Dynamic remote subagent auth is invalid.`)),n.headers!==void 0&&(r.headers=resolveDynamicRemoteAgentHeaders(n.headers)),r}function resolveDynamicRemoteAgentHeaders(e){if(typeof e==`function`)return e;let t=expectObjectRecord(e,`Dynamic remote subagent headers are invalid.`);for(let e of Object.values(t))if(typeof e!=`string`)throw Error(`Dynamic remote subagent headers are invalid.`);return t}function getStepRegistry(){let e=Symbol.for(`@workflow/core//registeredSteps`),t=globalThis,n=t[e];return n===void 0&&(n=new Map,t[e]=n),n}function createRemoteAgentSessionUrl(e){return createRemoteAgentRouteUrl(e.url,e.path)}function createRemoteAgentCancelTurnUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionCancelRoutePath(t))}function createRemoteAgentContinueUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionRoutePath(t))}function isRetryableRemoteCancelStatus(e){return e===408||e===425||e===429||e>=500}async function resolveRemoteAgentRequestHeaders(e){let t={};return e.headers!==void 0&&Object.assign(t,typeof e.headers==`function`?await e.headers():e.headers),e.auth!==void 0&&Object.assign(t,(await e.auth()).headers),t}function formatRemoteAgentCallInputMessage(e){let t=typeof e.action.input.message==`string`?e.action.input.message:``;return formatSubagentInput({description:e.remote.description,message:t,name:e.action.remoteAgentName,type:`remote`}).message}export{RemoteAgentContinueRequestError,cancelRemoteAgentTurn,continueRemoteAgentSession,isAmbiguousRemoteAgentContinueError,isRetryableRemoteAgentCancelError,isRetryableRemoteAgentContinueError,resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders,startRemoteAgentSession};
@@ -1,4 +1,6 @@
1
1
  /** Returns whether a token belongs to eve's framework-reserved session command namespace. */
2
2
  export declare function isReservedSessionCommandToken(token: string): boolean;
3
+ /** Returns whether a token is the stable command inbox for one workflow run. */
4
+ export declare function isSessionCommandHookToken(token: string): boolean;
3
5
  /** Derives the framework-reserved stable command inbox token for a session. */
4
6
  export declare function sessionCommandHookToken(sessionId: string): string;
@@ -1 +1 @@
1
- const SESSION_COMMAND_NAMESPACE=`eve:session`;function isReservedSessionCommandToken(e){return e.startsWith(`${SESSION_COMMAND_NAMESPACE}:`)}function sessionCommandHookToken(e){return`${SESSION_COMMAND_NAMESPACE}:${e}:inbox`}export{isReservedSessionCommandToken,sessionCommandHookToken};
1
+ const SESSION_COMMAND_NAMESPACE=`eve:session`;function isReservedSessionCommandToken(e){return e.startsWith(`${SESSION_COMMAND_NAMESPACE}:`)}function isSessionCommandHookToken(e){let t=`${SESSION_COMMAND_NAMESPACE}:`;return!e.startsWith(t)||!e.endsWith(`:inbox`)?!1:!e.slice(t.length,-6).includes(`:`)}function sessionCommandHookToken(e){return`${SESSION_COMMAND_NAMESPACE}:${e}:inbox`}export{isReservedSessionCommandToken,isSessionCommandHookToken,sessionCommandHookToken};
@@ -1 +1 @@
1
- import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{abandonRunningAgentTurns}from"#harness/handles/transitions.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,getProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingSessionLimitPrompt}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";async function settleCancelledTurnStep(a){"use step";let o=await readDurableSession(a.sessionState),s=await deserializeContext(a.serializedContext),c=s.require(ChannelKey),l=buildAdapterContext(c,s),u=s.require(BundleKey),d=resolveEffectiveAgentRuntime(u,s),f=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:o,turnAgent:d.turnAgent}),p=bindSessionInstrumentation({agentName:d.turnAgent.id,ctx:s,rootSessionId:f.rootSessionId??f.sessionId,sessionId:f.sessionId}),m=getHarnessEmissionState(o.state),h=[...getProxyInputRequests(o.state).values()].some(e=>e.kind===`session-limit`);if(!(isHarnessBetweenTurns(f)&&hasProxyInputRequests(o.state)&&!h)){let t=a.parentWritable.getWriter();try{let n=await withContextScope(s,f,async n=>{let baseEmit=async n=>{let r=await callAdapterEventHandler(c,n,l);setChannelContext(s,{...c,state:{...l.state}});let i=stampMessageStreamEvent(r);await t.write(encodeMessageStreamEvent(i)),observeSessionActivity({ctx:s,event:i,sessionId:f.sessionId}),await dispatchStreamEventHooks({ctx:s,event:i,registry:u.hookRegistry})};return{result:await emitCancelledTurn(p?.createCancellationHandleEvent({handleEvent:baseEmit,turnId:activeTurnId(m)})??baseEmit,m),session:n}});m=n.result,f=n.session}finally{await p?.flush(),t.releaseLock()}}let g=reconcileSessionContinuationToken(s,setHarnessEmissionState(clearPendingSessionLimitPrompt(clearAllProxyInputRequests(clearPendingWorkflowInterrupt(clearPendingRuntimeActionBatch(abandonRunningAgentTurns({...f,outputSchema:void 0}))))),m)),_=getTurnUsageState(f.state)?.session,v={serializedContext:serializeContext(s),sessionState:createDurableSessionState({session:g})};return _===void 0?v:{...v,usage:toUsage(_)}}export{settleCancelledTurnStep};
1
+ import{callAdapterEventHandler}from"#channel/adapter.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{abandonRunningAgentTurns}from"#harness/handles/transitions.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{clearToolRuns}from"#harness/tool-runs.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{clearPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{clearAllProxyInputRequests,getProxyInputRequests,hasProxyInputRequests}from"#harness/proxy-input-requests.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingSessionLimitPrompt}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{emitCancelledTurn}from"#harness/cancelled-turn-emission.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";async function settleCancelledTurnStep(a){"use step";let o=await readDurableSession(a.sessionState),s=await deserializeContext(a.serializedContext),c=s.require(ChannelKey),l=buildAdapterContext(c,s),u=s.require(BundleKey),d=resolveEffectiveAgentRuntime(u,s),f=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:o,turnAgent:d.turnAgent}),p=bindSessionInstrumentation({agentName:d.turnAgent.id,ctx:s,rootSessionId:f.rootSessionId??f.sessionId,sessionId:f.sessionId}),m=getHarnessEmissionState(o.state),h=[...getProxyInputRequests(o.state).values()].some(e=>e.kind===`session-limit`);if(!(isHarnessBetweenTurns(f)&&hasProxyInputRequests(o.state)&&!h)){let t=a.parentWritable.getWriter();try{let n=await withContextScope(s,f,async n=>{let baseEmit=async n=>{let r=await callAdapterEventHandler(c,n,l);setChannelContext(s,{...c,state:{...l.state}});let i=stampMessageStreamEvent(r);await t.write(encodeMessageStreamEvent(i)),observeSessionActivity({ctx:s,event:i,sessionId:f.sessionId}),await dispatchStreamEventHooks({ctx:s,event:i,registry:u.hookRegistry})};return{result:await emitCancelledTurn(p?.createHandleEvent({handleEvent:baseEmit,turnId:activeTurnId(m)})??baseEmit,m),session:n}});m=n.result,f=n.session}finally{await p?.flush(),t.releaseLock()}}let g=reconcileSessionContinuationToken(s,setHarnessEmissionState(clearPendingSessionLimitPrompt(clearAllProxyInputRequests(clearPendingWorkflowInterrupt(clearPendingRuntimeActionBatch(clearToolRuns(abandonRunningAgentTurns({...f,outputSchema:void 0})))))),m)),_=getTurnUsageState(f.state)?.session,v={serializedContext:serializeContext(s),sessionState:createDurableSessionState({session:g})};return _===void 0?v:{...v,usage:toUsage(_)}}export{settleCancelledTurnStep};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * eve workflow functions whose bundled id carries no `@<version>` stamp, so
3
+ * `start(ref, args, { deploymentId: "latest" })` finds them on a newer
4
+ * deployment. Dependency-free so the bundler can import it.
5
+ */
6
+ export declare const WORKFLOW_ENTRY_NAME = "workflowEntry";
7
+ export declare const TURN_WORKFLOW_NAME = "turnWorkflow";
8
+ export declare const SESSION_TIMEOUT_WORKFLOW_NAME = "sessionTimeoutWorkflow";
9
+ export declare const TASK_RUN_WORKFLOW_NAME = "taskRunWorkflow";
10
+ export declare const TOOL_RUN_WORKFLOW_NAME = "toolRunWorkflow";
11
+ export declare const ACTIVITY_COLLECTOR_WORKFLOW_NAME = "activityCollectorWorkflow";
12
+ export declare const STABLE_WORKFLOW_NAMES: ReadonlySet<string>;
@@ -0,0 +1 @@
1
+ const WORKFLOW_ENTRY_NAME=`workflowEntry`,TURN_WORKFLOW_NAME=`turnWorkflow`,SESSION_TIMEOUT_WORKFLOW_NAME=`sessionTimeoutWorkflow`,TASK_RUN_WORKFLOW_NAME=`taskRunWorkflow`,TOOL_RUN_WORKFLOW_NAME=`toolRunWorkflow`,ACTIVITY_COLLECTOR_WORKFLOW_NAME=`activityCollectorWorkflow`,STABLE_WORKFLOW_NAMES=new Set([WORKFLOW_ENTRY_NAME,TURN_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,TASK_RUN_WORKFLOW_NAME,TOOL_RUN_WORKFLOW_NAME,ACTIVITY_COLLECTOR_WORKFLOW_NAME]);export{ACTIVITY_COLLECTOR_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,STABLE_WORKFLOW_NAMES,TASK_RUN_WORKFLOW_NAME,TOOL_RUN_WORKFLOW_NAME,TURN_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME};
@@ -1,6 +1,7 @@
1
1
  import type { SubagentAuthorizationEventHookPayload, SubagentInputRequestHookPayload } from "#channel/types.js";
2
2
  import type { ContextContainer } from "#context/container.js";
3
3
  import { type DurableSession, type DurableSessionState } from "#execution/durable-session-store.js";
4
+ import type { AnswerHookRoute } from "#harness/proxy-input-requests.js";
4
5
  type SubagentEventHookPayload = SubagentAuthorizationEventHookPayload | SubagentInputRequestHookPayload;
5
6
  interface ProxySubagentEventResult {
6
7
  readonly serializedContext: Record<string, unknown>;
@@ -8,6 +9,7 @@ interface ProxySubagentEventResult {
8
9
  }
9
10
  /** Proxies one child event through its parent channel across a durable step boundary. */
10
11
  export declare function runProxySubagentEventStep(input: {
12
+ readonly answerHook?: AnswerHookRoute;
11
13
  readonly hookPayload: SubagentEventHookPayload;
12
14
  readonly parentWritable: WritableStream<Uint8Array>;
13
15
  readonly serializedContext: Record<string, unknown>;
@@ -29,6 +31,7 @@ export declare function emitRecordedTaskAuthorizationEventStep(input: {
29
31
  }): Promise<ProxySubagentEventResult>;
30
32
  /** Applies one proxied child event to an already-hydrated parent context. */
31
33
  export declare function emitProxiedSubagentEvent(input: {
34
+ readonly answerHook?: AnswerHookRoute;
32
35
  readonly ctx: ContextContainer;
33
36
  readonly durableSession: DurableSession;
34
37
  readonly hookPayload: SubagentEventHookPayload;
@@ -1 +1 @@
1
- import{callAdapterEventHandler}from"#channel/adapter.js";import{ModeKey}from"#context/keys.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{upsertProxyInputRequests}from"#harness/proxy-input-requests.js";import{emitProxiedInputRequest}from"#execution/subagent-hitl-proxy.js";import{setChannelContext}from"#execution/channel-context.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";async function runProxySubagentEventStep(e){"use step";let t=await readDurableSession(e.sessionState);return emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable})}async function emitRecordedTaskInputRequestStep(e){"use step";let t=await readDurableSession(e.sessionState);return emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable,recordProxyInputRequests:!1})}async function emitRecordedTaskAuthorizationEventStep(e){"use step";let t=await readDurableSession(e.sessionState);return emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable,recordProxyInputRequests:!1})}async function emitProxiedSubagentEvent(i){let{ctx:a}=i,o=a.require(ChannelKey),s=resolveEffectiveAgentRuntime(a.require(BundleKey),a),c=hydrateDurableSession({compactionOverrides:{thresholdPercent:s.thresholdPercent},durable:i.durableSession,turnAgent:s.turnAgent}),l=buildAdapterContext(o,a),u=i.parentWritable.getWriter(),d,f;try{let emit=async t=>{let r=await callAdapterEventHandler(o,t,l);await u.write(encodeMessageStreamEvent(stampMessageStreamEvent(r)))},r=await withContextScope(a,c,async e=>{if(i.hookPayload.kind===`subagent-authorization-event`)return await emit(i.hookPayload.event),{result:void 0,session:e};let n=await emitProxiedInputRequest({emit,hookPayload:i.hookPayload,mode:a.require(ModeKey),session:e});return{result:n.entries,session:n.session}});d=r.result,f=r.session}finally{u.releaseLock()}setChannelContext(a,{...o,state:{...l.state}}),i.recordProxyInputRequests!==!1&&d!==void 0&&i.hookPayload.kind===`subagent-input-request`&&(f=upsertProxyInputRequests({entries:d,forChildContinuationToken:i.hookPayload.childContinuationToken,session:f}));let p=reconcileSessionContinuationToken(a,f);return{serializedContext:serializeContext(a),sessionState:createDurableSessionState({session:p})}}export{emitProxiedSubagentEvent,emitRecordedTaskAuthorizationEventStep,emitRecordedTaskInputRequestStep,runProxySubagentEventStep};
1
+ import{callAdapterEventHandler}from"#channel/adapter.js";import{ModeKey}from"#context/keys.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{upsertProxyInputRequests}from"#harness/proxy-input-requests.js";import{emitProxiedInputRequest}from"#execution/subagent-hitl-proxy.js";import{setChannelContext}from"#execution/channel-context.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";async function runProxySubagentEventStep(e){"use step";let t=await readDurableSession(e.sessionState),n=await deserializeContext(e.serializedContext);return emitProxiedSubagentEvent({answerHook:e.answerHook,ctx:n,durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable})}async function emitRecordedTaskInputRequestStep(e){"use step";let t=await readDurableSession(e.sessionState);return emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable,recordProxyInputRequests:!1})}async function emitRecordedTaskAuthorizationEventStep(e){"use step";let t=await readDurableSession(e.sessionState);return emitProxiedSubagentEvent({ctx:await deserializeContext(e.serializedContext),durableSession:t,hookPayload:e.hookPayload,parentWritable:e.parentWritable,recordProxyInputRequests:!1})}async function emitProxiedSubagentEvent(i){let{ctx:a}=i,o=a.require(ChannelKey),s=resolveEffectiveAgentRuntime(a.require(BundleKey),a),c=hydrateDurableSession({compactionOverrides:{thresholdPercent:s.thresholdPercent},durable:i.durableSession,turnAgent:s.turnAgent}),l=buildAdapterContext(o,a),u=i.parentWritable.getWriter(),d,f;try{let emit=async t=>{let r=await callAdapterEventHandler(o,t,l);await u.write(encodeMessageStreamEvent(stampMessageStreamEvent(r)))},r=await withContextScope(a,c,async e=>{if(i.hookPayload.kind===`subagent-authorization-event`)return await emit(i.hookPayload.event),{result:void 0,session:e};let n=await emitProxiedInputRequest({emit,hookPayload:i.hookPayload,mode:a.require(ModeKey),session:e});return{result:n.entries,session:n.session}});d=r.result,f=r.session}finally{u.releaseLock()}if(setChannelContext(a,{...o,state:{...l.state}}),i.recordProxyInputRequests!==!1&&d!==void 0&&i.hookPayload.kind===`subagent-input-request`){let e=i.answerHook;f=upsertProxyInputRequests({entries:e===void 0?d:d.map(([t,n])=>[t,{...n,answerHook:e}]),forChildContinuationToken:i.hookPayload.childContinuationToken,session:f})}let p=reconcileSessionContinuationToken(a,f);return{serializedContext:serializeContext(a),sessionState:createDurableSessionState({session:p})}}export{emitProxiedSubagentEvent,emitRecordedTaskAuthorizationEventStep,emitRecordedTaskInputRequestStep,runProxySubagentEventStep};
@@ -1,5 +1,5 @@
1
1
  import type { DeliverPayload, SubagentInputRequestHookPayload } from "#channel/types.js";
2
- import type { ProxyInputRequest } from "#harness/proxy-input-requests.js";
2
+ import type { AnswerHookRoute, ProxyInputRequest } from "#harness/proxy-input-requests.js";
3
3
  import type { HarnessEmitFn, HarnessSession, SessionStateMap } from "#harness/types.js";
4
4
  import type { RunMode } from "#shared/run-mode.js";
5
5
  import type { InputResponse } from "#shared/input.js";
@@ -19,6 +19,7 @@ export declare function emitProxiedInputRequest(input: {
19
19
  }>;
20
20
  /** One proxied-child bucket of a routed deliver payload. */
21
21
  export interface RoutedChildDelivery {
22
+ readonly answerHook?: AnswerHookRoute;
22
23
  readonly childContinuationToken: string;
23
24
  readonly childResponseUrl?: string;
24
25
  readonly payload: {
@@ -1 +1 @@
1
- import{createInputRequestedEvent}from"#protocol/message.js";import{emitTurnEpilogue,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{getProxyInputRequests,toProxyInputRequestEntries}from"#harness/proxy-input-requests.js";import{SESSION_LIMIT_STOP_OPTION_ID}from"#harness/session-limit-continuation.js";async function emitProxiedInputRequest(i){await i.emit(createInputRequestedEvent({requests:i.hookPayload.event.requests,sequence:i.hookPayload.event.sequence,stepIndex:i.hookPayload.event.stepIndex,turnId:i.hookPayload.event.turnId}));let o=i.session;if(i.mode===`conversation`){let e=getHarnessEmissionState(i.session.state),a=await emitTurnEpilogue(i.emit,e,i.mode);o=setHarnessEmissionState(i.session,a)}return{entries:toProxyInputRequestEntries(i.hookPayload),session:o}}function routeDeliverPayload(e){let t=getProxyInputRequests(e.state),n=e.payload.inputResponses??[],r=new Map,a=[],s;for(let i of n){let n=t.get(i.requestId);if(n===void 0||e.allowRoute?.(i.requestId,n)===!1){a.push(i);continue}n.kind===`session-limit`&&i.optionId===SESSION_LIMIT_STOP_OPTION_ID&&(s={kind:`cancel-turn`});let c=n.taskId===void 0?n.childContinuationToken:`${n.childContinuationToken}\0${n.childResponseUrl??`local`}\0${n.taskId}`,l=r.get(c);l===void 0?r.set(c,{childContinuationToken:n.childContinuationToken,parentRequestIds:[i.requestId],responses:[toChildInputResponse(i,n)],routes:[n],...n.childResponseUrl!==void 0&&{childResponseUrl:n.childResponseUrl},...n.taskId!==void 0&&{taskId:n.taskId}}):(l.parentRequestIds.push(i.requestId),l.responses.push(toChildInputResponse(i,n)),l.routes.push(n))}let c=[...r.values()].map(({childContinuationToken:e,childResponseUrl:n,parentRequestIds:r,responses:i,routes:a,taskId:o})=>{let s=new Set(r),c=new Set(s);for(let n of a)if(n.batch!==void 0&&batchResolves({batch:n.batch,childContinuationToken:e,entries:t,responseIds:s}))for(let e of n.batch.requestIds)c.add(e);return{childContinuationToken:e,payload:{inputResponses:i},retireRequestIds:[...c],...n!==void 0&&{childResponseUrl:n},...o!==void 0&&{taskId:o}}}),l={};for(let[t,n]of Object.entries(e.payload))t===`inputResponses`||n===void 0||(l[t]=n);return a.length>0&&(l.inputResponses=a),{forChildren:c,forSelf:Object.keys(l).length>0?l:void 0,parentAction:s}}function batchResolves(e){return e.batch.approvalRequestIds.length===0||e.batch.approvalRequestIds.every(t=>{let n=e.entries.get(t);return n===void 0||!sameBatch(n,e)||e.responseIds.has(t)})}function sameBatch(e,t){return e.childContinuationToken===t.childContinuationToken&&e.batch?.requestIds.length===t.batch.requestIds.length&&e.batch.requestIds.every((e,n)=>e===t.batch.requestIds[n])}function toChildInputResponse(e,t){return t.childRequestId===void 0?e:{...e,requestId:t.childRequestId}}export{emitProxiedInputRequest,routeDeliverPayload};
1
+ import{createInputRequestedEvent}from"#protocol/message.js";import{emitTurnEpilogue,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{getProxyInputRequests,toProxyInputRequestEntries}from"#harness/proxy-input-requests.js";import{SESSION_LIMIT_STOP_OPTION_ID}from"#harness/session-limit-continuation.js";async function emitProxiedInputRequest(i){await i.emit(createInputRequestedEvent({requests:i.hookPayload.event.requests,sequence:i.hookPayload.event.sequence,stepIndex:i.hookPayload.event.stepIndex,turnId:i.hookPayload.event.turnId}));let o=i.session;if(i.mode===`conversation`){let e=getHarnessEmissionState(i.session.state),a=await emitTurnEpilogue(i.emit,e,i.mode);o=setHarnessEmissionState(i.session,a)}return{entries:toProxyInputRequestEntries(i.hookPayload),session:o}}function routeDeliverPayload(e){let t=getProxyInputRequests(e.state),n=e.payload.inputResponses??[],r=new Map,a=[],s;for(let i of n){let n=t.get(i.requestId);if(n===void 0||e.allowRoute?.(i.requestId,n)===!1){a.push(i);continue}n.kind===`session-limit`&&i.optionId===SESSION_LIMIT_STOP_OPTION_ID&&(s={kind:`cancel-turn`});let c=n.taskId===void 0?n.childContinuationToken:`${n.childContinuationToken}\0${n.childResponseUrl??`local`}\0${n.taskId}`,l=r.get(c);l===void 0?r.set(c,{childContinuationToken:n.childContinuationToken,parentRequestIds:[i.requestId],responses:[toChildInputResponse(i,n)],routes:[n],...n.answerHook!==void 0&&{answerHook:n.answerHook},...n.childResponseUrl!==void 0&&{childResponseUrl:n.childResponseUrl},...n.taskId!==void 0&&{taskId:n.taskId}}):(l.parentRequestIds.push(i.requestId),l.responses.push(toChildInputResponse(i,n)),l.routes.push(n))}let c=[...r.values()].map(({answerHook:e,childContinuationToken:n,childResponseUrl:r,parentRequestIds:i,responses:a,routes:o,taskId:s})=>{let c=new Set(i),l=new Set(c);for(let e of o)if(e.batch!==void 0&&batchResolves({batch:e.batch,childContinuationToken:n,entries:t,responseIds:c}))for(let t of e.batch.requestIds)l.add(t);return{childContinuationToken:n,payload:{inputResponses:a},retireRequestIds:[...l],...e!==void 0&&{answerHook:e},...r!==void 0&&{childResponseUrl:r},...s!==void 0&&{taskId:s}}}),l={};for(let[t,n]of Object.entries(e.payload))t===`inputResponses`||n===void 0||(l[t]=n);return a.length>0&&(l.inputResponses=a),{forChildren:c,forSelf:Object.keys(l).length>0?l:void 0,parentAction:s}}function batchResolves(e){return e.batch.approvalRequestIds.length===0||e.batch.approvalRequestIds.every(t=>{let n=e.entries.get(t);return n===void 0||!sameBatch(n,e)||e.responseIds.has(t)})}function sameBatch(e,t){return e.childContinuationToken===t.childContinuationToken&&e.batch?.requestIds.length===t.batch.requestIds.length&&e.batch.requestIds.every((e,n)=>e===t.batch.requestIds[n])}function toChildInputResponse(e,t){return t.childRequestId===void 0?e:{...e,requestId:t.childRequestId}}export{emitProxiedInputRequest,routeDeliverPayload};
@@ -1,4 +1,5 @@
1
1
  import type { DispatchOutcome, RuntimeSession } from "#execution/agent-handle-dispatch.js";
2
+ import type { LocalDevRequestProvenance } from "#context/keys.js";
2
3
  import { buildSubagentRunInput, type SubagentInputSource } from "#execution/subagent-tool.js";
3
4
  import { createWorkflowRuntime } from "#execution/workflow-runtime.js";
4
5
  import type { RuntimeSubagentCallActionRequest } from "#shared/action-types.js";
@@ -19,10 +20,12 @@ export declare function startLocalSubagent(input: {
19
20
  readonly dynamicSubagentAgentConfig?: DynamicSubagentAgentConfig;
20
21
  readonly fanoutSize: number;
21
22
  readonly initiatorAuth: Parameters<typeof buildSubagentRunInput>[0]["initiatorAuth"];
23
+ readonly localDevRequest?: LocalDevRequestProvenance;
22
24
  readonly parentContinuationToken: string | undefined;
23
25
  readonly parentTraceContext: Parameters<typeof buildSubagentRunInput>[0]["parentTraceContext"];
24
26
  readonly activityObserver?: Parameters<typeof buildSubagentRunInput>[0]["activityObserver"];
25
27
  readonly sandboxSessionId: string;
28
+ readonly selfAgent: boolean;
26
29
  readonly session: RuntimeSession;
27
30
  readonly source: SubagentInputSource;
28
31
  readonly taskOwned: boolean;
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{isRuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{toErrorMessage}from"#shared/errors.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{SUBAGENT_START_FAILED}from"#harness/agent-handle-errors.js";import{confirmAgentStarted,confirmTaskAgentAddress,prepareAgentStart,rejectAgentEffect}from"#harness/handles/transitions.js";import{buildSubagentRunInput}from"#execution/subagent-tool.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{mintStartOperation}from"#execution/dispatch-start-operation.js";const log=createLogger(`execution.subagent-start-local`);async function startLocalSubagent(e){let{action:t,source:n}=e,r=deriveChildActivityObserverConfig({activityObserver:e.activityObserver,callId:t.callId,kind:`subagent`,name:t.subagentName,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),i=createWorkflowRuntime({compiledArtifactsSource:e.bundle.compiledArtifactsSource,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,nodeId:t.nodeId}),{childContinuationToken:a,runInput:o}=buildSubagentRunInput({action:t,auth:e.auth,batchEvent:e.batchEvent,capabilities:e.capabilities,channelMetadata:e.channelMetadata,fanoutSize:e.fanoutSize,initiatorAuth:e.initiatorAuth,graph:e.bundle.graph,parentContinuationToken:e.parentContinuationToken,parentTraceContext:e.parentTraceContext,activityObserver:r,sandboxSessionId:e.sandboxSessionId,session:e.session,source:n}),s=n.type===`runtime`?`agent/self`:`agent/local`,{identity:c,operation:l}=mintStartOperation({callId:t.callId,name:t.subagentName,nodeId:t.nodeId,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),u=prepareAgentStart(e.currentSession,{identity:c,operation:l,target:{continuationToken:a,kind:s}}),d;try{d=(await i.createSession(o)).sessionId}catch(e){if(!isRuntimeSessionOwnershipConflictError(e))return logError(log,`local subagent start failed`,e,{callId:t.callId,nodeId:t.nodeId,subagentName:t.subagentName}),{kind:`error`,result:{callId:t.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:SUBAGENT_START_FAILED,message:toErrorMessage(e)},subagentName:t.subagentName},session:rejectAgentEffect(u,{disposition:`dead`,operationId:l.id})};d=e.ownerSessionId}let f={continuationToken:a,kind:s,sessionId:d};return{address:f,callId:t.callId,kind:`called`,name:t.name,session:e.taskOwned?confirmTaskAgentAddress(u,{address:f,operationId:l.id}):confirmAgentStarted(u,{address:f,operationId:l.id}),toolName:t.subagentName}}export{startLocalSubagent};
1
+ import{createLogger,logError}from"#internal/logging.js";import{isRuntimeSessionOwnershipConflictError}from"#execution/runtime-errors.js";import{ContextContainer,contextStorage}from"#context/container.js";import{toErrorMessage}from"#shared/errors.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{SUBAGENT_START_FAILED}from"#harness/agent-handle-errors.js";import{confirmAgentStarted,confirmTaskAgentAddress,prepareAgentStart,rejectAgentEffect}from"#harness/handles/transitions.js";import{buildSubagentRunInput}from"#execution/subagent-tool.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{mintStartOperation}from"#execution/dispatch-start-operation.js";const log=createLogger(`execution.subagent-start-local`);async function startLocalSubagent(e){let{action:t,source:n}=e,r=deriveChildActivityObserverConfig({activityObserver:e.activityObserver,callId:t.callId,kind:`subagent`,name:t.subagentName,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),i=createWorkflowRuntime({compiledArtifactsSource:e.bundle.compiledArtifactsSource,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,nodeId:t.nodeId}),{childContinuationToken:a,runInput:o}=buildSubagentRunInput({action:t,auth:e.auth,batchEvent:e.batchEvent,capabilities:e.capabilities,channelMetadata:e.channelMetadata,fanoutSize:e.fanoutSize,initiatorAuth:e.initiatorAuth,graph:e.bundle.graph,parentContinuationToken:e.parentContinuationToken,parentTraceContext:e.parentTraceContext,activityObserver:r,sandboxSessionId:e.sandboxSessionId,selfAgent:e.selfAgent,session:e.session,source:n}),s=n.type===`runtime`?`agent/self`:`agent/local`,{identity:c,operation:l}=mintStartOperation({callId:t.callId,name:t.subagentName,nodeId:t.nodeId,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),u=prepareAgentStart(e.currentSession,{identity:c,operation:l,target:{continuationToken:a,kind:s}}),d;try{d=(await contextStorage.run(new ContextContainer({localDevRequest:e.localDevRequest}),()=>i.createSession(o))).sessionId}catch(e){if(!isRuntimeSessionOwnershipConflictError(e))return logError(log,`local subagent start failed`,e,{callId:t.callId,nodeId:t.nodeId,subagentName:t.subagentName}),{kind:`error`,result:{callId:t.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:SUBAGENT_START_FAILED,message:toErrorMessage(e)},subagentName:t.subagentName},session:rejectAgentEffect(u,{disposition:`dead`,operationId:l.id})};d=e.ownerSessionId}let f={continuationToken:a,kind:s,sessionId:d};return{address:f,callId:t.callId,kind:`called`,name:t.name,session:e.taskOwned?confirmTaskAgentAddress(u,{address:f,operationId:l.id}):confirmAgentStarted(u,{address:f,operationId:l.id}),toolName:t.subagentName}}export{startLocalSubagent};
@@ -2,6 +2,7 @@ import type { DispatchOutcome, RuntimeSession } from "#execution/agent-handle-di
2
2
  import { resolveRemoteAgentForAction, startRemoteAgentSession } from "#execution/remote-agent-dispatch.js";
3
3
  import type { RuntimeRemoteAgentCallActionRequest } from "#shared/action-types.js";
4
4
  import type { CompiledBundle } from "#runtime/sessions/runtime-context-keys.js";
5
+ import type { ChannelAudience } from "#shared/channel-audience.js";
5
6
  /** Starts one remote subagent after dispatch planning has selected its target. */
6
7
  export declare function startRemoteSubagent(input: {
7
8
  readonly action: RuntimeRemoteAgentCallActionRequest;
@@ -12,6 +13,7 @@ export declare function startRemoteSubagent(input: {
12
13
  };
13
14
  readonly bundle: CompiledBundle;
14
15
  readonly callbackBaseUrl: string | undefined;
16
+ readonly originAudience: ChannelAudience;
15
17
  readonly currentSession: RuntimeSession;
16
18
  readonly dynamicRemoteAgent?: NonNullable<Parameters<typeof resolveRemoteAgentForAction>[0]["dynamicRemoteAgent"]>;
17
19
  readonly initiatorAuth: Parameters<typeof startRemoteAgentSession>[0]["initiatorAuth"];
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{resolveRemoteAgentForAction,startRemoteAgentSession}from"#execution/remote-agent-dispatch.js";import{confirmAgentStarted,confirmTaskAgentAddress,prepareAgentStart,rejectAgentEffect}from"#harness/handles/transitions.js";import{createRemoteAgentStartFailureResult}from"#execution/dispatch-action-failures.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{mintStartOperation}from"#execution/dispatch-start-operation.js";const log=createLogger(`execution.subagent-start-remote`);async function startRemoteSubagent(e){let{action:r}=e,i=deriveChildActivityObserverConfig({activityObserver:e.activityObserver,callId:r.callId,kind:`remote-agent`,name:r.remoteAgentName,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),a,o;try{if(e.callbackBaseUrl===void 0)throw Error(`Cannot dispatch remote agent without a callback base URL.`);a=e.callbackBaseUrl,o=resolveRemoteAgentForAction({dynamicRemoteAgent:e.dynamicRemoteAgent,nodeId:r.nodeId,remoteAgentName:r.remoteAgentName,registry:e.bundle.subagentRegistry.subagentsByNodeId})}catch(n){return logError(log,`remote agent start failed`,n,{remoteAgentName:r.remoteAgentName,nodeId:r.nodeId,callId:r.callId}),{kind:`error`,result:createRemoteAgentStartFailureResult({action:r,error:n}),session:e.currentSession}}let{identity:s,operation:c}=mintStartOperation({callId:r.callId,name:r.remoteAgentName,nodeId:r.nodeId,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),l={resolverId:e.dynamicRemoteAgent===void 0?r.nodeId:e.dynamicRemoteAgent.credentialsStepId},u=prepareAgentStart(e.currentSession,{identity:s,operation:c,target:{callbackBaseUrl:a,credentialResolver:l,kind:`agent/remote`,url:o.url}});try{let t=await startRemoteAgentSession({action:r,auth:e.auth,callbackBaseUrl:a,callbackToken:e.parentContinuationToken,initiatorAuth:e.initiatorAuth,operationId:c.id,parentTraceContext:e.parentTraceContext,activityObserver:i,remote:o,session:e.session}),n={callbackBaseUrl:a,credentialResolver:l,kind:`agent/remote`,sessionId:t.sessionId,url:o.url};return{address:n,callId:r.callId,kind:`called`,name:r.name,session:e.taskOwned?confirmTaskAgentAddress(u,{address:n,operationId:c.id}):confirmAgentStarted(u,{address:n,operationId:c.id}),toolName:r.remoteAgentName}}catch(e){return logError(log,`remote agent start failed`,e,{remoteAgentName:r.remoteAgentName,nodeId:r.nodeId,callId:r.callId}),{kind:`error`,result:createRemoteAgentStartFailureResult({action:r,error:e}),session:rejectAgentEffect(u,{disposition:`dead`,operationId:c.id})}}}export{startRemoteSubagent};
1
+ import{createLogger,logError}from"#internal/logging.js";import{resolveRemoteAgentForAction,startRemoteAgentSession}from"#execution/remote-agent-dispatch.js";import{confirmAgentStarted,confirmTaskAgentAddress,prepareAgentStart,rejectAgentEffect}from"#harness/handles/transitions.js";import{createRemoteAgentStartFailureResult}from"#execution/dispatch-action-failures.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{mintStartOperation}from"#execution/dispatch-start-operation.js";const log=createLogger(`execution.subagent-start-remote`);async function startRemoteSubagent(e){let{action:r}=e,i=deriveChildActivityObserverConfig({activityObserver:e.activityObserver,callId:r.callId,kind:`remote-agent`,name:r.remoteAgentName,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),a,o;try{if(e.callbackBaseUrl===void 0)throw Error(`Cannot dispatch remote agent without a callback base URL.`);a=e.callbackBaseUrl,o=resolveRemoteAgentForAction({dynamicRemoteAgent:e.dynamicRemoteAgent,nodeId:r.nodeId,remoteAgentName:r.remoteAgentName,registry:e.bundle.subagentRegistry.subagentsByNodeId})}catch(n){return logError(log,`remote agent start failed`,n,{remoteAgentName:r.remoteAgentName,nodeId:r.nodeId,callId:r.callId}),{kind:`error`,result:createRemoteAgentStartFailureResult({action:r,error:n}),session:e.currentSession}}let{identity:s,operation:c}=mintStartOperation({callId:r.callId,name:r.remoteAgentName,nodeId:r.nodeId,parentSessionId:e.session.sessionId,parentTurnId:e.batchEvent.turnId}),l={resolverId:e.dynamicRemoteAgent===void 0?r.nodeId:e.dynamicRemoteAgent.credentialsStepId},u=prepareAgentStart(e.currentSession,{identity:s,operation:c,target:{callbackBaseUrl:a,credentialResolver:l,kind:`agent/remote`,url:o.url}});try{let t=await startRemoteAgentSession({action:r,auth:e.auth,callbackBaseUrl:a,callbackToken:e.parentContinuationToken,originAudience:e.originAudience,initiatorAuth:e.initiatorAuth,operationId:c.id,parentTraceContext:e.parentTraceContext,activityObserver:i,remote:o,session:e.session}),n={callbackBaseUrl:a,credentialResolver:l,kind:`agent/remote`,sessionId:t.sessionId,url:o.url};return{address:n,callId:r.callId,kind:`called`,name:r.name,session:e.taskOwned?confirmTaskAgentAddress(u,{address:n,operationId:c.id}):confirmAgentStarted(u,{address:n,operationId:c.id}),toolName:r.remoteAgentName}}catch(e){return logError(log,`remote agent start failed`,e,{remoteAgentName:r.remoteAgentName,nodeId:r.nodeId,callId:r.callId}),{kind:`error`,result:createRemoteAgentStartFailureResult({action:r,error:e}),session:rejectAgentEffect(u,{disposition:`dead`,operationId:c.id})}}}export{startRemoteSubagent};
@@ -72,6 +72,7 @@ export declare function buildSubagentRunInput(input: {
72
72
  readonly graph?: SubagentSandboxGraph;
73
73
  /** Durable session identity of the sandbox currently used by the parent. */
74
74
  readonly sandboxSessionId?: string;
75
+ readonly selfAgent: boolean;
75
76
  /** Hook token owned by the workflow currently waiting for this child. */
76
77
  readonly parentContinuationToken?: string;
77
78
  readonly parentTraceContext?: SessionTraceContext;
@@ -1 +1 @@
1
- import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter-state.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{resolveRemainingSessionTokenLimits}from"#harness/subagent-token-budget.js";function buildSubagentRunInput(e){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l,source:u}=e,d=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),f=l.rootSessionId??l.sessionId,p=resolveSubagentDepth(l),m=resolveRemainingSessionTokenLimits(l,e.fanoutSize),h=normalizeRequestedOutputSchema(r.input.outputSchema),g={callId:r.callId,parentContinuationToken:e.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName};return(e.graph?.nodesByNodeId.get(r.nodeId)?.sandboxRegistry.sandbox?.definition.inheritsParent===!0||r.subagentName===`agent`)&&(l.sandboxState!==void 0&&(g.parentSandboxState=l.sandboxState),g.sandboxSessionId=e.sandboxSessionId??l.sessionId),{childContinuationToken:d,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:g},auth:i,capabilities:o,channelMetadata:s,continuationToken:d,initiatorAuth:c,input:{message:formatSubagentCallInputMessage({action:r,source:u}),outputSchema:h??u.outputSchema},limits:m,mode:`conversation`,parent:{callId:r.callId,rootSessionId:f,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}},parentTraceContext:e.parentTraceContext,activityObserver:e.activityObserver,subagentDepth:p.nextChildDepth}}}function formatSubagentCallInputMessage(t){let{message:n}=t.action.input;switch(t.source.type){case`local`:return formatSubagentInput({description:t.source.description,message:n,name:t.action.subagentName,type:`local`}).message;case`runtime`:return formatSubagentInput({message:n,name:t.action.subagentName,type:`runtime`}).message;default:return t.source}}export{buildSubagentRunInput};
1
+ import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter-state.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{resolveRemainingSessionTokenLimits}from"#harness/subagent-token-budget.js";function buildSubagentRunInput(e){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l,source:u}=e,d=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),f=l.rootSessionId??l.sessionId,p=resolveSubagentDepth(l),m=resolveRemainingSessionTokenLimits(l,e.fanoutSize),h=normalizeRequestedOutputSchema(r.input.outputSchema),g={callId:r.callId,parentContinuationToken:e.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName};return(e.graph?.nodesByNodeId.get(r.nodeId)?.sandboxRegistry.sandbox?.definition.inheritsParent===!0||e.selfAgent)&&(l.sandboxState!==void 0&&(g.parentSandboxState=l.sandboxState),g.sandboxSessionId=e.sandboxSessionId??l.sessionId),{childContinuationToken:d,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:g},auth:i,capabilities:o,channelMetadata:s,continuationToken:d,initiatorAuth:c,input:{message:formatSubagentCallInputMessage({action:r,source:u}),outputSchema:h??u.outputSchema},limits:m,mode:`conversation`,parent:{callId:r.callId,rootSessionId:f,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}},parentTraceContext:e.parentTraceContext,activityObserver:e.activityObserver,subagentDepth:p.nextChildDepth}}}function formatSubagentCallInputMessage(t){let{message:n}=t.action.input;switch(t.source.type){case`local`:return formatSubagentInput({description:t.source.description,message:n,name:t.action.subagentName,type:`local`}).message;case`runtime`:return formatSubagentInput({message:n,name:t.action.subagentName,type:`runtime`}).message;default:return t.source}}export{buildSubagentRunInput};
@@ -1,4 +1,5 @@
1
1
  import type { ActivityObserverConfig } from "#channel/types.js";
2
+ import type { AnswerHookRoute } from "#harness/proxy-input-requests.js";
2
3
  import type { ActivityEventV1 } from "#protocol/activity.js";
3
4
  import { type TaskInboundAnswerInput, type TaskInboundAuthorizationEvent, type TaskInboundInputRequest, type TaskInboundUpdate, type TaskView } from "#tasks/types.js";
4
5
  /**
@@ -56,6 +57,7 @@ export declare function wakeTaskInputRequestParentStep(input: {
56
57
  */
57
58
  export declare function deliverTaskInputResponsesStep(input: {
58
59
  readonly answer: TaskInboundAnswerInput;
60
+ readonly answerHook?: AnswerHookRoute;
59
61
  readonly requestIds: readonly string[];
60
62
  }): Promise<"delivered" | "unreachable">;
61
63
  export declare function formatTaskNotification(view: TaskView): string;
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{submitActivity}from"#execution/submit-activity.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let n=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await n.write(e.view)}finally{n.releaseLock()}submitActivity({events:projectTaskActivitySettlement({activityObserver:e.activityObserver,settledAt:new Date().toISOString(),view:e.view}),sink:e.activityObserver?.sink})}function projectTaskActivitySettlement(e){let t=e.activityObserver?.workIdentity,n=e.view.status;return t===void 0||n!==`completed`&&n!==`failed`&&n!==`cancelled`?[]:[{eventId:`${t.id}:settled:${n}`,kind:`work.settled`,outcome:n,settledAt:e.settledAt,workId:t.id}]}async function wakeTaskAuthorizationParentStep(e){"use step";let t={callId:e.request.callId,childSessionId:e.request.childSessionId,event:e.request.event,kind:`subagent-authorization-event`,subagentName:e.request.subagentName},r=e.request.event.data,i={task:{authorizationEvents:[{hookPayload:t,taskId:e.taskId}]}};e.request.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${e.request.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(e.request.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskParentStep(e){"use step";let t={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(t.task={views:[e.view]});let r={kind:`send`,payload:t,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let t={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.updateEpoch}:${e.update.updateIndex}:${e.update.callId}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskInputRequestParentStep(e){"use step";let t={kind:`send`,payload:{task:{inputRequests:[{hookPayload:e.request,taskId:e.taskId}]}},taskDeliveryId:`${e.taskId}:input:${e.request.event.turnId}:${e.request.event.stepIndex}:${e.request.event.sequence}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function deliverTaskInputResponsesStep(e){"use step";let t=new Set(e.requestIds),r={auth:e.answer.auth,kind:`send`,payload:{inputResponses:e.answer.inputResponses.filter(e=>t.has(e.requestId))},taskDeliveryId:`${e.answer.taskId}:${[...e.requestIds].sort().join(`,`)}`};try{if(e.answer.childResponseUrl!==void 0){let t=await fetch(e.answer.childResponseUrl,{body:JSON.stringify({inputResponses:r.payload.inputResponses}),headers:{"content-type":`application/json`},method:`POST`,redirect:`error`});if(t.status===404)return`unreachable`;if(!t.ok)throw Error(`Remote task input delivery failed with HTTP ${t.status}.`)}else await resumeSessionInbox(e.answer.childContinuationToken,r);return`delivered`}catch(t){if(isTaskWorkflowTargetGone(t))return log.warn(`task input answer target is gone; the child turn already ended`,{taskId:e.answer.taskId}),`unreachable`;throw t}}function formatTaskNotification(e){let t=`Background task ${e.taskId} (${e.metadata.name})`;return e.status===`input_required`?`${t} needs input.`:e.status===`completed`?`${t} is completed.\n\nResult:\n${formatTaskOutput(e.lastOutput.data)}`:e.status===`failed`?`${t} failed.\n\nError:\n${formatTaskOutput(e.lastOutput.data)}`:`${t} is cancelled.`}function formatTaskOutput(e){return typeof e==`string`?e:JSON.stringify(e)??`null`}export{appendTaskViewStep,deliverTaskInputResponsesStep,formatTaskNotification,projectTaskActivitySettlement,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep};
1
+ import{createLogger}from"#internal/logging.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{resumeToolRunAnswers}from"#execution/tool-run/answer.js";import{submitActivity}from"#execution/submit-activity.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let n=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await n.write(e.view)}finally{n.releaseLock()}submitActivity({events:projectTaskActivitySettlement({activityObserver:e.activityObserver,settledAt:new Date().toISOString(),view:e.view}),sink:e.activityObserver?.sink})}function projectTaskActivitySettlement(e){let t=e.activityObserver?.workIdentity,n=e.view.status;return t===void 0||n!==`completed`&&n!==`failed`&&n!==`cancelled`?[]:[{eventId:`${t.id}:settled:${n}`,kind:`work.settled`,outcome:n,settledAt:e.settledAt,workId:t.id}]}async function wakeTaskAuthorizationParentStep(e){"use step";let t={callId:e.request.callId,childSessionId:e.request.childSessionId,event:e.request.event,kind:`subagent-authorization-event`,subagentName:e.request.subagentName},r=e.request.event.data,i={task:{authorizationEvents:[{hookPayload:t,taskId:e.taskId}]}};e.request.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${e.request.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(e.request.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskParentStep(e){"use step";let t={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(t.task={views:[e.view]});let r={kind:`send`,payload:t,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let t={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.updateEpoch}:${e.update.updateIndex}:${e.update.callId}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskInputRequestParentStep(e){"use step";let t={kind:`send`,payload:{task:{inputRequests:[{hookPayload:e.request,taskId:e.taskId}]}},taskDeliveryId:`${e.taskId}:input:${e.request.event.turnId}:${e.request.event.stepIndex}:${e.request.event.sequence}`};try{await resumeSessionInbox(e.token,t)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function deliverTaskInputResponsesStep(e){"use step";let t=new Set(e.requestIds),i={auth:e.answer.auth,kind:`send`,payload:{inputResponses:e.answer.inputResponses.filter(e=>t.has(e.requestId))},taskDeliveryId:`${e.answer.taskId}:${[...e.requestIds].sort().join(`,`)}`};try{if(e.answer.childResponseUrl!==void 0){let t=await fetch(e.answer.childResponseUrl,{body:JSON.stringify({inputResponses:i.payload.inputResponses}),headers:{"content-type":`application/json`},method:`POST`,redirect:`error`});if(t.status===404)return`unreachable`;if(!t.ok)throw Error(`Remote task input delivery failed with HTTP ${t.status}.`)}else e.answerHook===void 0?await resumeSessionInbox(e.answer.childContinuationToken,i):await resumeToolRunAnswers(e.answer.childContinuationToken,i.payload.inputResponses);return`delivered`}catch(t){if(isTaskWorkflowTargetGone(t))return log.warn(`task input answer target is gone; the child turn already ended`,{taskId:e.answer.taskId}),`unreachable`;throw t}}function formatTaskNotification(e){let t=`Background task ${e.taskId} (${e.metadata.name})`;return e.status===`input_required`?`${t} needs input.`:e.status===`completed`?`${t} is completed.\n\nResult:\n${formatTaskOutput(e.lastOutput.data)}`:e.status===`failed`?`${t} failed.\n\nError:\n${formatTaskOutput(e.lastOutput.data)}`:`${t} is cancelled.`}function formatTaskOutput(e){return typeof e==`string`?e:JSON.stringify(e)??`null`}export{appendTaskViewStep,deliverTaskInputResponsesStep,formatTaskNotification,projectTaskActivitySettlement,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep};
@@ -1,8 +1,9 @@
1
1
  import type { ChannelAdapter } from "#channel/adapter.js";
2
- import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#shared/action-types.js";
2
+ import type { RuntimeActionResult } from "#shared/action-types.js";
3
+ import type { TaskControlInvocation } from "#shared/dispatch-action.js";
3
4
  /** Sends one child-authored progress update over its existing parent transport. */
4
5
  export declare function executeTaskUpdate(input: {
5
- readonly action: RuntimeToolCallActionRequest;
6
+ readonly action: TaskControlInvocation;
6
7
  readonly adapter: ChannelAdapter | undefined;
7
8
  readonly updateIndex: number;
8
9
  readonly updateEpoch: string;
@@ -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";function isTaskRunFinished(e,t){return!isTerminalTaskStatus(e.status)||!t?!1:e.status!==`cancelled`||e.executor?.lifecycle===`terminal`}async function taskRunWorkflow(i){"use workflow";let a=createHook({token:i.taskInboxToken}),o=a[Symbol.asyncIterator](),s=!1;try{try{await claimHookOwnership(a),s=!0}catch(e){if(isHookConflictError(e))return;throw e}let e=i.initialView,n,c=[],l=[],u=!1;for(await appendTaskViewStep({activityObserver:i.activityObserver,view:e});!isTaskRunFinished(e,u);){let t=await o.next();if(t.done===!0)return;let r=t.value.kind===`subagent-authorization-event`?{...t.value,kind:`authorization-event`}:t.value;if(r.kind===`authorization-event`&&(r.event.type===`approval.candidate`||r.event.type===`approval.settled`))continue;let a=r.kind===`task-command`&&r.command.kind===`ready`,s=r.kind===`task-command`&&r.command.kind===`reject-dispatch`;if((a||s)&&(u=!0),r.kind===`subagent-input-request`&&(n=r),r.kind===`authorization-event`&&c.push(r),r.kind===`task-update`){u&&!isTerminalTaskStatus(e.status)?await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:r,view:e}):l.push(r);continue}let d=e.status===`cancelled`&&r.kind===`runtime-action-result`,f=r.kind===`input-response`,p;if(d)p={kind:`settle-executor`,usage:readTaskUsage(r.results[0]?.outcome?.usageDelta)};else if(f){if(e.status!==`input_required`)continue;p=await resolveAnsweredCommand(e,r)}else p=translateTaskInboundPayload(r);if(p===void 0)continue;if(a&&isTerminalTaskStatus(e.status)){for(let t of l)await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:t,view:e});l=[],await wakeTaskParentStep({token:i.parentContinuationToken,view:e});continue}let m=applyTaskTransition(e,p);if(m.action!==`accepted`)continue;let h=!isTerminalTaskStatus(e.status)&&isTerminalTaskStatus(m.view.status),g=!isReadyTaskStatus(e.status)&&isReadyTaskStatus(m.view.status);e=m.view,await appendTaskViewStep({activityObserver:i.activityObserver,view:e});let _=u&&!h?c:[];for(let t of _)await wakeTaskAuthorizationParentStep({request:t,taskId:e.taskId,token:i.parentContinuationToken});if(u&&l.length>0&&!isTerminalTaskStatus(e.status)){for(let t of l)await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:t,view:e});l=[]}(h||_.length>0)&&(c=[]),n!==void 0&&u&&e.status===`input_required`?(await wakeTaskInputRequestParentStep({request:n,taskId:e.taskId,token:i.parentContinuationToken}),n=void 0):!s&&_.length===0&&u&&(h||g&&n===void 0)&&await wakeTaskParentStep({token:i.parentContinuationToken,view:e}),e.status!==`input_required`&&(n=void 0)}}finally{s&&await disposeHook(a)}}async function resolveAnsweredCommand(e,t){if(t.taskId!==e.taskId)return;let n=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),r=t.inputResponses.map(e=>e.requestId).filter(e=>n.has(e));return r.length===0?void 0:await deliverTaskInputResponsesStep({answer:t,requestIds:r})===`delivered`?{kind:`answered`,requestIds:r}: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,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,6 +1,7 @@
1
1
  import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
2
2
  import { type AgentHandle } from "#harness/handles/store.js";
3
- import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#shared/action-types.js";
3
+ import type { RuntimeActionResult } from "#shared/action-types.js";
4
+ import type { TaskControlInvocation } from "#shared/dispatch-action.js";
4
5
  import { type SessionTaskIndexEntry } from "#tasks/session-index.js";
5
6
  import { type TaskView } from "#tasks/types.js";
6
7
  /**
@@ -29,8 +30,8 @@ export declare function findActiveTaskForAgent(session: RuntimeSession, agentId:
29
30
  readonly view: TaskView;
30
31
  } | undefined>;
31
32
  /** One successful task-control result carrying full task views. */
32
- export declare function createTaskViewsResult(action: RuntimeToolCallActionRequest, views: readonly TaskView[]): RuntimeActionResult;
33
+ export declare function createTaskViewsResult(action: TaskControlInvocation, views: readonly TaskView[]): RuntimeActionResult;
33
34
  /** One task-control error the model can act on. */
34
- export declare function createTaskControlError(action: RuntimeToolCallActionRequest, message: string): RuntimeActionResult;
35
+ export declare function createTaskControlError(action: TaskControlInvocation, message: string): RuntimeActionResult;
35
36
  /** The ownership error for ids outside this session's task index. */
36
- export declare function createUnknownTasksError(action: RuntimeToolCallActionRequest, unknown: readonly string[]): RuntimeActionResult;
37
+ export declare function createUnknownTasksError(action: TaskControlInvocation, unknown: readonly string[]): RuntimeActionResult;
@@ -1 +1 @@
1
- import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{beginDelegatedTask,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{checkTaskContinuationAvailability,describeTaskDispatch,persistContinuationTaskInParentSession,settleTaskDispatchError}from"#execution/tasks/parent/continuation-dispatch.js";async function dispatchTaskStep(r){"use step";let i=await prepareRuntimeActionDispatch({serializedContext:r.serializedContext,sessionState:r.sessionState,taskControls:!0});if(i===void 0)return{results:[],sessionState:r.sessionState,pendingTasks:[]};let{batch:a,bundle:o,session:s}=i,c=r.parentWritable.getWriter(),l=s,u=[],d=[];try{for(let e of i.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`task-control`){let t=await executeTaskControlAction({action:e.action,adapter:i.adapter,bundle:o,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,serializedContext:i.serializedContext,session:l});l=t.session,t.pendingTask!==void 0&&d.push(t.pendingTask),u.push(t.result);continue}if(e.kind===`resume`){let t=await checkTaskContinuationAvailability({action:e.action,agentId:e.agentId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l});if(t!==void 0){u.push(t);continue}}let n=e.kind===`resume`?e.action:e.target.action,f=await beginDelegatedTask({...describeTaskDispatch({action:n,agentId:e.kind===`resume`?e.agentId:void 0,parentSessionId:s.sessionId,parentTurnId:a.event.turnId,session:l}),activityObserver:i.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:i.activityObserver,callId:n.callId,kind:`task`,name:e.kind===`resume`?e.action.name:e.target.action.name,parentSessionId:s.sessionId,parentTurnId:a.event.turnId}),parentSessionId:s.sessionId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l}),p;e.kind===`resume`&&(p=await persistContinuationTaskInParentSession({action:e.action,agentId:e.agentId,delegated:f,session:l}),l=p?.session??l);let m;switch(e.kind){case`resume`:m=await dispatchToTaskAgentAddress({action:e.action,activityObserver:i.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:i.activityObserver,callId:e.action.callId,kind:`task`,name:e.action.name,parentSessionId:s.sessionId,parentTurnId:a.event.turnId}),agentId:e.agentId,auth:i.auth,bundle:createAgentContinuationBundle({action:e.action,bundle:o,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:f.taskInboxToken});break;case`start`:m=await startSubagent({auth:i.auth,batchEvent:a.event,bundle:o,callbackBaseUrl:r.callbackBaseUrl,capabilities:i.capabilities,channelMetadata:i.channelMetadata,currentSession:l,fanoutSize:i.fanoutSize,initiatorAuth:i.initiatorAuth,parentContinuationToken:f.taskInboxToken,parentTraceContext:i.parentTraceContext,activityObserver:i.activityObserver,sandboxSessionId:i.sandboxSessionId,serializedContext:i.serializedContext,session:s,taskOwned:!0,target:e.target});break}if(l=m.session,m.kind===`error`){u.push(await settleTaskDispatchError({delegated:f,outcome:m,persisted:p})),p!==void 0&&d.push(f);continue}if(p!==void 0)u.push(p.receipt);else{let e=await settleDelegatedDispatch({callId:m.callId,session:l,subagentName:m.toolName,task:f});l=e.session,u.push(e.receipt)}d.push(f),await emitSubagentCalled({adapter:i.adapter,adapterCtx:i.adapterCtx,batchEvent:a.event,entry:e,outcome:m,sessionId:s.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===s?r.sessionState:createDurableSessionState({session:l}),pendingTasks:d}}export{dispatchTaskStep};
1
+ import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{startWorkflowTool}from"#execution/tool-run/dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{beginDelegatedTask,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{checkTaskContinuationAvailability,describeTaskDispatch,persistContinuationTaskInParentSession,settleTaskDispatchError}from"#execution/tasks/parent/continuation-dispatch.js";async function dispatchTaskStep(r){"use step";let i=await prepareRuntimeActionDispatch({serializedContext:r.serializedContext,sessionState:r.sessionState,taskControls:!0});if(i===void 0)return{results:[],sessionState:r.sessionState,pendingTasks:[]};let{batch:a,bundle:o,session:s}=i,c=r.parentWritable.getWriter(),l=s,u=[],d=[];try{for(let e of i.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`workflow-tool`){let t=await startWorkflowTool({action:e.action,batchEvent:a.event,ownerInboxToken:r.parentContinuationToken,prepared:i,session:l});l=t.session,t.result!==void 0&&u.push(t.result);continue}if(e.kind===`task-control`){let t=await executeTaskControlAction({action:e.action,adapter:i.adapter,bundle:o,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,serializedContext:i.serializedContext,session:l});l=t.session,t.pendingTask!==void 0&&d.push(t.pendingTask),u.push(t.result);continue}if(e.kind===`resume`){let t=await checkTaskContinuationAvailability({action:e.action,agentId:e.agentId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l});if(t!==void 0){u.push(t);continue}}let n=e.kind===`resume`?e.action:e.target.action,f=await beginDelegatedTask({...describeTaskDispatch({action:n,agentId:e.kind===`resume`?e.agentId:void 0,parentSessionId:s.sessionId,parentTurnId:a.event.turnId,session:l}),activityObserver:i.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:i.activityObserver,callId:n.callId,kind:`task`,name:e.kind===`resume`?e.action.name:e.target.action.name,parentSessionId:s.sessionId,parentTurnId:a.event.turnId}),parentSessionId:s.sessionId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l}),p;e.kind===`resume`&&(p=await persistContinuationTaskInParentSession({action:e.action,agentId:e.agentId,delegated:f,session:l}),l=p?.session??l);let m;switch(e.kind){case`resume`:m=await dispatchToTaskAgentAddress({action:e.action,activityObserver:i.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:i.activityObserver,callId:e.action.callId,kind:`task`,name:e.action.name,parentSessionId:s.sessionId,parentTurnId:a.event.turnId}),agentId:e.agentId,auth:i.auth,bundle:createAgentContinuationBundle({action:e.action,bundle:o,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:f.taskInboxToken});break;case`start`:m=await startSubagent({auth:i.auth,batchEvent:a.event,bundle:o,callbackBaseUrl:r.callbackBaseUrl,capabilities:i.capabilities,channelMetadata:i.channelMetadata,currentSession:l,fanoutSize:i.fanoutSize,initiatorAuth:i.initiatorAuth,localDevRequest:i.localDevRequest,parentContinuationToken:f.taskInboxToken,parentTraceContext:i.parentTraceContext,activityObserver:i.activityObserver,sandboxSessionId:i.sandboxSessionId,serializedContext:i.serializedContext,session:s,taskOwned:!0,target:e.target});break}if(l=m.session,m.kind===`error`){u.push(await settleTaskDispatchError({delegated:f,outcome:m,persisted:p})),p!==void 0&&d.push(f);continue}if(p!==void 0)u.push(p.receipt);else{let e=await settleDelegatedDispatch({callId:m.callId,session:l,subagentName:m.toolName,task:f});l=e.session,u.push(e.receipt)}d.push(f),await emitSubagentCalled({adapter:i.adapter,adapterCtx:i.adapterCtx,batchEvent:a.event,entry:e,outcome:m,sessionId:s.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===s?r.sessionState:createDurableSessionState({session:l}),pendingTasks:d}}export{dispatchTaskStep};
@@ -1,12 +1,13 @@
1
1
  import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
2
2
  import type { ChannelAdapter } from "#channel/adapter.js";
3
3
  import type { DelegatedTask } from "#execution/tasks/parent/delegate.js";
4
- import type { RuntimeActionRequest, RuntimeActionResult, RuntimeToolCallActionRequest } from "#shared/action-types.js";
4
+ import type { RuntimeActionResult } from "#shared/action-types.js";
5
+ import type { PendingDispatchAction, PendingTaskControlAction } from "#shared/dispatch-action.js";
5
6
  import type { CompiledBundle } from "#runtime/sessions/runtime-context-keys.js";
6
7
  import type { SessionTaskIndexEntry } from "#tasks/session-index.js";
7
8
  import { type SubagentExecutorData, type TaskView } from "#tasks/types.js";
8
9
  /** True for task-control calls dispatched outside the model loop. */
9
- export declare function isTaskControlAction(action: RuntimeActionRequest): action is RuntimeToolCallActionRequest;
10
+ export declare function isTaskControlAction(action: PendingDispatchAction): action is PendingTaskControlAction;
10
11
  /**
11
12
  * Executes one task-control call inside the dispatch step, which holds
12
13
  * the durable session state (ownership index) and world access the
@@ -15,7 +16,7 @@ export declare function isTaskControlAction(action: RuntimeActionRequest): actio
15
16
  * Returns the current session alongside the action result.
16
17
  */
17
18
  export declare function executeTaskControlAction(input: {
18
- readonly action: RuntimeToolCallActionRequest;
19
+ readonly action: PendingTaskControlAction;
19
20
  readonly adapter?: ChannelAdapter;
20
21
  readonly bundle: CompiledBundle;
21
22
  readonly parentStepIndex?: number;
@@ -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{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{TASK_CANCEL_TOOL_NAME,TASK_TOOL_NAMES,TASK_UPDATE_TOOL_NAME}from"#tools/framework/task-contract.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.kind===`tool-call`&&TASK_TOOL_NAMES.has(e.toolName)}async function executeTaskControlAction(e){let{action:t,session:n}=e;if(t.toolName===TASK_UPDATE_TOOL_NAME)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;if(t.toolName!==TASK_CANCEL_TOOL_NAME)return{result:createTaskControlError(t,`Unsupported task control "${t.toolName}".`),session:n};let 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,session:e.session,view:i}),i}async function propagateTaskCancel(e){let t=readSubagentTaskMetadata(e.view);if(t===void 0)return;let n=readSubagentExecutor(e.view.executor)??findTaskAgentAddress(e.session,t.agentId);n!==void 0&&(e.view.executor?.childSessionId!==void 0&&e.view.executor.childSessionId!==n.address.sessionId||await propagateSubagentExecutorCancel({bundle:e.bundle,childTurnId:e.view.executor?.childTurnId,executor:n,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{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 +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{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(r){"use step";let a=await readDurableSession(r.sessionState),c=findSessionTaskEntry(a.state,r.taskId),l=c===void 0?void 0:readSubagentTaskMetadata(c),u=(getAgentHandleStore(a.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===l?.agentId);if(c===void 0||u?.phase!==`addressed`||u.address.sessionId!==r.hookPayload.childSessionId)return{accepted:!1,sessionState:r.sessionState};let d=await readLatestTaskView({taskRunId:c.taskRunId}),f=d===void 0?void 0:readSubagentTaskMetadata(d),p=r.hookPayload.event.requests.map(e=>e.requestId),m=d?.inputRequests?.map(e=>typeof e==`object`&&e&&!Array.isArray(e)?Reflect.get(e,`requestId`):void 0)??[];if(d?.status!==`input_required`||!r.hookPayload.event.requests.every(isInputRequest)||f?.mode!==(u.address.kind===`agent/remote`?`remote`:`local`)||f.agentId!==l?.agentId||d.executor?.childSessionId!==r.hookPayload.childSessionId||new Set(p).size!==p.length||p.length!==m.length||p.some((e,t)=>e!==m[t]))return{accepted:!1,sessionState:r.sessionState};let h=namespaceTaskInputRequests(r.hookPayload,r.taskId),g=toProxyInputRequestEntries(h,r.taskId).map(([e,t],n)=>{let i=r.hookPayload.event.requests[n].requestId;return[e,{...t,childRequestId:i}]});if(u.address.kind===`agent/remote`){let t=createRemoteTaskInputCallbackUrl(u.address.url,createEveTaskInputRoutePath(createTaskInputCapabilityToken(r.hookPayload.childContinuationToken)));g=g.map(([e,n])=>[e,{...n,childResponseUrl:t}])}let _=upsertProxyInputRequestState({entries:g,forChildContinuationToken:r.hookPayload.childContinuationToken,state:a.state});return{accepted:!0,hookPayload:h,sessionState:{...r.sessionState,hasProxyInputRequests:!0,snapshot:{session:{...a,state:_},version:r.sessionState.version}}}}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{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 +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{runStep}from"#context/run-step.js";import{propagateSubagentExecutorCancel}from"#execution/tasks/parent/dispatch.js";import{activeTurnId}from"#harness/active-turn-id.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{isTurnCancellation}from"#harness/turn-cancellation.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})}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{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{propagateSubagentExecutorCancel}from"#execution/tasks/parent/dispatch.js";import{activeTurnId}from"#harness/active-turn-id.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 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{callAdapterEventHandler}from"#channel/adapter.js";import{createSessionCompletedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext}from"#context/serialize.js";import{buildAdapterContext}from"#channel/adapter-context.js";const log=createLogger(`execution.workflow-entry`);async function emitTerminalSessionCompletionStep(e){"use step";let i=createSessionCompletedEvent(),a=e.serializedContext[`eve.sessionId`]??``;try{let n=await deserializeContext(e.serializedContext),r=n.get(ChannelKey);r!==void 0&&await callAdapterEventHandler(r,i,buildAdapterContext(r,n))}catch(e){log.error(`adapter failed to handle terminal session.completed event`,{error:e,sessionId:a})}try{let t=e.parentWritable.getWriter();try{await t.write(encodeMessageStreamEvent(stampMessageStreamEvent(i)))}finally{t.releaseLock()}}catch(e){log.error(`failed to write terminal session.completed event to durable stream`,{error:e,sessionId:a})}}export{emitTerminalSessionCompletionStep};
1
+ import{createSessionCompletedEvent}from"#protocol/message.js";import{emitTerminalSessionEvent}from"#execution/terminal-session-event.js";async function emitTerminalSessionCompletionStep(e){"use step";await emitTerminalSessionEvent({...e,event:createSessionCompletedEvent()})}export{emitTerminalSessionCompletionStep};
@@ -0,0 +1,13 @@
1
+ import { type UnstampedMessageStreamEvent } from "#protocol/message.js";
2
+ type TerminalSessionEvent = Extract<UnstampedMessageStreamEvent, {
3
+ type: "session.completed" | "session.failed";
4
+ }>;
5
+ /** Delivers one out-of-turn terminal event through the native instrumentation lifecycle. */
6
+ export declare function emitTerminalSessionEvent(input: {
7
+ readonly errorId?: string;
8
+ readonly event: TerminalSessionEvent;
9
+ readonly parentWritable: WritableStream<Uint8Array>;
10
+ readonly serializedContext: Record<string, unknown>;
11
+ readonly turnId?: string;
12
+ }): Promise<void>;
13
+ export {};
@@ -0,0 +1 @@
1
+ import{createLogger}from"#internal/logging.js";import{callAdapterEventHandler}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{ParentSessionKey}from"#context/keys.js";import{encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{deserializeContext}from"#context/serialize.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";const log=createLogger(`execution.workflow-entry`);async function emitTerminalSessionEvent(e){let i=e.serializedContext[`eve.sessionId`]??``,a;try{a=await deserializeContext(e.serializedContext)}catch(t){log.error(`failed to restore context for terminal ${e.event.type} event`,{error:t,errorId:e.errorId,sessionId:i})}let handleEvent=async n=>{if(a!==void 0){let r=a.get(ChannelKey);if(r!==void 0)try{await callAdapterEventHandler(r,n,buildAdapterContext(r,a))}catch(t){log.error(`adapter failed to handle terminal ${n.type} event`,{error:t,errorId:e.errorId,sessionId:i})}}try{let t=e.parentWritable.getWriter();try{await t.write(encodeMessageStreamEvent(stampMessageStreamEvent(n)))}finally{t.releaseLock()}}catch(t){log.error(`failed to write terminal ${n.type} event to durable stream`,{error:t,errorId:e.errorId,sessionId:i})}},o;if(a!==void 0)try{o=bindSessionInstrumentation({agentName:a.require(BundleKey).turnAgent.id,ctx:a,rootSessionId:a.get(ParentSessionKey)?.rootSessionId??i,sessionId:i})}catch(t){log.error(`failed to bind instrumentation for terminal ${e.event.type} event`,{error:t,errorId:e.errorId,sessionId:i})}let s=o?.createHandleEvent({handleEvent,turnId:e.turnId})??handleEvent;try{a===void 0?await s(e.event):await contextStorage.run(a,()=>s(e.event))}catch(t){log.error(`instrumentation failed to handle terminal ${e.event.type} event`,{error:t,errorId:e.errorId,sessionId:i})}finally{try{await o?.flush()}catch(t){log.error(`failed to flush instrumentation after terminal ${e.event.type} event`,{error:t,errorId:e.errorId,sessionId:i})}}}export{emitTerminalSessionEvent};
@@ -3,4 +3,5 @@ export declare function emitTerminalSessionFailureStep(input: {
3
3
  readonly error: unknown;
4
4
  readonly parentWritable: WritableStream<Uint8Array>;
5
5
  readonly serializedContext: Record<string, unknown>;
6
+ readonly turnId?: string;
6
7
  }): Promise<void>;