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{createLogger,formatError}from"#internal/logging.js";import{callAdapterEventHandler}from"#channel/adapter.js";import{createSessionFailedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.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 emitTerminalSessionFailureStep(e){"use step";let r=formatError(e.error),i=summarizeKnownError(e.error),a=r;if(i!==null){let e={...r,message:i.message,name:i.name,semanticErrorId:i.id};a=i.hint===void 0?e:{...e,hint:i.hint}}let o=typeof a.name==`string`?a.name:`WORKFLOW_EXECUTION_FAILED`,s=typeof a.message==`string`?a.message:String(e.error),c=e.serializedContext[`eve.sessionId`]??``;log.error(`workflow loop threw — emitting terminal session.failed`,{sessionId:c,errorId:typeof a.errorId==`string`?a.errorId:void 0,code:o});let l=createSessionFailedEvent({code:o,details:a,message:s,sessionId:c});try{let t=await deserializeContext(e.serializedContext),n=t.get(ChannelKey);n!==void 0&&await callAdapterEventHandler(n,l,buildAdapterContext(n,t))}catch(e){log.error(`adapter failed to handle terminal session.failed event`,{errorId:typeof a.errorId==`string`?a.errorId:void 0,sessionId:c,error:e})}try{let t=e.parentWritable.getWriter();try{await t.write(encodeMessageStreamEvent(stampMessageStreamEvent(l)))}finally{t.releaseLock()}}catch(e){log.error(`failed to write terminal session.failed event to durable stream`,{errorId:typeof a.errorId==`string`?a.errorId:void 0,sessionId:c,error:e})}}export{emitTerminalSessionFailureStep};
1
+ import{createLogger,formatError}from"#internal/logging.js";import{createSessionFailedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{emitTerminalSessionEvent}from"#execution/terminal-session-event.js";const log=createLogger(`execution.workflow-entry`);async function emitTerminalSessionFailureStep(e){"use step";let t=formatError(e.error),n=summarizeKnownError(e.error),r=t;if(n!==null){let e={...t,message:n.message,name:n.name,semanticErrorId:n.id};r=n.hint===void 0?e:{...e,hint:n.hint}}let i=typeof r.name==`string`?r.name:`WORKFLOW_EXECUTION_FAILED`,a=typeof r.message==`string`?r.message:String(e.error),o=e.serializedContext[`eve.sessionId`]??``;log.error(`workflow loop threw — emitting terminal session.failed`,{sessionId:o,errorId:typeof r.errorId==`string`?r.errorId:void 0,code:i}),await emitTerminalSessionEvent({errorId:typeof r.errorId==`string`?r.errorId:void 0,event:createSessionFailedEvent({code:i,details:r,message:a,sessionId:o}),parentWritable:e.parentWritable,serializedContext:e.serializedContext,turnId:e.turnId})}export{emitTerminalSessionFailureStep};
@@ -0,0 +1,3 @@
1
+ import type { InputResponse } from "#shared/input.js";
2
+ /** Resumed with the bare response, not a session-inbox delivery, so the body can race the hook. */
3
+ export declare function resumeToolRunAnswers(answerToken: string, responses: readonly InputResponse[] | undefined): Promise<void>;
@@ -0,0 +1 @@
1
+ import{resumeHook}from"#internal/workflow/runtime.js";async function resumeToolRunAnswers(e,t){for(let n of t??[])await resumeHook(e,{optionId:n.optionId,text:n.text})}export{resumeToolRunAnswers};
@@ -0,0 +1,14 @@
1
+ import { type ToolRunAddress } from "#execution/tool-run/types.js";
2
+ import type { HarnessToolDefinition } from "#harness/execute-tool.js";
3
+ import { type JsonObject } from "#shared/json.js";
4
+ import type { TaskExecutorBinding } from "#tools/task.js";
5
+ /** Harness `execute` for a background workflow tool: starts the run as the task's executor. */
6
+ export declare function createWorkflowToolBackgroundExecute(input: {
7
+ readonly toolName: string;
8
+ readonly workflowId: string;
9
+ }): NonNullable<HarnessToolDefinition["execute"]>;
10
+ export declare function createWorkflowToolExecutorBinding(data: ToolRunAddress): TaskExecutorBinding;
11
+ /** Reads the tool run recorded on a task's executor binding, if that is what runs it. */
12
+ export declare function readWorkflowToolExecutor(binding: TaskExecutorBinding | undefined): ToolRunAddress | undefined;
13
+ /** The input crosses the run's serialization boundary; a schema may emit a `Date`, which cannot. */
14
+ export declare function parseWorkflowToolInput(toolInput: unknown, toolName: string): JsonObject;
@@ -0,0 +1 @@
1
+ import{parseJsonObject}from"#shared/json.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deriveRunOwner}from"#execution/tool-run/messages.js";import{startToolRun}from"#execution/tool-run/start.js";import{WORKFLOW_TOOL_EXECUTOR_KIND}from"#execution/tool-run/types.js";function createWorkflowToolBackgroundExecute(e){return async(r,i,a)=>{if(a===void 0)throw Error(`Background tool "${e.toolName}" requires a task runtime.`);let o=await startToolRun({callId:i.toolCallId,input:parseWorkflowToolInput(r,e.toolName),owner:deriveRunOwner(a.task.taskInboxToken),session:buildCallbackContext().session,stepIndex:getHarnessEmissionState(a.session.state).stepIndex,toolName:e.toolName,workflowId:e.workflowId});return a.delegated({executor:createWorkflowToolExecutorBinding(o),receipt:{}})}}function createWorkflowToolExecutorBinding(e){return{data:{hookToken:e.hookToken,runId:e.runId},kind:WORKFLOW_TOOL_EXECUTOR_KIND}}function readWorkflowToolExecutor(e){if(e?.kind!==WORKFLOW_TOOL_EXECUTOR_KIND)return;let{hookToken:t,runId:n}=e.data;return typeof t==`string`&&typeof n==`string`?{hookToken:t,runId:n}:void 0}function parseWorkflowToolInput(t,n){try{return parseJsonObject(t)}catch(e){throw TypeError(`Tool "${n}" is a workflow, so its parsed input must be a JSON object.`,{cause:e})}}export{createWorkflowToolBackgroundExecute,createWorkflowToolExecutorBinding,parseWorkflowToolInput,readWorkflowToolExecutor};
@@ -0,0 +1,7 @@
1
+ import type { ToolRunAddress } from "#execution/tool-run/types.js";
2
+ /**
3
+ * Asks the run to cancel itself; cancels it outright only if the message cannot
4
+ * be delivered. Failures are logged, not thrown: the caller has already
5
+ * committed the cancellation the run was serving.
6
+ */
7
+ export declare function cancelToolRun(run: ToolRunAddress, reason: string): Promise<void>;
@@ -0,0 +1 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{cancelRun,getWorld,resumeHook}from"#internal/workflow/runtime.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";const log=createLogger(`execution.tool-run`);async function cancelToolRun(e,n){let r={kind:`cancel`,reason:n};try{await resumeHook(e.hookToken,r);return}catch(t){if(isTaskWorkflowTargetGone(t))return;logError(log,`failed to signal a workflow tool run to cancel; cancelling it outright`,t,{runId:e.runId})}try{await cancelRun(await getWorld(),e.runId,{cancelReason:n})}catch(t){if(isTaskWorkflowTargetGone(t))return;logError(log,`failed to cancel workflow tool run; it may run to completion`,t,{runId:e.runId})}}export{cancelToolRun};
@@ -0,0 +1,24 @@
1
+ import type { PreparedRuntimeActionDispatch } from "#execution/dispatch-runtime-actions-shared.js";
2
+ import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
3
+ import type { RuntimeToolResultActionResult } from "#shared/action-types.js";
4
+ import type { PendingDispatchAction, PendingWorkflowToolAction } from "#shared/dispatch-action.js";
5
+ export declare function isWorkflowToolAction(action: PendingDispatchAction): action is PendingWorkflowToolAction;
6
+ /**
7
+ * Starts the run and records it on the session so the turn can bind its
8
+ * result, route its requests, and cancel it. A start failure settles the call
9
+ * with an error and records nothing, so nothing is left to cancel.
10
+ */
11
+ export declare function startWorkflowTool(input: {
12
+ readonly action: PendingWorkflowToolAction;
13
+ readonly batchEvent: {
14
+ readonly sequence: number;
15
+ readonly stepIndex: number;
16
+ readonly turnId: string;
17
+ };
18
+ readonly ownerInboxToken: string | undefined;
19
+ readonly prepared: Pick<PreparedRuntimeActionDispatch, "auth" | "initiatorAuth" | "parentSession">;
20
+ readonly session: RuntimeSession;
21
+ }): Promise<{
22
+ readonly result?: RuntimeToolResultActionResult;
23
+ readonly session: RuntimeSession;
24
+ }>;
@@ -0,0 +1 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{toError}from"#shared/errors.js";import{recordToolRun}from"#harness/tool-runs.js";import{deriveRunOwner}from"#execution/tool-run/messages.js";import{startToolRun}from"#execution/tool-run/start.js";import{createRuntimeToolResultFromValue}from"#harness/action-result-helpers.js";const log=createLogger(`execution.tool-run`);function isWorkflowToolAction(e){return e.target.kind===`workflow-tool-call`}async function startWorkflowTool(e){let{action:n,batchEvent:r,prepared:i,session:a}=e;if(e.ownerInboxToken===void 0)throw Error(`Workflow tool "${n.toolName}" was dispatched without the turn inbox its run reports to.`);try{let t=await startToolRun({callId:n.callId,input:n.input,owner:deriveRunOwner(e.ownerInboxToken),session:{auth:{current:i.auth,initiator:i.initiatorAuth},id:a.sessionId,parent:i.parentSession,turn:{id:r.turnId,sequence:r.sequence}},stepIndex:r.stepIndex,toolName:n.toolName,workflowId:n.target.workflowId});return{session:recordToolRun(a,{callId:n.callId,hookToken:t.hookToken,runId:t.runId,toolName:n.toolName})}}catch(e){return logError(log,`workflow tool run failed to start`,e,{callId:n.callId,toolName:n.toolName}),{result:createRuntimeToolResultFromValue({callId:n.callId,isError:!0,output:toError(e),toolName:n.toolName}),session:a}}}export{isWorkflowToolAction,startWorkflowTool};
@@ -0,0 +1,7 @@
1
+ import type { RunRef } from "#execution/tool-run/messages.js";
2
+ import type { JsonValue } from "#shared/json.js";
3
+ export declare function emitRunReportStep(input: {
4
+ readonly from: RunRef;
5
+ readonly parentWritable: WritableStream<Uint8Array>;
6
+ readonly update: JsonValue;
7
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import{createActionPartialEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{createRuntimeToolResultFromValue}from"#harness/action-result-helpers.js";async function emitRunReportStep(e){"use step";let t=createActionPartialEvent({result:createRuntimeToolResultFromValue({callId:e.from.callId,output:e.update,toolName:e.from.toolName}),sequence:e.from.sequence,stepIndex:e.from.stepIndex,turnId:e.from.turnId}),n=e.parentWritable.getWriter();try{await n.write(encodeMessageStreamEvent(stampMessageStreamEvent(t)))}finally{n.releaseLock()}}export{emitRunReportStep};
@@ -0,0 +1,70 @@
1
+ import { type Hook } from "#compiled/@workflow/core/index.js";
2
+ import type { ToolContext, ToolInputRequest, ToolInputResponse } from "#tools/definition.js";
3
+ import type { JsonObject, JsonValue } from "#shared/json.js";
4
+ export interface ToolRunOwner {
5
+ readonly outcome: string;
6
+ readonly report: string;
7
+ readonly request: string;
8
+ }
9
+ /** Identifies the sending run to an owner that shares its channels across many runs. */
10
+ export interface RunRef {
11
+ readonly callId: string;
12
+ /** The tool's parsed input, shown as the request's action when the run asks. */
13
+ readonly input: JsonObject;
14
+ readonly runId: string;
15
+ /** Stream coordinates of the model call that made the tool call. */
16
+ readonly sequence: number;
17
+ readonly stepIndex: number;
18
+ readonly toolName: string;
19
+ readonly turnId: string;
20
+ }
21
+ export type RunOutcome = {
22
+ readonly status: "completed";
23
+ readonly output: JsonValue;
24
+ } | {
25
+ readonly status: "failed";
26
+ readonly error: unknown;
27
+ } | {
28
+ readonly status: "cancelled";
29
+ readonly reason?: string;
30
+ };
31
+ /** Progress sent up from a run; the owner streams it as a turn partial or a task update. */
32
+ export interface RunReport {
33
+ readonly from: RunRef;
34
+ readonly update: JsonValue;
35
+ }
36
+ /** A question sent up from a run; the owner puts it to the human and resumes `answerToken` with the reply. */
37
+ export interface RunRequestMessage {
38
+ readonly answerToken: string;
39
+ readonly from: RunRef;
40
+ readonly request: ToolInputRequest;
41
+ }
42
+ /** The end of a run, sent up once; the owner settles the tool call or the task with it. */
43
+ export interface RunOutcomeMessage {
44
+ readonly from: RunRef;
45
+ readonly result: RunOutcome;
46
+ }
47
+ export declare const reportHook: import("#compiled/@workflow/core/index.js").TypedHook<RunReport, RunReport>;
48
+ export declare const requestHook: import("#compiled/@workflow/core/index.js").TypedHook<RunRequestMessage, RunRequestMessage>;
49
+ export declare const outcomeHook: import("#compiled/@workflow/core/index.js").TypedHook<RunOutcomeMessage, RunOutcomeMessage>;
50
+ /** Derived from the owner's inbox token so owner and run agree without exchanging tokens. */
51
+ export declare function deriveRunOwner(inboxToken: string): ToolRunOwner;
52
+ export type RunControlMessage = {
53
+ readonly kind: "cancel";
54
+ readonly reason: string;
55
+ };
56
+ export declare function isRunControlMessage(value: unknown): value is RunControlMessage;
57
+ interface RunContext {
58
+ answerSeq: number;
59
+ readonly from: RunRef;
60
+ readonly owner: ToolRunOwner;
61
+ }
62
+ export declare function attachRunContext(ctx: ToolContext, context: Omit<RunContext, "answerSeq">): void;
63
+ /**
64
+ * Asks the human on the session's channel and returns the hook the answer
65
+ * resumes, as `createHook` would: await it for the answer, or race it against
66
+ * a `sleep` for a deadline. Synchronous because a `Hook` is thenable: an async
67
+ * `ask` would resolve to the answer, never the hook.
68
+ */
69
+ export declare function ask(ctx: ToolContext, request: ToolInputRequest): Hook<ToolInputResponse>;
70
+ export {};
@@ -0,0 +1 @@
1
+ import{createHook,defineHook}from"#compiled/@workflow/core/index.js";import{toolRunAnswerToken}from"#harness/tool-runs.js";import{resumeHookStep}from"#execution/tool-run/resume-hook-step.js";const reportHook=defineHook(),requestHook=defineHook(),outcomeHook=defineHook();function deriveRunOwner(e){return{outcome:`${e}:outcome`,report:`${e}:report`,request:`${e}:request`}}function isRunControlMessage(e){if(typeof e!=`object`||!e)return!1;let{kind:t,reason:n}=e;return t===`cancel`&&typeof n==`string`}const RUN_CONTEXT=Symbol.for(`eve.tool-run.context`);function attachRunContext(e,t){Object.defineProperty(e,RUN_CONTEXT,{enumerable:!1,value:{...t,answerSeq:0}})}function readRunContext(e){let t=e[RUN_CONTEXT];if(t===void 0)throw Error(`ask() must be called with the context of a workflow tool body ("use workflow").`);return t}function ask(t,r){let i=readRunContext(t),a=createHook({token:toolRunAnswerToken(i.from.runId,i.answerSeq++)}),o={answerToken:a.token,from:i.from,request:r};return resumeHookStep(i.owner.request,o),a}export{ask,attachRunContext,deriveRunOwner,isRunControlMessage,outcomeHook,reportHook,requestHook};
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Races reads across several hooks. A read that lands while no race is waiting
3
+ * is kept until one claims it: the owner awaits steps between races, and a
4
+ * resume arriving then must not be dropped or re-issued. Claims follow array
5
+ * order because separate hooks carry no order between them.
6
+ */
7
+ export interface ChannelReader<C extends string, T> {
8
+ readonly channel: C;
9
+ readonly iterator: AsyncIterator<T>;
10
+ /** Reads that have landed and not yet been claimed, oldest first. */
11
+ readonly landed: IteratorResult<T>[];
12
+ failure?: {
13
+ readonly error: unknown;
14
+ };
15
+ pending?: Promise<void>;
16
+ }
17
+ export declare function createChannelReader<C extends string, T>(channel: C, iterable: AsyncIterable<T>): ChannelReader<C, T>;
18
+ export type ChannelRead<R extends readonly ChannelReader<string, unknown>[]> = {
19
+ [I in keyof R]: R[I] extends ChannelReader<infer C, infer T> ? {
20
+ readonly channel: C;
21
+ readonly next: IteratorResult<T>;
22
+ } : never;
23
+ }[number];
24
+ /**
25
+ * Channel reads wake the loop with `undefined` after buffering their result;
26
+ * a cancel wins the race outright.
27
+ */
28
+ export declare function raceChannelReads<const R extends readonly ChannelReader<string, unknown>[]>(readers: R): Promise<ChannelRead<R>>;
29
+ export declare function raceChannelReads<const R extends readonly ChannelReader<string, unknown>[]>(readers: R, cancelled: Promise<"cancel"> | undefined): Promise<ChannelRead<R> | "cancel">;
@@ -0,0 +1 @@
1
+ function createChannelReader(e,t){return{channel:e,iterator:t[Symbol.asyncIterator](),landed:[]}}async function raceChannelReads(e,t){for(;;){for(let t of e){if(t.failure!==void 0)throw t.failure.error;let e=t.landed.shift();if(e!==void 0)return{channel:t.channel,next:e}}let n=[];for(let t of e)t.pending??=t.iterator.next().then(e=>{t.landed.push(e),t.pending=void 0},e=>{t.failure={error:e},t.pending=void 0}),n.push(t.pending);if(t!==void 0&&n.push(t),await Promise.race(n)===`cancel`)return`cancel`}}export{createChannelReader,raceChannelReads};
@@ -0,0 +1,11 @@
1
+ import type { SubagentInputRequestHookPayload } from "#channel/types.js";
2
+ import type { RunOutcomeMessage, RunReport, RunRequestMessage } from "#execution/tool-run/messages.js";
3
+ import type { RuntimeToolResultActionResult } from "#shared/action-types.js";
4
+ import type { TaskCommand, TaskInboundUpdate } from "#tasks/types.js";
5
+ /** A cancelled run settles the call as an error so the owner never waits on it. */
6
+ export declare function runOutcomeToToolResult(message: RunOutcomeMessage): RuntimeToolResultActionResult;
7
+ /** The answer hook token is both the request id and the route, so one resume reaches the body. */
8
+ export declare function runRequestToInputRequestPayload(message: RunRequestMessage): SubagentInputRequestHookPayload;
9
+ export declare function runReportToTaskUpdate(message: RunReport, taskId: string, updateIndex: number): TaskInboundUpdate;
10
+ /** A cancelled run only settles the executor: the task itself was already cancelled. */
11
+ export declare function runOutcomeToTaskCommand(message: RunOutcomeMessage): TaskCommand;
@@ -0,0 +1 @@
1
+ function runOutcomeToToolResult(e){let{from:t,result:n}=e;if(n.status===`completed`)return{callId:t.callId,kind:`tool-result`,output:n.output,toolName:t.toolName};let r=n.status===`failed`?errorMessage(n.error):n.reason??`The tool run was cancelled.`;return{callId:t.callId,isError:!0,kind:`tool-result`,output:r,toolName:t.toolName}}function errorMessage(e){if(typeof e==`object`&&e&&`message`in e){let t=e.message;if(typeof t==`string`)return t}return String(e)}function runRequestToInputRequestPayload(e){let{answerToken:t,from:n,request:r}=e;return{callId:n.callId,childContinuationToken:t,childSessionId:n.runId,event:{requests:[toInputRequest(r,n,t)],sequence:n.sequence,stepIndex:n.stepIndex,turnId:n.turnId},kind:`subagent-input-request`,subagentName:n.toolName}}function toInputRequest(e,t,n){if(typeof e.prompt!=`string`||e.prompt.length===0)throw TypeError("A tool run request needs a non-empty `prompt`.");let r={action:{callId:t.callId,input:t.input,kind:`tool-call`,toolName:t.toolName},kind:`question`,prompt:e.prompt,requestId:n};return e.allowFreeform!==void 0&&(r.allowFreeform=e.allowFreeform),e.display!==void 0&&(r.display=e.display),e.options!==void 0&&(r.options=[...e.options]),r}function runReportToTaskUpdate(e,t,n){return{callId:e.from.callId,kind:`task-update`,message:typeof e.update==`string`?e.update:JSON.stringify(e.update),updateEpoch:t,updateIndex:n}}function runOutcomeToTaskCommand(e){let{result:t}=e;return t.status===`completed`?{data:t.output,kind:`complete`,lifecycle:`terminal`}:t.status===`failed`?{data:errorMessage(t.error),kind:`fail`,lifecycle:`terminal`}:{kind:`settle-executor`}}export{runOutcomeToTaskCommand,runOutcomeToToolResult,runReportToTaskUpdate,runRequestToInputRequestPayload};
@@ -0,0 +1,13 @@
1
+ import { type RunOutcomeMessage, type RunReport, type RunRequestMessage } from "#execution/tool-run/messages.js";
2
+ import { type ChannelReader } from "#execution/tool-run/owner-channels.js";
3
+ /** In read priority: what a run said before its outcome lands first. */
4
+ export type RunOwnerReaders = readonly [
5
+ ChannelReader<"report", RunReport>,
6
+ ChannelReader<"request", RunRequestMessage>,
7
+ ChannelReader<"outcome", RunOutcomeMessage>
8
+ ];
9
+ export interface RunOwnerChannels {
10
+ readonly readers: RunOwnerReaders;
11
+ dispose(): Promise<void>;
12
+ }
13
+ export declare function openRunOwnerChannels(inboxToken: string): RunOwnerChannels;
@@ -0,0 +1 @@
1
+ import{disposeHook}from"#execution/hook-ownership.js";import{createChannelReader}from"#execution/tool-run/owner-channels.js";import{deriveRunOwner,outcomeHook,reportHook,requestHook}from"#execution/tool-run/messages.js";function openRunOwnerChannels(e){let t=deriveRunOwner(e),n=reportHook.create({token:t.report}),r=requestHook.create({token:t.request}),i=outcomeHook.create({token:t.outcome});return{readers:[createChannelReader(`report`,n),createChannelReader(`request`,r),createChannelReader(`outcome`,i)],async dispose(){await Promise.all([disposeHook(n),disposeHook(r),disposeHook(i)])}}}export{openRunOwnerChannels};
@@ -0,0 +1,4 @@
1
+ /** `resumeHook` as a step, so the runtime API stays out of the driver. */
2
+ export declare function resumeHookStep(token: string, payload: unknown, options?: {
3
+ readonly ifPresent?: boolean;
4
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import{resumeHook}from"#internal/workflow/runtime.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";async function resumeHookStep(t,n,r){"use step";try{await resumeHook(t,n)}catch(e){if(r?.ifPresent===!0&&isTaskWorkflowTargetGone(e))return;throw e}}export{resumeHookStep};
@@ -0,0 +1,18 @@
1
+ import { type Hook } from "#compiled/@workflow/core/index.js";
2
+ import { type RunControlMessage } from "#execution/tool-run/messages.js";
3
+ /**
4
+ * The run's control inbox. An unawaited hook read is not scheduled under
5
+ * replay, so `cancelled` must be raced for a cancel to be observed at all.
6
+ */
7
+ export interface RunControlInbox {
8
+ readonly hook: Hook<RunControlMessage>;
9
+ readonly signal: AbortSignal;
10
+ /** Rejects with {@link RunCancelledError} when a cancel message arrives; never resolves. */
11
+ readonly cancelled: Promise<never>;
12
+ reason(): string | undefined;
13
+ }
14
+ /** Opens without claiming, so a losing duplicate start never trips the signal. */
15
+ export declare function openRunControlInbox(hookToken: string): RunControlInbox;
16
+ export declare class RunCancelledError extends Error {
17
+ constructor(reason: string);
18
+ }
@@ -0,0 +1 @@
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{isRunControlMessage}from"#execution/tool-run/messages.js";function openRunControlInbox(t){let n=createHook({token:t}),r=n[Symbol.asyncIterator](),i=new AbortController,a,o=consumeCancel(r,e=>{a=e,i.abort(new RunCancelledError(e))});return o.catch(()=>{}),{cancelled:o,hook:n,reason:()=>a,signal:i.signal}}async function consumeCancel(e,n){for(;;){let r;try{r=await e.next()}catch{return await new Promise(()=>{})}if(r.done===!0)return await new Promise(()=>{});if(isRunControlMessage(r.value))throw n(r.value.reason),new RunCancelledError(r.value.reason)}}var RunCancelledError=class extends Error{constructor(e){super(e),this.name=`RunCancelledError`}};export{RunCancelledError,openRunControlInbox};
@@ -0,0 +1,11 @@
1
+ import type { ToolRunWorkflowInput } from "#execution/tool-run/types.js";
2
+ export declare function deriveToolRunHookToken(input: {
3
+ readonly callId: string;
4
+ readonly parentSessionId: string;
5
+ readonly parentTurnId: string;
6
+ }): string;
7
+ /** Resolves once the run owns its hook. Call from inside a `"use step"` body. */
8
+ export declare function startToolRun(input: Omit<ToolRunWorkflowInput, "hookToken">): Promise<{
9
+ readonly hookToken: string;
10
+ readonly runId: string;
11
+ }>;
@@ -0,0 +1 @@
1
+ import{startWorkflowPreferLatest,toolRunWorkflowReference,waitForCommandHookOwner}from"#execution/workflow-runtime.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";function deriveToolRunHookToken(e){return`eve:tool-run:${deriveAgentOperationId(e)}`}async function startToolRun(t){let n=deriveToolRunHookToken({callId:t.callId,parentSessionId:t.session.id,parentTurnId:t.session.turn.id});return await startWorkflowPreferLatest(toolRunWorkflowReference,[{...t,hookToken:n}]),{hookToken:n,runId:(await waitForCommandHookOwner(n)).runId}}export{deriveToolRunHookToken,startToolRun};
@@ -0,0 +1,21 @@
1
+ import type { SessionContext } from "#context/session-context.js";
2
+ import type { ToolRunOwner } from "#execution/tool-run/messages.js";
3
+ import type { JsonObject } from "#shared/json.js";
4
+ export type ToolRunSessionContext = SessionContext["session"];
5
+ export interface ToolRunWorkflowInput {
6
+ readonly callId: string;
7
+ /** Deterministic per call: a replayed start re-derives it, loses the claim, and exits. */
8
+ readonly hookToken: string;
9
+ readonly input: JsonObject;
10
+ readonly owner: ToolRunOwner;
11
+ readonly session: ToolRunSessionContext;
12
+ /** Harness step index of the model call that made this tool call. */
13
+ readonly stepIndex: number;
14
+ readonly toolName: string;
15
+ readonly workflowId: string;
16
+ }
17
+ export interface ToolRunAddress {
18
+ readonly hookToken: string;
19
+ readonly runId: string;
20
+ }
21
+ export declare const WORKFLOW_TOOL_EXECUTOR_KIND = "workflow-tool";
@@ -0,0 +1 @@
1
+ const WORKFLOW_TOOL_EXECUTOR_KIND=`workflow-tool`;export{WORKFLOW_TOOL_EXECUTOR_KIND};
@@ -0,0 +1,9 @@
1
+ import type { ToolRunWorkflowInput } from "#execution/tool-run/types.js";
2
+ /**
3
+ * Runs one authored workflow tool call. The run's own hook is its identity
4
+ * claim and its control inbox: a duplicate start loses the claim and exits; a
5
+ * `cancel` message aborts `ctx.abortSignal`, and the run waits up to
6
+ * {@link CANCEL_GRACE} for the body to unwind before ending as cancelled, so a
7
+ * body parked on a hook or sleep cannot keep a cancelled run alive.
8
+ */
9
+ export declare function toolRunWorkflow(input: ToolRunWorkflowInput): Promise<void>;
@@ -0,0 +1 @@
1
+ import{getWorkflowMetadata,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{attachRunContext}from"#execution/tool-run/messages.js";import{resumeHookStep}from"#execution/tool-run/resume-hook-step.js";import{openRunControlInbox}from"#execution/tool-run/run-control.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{readRegisteredWorkflow}from"#execution/workflow-registry.js";function noop(){}async function toolRunWorkflow(e){"use workflow";let s=openRunControlInbox(e.hookToken),c=!1;try{try{await claimHookOwnership(s.hook),c=!0}catch(e){if(isHookConflictError(e))return;throw e}let r=readRunId(),o={callId:e.callId,input:e.input,runId:r,sequence:e.session.turn.sequence,stepIndex:e.stepIndex,toolName:e.toolName,turnId:e.session.turn.id},l=createWorkflowToolContext(e,s.signal);attachRunContext(l,{from:o,owner:e.owner});let u=runBody(e,l,o),d=u.catch(noop),f;try{f={output:await Promise.race([u,s.cancelled]),status:`completed`}}catch(e){s.signal.aborted?(await Promise.race([d,sleep(`30s`)]),f={reason:s.reason(),status:`cancelled`}):f={error:normalizeSerializableError(e),status:`failed`}}let p={from:o,result:f};await resumeHookStep(e.owner.outcome,p,{ifPresent:f.status===`cancelled`})}finally{c&&await disposeHook(s.hook)}}async function runBody(e,t,n){let r=resolveWorkflowToolExecute(e)(e.input,t);if(!isAsyncIterable(r))return await r;let i=r[Symbol.asyncIterator](),a,o=await i.next();for(;o.done!==!0;){a=o.value;let t={from:n,update:o.value};await resumeHookStep(e.owner.report,t),o=await i.next()}return o.value??a??null}function isAsyncIterable(e){return typeof e==`object`&&!!e&&typeof e[Symbol.asyncIterator]==`function`}function readRunId(){let t=getWorkflowMetadata().workflowRunId;if(typeof t!=`string`)throw Error(`The tool run has no workflow run id.`);return t}function resolveWorkflowToolExecute(e){let t=readRegisteredWorkflow(e.workflowId);if(typeof t!=`function`)throw Error(`Tool "${e.toolName}" is not registered as a workflow in this deployment (${e.workflowId}). The tool was renamed or removed after this run started.`);return t}function createWorkflowToolContext(e,t){let{callId:n,session:r,toolName:i}=e,unavailable=(e,t)=>{throw Error(`ctx.${e} is not available inside a workflow tool; ${t}. Tool "${i}" runs as a durable workflow body, which only replays deterministic code.`)};return{abortSignal:t,callId:n,getSandbox:()=>unavailable(`getSandbox()`,`the session sandbox belongs to the turn`),getSkill:()=>unavailable(`getSkill()`,`skills are read through the session sandbox`),getToken:()=>unavailable(`getToken()`,`read credentials from the environment inside a "use step" helper`),requireAuth:()=>unavailable(`requireAuth()`,`a workflow body cannot park on authorization`),session:r,toolName:i}}export{toolRunWorkflow};
@@ -1,8 +1,9 @@
1
1
  import { type TaskExec, type ToolContext } from "#tools/definition.js";
2
+ import type { PendingAgentDispatchAction } from "#shared/dispatch-action.js";
2
3
  interface SubagentDefinitionInput {
3
4
  readonly description: string;
4
5
  readonly name: string;
5
- readonly nodeId: string;
6
+ readonly target: PendingAgentDispatchAction["target"];
6
7
  }
7
8
  export declare function defineSubagent(input: SubagentDefinitionInput): import("#tools/definition.js").BackgroundToolDefinition<{
8
9
  agentId?: string | null | undefined;
@@ -23,15 +24,13 @@ export declare function defineSubagent(input: SubagentDefinitionInput): import("
23
24
  agentId: string;
24
25
  }>>;
25
26
  };
26
- export declare function registerLocalSubagentExecutor(execute: object): void;
27
27
  export declare function countLocalSubagentCalls(calls: readonly {
28
28
  readonly definition: {
29
- readonly execute: object;
29
+ readonly behavior?: import("#tools/behavior.js").PreparedToolBehavior;
30
30
  };
31
31
  }[]): number;
32
32
  export declare function executeSubagentTool(input: {
33
33
  readonly definition: SubagentDefinitionInput;
34
- readonly kind: "local" | "remote";
35
34
  readonly task: TaskExec;
36
35
  readonly toolContext: ToolContext;
37
36
  readonly toolInput: unknown;
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{HandleEventKey}from"#context/keys.js";import{createSubagentCalledEvent}from"#protocol/message.js";import{defineTool}from"#tools/definition.js";import{parseJsonObject}from"#shared/json.js";import{getHarnessEmissionState}from"#harness/emission.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{serializeContext}from"#context/serialize.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{prepareAgentActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{activeTurnId}from"#harness/active-turn-id.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";import{CallbackBaseUrlKey}from"#harness/authorization.js";import{createSubagentExecutorBinding}from"#tasks/types.js";import{findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{checkTaskContinuationAvailability,createTaskContinuationBusyResult,describeTaskDispatch}from"#execution/tasks/parent/continuation-dispatch.js";const localSubagentExecutors=new WeakSet,batchAgentClaims=new WeakMap,log=createLogger(`runtime.framework-tools.subagent`);function defineSubagent(e){return defineTool({description:e.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(t,n,r)=>executeSubagentTool({definition:e,kind:`local`,task:r,toolContext:n,toolInput:t})})}function registerLocalSubagentExecutor(e){localSubagentExecutors.add(e)}function countLocalSubagentCalls(e){return e.filter(e=>localSubagentExecutors.has(e.definition.execute)).length}async function executeSubagentTool(e){let t=loadContext(),{batch:r,session:i,task:a}=e.task,o=getHarnessEmissionState(i.state),s={callId:e.toolContext.callId,description:e.definition.description,input:parseJsonObject(SUBAGENT_TOOL_INPUT_SCHEMA.parse(e.toolInput)),name:e.definition.name,nodeId:e.definition.nodeId},c=await dispatchSubagent({action:e.kind===`remote`?{...s,kind:`remote-agent-call`,remoteAgentName:e.definition.name}:{...s,kind:`subagent-call`,subagentName:e.definition.name},batch:r,callbackBaseUrl:t.get(CallbackBaseUrlKey),ctx:t,event:{...o,turnId:activeTurnId(o)},localFanoutSize:countLocalSubagentCalls(r),serializedContext:serializeContext(t),sessionState:createDurableSessionState({session:i}),task:a}),l=findTaskAgentAddress(c.session,c.agentId);if(l===void 0)throw Error(`Subagent dispatch for "${c.agentId}" recorded no task agent address.`);let u=createSubagentExecutorBinding({address:l.address,identity:l.identity});await emitSubagentCalled$1({callId:e.toolContext.callId,childSessionId:c.address.sessionId,event:{...o,turnId:activeTurnId(o)},name:c.name,remote:c.remote,sessionId:i.sessionId,toolName:e.definition.name});let d=e.task.delegated({executor:u,receipt:{agentId:c.agentId}});return await emitSubagentCompleted({callId:e.toolContext.callId,output:JSON.stringify(d.receipt),subagentName:c.name,taskId:d.receipt.taskId}),d}async function dispatchSubagent(e){let t=await prepareAgentActionDispatch({action:e.action,ctx:e.ctx,event:e.event,localFanoutSize:e.localFanoutSize,serializedContext:e.serializedContext,sessionState:e.sessionState}),n=t.plan[0];if(n===void 0||n.kind===`task-control`)throw Error(`Subagent tool dispatch produced no executable plan entry.`);if(n.kind===`reject`)throw Error(JSON.stringify(n.result.output));if(n.kind===`resume`){let r=await checkTaskContinuationAvailability({action:n.action,agentId:n.agentId,parentStepIndex:e.event.stepIndex,parentTurnId:e.event.turnId,session:t.session});if(r!==void 0)throw Error(JSON.stringify(r.output));let i=claimBatchAgent(e.batch,n.agentId,e.task.taskId);if(i!==void 0){let e=createTaskContinuationBusyResult({action:n.action,agentId:n.agentId,status:`working`,taskId:i});throw Error(JSON.stringify(e.output))}}let r=n.kind===`resume`?await dispatchToTaskAgentAddress({action:n.action,activityObserver:t.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:t.activityObserver,callId:n.action.callId,kind:`task`,name:n.action.name,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId}),agentId:n.agentId,auth:t.auth,bundle:createAgentContinuationBundle({action:n.action,bundle:t.bundle,dynamicRemoteAgent:n.dynamicRemoteAgent}),currentSession:t.session,parentToken:e.task.taskInboxToken}):await startSubagent({auth:t.auth,batchEvent:e.event,bundle:t.bundle,callbackBaseUrl:e.callbackBaseUrl,capabilities:t.capabilities,channelMetadata:t.channelMetadata,currentSession:t.session,fanoutSize:t.fanoutSize,initiatorAuth:t.initiatorAuth,parentContinuationToken:e.task.taskInboxToken,parentTraceContext:t.parentTraceContext,activityObserver:t.activityObserver,sandboxSessionId:t.sandboxSessionId,serializedContext:t.serializedContext,session:t.session,taskOwned:!0,target:n.target});if(r.kind===`error`)throw Error(JSON.stringify(r.result.output));let i=describeTaskDispatch({action:e.action,agentId:n.kind===`resume`?n.agentId:void 0,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId,session:r.session}),a=n.kind===`resume`?n.dynamicRemoteAgent:n.target.kind===`remote`?n.target.dynamicRemoteAgent:void 0;return{address:r.address,agentId:i.agentId,mode:i.mode,name:i.name,...r.address.kind===`agent/remote`?{remote:{resolverId:a?.credentialsStepId??e.action.nodeId,url:r.address.url}}:{},session:r.session}}function claimBatchAgent(e,t,n){let r=batchAgentClaims.get(e);r===void 0&&(r=new Map,batchAgentClaims.set(e,r));let i=r.get(t);if(i!==void 0)return i;r.set(t,n)}async function emitSubagentCalled$1(e){let a=loadContext().get(HandleEventKey);if(a!==void 0)try{await a(createSubagentCalledEvent({callId:e.callId,childSessionId:e.childSessionId,name:e.name,remote:e.remote,sequence:e.event.sequence,sessionId:e.sessionId,toolName:e.toolName,turnId:e.event.turnId,workflowId:workflowEntryReference.workflowId}))}catch(n){logError(log,`subagent.called emission failed`,n,{callId:e.callId,childSessionId:e.childSessionId,toolName:e.toolName})}}async function emitSubagentCompleted(e){let i=loadContext().get(HandleEventKey);if(i!==void 0)try{await i({data:{backgroundTask:{status:`working`,taskId:e.taskId},callId:e.callId,output:e.output,subagentName:e.subagentName},type:`subagent.completed`})}catch(n){logError(log,`subagent.completed emission failed`,n,{callId:e.callId,taskId:e.taskId})}}export{countLocalSubagentCalls,defineSubagent,executeSubagentTool,registerLocalSubagentExecutor};
1
+ import{createLogger,logError}from"#internal/logging.js";import{loadContext}from"#context/container.js";import{HandleEventKey}from"#context/keys.js";import{createSubagentCalledEvent}from"#protocol/message.js";import{defineTool}from"#tools/definition.js";import{parseJsonObject}from"#shared/json.js";import{getHarnessEmissionState}from"#harness/emission.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{serializeContext}from"#context/serialize.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{resolvePreparedAgentAction}from"#execution/prepared-agent-action.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{prepareAgentActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{deriveChildActivityObserverConfig}from"#execution/activity-work.js";import{activeTurnId}from"#harness/active-turn-id.js";import{CallbackBaseUrlKey}from"#harness/authorization.js";import{createSubagentExecutorBinding}from"#tasks/types.js";import{findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{checkTaskContinuationAvailability,createTaskContinuationBusyResult,describeTaskDispatch}from"#execution/tasks/parent/continuation-dispatch.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";const batchAgentClaims=new WeakMap,log=createLogger(`runtime.framework-tools.subagent`);function defineSubagent(e){return defineTool({description:e.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(t,n,r)=>executeSubagentTool({definition:e,task:r,toolContext:n,toolInput:t})})}function countLocalSubagentCalls(e){return e.filter(e=>{let t=e.definition.behavior?.handling;return t?.kind===`dispatch`&&(t.target.kind===`self-agent-call`||t.target.kind===`subagent-call`)}).length}async function executeSubagentTool(e){let t=loadContext(),{batch:r,session:i,task:a}=e.task,o=getHarnessEmissionState(i.state),s={callId:e.toolContext.callId,description:e.definition.description,input:parseJsonObject(SUBAGENT_TOOL_INPUT_SCHEMA.parse(e.toolInput)),target:e.definition.target,toolName:e.definition.name},c=resolvePreparedAgentAction(s).action,l=await dispatchSubagent({action:c,batch:r,callbackBaseUrl:t.get(CallbackBaseUrlKey),ctx:t,dispatchAction:s,event:{...o,turnId:activeTurnId(o)},localFanoutSize:countLocalSubagentCalls(r),serializedContext:serializeContext(t),sessionState:createDurableSessionState({session:i}),task:a}),u=findTaskAgentAddress(l.session,l.agentId);if(u===void 0)throw Error(`Subagent dispatch for "${l.agentId}" recorded no task agent address.`);let d=createSubagentExecutorBinding({address:u.address,identity:u.identity});await emitSubagentCalled$1({callId:e.toolContext.callId,childSessionId:l.address.sessionId,event:{...o,turnId:activeTurnId(o)},name:l.name,remote:l.remote,sessionId:i.sessionId,toolName:e.definition.name});let f=e.task.delegated({executor:d,receipt:{agentId:l.agentId}});return await emitSubagentCompleted({callId:e.toolContext.callId,output:JSON.stringify(f.receipt),subagentName:l.name,taskId:f.receipt.taskId}),f}async function dispatchSubagent(e){let t=await prepareAgentActionDispatch({action:e.dispatchAction,ctx:e.ctx,event:e.event,localFanoutSize:e.localFanoutSize,serializedContext:e.serializedContext,sessionState:e.sessionState}),n=t.plan[0];if(n===void 0||n.kind===`task-control`||n.kind===`workflow-tool`)throw Error(`Subagent tool dispatch produced no executable plan entry.`);if(n.kind===`reject`)throw Error(JSON.stringify(n.result.output));if(n.kind===`resume`){let r=await checkTaskContinuationAvailability({action:n.action,agentId:n.agentId,parentStepIndex:e.event.stepIndex,parentTurnId:e.event.turnId,session:t.session});if(r!==void 0)throw Error(JSON.stringify(r.output));let i=claimBatchAgent(e.batch,n.agentId,e.task.taskId);if(i!==void 0){let e=createTaskContinuationBusyResult({action:n.action,agentId:n.agentId,status:`working`,taskId:i});throw Error(JSON.stringify(e.output))}}let r=n.kind===`resume`?await dispatchToTaskAgentAddress({action:n.action,activityObserver:t.activityObserver===void 0?void 0:deriveChildActivityObserverConfig({activityObserver:t.activityObserver,callId:n.action.callId,kind:`task`,name:n.action.name,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId}),agentId:n.agentId,auth:t.auth,bundle:createAgentContinuationBundle({action:n.action,bundle:t.bundle,dynamicRemoteAgent:n.dynamicRemoteAgent}),currentSession:t.session,parentToken:e.task.taskInboxToken}):await startSubagent({auth:t.auth,batchEvent:e.event,bundle:t.bundle,callbackBaseUrl:e.callbackBaseUrl,capabilities:t.capabilities,channelMetadata:t.channelMetadata,currentSession:t.session,fanoutSize:t.fanoutSize,initiatorAuth:t.initiatorAuth,localDevRequest:t.localDevRequest,parentContinuationToken:e.task.taskInboxToken,parentTraceContext:t.parentTraceContext,activityObserver:t.activityObserver,sandboxSessionId:t.sandboxSessionId,serializedContext:t.serializedContext,session:t.session,taskOwned:!0,target:n.target});if(r.kind===`error`)throw Error(JSON.stringify(r.result.output));let i=describeTaskDispatch({action:e.action,agentId:n.kind===`resume`?n.agentId:void 0,parentSessionId:t.session.sessionId,parentTurnId:e.event.turnId,session:r.session}),a=n.kind===`resume`?n.dynamicRemoteAgent:n.target.kind===`remote`?n.target.dynamicRemoteAgent:void 0;return{address:r.address,agentId:i.agentId,mode:i.mode,name:i.name,...r.address.kind===`agent/remote`?{remote:{resolverId:a?.credentialsStepId??e.action.nodeId,url:r.address.url}}:{},session:r.session}}function claimBatchAgent(e,t,n){let r=batchAgentClaims.get(e);r===void 0&&(r=new Map,batchAgentClaims.set(e,r));let i=r.get(t);if(i!==void 0)return i;r.set(t,n)}async function emitSubagentCalled$1(e){let a=loadContext().get(HandleEventKey);if(a!==void 0)try{await a(createSubagentCalledEvent({callId:e.callId,childSessionId:e.childSessionId,name:e.name,remote:e.remote,sequence:e.event.sequence,sessionId:e.sessionId,toolName:e.toolName,turnId:e.event.turnId,workflowId:workflowEntryReference.workflowId}))}catch(n){logError(log,`subagent.called emission failed`,n,{callId:e.callId,childSessionId:e.childSessionId,toolName:e.toolName})}}async function emitSubagentCompleted(e){let i=loadContext().get(HandleEventKey);if(i!==void 0)try{await i({data:{backgroundTask:{status:`working`,taskId:e.taskId},callId:e.callId,output:e.output,subagentName:e.subagentName},type:`subagent.completed`})}catch(n){logError(log,`subagent.completed emission failed`,n,{callId:e.callId,taskId:e.taskId})}}export{countLocalSubagentCalls,defineSubagent,executeSubagentTool};
@@ -1,7 +1,10 @@
1
+ import type { PendingAgentDispatchAction } from "#shared/dispatch-action.js";
1
2
  export declare function defineRemoteSubagent(input: {
2
3
  readonly description: string;
3
4
  readonly name: string;
4
- readonly nodeId: string;
5
+ readonly target: Extract<PendingAgentDispatchAction["target"], {
6
+ readonly kind: "remote-agent-call";
7
+ }>;
5
8
  }): import("#tools/definition.js").BackgroundToolDefinition<{
6
9
  agentId?: string | null | undefined;
7
10
  message: string;
@@ -1 +1 @@
1
- import{defineTool}from"#tools/definition.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{executeSubagentTool}from"#execution/tools/subagent/local.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";function defineRemoteSubagent(r){return defineTool({description:r.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(e,t,n)=>executeSubagentTool({definition:r,kind:`remote`,task:n,toolContext:t,toolInput:e})})}export{defineRemoteSubagent};
1
+ import{defineTool}from"#tools/definition.js";import{executeSubagentTool}from"#execution/tools/subagent/local.js";import{SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA}from"#tools/framework/task-contract.js";import{SUBAGENT_TOOL_INPUT_SCHEMA}from"#tools/framework/agent-contract.js";function defineRemoteSubagent(r){return defineTool({description:r.description,execution:`background`,inputSchema:SUBAGENT_TOOL_INPUT_SCHEMA,outputSchema:SUBAGENT_TASK_RECEIPT_OUTPUT_SCHEMA,execute:(e,t,n)=>executeSubagentTool({definition:r,task:n,toolContext:t,toolInput:e})})}export{defineRemoteSubagent};
@@ -1,3 +1,4 @@
1
+ import { type TurnCancelPayload } from "#execution/turn-cancellation-token.js";
1
2
  /**
2
3
  * Owns one turn's cancellation surface inside the turn workflow: the
3
4
  * turn-private cancel hook and the durable `AbortController` whose
@@ -24,4 +25,5 @@ export interface TurnCancellationControl {
24
25
  export declare function createTurnCancellationControl(input: {
25
26
  readonly controlToken: string;
26
27
  readonly expectedTurnId: string;
28
+ readonly initialPayload?: TurnCancelPayload;
27
29
  }): Promise<TurnCancellationControl | undefined>;
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";import{turnCancellationHookToken}from"#execution/turn-cancellation-token.js";async function createTurnCancellationControl(i){let a=createHook({token:turnCancellationHookToken(i.controlToken)}),o=a[Symbol.asyncIterator]();try{await claimHookOwnership(a)}catch(e){if(isHookConflictError(e))return;throw e}let s=new AbortController,c=consumeMatchingCancel(o,i.expectedTurnId,()=>{s.abort(new TurnCancelledError)}).then(()=>`cancel`),l=!1;return{signal:s.signal,requested:c,async dispose(){l||(l=!0,await disposeHook(a))}}}async function consumeMatchingCancel(e,t,n){for(;;){let r=await e.next();if(r.done)return await new Promise(()=>{});if(matchesActiveTurn(r.value,t)){n();return}}}function matchesActiveTurn(e,t){if(typeof e!=`object`||!e)return!0;let n=e.turnId;return n===void 0||n===t}export{createTurnCancellationControl};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{TurnCancelledError}from"#harness/turn-cancellation.js";import{turnCancellationHookToken}from"#execution/turn-cancellation-token.js";async function createTurnCancellationControl(i){let a=createHook({token:turnCancellationHookToken(i.controlToken)}),o=a[Symbol.asyncIterator]();try{await claimHookOwnership(a)}catch(e){if(isHookConflictError(e))return;throw e}let s=new AbortController,abort=()=>s.abort(new TurnCancelledError),c=i.initialPayload!==void 0&&matchesActiveTurn(i.initialPayload,i.expectedTurnId);c&&abort();let l=c?Promise.resolve(`cancel`):consumeMatchingCancel(o,i.expectedTurnId,abort).then(()=>`cancel`),u=!1;return{signal:s.signal,requested:l,async dispose(){u||(u=!0,await disposeHook(a))}}}async function consumeMatchingCancel(e,t,n){for(;;){let r=await e.next();if(r.done)return await new Promise(()=>{});if(matchesActiveTurn(r.value,t)){n();return}}}function matchesActiveTurn(e,t){if(typeof e!=`object`||!e)return!0;let n=e.turnId;return n===void 0||n===t}export{createTurnCancellationControl};
@@ -1 +1 @@
1
- import{createHook}from"#compiled/@workflow/core/index.js";import{closeHookIterator,disposeHook}from"#execution/hook-ownership.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{turnCancellationHookToken}from"#execution/turn-cancellation-token.js";import{forwardTurnCancellationStep}from"#execution/forward-turn-cancellation-step.js";import{forwardTurnDeliveryStep}from"#execution/forward-turn-delivery-step.js";import{rebuildSerializableError}from"#execution/workflow-errors.js";var TurnControlReceiver=class{bufferedDeliveries;bufferedSessionControls;commandInbox;control;controlIterator;expectedTurnId;cancelledTaskIds;seenTaskDeliveries;pendingControl=null;constructor(t){this.bufferedDeliveries=t.bufferedDeliveries,this.bufferedSessionControls=t.bufferedSessionControls,this.cancelledTaskIds=t.cancelledTaskIds??new Set,this.commandInbox=t.commandInbox,this.seenTaskDeliveries=t.seenTaskDeliveries??new Set,this.control=createHook({token:t.token}),this.controlIterator=this.control[Symbol.asyncIterator](),this.expectedTurnId=t.expectedTurnId}get token(){return this.control.token}async dispose(){await closeHookIterator(this.controlIterator),await disposeHook(this.control)}async waitForAction(){for(;;){let e=await this.nextControlOrCommand();if(e.kind===`command`){let t=await this.handleSessionCommand(e.command);if(t!==void 0)return t;continue}let t=e.payload,n=this.readTerminalControl(t);if(n!==void 0)return n;if(t.kind===`turn-delivery-request`){let e=await this.serviceDeliveryRequest(t);if(e!==void 0)return e}}}async handleSessionCommand(e){if(e.kind===`deliver`){if(!this.acceptTaskDelivery(e))return;await this.bufferDelivery(e);return}if(e.kind===`clear`||e.kind===`compact`){this.bufferedSessionControls.push(e.kind);return}if(e.kind===`session-timeout`){this.bufferedSessionControls.push(`expired`);return}if(e.kind===`cancel`){e.taskId!==void 0&&this.discardTaskDeliveries(e.taskId);let t=e.taskId!==void 0&&e.turnId!==void 0&&e.turnId!==this.expectedTurnId?void 0:e.turnId;await forwardTurnCancellationStep({payload:t===void 0?{}:{turnId:t},token:turnCancellationHookToken(this.control.token)});return}if(e.kind===`reset`){await forwardTurnCancellationStep({payload:{},token:turnCancellationHookToken(this.control.token)}),this.bufferedSessionControls.push(`reset`);return}return unsupportedSessionCommand(e)}async bufferDelivery(e){this.bufferedDeliveries.push(e),!(e.turnPolicy!==`steer`||!deliveryHasMessage(e))&&await forwardTurnCancellationStep({payload:{},token:turnCancellationHookToken(this.control.token)})}bufferTurnDeliveries(e){e.bufferedDeliveries!==void 0&&this.bufferedDeliveries.unshift(...e.bufferedDeliveries.filter(e=>!this.shouldDiscard(e)))}consumeControl(){this.pendingControl=null}getControlPromise(){return this.pendingControl??=this.controlIterator.next(),this.pendingControl}async nextControlOrCommand(){let e=await Promise.race([this.getControlPromise().then(e=>({kind:`control`,value:e})),this.commandInbox.next().then(e=>({kind:`command`,value:e}))]);if(e.kind===`command`){if(e.value.done)throw Error(`Session command inbox closed before the active turn settled.`);if(this.commandInbox.consumeNext(),e.value.value.kind===`runtime-action-result`)return await this.nextControlOrCommand();try{return{command:sessionInboxWire.decode(e.value.value),kind:`command`}}catch(e){if(!(e instanceof SessionInboxWireError))throw e;return await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`}),await this.nextControlOrCommand()}}if(this.consumeControl(),e.value.done)throw Error(`Turn control hook closed before delivering a result.`);let t=e.value.value;if(t.kind===`turn-error`)throw rebuildSerializableError(t.error);return t.kind===`turn-continuation-token`?(await this.commandInbox.rekeyContinuation(t.continuationToken),await this.nextControlOrCommand()):{kind:`control`,payload:t}}readTerminalControl(e){if(e.kind===`turn-error`)throw rebuildSerializableError(e.error);if(e.kind===`turn-result`)return this.bufferTurnDeliveries(e),e.action}async serviceDeliveryRequest(e){await this.commandInbox.rekeyContinuation(e.continuationToken);let t=this.takeInputResponseDelivery();for(;t===void 0;){let n=await Promise.race([this.getControlPromise().then(e=>({kind:`control`,value:e})),this.commandInbox.next().then(e=>({kind:`command`,value:e}))]);if(n.kind===`control`){if(this.consumeControl(),n.value.done)throw Error(`Turn control hook closed during a delivery request.`);if(n.value.value.kind===`turn-continuation-token`){await this.commandInbox.rekeyContinuation(n.value.value.continuationToken);continue}let t=this.readTerminalControl(n.value.value);if(t!==void 0)return t;if(n.value.value.kind===`turn-delivery-cancelled`&&n.value.value.requestId===e.requestId)return;continue}if(n.value.done)throw Error(`Session command inbox closed during a turn delivery request.`);if(this.commandInbox.consumeNext(),n.value.value.kind===`runtime-action-result`)continue;let a;try{a=sessionInboxWire.decode(n.value.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(a.kind===`deliver`){if(!this.acceptTaskDelivery(a))continue;deliveryHasMessage(a)?await this.bufferDelivery(a):t=a;continue}let o=await this.handleSessionCommand(a);if(o!==void 0)return o}try{await forwardTurnDeliveryStep({inboxToken:e.inboxToken,payload:{delivery:t,kind:`driver-delivery`,requestId:e.requestId}})}catch(e){if(!(e instanceof Error&&e.name===`HookNotFoundError`))throw e}return await this.awaitForwardedDelivery(e.requestId,t)}takeInputResponseDelivery(){let e=this.bufferedDeliveries.findIndex(e=>!deliveryHasMessage(e));if(e!==-1)return this.bufferedDeliveries.splice(e,1)[0]}async awaitForwardedDelivery(e,t){for(;;){let n=await this.nextControlOrCommand();if(n.kind===`command`){let e=await this.handleSessionCommand(n.command);if(e!==void 0)return this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t),e;continue}let r=n.payload;if(r.kind===`turn-delivery-accepted`){if(r.requestId===e)return;continue}if(r.kind===`turn-delivery-cancelled`&&r.requestId===e){this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t);return}r.kind===`turn-result`&&(this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t));let i=this.readTerminalControl(r);if(i!==void 0)return i}}acceptTaskDelivery(e){let t=e.taskDeliveryId??e.caller?.taskId;return t===void 0?!0:this.originatesFromCancelledTask(t)||this.seenTaskDeliveries.has(t)?!1:(this.seenTaskDeliveries.add(t),!0)}discardTaskDeliveries(e){this.cancelledTaskIds.add(e);let t=this.bufferedDeliveries.filter(e=>!this.shouldDiscard(e));this.bufferedDeliveries.splice(0,this.bufferedDeliveries.length,...t)}originatesFromCancelledTask(e){return[...this.cancelledTaskIds].some(t=>deliveryOriginatesFromTask(e,t))}shouldDiscard(e){let t=e.taskDeliveryId??e.caller?.taskId;return t!==void 0&&this.originatesFromCancelledTask(t)}};function deliveryOriginatesFromTask(e,t){return e===t||e.startsWith(`${t}:`)}function deliveryHasMessage(e){return e.payloads.some(e=>e.message!==void 0)}function unsupportedSessionCommand(e){throw Error(`Unsupported session command: ${JSON.stringify(e)}`)}export{TurnControlReceiver};
1
+ import{createHook}from"#compiled/@workflow/core/index.js";import{closeHookIterator,disposeHook}from"#execution/hook-ownership.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{rebuildSerializableError}from"#execution/workflow-errors.js";import{turnCancellationHookToken}from"#execution/turn-cancellation-token.js";import{forwardTurnCancellationStep}from"#execution/forward-turn-cancellation-step.js";import{forwardTurnDeliveryStep}from"#execution/forward-turn-delivery-step.js";var TurnControlReceiver=class{bufferedDeliveries;bufferedSessionControls;commandInbox;control;controlIterator;expectedTurnId;cancelledTaskIds;seenTaskDeliveries;pendingControl=null;constructor(t){this.bufferedDeliveries=t.bufferedDeliveries,this.bufferedSessionControls=t.bufferedSessionControls,this.cancelledTaskIds=t.cancelledTaskIds??new Set,this.commandInbox=t.commandInbox,this.seenTaskDeliveries=t.seenTaskDeliveries??new Set,this.control=createHook({token:t.token}),this.controlIterator=this.control[Symbol.asyncIterator](),this.expectedTurnId=t.expectedTurnId}get token(){return this.control.token}async dispose(){await closeHookIterator(this.controlIterator),await disposeHook(this.control)}async waitForAction(){for(;;){let e=await this.nextControlOrCommand();if(e.kind===`command`){let t=await this.handleSessionCommand(e.command);if(t!==void 0)return t;continue}let t=e.payload,n=this.readTerminalControl(t);if(n!==void 0)return n;if(t.kind===`turn-delivery-request`){let e=await this.serviceDeliveryRequest(t);if(e!==void 0)return e}}}async handleSessionCommand(e){if(e.kind===`deliver`){if(!this.acceptTaskDelivery(e))return;await this.bufferDelivery(e);return}if(e.kind===`clear`||e.kind===`compact`){this.bufferedSessionControls.push(e.kind);return}if(e.kind===`session-timeout`){this.bufferedSessionControls.push(`expired`);return}if(e.kind===`cancel`){e.taskId!==void 0&&this.discardTaskDeliveries(e.taskId);let t=e.taskId!==void 0&&e.turnId!==void 0&&e.turnId!==this.expectedTurnId?void 0:e.turnId;await forwardTurnCancellationStep({payload:t===void 0?{}:{turnId:t},token:turnCancellationHookToken(this.control.token)});return}if(e.kind===`reset`){await forwardTurnCancellationStep({payload:{},token:turnCancellationHookToken(this.control.token)}),this.bufferedSessionControls.push(`reset`);return}return unsupportedSessionCommand(e)}async bufferDelivery(e){this.bufferedDeliveries.push(e),!(e.turnPolicy!==`steer`||!deliveryHasMessage(e))&&await forwardTurnCancellationStep({payload:{},token:turnCancellationHookToken(this.control.token)})}bufferTurnDeliveries(e){e.bufferedDeliveries!==void 0&&this.bufferedDeliveries.unshift(...e.bufferedDeliveries.filter(e=>!this.shouldDiscard(e)))}consumeControl(){this.pendingControl=null}getControlPromise(){return this.pendingControl??=this.controlIterator.next(),this.pendingControl}async nextControlOrCommand(){let e=await Promise.race([this.getControlPromise().then(e=>({kind:`control`,value:e})),this.commandInbox.next().then(e=>({kind:`command`,value:e}))]);if(e.kind===`command`){if(e.value.done)throw Error(`Session command inbox closed before the active turn settled.`);if(this.commandInbox.consumeNext(),e.value.value.kind===`runtime-action-result`)return await this.nextControlOrCommand();try{return{command:sessionInboxWire.decode(e.value.value),kind:`command`}}catch(e){if(!(e instanceof SessionInboxWireError))throw e;return await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`}),await this.nextControlOrCommand()}}if(this.consumeControl(),e.value.done)throw Error(`Turn control hook closed before delivering a result.`);let t=e.value.value;if(t.kind===`turn-error`)throw rebuildSerializableError(t.error);return t.kind===`turn-continuation-token`?(await this.commandInbox.rekeyContinuation(t.continuationToken),await this.nextControlOrCommand()):{kind:`control`,payload:t}}readTerminalControl(e){if(e.kind===`turn-error`)throw rebuildSerializableError(e.error);if(e.kind===`turn-result`)return this.bufferTurnDeliveries(e),e.action}async serviceDeliveryRequest(e){await this.commandInbox.rekeyContinuation(e.continuationToken);let t=this.takeInputResponseDelivery();for(;t===void 0;){let n=await Promise.race([this.getControlPromise().then(e=>({kind:`control`,value:e})),this.commandInbox.next().then(e=>({kind:`command`,value:e}))]);if(n.kind===`control`){if(this.consumeControl(),n.value.done)throw Error(`Turn control hook closed during a delivery request.`);if(n.value.value.kind===`turn-continuation-token`){await this.commandInbox.rekeyContinuation(n.value.value.continuationToken);continue}let t=this.readTerminalControl(n.value.value);if(t!==void 0)return t;if(n.value.value.kind===`turn-delivery-cancelled`&&n.value.value.requestId===e.requestId)return;continue}if(n.value.done)throw Error(`Session command inbox closed during a turn delivery request.`);if(this.commandInbox.consumeNext(),n.value.value.kind===`runtime-action-result`)continue;let a;try{a=sessionInboxWire.decode(n.value.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(a.kind===`deliver`){if(!this.acceptTaskDelivery(a))continue;deliveryHasMessage(a)?await this.bufferDelivery(a):t=a;continue}let o=await this.handleSessionCommand(a);if(o!==void 0)return o}try{await forwardTurnDeliveryStep({inboxToken:e.inboxToken,payload:{delivery:t,kind:`driver-delivery`,requestId:e.requestId}})}catch(e){if(!(e instanceof Error&&e.name===`HookNotFoundError`))throw e}return await this.awaitForwardedDelivery(e.requestId,t)}takeInputResponseDelivery(){let e=this.bufferedDeliveries.findIndex(e=>!deliveryHasMessage(e));if(e!==-1)return this.bufferedDeliveries.splice(e,1)[0]}async awaitForwardedDelivery(e,t){for(;;){let n=await this.nextControlOrCommand();if(n.kind===`command`){let e=await this.handleSessionCommand(n.command);if(e!==void 0)return this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t),e;continue}let r=n.payload;if(r.kind===`turn-delivery-accepted`){if(r.requestId===e)return;continue}if(r.kind===`turn-delivery-cancelled`&&r.requestId===e){this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t);return}r.kind===`turn-result`&&(this.shouldDiscard(t)||this.bufferedDeliveries.unshift(t));let i=this.readTerminalControl(r);if(i!==void 0)return i}}acceptTaskDelivery(e){let t=e.taskDeliveryId??e.caller?.taskId;return t===void 0?!0:this.originatesFromCancelledTask(t)||this.seenTaskDeliveries.has(t)?!1:(this.seenTaskDeliveries.add(t),!0)}discardTaskDeliveries(e){this.cancelledTaskIds.add(e);let t=this.bufferedDeliveries.filter(e=>!this.shouldDiscard(e));this.bufferedDeliveries.splice(0,this.bufferedDeliveries.length,...t)}originatesFromCancelledTask(e){return[...this.cancelledTaskIds].some(t=>deliveryOriginatesFromTask(e,t))}shouldDiscard(e){let t=e.taskDeliveryId??e.caller?.taskId;return t!==void 0&&this.originatesFromCancelledTask(t)}};function deliveryOriginatesFromTask(e,t){return e===t||e.startsWith(`${t}:`)}function deliveryHasMessage(e){return e.payloads.some(e=>e.message!==void 0)}function unsupportedSessionCommand(e){throw Error(`Unsupported session command: ${JSON.stringify(e)}`)}export{TurnControlReceiver};
@@ -17,7 +17,7 @@ export interface DispatchedTurn {
17
17
  dispose(): Promise<void>;
18
18
  }
19
19
  /** Dispatches one turn and services its private-inbox control protocol until it terminates. */
20
- export declare function dispatchAndAwaitTurn(input: {
20
+ interface TurnDispatchInput {
21
21
  readonly bufferedDeliveries: DeliverHookPayload[];
22
22
  readonly bufferedSessionControls: Array<"clear" | "compact" | "expired" | "reset">;
23
23
  readonly capabilities?: SessionCapabilities;
@@ -30,4 +30,6 @@ export declare function dispatchAndAwaitTurn(input: {
30
30
  readonly serializedContext: Record<string, unknown>;
31
31
  readonly seenTaskDeliveries?: Set<string>;
32
32
  readonly sessionState: DurableSessionState;
33
- }): Promise<DispatchedTurn>;
33
+ }
34
+ export declare function dispatchAndAwaitTurn(input: TurnDispatchInput): Promise<DispatchedTurn>;
35
+ export {};
@@ -1 +1 @@
1
- import{activeTurnId}from"#harness/active-turn-id.js";import{dispatchTurnStep}from"#execution/dispatch-turn-step.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";async function dispatchAndAwaitTurn(t){let n=new TurnControlReceiver({bufferedDeliveries:t.bufferedDeliveries,bufferedSessionControls:t.bufferedSessionControls,cancelledTaskIds:t.cancelledTaskIds,commandInbox:t.commandInbox,expectedTurnId:activeTurnId(t.sessionState.emissionState),seenTaskDeliveries:t.seenTaskDeliveries??new Set,token:t.controlToken});try{return await dispatchTurnStep({capabilities:t.capabilities,completionToken:n.token,delivery:t.delivery,mode:t.mode,parentWritable:t.parentWritable,serializedContext:t.serializedContext,sessionState:t.sessionState}),{action:await n.waitForAction(),dispose:()=>n.dispose()}}catch(e){throw await n.dispose(),e}}export{dispatchAndAwaitTurn};
1
+ import{activeTurnId}from"#harness/active-turn-id.js";import{dispatchTurnStep}from"#execution/dispatch-turn-step.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";import{runInlineTurn}from"#execution/inline-turn.js";async function dispatchAndAwaitTurn(e){let t=await runInlineTurn(e);return t.kind===`result`?{action:t.action,async dispose(){}}:await dispatchAndAwaitChildTurn({...e,initialCancellation:t.initialCancellation,initialStep:t.initialStep})}async function dispatchAndAwaitChildTurn(n){let r=new TurnControlReceiver({bufferedDeliveries:n.bufferedDeliveries,bufferedSessionControls:n.bufferedSessionControls,cancelledTaskIds:n.cancelledTaskIds,commandInbox:n.commandInbox,expectedTurnId:activeTurnId(n.sessionState.emissionState),seenTaskDeliveries:n.seenTaskDeliveries??new Set,token:n.controlToken});try{return await dispatchTurnStep({capabilities:n.capabilities,completionToken:r.token,delivery:n.delivery,initialCancellation:n.initialCancellation,initialStep:n.initialStep,mode:n.mode,parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}),{action:await r.waitForAction(),dispose:()=>r.dispose()}}catch(e){throw await r.dispose(),e}}export{dispatchAndAwaitTurn};
@@ -1 +1 @@
1
- import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";var TurnExecutionCursor=class extends SessionStateCursor{controlToken;parentWritable;lastReportedContinuationToken;constructor(e){super({serializedContext:e.serializedContext,sessionState:e.sessionState}),this.controlToken=e.controlToken,this.lastReportedContinuationToken=e.sessionState.continuationToken,this.parentWritable=e.parentWritable}async adopt(e){this.adoptState(e);let t=e.sessionState.continuationToken;t===``||t===this.lastReportedContinuationToken||(this.lastReportedContinuationToken=t,await this.send({continuationToken:t,kind:`turn-continuation-token`}))}createStepInput(e,t){return{abortSignal:t,input:e,parentWritable:this.parentWritable,serializedContext:this.serializedContext,sessionState:this.sessionState}}async finish(e,t,n){this.adoptState(e),await this.send({action:{...t,serializedContext:this.serializedContext,sessionState:this.sessionState},bufferedDeliveries:n.length===0?void 0:[...n],kind:`turn-result`})}async send(t){await sendTurnControlStep({controlToken:this.controlToken,payload:t})}};export{TurnExecutionCursor};
1
+ import{SessionStateCursor}from"#execution/session-state-cursor.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";var TurnExecutionCursor=class extends SessionStateCursor{controlToken;parentWritable;lastReportedContinuationToken;constructor(e){super({serializedContext:e.serializedContext,sessionState:e.sessionState}),this.controlToken=e.controlToken,this.lastReportedContinuationToken=e.sessionState.continuationToken,this.parentWritable=e.parentWritable}async adopt(e){this.adoptState(e);let t=e.sessionState.continuationToken;t===``||t===this.lastReportedContinuationToken||(this.lastReportedContinuationToken=t,await this.send({continuationToken:t,kind:`turn-continuation-token`}))}createStepInput(e,t){return{abortSignal:t,input:e,parentWritable:this.parentWritable,serializedContext:this.serializedContext,sessionState:this.sessionState}}async finish(e,t,n){this.adoptState(e),await this.send({action:{...t,serializedContext:this.serializedContext,sessionState:this.sessionState},bufferedDeliveries:n.length===0?void 0:[...n],kind:`turn-result`})}async send(e){await sendTurnControlStep({controlToken:this.controlToken,payload:e})}};export{TurnExecutionCursor};
@@ -1 +1 @@
1
- import{createHook,getWorkflowMetadata,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{dispatchTaskStep}from"#execution/tasks/parent/dispatch-task-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getRuntimeActionResultKey}from"#runtime/actions/keys.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{isInboxSubagentResultFromRunningHandle}from"#harness/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{turnStep}from"#execution/workflow-steps.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(n){let s=createHook({token:`${n.completionToken}:inbox`}),l=s[Symbol.asyncIterator](),u=new TurnExecutionCursor({controlToken:n.completionToken,parentWritable:n.stepInput.parentWritable,serializedContext:n.stepInput.serializedContext,sessionState:n.stepInput.sessionState}),d=0,nextDeliveryRequestId=()=>`${s.token}:delivery:${String(d++)}`,f=[],p=n.stepInput.input,m=!1,h;try{try{await claimHookOwnership(s),m=!0}catch(e){if(isHookConflictError(e))return;throw e}for(n.driverCapabilities?.cancelledTurnSettle===!0&&(h=await createTurnCancellationControl({controlToken:n.completionToken,expectedTurnId:activeTurnId(n.stepInput.sessionState.emissionState)}));;){let e={serializedContext:u.serializedContext,sessionState:u.sessionState},r=await turnStep(u.createStepInput(p,h?.signal)),i=r.action===`dispatch-workflow-runtime-actions`||r.action===`park`?r.pendingRuntimeActionKeys:void 0,a=(r.backgroundTasks?.length??0)>0;if(a){if(r.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await u.adopt({serializedContext:e.serializedContext,sessionState:r.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:r.backgroundTasks??[]})}if(r.action===`cancelled`){await u.adopt({serializedContext:r.serializedContext,sessionState:r.backgroundTaskState??r.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(h?.signal.aborted===!0&&(i===void 0||a)){await u.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(e.serializedContext,r.serializedContext),sessionState:u.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(r.sleepDurationMs!==void 0&&await waitForTurnSleep(r.sleepDurationMs,h)===`cancel`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}if(r.action===`done`){await h?.dispose(),await u.finish(r,{kind:`done`,output:r.output??``,isError:r.isError,usage:r.usage,usageDelta:r.usageDelta},f);return}if(i!==void 0){await u.adopt(r);let e=r.action===`park`&&r.tasksEnabled,n;n=r.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:e?dispatchTaskStep:dispatchRuntimeActionsStep;let a=await n({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:s.token,parentWritable:u.parentWritable,serializedContext:u.serializedContext,sessionState:u.sessionState}),c=a.results.length===0?void 0:Date.now();await u.adopt(a),await acknowledgeDelegatedTasksStep({tasks:a.pendingTasks});let d=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:h,cursor:u,inboxToken:s.token,initialAcceptedAtMs:c,initialResults:a.results,iterator:l,nextDeliveryRequestId,pendingActionKeys:i});if(d===`cancelled`){p=void 0;continue}if(d===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:h,cursor:u});return}p={kind:`runtime-action-result`,...d};continue}if(r.action===`park`){if(!(r.hasPendingAuthorization||r.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await h?.dispose(),await u.finish(r,{authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,kind:`park`,settled:r.settled},f);return}await u.adopt(r),p=void 0}}catch(e){throw await u.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{h!==void 0&&await h.dispose(),m&&await disposeHook(s)}}async function finishCancelledTurn(e){await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForTurnSleep(e,t){if(t?.signal.aborted===!0)return`cancel`;let r=sleep(e).then(()=>`slept`);return t===void 0?r:Promise.race([r,t.requested])}async function waitForRuntimeActionResults(e){let t,n=[...e.initialResults],r=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)r.set(getRuntimeActionResultKey(t),e.initialAcceptedAtMs);for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:e.pendingActionKeys,results:n});if(i!==void 0)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),{acceptedAtMsByCallId:Object.fromEntries(i.map(e=>[e.callId,r.get(getRuntimeActionResultKey(e))])),results:i};e.cursor.sessionState.hasProxyInputRequests&&t===void 0&&(t=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:t}));let a=e.iterator.next();a.catch(()=>{});let o=await(e.cancellation===void 0?a:Promise.race([a,e.cancellation.requested]));if(o===`cancel`)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),`cancelled`;if(o.done)throw Error(`Turn inbox closed before runtime actions completed.`);let s=o.value;if(s.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,i=s.results.filter(e=>isInboxSubagentResultFromRunningHandle(t,e));if(i.length>0){let e=Date.now();n.push(...i);for(let t of i)r.set(getRuntimeActionResultKey(t),e)}continue}if(s.kind===`subagent-input-request`||s.kind===`subagent-authorization-event`){let t=await runProxySubagentEventStep({hookPayload:s,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(t);continue}if(s.kind===`driver-delivery`&&s.requestId===t){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:s.requestId}),t=void 0;let n=await routeDeliverToChildren({delivery:s.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:n.serializedContext??e.cursor.serializedContext,sessionState:n.sessionState??e.cursor.sessionState}),n.kind===`cancel-turn`)return n.kind;n.remainder!==void 0&&e.bufferedDeliveries.push(n.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let r=await turnStep(t);if(r.action!==`cancelled`&&r.sleepDurationMs!==void 0&&await sleep(r.sleepDurationMs),r.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:r.output??``,isError:r.isError,serializedContext:r.serializedContext,sessionState:r.sessionState,usage:r.usage,usageDelta:r.usageDelta},kind:`turn-result`}});return}if(r.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:r.pendingRuntimeActionKeys,serializedContext:r.serializedContext,sessionState:r.sessionState},kind:`turn-result`}});return}if(r.action===`park`){let t=r.pendingRuntimeActionKeys;if(!(t!==void 0||r.hasPendingAuthorization||r.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let n=t===void 0?{kind:`park`,serializedContext:r.serializedContext,sessionState:r.sessionState,authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,settled:r.settled}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:r.serializedContext,sessionState:r.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:n,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:r.serializedContext,sessionState:r.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
1
+ import{createHook,getWorkflowMetadata,sleep}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{isInboxToolResultFromRecordedRun}from"#harness/tool-runs.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{dispatchRuntimeActionsStep}from"#execution/dispatch-runtime-actions-step.js";import{dispatchTaskStep}from"#execution/tasks/parent/dispatch-task-step.js";import{activeTurnId}from"#harness/active-turn-id.js";import{turnStep}from"#execution/workflow-steps.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getRuntimeActionResultKey}from"#runtime/actions/keys.js";import{runProxySubagentEventStep}from"#execution/subagent-event-proxy-step.js";import{createChannelReader,raceChannelReads}from"#execution/tool-run/owner-channels.js";import{openRunOwnerChannels}from"#execution/tool-run/owner.js";import{runOutcomeToToolResult,runRequestToInputRequestPayload}from"#execution/tool-run/owner-inbox.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{isInboxSubagentResultFromRunningHandle}from"#harness/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchWorkflowRuntimeActionsStep}from"#execution/dispatch-workflow-runtime-actions-step.js";import{emitRunReportStep}from"#execution/tool-run/emit-run-report-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(n){let s=createHook({token:`${n.completionToken}:inbox`}),c=createChannelReader(`inbox`,s),d=n.initialStep,f=new TurnExecutionCursor({controlToken:n.completionToken,parentWritable:n.stepInput.parentWritable,serializedContext:d?.beforeStep.serializedContext??n.stepInput.serializedContext,sessionState:d?.beforeStep.sessionState??n.stepInput.sessionState}),p=0,nextDeliveryRequestId=()=>`${s.token}:delivery:${String(p++)}`,m=[],h=n.stepInput.input,g=!1,_,v;try{try{await claimHookOwnership(s),g=!0}catch(e){if(isHookConflictError(e))return;throw e}for(n.driverCapabilities?.cancelledTurnSettle===!0&&(v=await createTurnCancellationControl({controlToken:n.completionToken,expectedTurnId:activeTurnId(f.sessionState.emissionState),initialPayload:n.initialCancellation}));;){let e=d?.beforeStep??{serializedContext:f.serializedContext,sessionState:f.sessionState},r=d?.result??await turnStep(f.createStepInput(h,v?.signal));d=void 0;let i=r.action===`dispatch-workflow-runtime-actions`||r.action===`park`?r.pendingRuntimeActionKeys:void 0,a=(r.backgroundTasks?.length??0)>0;if(a){if(r.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await f.adopt({serializedContext:e.serializedContext,sessionState:r.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:r.backgroundTasks??[]})}if(r.action===`cancelled`){await f.adopt({serializedContext:r.serializedContext,sessionState:r.backgroundTaskState??r.sessionState}),await finishCancelledTurn({bufferedDeliveries:m,cancellation:v,cursor:f});return}if(v?.signal.aborted===!0&&(i===void 0||a)){await f.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(e.serializedContext,r.serializedContext),sessionState:f.sessionState}),await finishCancelledTurn({bufferedDeliveries:m,cancellation:v,cursor:f});return}if(r.sleepDurationMs!==void 0&&await waitForTurnSleep(r.sleepDurationMs,v)===`cancel`){await finishCancelledTurn({bufferedDeliveries:m,cancellation:v,cursor:f});return}if(r.action===`done`){await v?.dispose(),await f.finish(r,{kind:`done`,output:r.output??``,isError:r.isError,usage:r.usage,usageDelta:r.usageDelta},m);return}if(i!==void 0){await f.adopt(r),r.action===`park`&&r.startsWorkflowToolRuns===!0&&(_??=openRunOwnerChannels(s.token));let e=r.action===`park`&&r.tasksEnabled,n;n=r.action===`dispatch-workflow-runtime-actions`?dispatchWorkflowRuntimeActionsStep:e?dispatchTaskStep:dispatchRuntimeActionsStep;let a=await n({callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:s.token,parentWritable:f.parentWritable,serializedContext:f.serializedContext,sessionState:f.sessionState}),l=a.results.length===0?void 0:Date.now();await f.adopt(a),await acknowledgeDelegatedTasksStep({tasks:a.pendingTasks});let u=await waitForRuntimeActionResults({bufferedDeliveries:m,cancellation:v,cursor:f,inboxToken:s.token,initialAcceptedAtMs:l,initialResults:a.results,nextDeliveryRequestId,readers:_===void 0?[c]:[..._.readers,c],pendingActionKeys:i});if(u===`cancelled`){h=void 0;continue}if(u===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:m,cancellation:v,cursor:f});return}h={kind:`runtime-action-result`,...u};continue}if(r.action===`park`){if(!(r.hasPendingAuthorization||r.hasPendingInputBatch&&n.capabilities?.requestInput===!0||n.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await v?.dispose(),await f.finish(r,{authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,kind:`park`,settled:r.settled},m);return}await f.adopt(r),h=void 0}}catch(e){throw await f.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{v!==void 0&&await v.dispose(),_!==void 0&&await _.dispose(),g&&await disposeHook(s)}}async function finishCancelledTurn(e){await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForTurnSleep(e,t){if(t?.signal.aborted===!0)return`cancel`;let r=sleep(e).then(()=>`slept`);return t===void 0?r:Promise.race([r,t.requested])}async function waitForRuntimeActionResults(e){let t,n=[...e.initialResults],r=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)r.set(getRuntimeActionResultKey(t),e.initialAcceptedAtMs);for(;;){let i=resolveRuntimeActionResultsForKeys({pendingKeys:e.pendingActionKeys,results:n});if(i!==void 0)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),{acceptedAtMsByCallId:Object.fromEntries(i.map(e=>[e.callId,r.get(getRuntimeActionResultKey(e))])),results:i};e.cursor.sessionState.hasProxyInputRequests&&t===void 0&&(t=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:t}));let a=await raceChannelReads(e.readers,e.cancellation?.requested);if(a===`cancel`)return t!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:t}),`cancelled`;if(a.next.done)throw Error(`Turn inbox closed before runtime actions completed.`);if(a.channel===`outcome`){let t=runOutcomeToToolResult(a.next.value),i=e.cursor.sessionState.snapshot?.session.state;if(isInboxToolResultFromRecordedRun(i,t)){let e=Date.now();n.push(t),r.set(getRuntimeActionResultKey(t),e)}continue}if(a.channel===`request`){let t=await runProxySubagentEventStep({answerHook:{runId:a.next.value.from.runId},hookPayload:runRequestToInputRequestPayload(a.next.value),parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(t);continue}if(a.channel===`report`){await emitRunReportStep({from:a.next.value.from,parentWritable:e.cursor.parentWritable,update:a.next.value.update});continue}let o=a.next.value;if(o.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,i=o.results.filter(e=>e.kind===`tool-result`?isInboxToolResultFromRecordedRun(t,e):isInboxSubagentResultFromRunningHandle(t,e));if(i.length>0){let e=Date.now();n.push(...i);for(let t of i)r.set(getRuntimeActionResultKey(t),e)}continue}if(o.kind===`subagent-input-request`||o.kind===`subagent-authorization-event`){let t=await runProxySubagentEventStep({hookPayload:o,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(t);continue}if(o.kind===`driver-delivery`&&o.requestId===t){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:o.requestId}),t=void 0;let n=await routeDeliverToChildren({delivery:o.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:n.serializedContext??e.cursor.serializedContext,sessionState:n.sessionState??e.cursor.sessionState}),n.kind===`cancel-turn`)return n.kind;n.remainder!==void 0&&e.bufferedDeliveries.push(n.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let r=await turnStep(t);if(r.action!==`cancelled`&&r.sleepDurationMs!==void 0&&await sleep(r.sleepDurationMs),r.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:r.output??``,isError:r.isError,serializedContext:r.serializedContext,sessionState:r.sessionState,usage:r.usage,usageDelta:r.usageDelta},kind:`turn-result`}});return}if(r.action===`dispatch-workflow-runtime-actions`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-runtime-actions`,pendingActionKeys:r.pendingRuntimeActionKeys,serializedContext:r.serializedContext,sessionState:r.sessionState},kind:`turn-result`}});return}if(r.action===`park`){let t=r.pendingRuntimeActionKeys;if(!(t!==void 0||r.hasPendingAuthorization||r.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let n=t===void 0?{kind:`park`,serializedContext:r.serializedContext,sessionState:r.sessionState,authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,settled:r.settled}:{kind:`dispatch-runtime-actions`,pendingActionKeys:t,serializedContext:r.serializedContext,sessionState:r.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:n,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:r.serializedContext,sessionState:r.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}export{turnWorkflow};
@@ -1,8 +1,8 @@
1
1
  /** Every explicit session-inbox wire version still supported by producers. */
2
- export declare const SESSION_INBOX_WIRE_VERSIONS: readonly [1, 2];
2
+ export declare const SESSION_INBOX_WIRE_VERSIONS: readonly [1, 2, 3];
3
3
  export type SessionInboxWireVersion = (typeof SESSION_INBOX_WIRE_VERSIONS)[number];
4
4
  /** Current persisted session-inbox wire version. */
5
- export declare const SESSION_INBOX_WIRE_VERSION: 1 | 2;
5
+ export declare const SESSION_INBOX_WIRE_VERSION: 1 | 2 | 3;
6
6
  /** Hook metadata field advertising the consumer's inbox wire capability. */
7
7
  export declare const SESSION_INBOX_WIRE_VERSION_METADATA_KEY = "sessionInboxWireVersion";
8
8
  /**
@@ -1 +1 @@
1
- const SESSION_INBOX_WIRE_VERSIONS=[1,2],SESSION_INBOX_WIRE_VERSION=SESSION_INBOX_WIRE_VERSIONS[SESSION_INBOX_WIRE_VERSIONS.length-1],SESSION_INBOX_WIRE_VERSION_METADATA_KEY=`sessionInboxWireVersion`;function isSessionInboxWireVersion(t){return SESSION_INBOX_WIRE_VERSIONS.some(e=>e===t)}var SessionInboxWireError=class extends Error{constructor(e){super(e),this.name=`SessionInboxWireError`}};export{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSIONS,SESSION_INBOX_WIRE_VERSION_METADATA_KEY,SessionInboxWireError,isSessionInboxWireVersion};
1
+ const SESSION_INBOX_WIRE_VERSIONS=[1,2,3],SESSION_INBOX_WIRE_VERSION=SESSION_INBOX_WIRE_VERSIONS[SESSION_INBOX_WIRE_VERSIONS.length-1],SESSION_INBOX_WIRE_VERSION_METADATA_KEY=`sessionInboxWireVersion`;function isSessionInboxWireVersion(t){return SESSION_INBOX_WIRE_VERSIONS.some(e=>e===t)}var SessionInboxWireError=class extends Error{constructor(e){super(e),this.name=`SessionInboxWireError`}};export{SESSION_INBOX_WIRE_VERSION,SESSION_INBOX_WIRE_VERSIONS,SESSION_INBOX_WIRE_VERSION_METADATA_KEY,SessionInboxWireError,isSessionInboxWireVersion};