eve 0.29.2 → 0.29.4

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 (356) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/src/acp/adapter.d.ts +43 -0
  3. package/dist/src/acp/adapter.js +1 -0
  4. package/dist/src/acp/line-limit.d.ts +3 -0
  5. package/dist/src/acp/line-limit.js +1 -0
  6. package/dist/src/acp/server.d.ts +24 -0
  7. package/dist/src/acp/server.js +1 -0
  8. package/dist/src/channel/types.d.ts +15 -0
  9. package/dist/src/chunks/{use-eve-agent-DaH3cf8K.js → use-eve-agent-8mofdZcO.js} +45 -10
  10. package/dist/src/chunks/{use-eve-agent-CyDt3Lny.js → use-eve-agent-bKJbH0k4.js} +45 -10
  11. package/dist/src/cli/acp/command.d.ts +22 -0
  12. package/dist/src/cli/acp/command.js +4 -0
  13. package/dist/src/cli/commands/agent-prompt/build-and-verify.md +4 -0
  14. package/dist/src/cli/commands/extension-init.js +1 -1
  15. package/dist/src/cli/commands/init-git.js +1 -1
  16. package/dist/src/cli/commands/init-repl.js +1 -1
  17. package/dist/src/cli/commands/init.js +1 -1
  18. package/dist/src/cli/commands/integration-setup.d.ts +3 -7
  19. package/dist/src/cli/commands/integration-setup.js +1 -1
  20. package/dist/src/cli/commands/logs.js +2 -2
  21. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  22. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  23. package/dist/src/cli/commands/registry-project.js +1 -1
  24. package/dist/src/cli/commands/registry-setup-command.js +1 -1
  25. package/dist/src/cli/commands/registry.d.ts +15 -2
  26. package/dist/src/cli/commands/registry.js +1 -1
  27. package/dist/src/cli/commands/trace.d.ts +6 -23
  28. package/dist/src/cli/commands/trace.js +7 -5
  29. package/dist/src/cli/dev/command-options.d.ts +22 -0
  30. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  31. package/dist/src/cli/dev/diagnostic-sink.js +1 -1
  32. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  33. package/dist/src/cli/dev/local-server-process.js +1 -1
  34. package/dist/src/cli/dev/tui/blocks.js +1 -1
  35. package/dist/src/cli/dev/tui/clipboard.d.ts +17 -0
  36. package/dist/src/cli/dev/tui/clipboard.js +1 -0
  37. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  38. package/dist/src/cli/dev/tui/prompt-commands.d.ts +3 -0
  39. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  40. package/dist/src/cli/dev/tui/remote-auth.d.ts +6 -3
  41. package/dist/src/cli/dev/tui/remote-auth.js +1 -1
  42. package/dist/src/cli/dev/tui/remote-connection-probe.js +1 -1
  43. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  44. package/dist/src/cli/dev/tui/runner.js +1 -1
  45. package/dist/src/cli/dev/tui/stream-format.d.ts +22 -0
  46. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  47. package/dist/src/cli/dev/tui/terminal-background.d.ts +23 -0
  48. package/dist/src/cli/dev/tui/terminal-background.js +1 -0
  49. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +3 -0
  50. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  51. package/dist/src/cli/dev/tui/test/mock-terminal.js +3 -3
  52. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +35 -0
  53. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -0
  54. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +63 -0
  55. package/dist/src/cli/dev/tui/traces/trace-conversation.js +2 -0
  56. package/dist/src/cli/dev/tui/traces/trace-store.d.ts +27 -0
  57. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -0
  58. package/dist/src/cli/dev/tui/traces/trace-surfaces.d.ts +40 -0
  59. package/dist/src/cli/dev/tui/traces/trace-surfaces.js +1 -0
  60. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +55 -0
  61. package/dist/src/cli/dev/tui/traces/trace-view.js +2 -0
  62. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +54 -0
  63. package/dist/src/cli/dev/tui/traces/trace-viewer-session.js +1 -0
  64. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +110 -0
  65. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -0
  66. package/dist/src/cli/dev/tui/tui.js +1 -1
  67. package/dist/src/cli/invoke/invoke.js +1 -1
  68. package/dist/src/cli/invoke/result.js +1 -1
  69. package/dist/src/cli/run.d.ts +3 -0
  70. package/dist/src/cli/run.js +3 -3
  71. package/dist/src/cli/ui/alt-screen.d.ts +42 -0
  72. package/dist/src/cli/ui/alt-screen.js +1 -0
  73. package/dist/src/cli/ui/terminal-text.d.ts +4 -3
  74. package/dist/src/cli/ui/terminal-text.js +1 -1
  75. package/dist/src/client/index.d.ts +1 -1
  76. package/dist/src/client/open-stream.js +1 -1
  77. package/dist/src/client/session.d.ts +15 -1
  78. package/dist/src/client/session.js +1 -1
  79. package/dist/src/client/types.d.ts +9 -0
  80. package/dist/src/compiled/.vendor-stamp.json +3 -1
  81. package/dist/src/compiled/@agentclientprotocol/sdk/LICENSE +191 -0
  82. package/dist/src/compiled/@agentclientprotocol/sdk/index.d.ts +1835 -0
  83. package/dist/src/compiled/@agentclientprotocol/sdk/index.js +65 -0
  84. package/dist/src/compiled/@agentclientprotocol/sdk/jsonrpc.d.ts +603 -0
  85. package/dist/src/compiled/@agentclientprotocol/sdk/schema/guards.gen.d.ts +199 -0
  86. package/dist/src/compiled/@agentclientprotocol/sdk/schema/index.d.ts +51 -0
  87. package/dist/src/compiled/@agentclientprotocol/sdk/schema/types.gen.d.ts +6118 -0
  88. package/dist/src/compiled/@agentclientprotocol/sdk/stream.d.ts +35 -0
  89. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/LICENSE +21 -0
  90. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/_spectrum-core.d.ts +3 -0
  91. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/_spectrum-imessage.d.ts +2 -0
  92. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.d.ts +496 -0
  93. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +137 -0
  94. package/dist/src/compiled/@vercel/sandbox/index.js +13 -107
  95. package/dist/src/compiled/_chunks/node/auth-BS3UoyvT.js +2 -0
  96. package/dist/src/compiled/_chunks/node/compat-Dm2n85Mx.js +1 -0
  97. package/dist/src/compiled/_chunks/node/schemas-DtQwuPdM.js +65 -0
  98. package/dist/src/compiled/_chunks/node/undici-DWL_MYmT.js +95 -0
  99. package/dist/src/compiled/_chunks/node/version-Cztrk7z6.js +1 -0
  100. package/dist/src/compiled/shadcn-registry/index.js +461 -893
  101. package/dist/src/compiler/artifacts.js +1 -1
  102. package/dist/src/compiler/extension-compatibility.js +1 -1
  103. package/dist/src/compiler/model-catalog.js +1 -1
  104. package/dist/src/compiler/normalize-sandbox.js +1 -1
  105. package/dist/src/compiler/workspace-resources.js +1 -1
  106. package/dist/src/context/keys.d.ts +3 -1
  107. package/dist/src/context/keys.js +1 -1
  108. package/dist/src/discover/project-source.js +1 -1
  109. package/dist/src/evals/cli/eval.js +2 -2
  110. package/dist/src/evals/loaders/json.js +1 -1
  111. package/dist/src/evals/loaders/yaml.js +1 -1
  112. package/dist/src/evals/runner/artifacts.js +1 -1
  113. package/dist/src/evals/runner/discover.js +1 -1
  114. package/dist/src/evals/runner/reporters/junit.js +1 -1
  115. package/dist/src/evals/session.js +1 -1
  116. package/dist/src/execution/delegated-parent-notification.js +1 -1
  117. package/dist/src/execution/delegated-parent-result.js +1 -1
  118. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  119. package/dist/src/execution/runtime-context.js +1 -1
  120. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  121. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  122. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  123. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  124. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
  125. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  126. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -1
  127. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +1 -1
  128. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  129. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  130. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  131. package/dist/src/execution/sandbox/glob-tool.js +3 -3
  132. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  133. package/dist/src/execution/sandbox/read-file-tool.js +3 -3
  134. package/dist/src/execution/sandbox/require-sandbox.d.ts +3 -3
  135. package/dist/src/execution/sandbox/require-sandbox.js +1 -1
  136. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -1
  137. package/dist/src/execution/sandbox/write-file-tool.js +1 -1
  138. package/dist/src/execution/subagent-adapter-state.d.ts +39 -0
  139. package/dist/src/execution/subagent-adapter-state.js +1 -0
  140. package/dist/src/execution/subagent-adapter.d.ts +0 -34
  141. package/dist/src/execution/subagent-adapter.js +1 -1
  142. package/dist/src/execution/subagent-tool.d.ts +2 -1
  143. package/dist/src/execution/subagent-tool.js +1 -1
  144. package/dist/src/execution/workflow-steps.js +1 -1
  145. package/dist/src/harness/attachment-staging.js +1 -1
  146. package/dist/src/harness/instrumentation-lifecycle.d.ts +18 -0
  147. package/dist/src/harness/instrumentation-native-events.d.ts +3 -1
  148. package/dist/src/harness/instrumentation-native-events.js +1 -1
  149. package/dist/src/harness/parent-lineage.d.ts +11 -0
  150. package/dist/src/harness/parent-lineage.js +1 -0
  151. package/dist/src/harness/tool-loop.js +2 -2
  152. package/dist/src/internal/application/build-profile.js +1 -1
  153. package/dist/src/internal/application/build-workspace.js +1 -1
  154. package/dist/src/internal/application/cache-metadata.js +1 -1
  155. package/dist/src/internal/application/compiled-artifacts.js +8 -8
  156. package/dist/src/internal/application/optional-package-install.js +2 -2
  157. package/dist/src/internal/application/output-publication-artifacts.js +1 -1
  158. package/dist/src/internal/application/output-publication-journal.js +1 -1
  159. package/dist/src/internal/application/output-publication-lock.js +1 -1
  160. package/dist/src/internal/application/output-publication.js +1 -1
  161. package/dist/src/internal/application/package.js +1 -1
  162. package/dist/src/internal/application/paths.js +1 -1
  163. package/dist/src/internal/application/production-compiler-artifacts.js +1 -1
  164. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  165. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  166. package/dist/src/internal/authored-module-loader.js +3 -3
  167. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  168. package/dist/src/internal/materialized-authored-modules.js +1 -1
  169. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  170. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  171. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  172. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  173. package/dist/src/internal/nitro/host/build-application.js +1 -1
  174. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  175. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  176. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  177. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -1
  178. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  179. package/dist/src/internal/nitro/host/cron-handler-route.js +1 -1
  180. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  181. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  182. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  183. package/dist/src/internal/nitro/host/dev-host-workspace.js +1 -1
  184. package/dist/src/internal/nitro/host/dev-server-http.js +1 -1
  185. package/dist/src/internal/nitro/host/dev-server-state.js +1 -1
  186. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  187. package/dist/src/internal/nitro/host/extension-build-config.js +1 -1
  188. package/dist/src/internal/nitro/host/extension-declarations.js +2 -2
  189. package/dist/src/internal/nitro/host/extension-distribution.js +3 -3
  190. package/dist/src/internal/nitro/host/extension-state-usage.js +1 -1
  191. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  192. package/dist/src/internal/nitro/host/normalize-vercel-service-crons.js +1 -1
  193. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  194. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  195. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  196. package/dist/src/internal/vercel/project-link.js +1 -1
  197. package/dist/src/internal/workflow/development-world-client.js +1 -1
  198. package/dist/src/internal/workflow-bundle/builder-support.js +6 -6
  199. package/dist/src/internal/workflow-bundle/builder.js +3 -3
  200. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  201. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  202. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  203. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  204. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +7 -0
  205. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  206. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  207. package/dist/src/public/channels/discord/verify.js +1 -1
  208. package/dist/src/public/channels/github/auth.js +2 -2
  209. package/dist/src/public/channels/github/githubChannel.js +1 -1
  210. package/dist/src/public/channels/github/verify.js +1 -1
  211. package/dist/src/public/channels/linear/inbound.js +2 -2
  212. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  213. package/dist/src/public/channels/linear/verify.js +1 -1
  214. package/dist/src/public/channels/photon/inboundContent.d.ts +4 -0
  215. package/dist/src/public/channels/photon/inboundContent.js +1 -0
  216. package/dist/src/public/channels/photon/index.d.ts +1 -0
  217. package/dist/src/public/channels/photon/index.js +1 -0
  218. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +54 -0
  219. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -0
  220. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  221. package/dist/src/public/channels/telegram/verify.js +1 -1
  222. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  223. package/dist/src/public/models/openai/chatgpt/auth.js +1 -1
  224. package/dist/src/public/next/server.js +2 -2
  225. package/dist/src/public/next/vercel-output-config.js +1 -1
  226. package/dist/src/public/nuxt/dev-server.js +1 -1
  227. package/dist/src/public/nuxt/vercel-services.js +1 -1
  228. package/dist/src/public/sveltekit/dev-server.js +1 -1
  229. package/dist/src/public/sveltekit/vercel-json.js +1 -1
  230. package/dist/src/runtime/channels/registry.js +1 -1
  231. package/dist/src/runtime/framework-tools/file-state.js +1 -1
  232. package/dist/src/runtime/framework-tools/glob.js +1 -1
  233. package/dist/src/runtime/framework-tools/grep.js +1 -1
  234. package/dist/src/runtime/framework-tools/read-file.js +1 -1
  235. package/dist/src/runtime/framework-tools/write-file.js +1 -1
  236. package/dist/src/runtime/sandbox/keys.js +1 -1
  237. package/dist/src/runtime/workspace/seed-files.js +1 -1
  238. package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
  239. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  240. package/dist/src/setup/connect-provisioning.d.ts +32 -0
  241. package/dist/src/setup/connect-provisioning.js +1 -0
  242. package/dist/src/setup/flows/login.js +1 -1
  243. package/dist/src/setup/flows/registry.js +1 -1
  244. package/dist/src/setup/index.d.ts +1 -0
  245. package/dist/src/setup/index.js +1 -1
  246. package/dist/src/setup/integrations/discord/api.d.ts +15 -0
  247. package/dist/src/setup/integrations/discord/api.js +1 -0
  248. package/dist/src/setup/integrations/discord/connect.d.ts +24 -0
  249. package/dist/src/setup/integrations/discord/connect.js +1 -0
  250. package/dist/src/setup/integrations/discord/setup.d.ts +19 -0
  251. package/dist/src/setup/integrations/discord/setup.js +8 -0
  252. package/dist/src/setup/integrations/photon/connect.d.ts +40 -0
  253. package/dist/src/setup/integrations/photon/connect.js +1 -0
  254. package/dist/src/setup/integrations/photon/management.d.ts +34 -0
  255. package/dist/src/setup/integrations/photon/management.js +1 -0
  256. package/dist/src/setup/integrations/photon/setup-flow.d.ts +39 -0
  257. package/dist/src/setup/integrations/photon/setup-flow.js +20 -0
  258. package/dist/src/setup/integrations/photon/setup.d.ts +3 -0
  259. package/dist/src/setup/integrations/photon/setup.js +1 -0
  260. package/dist/src/setup/integrations/registry.d.ts +6 -0
  261. package/dist/src/setup/integrations/registry.js +1 -0
  262. package/dist/src/setup/integrations/runner.d.ts +25 -0
  263. package/dist/src/setup/integrations/runner.js +1 -0
  264. package/dist/src/setup/integrations/{channels → shared}/environment.d.ts +3 -3
  265. package/dist/src/setup/integrations/shared/environment.js +1 -0
  266. package/dist/src/setup/integrations/shared/scaffold.d.ts +19 -0
  267. package/dist/src/setup/integrations/shared/scaffold.js +1 -0
  268. package/dist/src/setup/integrations/{channels → shared}/ui.d.ts +3 -3
  269. package/dist/src/setup/integrations/shared/ui.js +2 -0
  270. package/dist/src/setup/integrations/slack/setup.d.ts +16 -0
  271. package/dist/src/setup/integrations/slack/setup.js +1 -0
  272. package/dist/src/setup/integrations/types.d.ts +26 -0
  273. package/dist/src/setup/integrations/types.js +1 -0
  274. package/dist/src/setup/integrations/web/setup.d.ts +3 -0
  275. package/dist/src/setup/integrations/web/setup.js +1 -0
  276. package/dist/src/setup/package-manager.js +1 -1
  277. package/dist/src/setup/primitives/pm/pnpm.js +3 -3
  278. package/dist/src/setup/primitives/run-vercel.d.ts +2 -7
  279. package/dist/src/setup/primitives/run-vercel.js +1 -1
  280. package/dist/src/setup/project-resolution.js +1 -1
  281. package/dist/src/setup/prompter.js +1 -1
  282. package/dist/src/setup/registry-setup-client.d.ts +6 -2
  283. package/dist/src/setup/registry-setup-client.js +1 -1
  284. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  285. package/dist/src/setup/scaffold/create/extension.js +1 -1
  286. package/dist/src/setup/scaffold/create/project.js +3 -10
  287. package/dist/src/setup/scaffold/files.js +1 -1
  288. package/dist/src/setup/scaffold/update/channels.js +2 -2
  289. package/dist/src/setup/scaffold/update/connections.js +1 -1
  290. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  291. package/dist/src/setup/slack-connect-lifecycle.d.ts +2 -8
  292. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  293. package/dist/src/setup/state.d.ts +0 -12
  294. package/dist/src/setup/state.js +1 -1
  295. package/dist/src/setup/vercel-project-framework.js +1 -1
  296. package/dist/src/shared/guards.d.ts +2 -0
  297. package/dist/src/shared/guards.js +1 -1
  298. package/dist/src/shared/skill-package.js +1 -1
  299. package/dist/src/shared/skill-paths.d.ts +14 -4
  300. package/dist/src/shared/skill-paths.js +2 -2
  301. package/dist/src/shared/vercel-output-directory.js +1 -1
  302. package/dist/src/source-change/static-source-change.js +1 -1
  303. package/dist/src/svelte/index.js +1 -1
  304. package/dist/src/svelte/use-eve-agent.js +1 -1
  305. package/dist/src/tracing/agent-otel-content.d.ts +32 -0
  306. package/dist/src/tracing/agent-otel-content.js +4 -0
  307. package/dist/src/{harness → tracing}/agent-otel-provider.d.ts +10 -1
  308. package/dist/src/tracing/agent-otel-provider.js +2 -0
  309. package/dist/src/{harness → tracing}/agent-trace-context-store.d.ts +8 -1
  310. package/dist/src/tracing/agent-trace-context-store.js +1 -0
  311. package/dist/src/{harness → tracing}/agent-trace-span-processor.d.ts +5 -1
  312. package/dist/src/tracing/agent-trace-span-processor.js +1 -0
  313. package/dist/src/tracing/local-instrumentation-runtime.js +1 -0
  314. package/dist/src/tracing/local-trace-reader.d.ts +74 -0
  315. package/dist/src/tracing/local-trace-reader.js +1 -0
  316. package/dist/src/{harness → tracing}/local-trace-retention.js +1 -1
  317. package/dist/src/{harness → tracing}/local-trace-span-processor.js +1 -1
  318. package/dist/src/vue/index.js +1 -1
  319. package/dist/src/vue/use-eve-agent.js +1 -1
  320. package/docs/channels/chat-sdk.mdx +18 -1
  321. package/docs/channels/discord.mdx +30 -14
  322. package/docs/channels/meta.json +1 -0
  323. package/docs/channels/overview.mdx +1 -1
  324. package/docs/channels/photon.mdx +78 -0
  325. package/docs/concepts/default-harness.md +2 -0
  326. package/docs/guides/acp.md +91 -0
  327. package/docs/guides/client/streaming.mdx +24 -0
  328. package/docs/guides/dev-tui.md +20 -1
  329. package/docs/guides/instrumentation.md +8 -7
  330. package/docs/guides/meta.json +1 -0
  331. package/docs/reference/cli.md +12 -1
  332. package/docs/sandbox.mdx +1 -1
  333. package/package.json +8 -1
  334. package/dist/src/compiled/_chunks/node/auth-DMsLOrh7.js +0 -2
  335. package/dist/src/compiled/_chunks/node/version-BQBAL95V.js +0 -64
  336. package/dist/src/harness/agent-otel-provider.js +0 -1
  337. package/dist/src/harness/agent-trace-context-store.js +0 -1
  338. package/dist/src/harness/agent-trace-span-processor.js +0 -1
  339. package/dist/src/harness/local-instrumentation-runtime.js +0 -1
  340. package/dist/src/setup/integrations/channels/environment.js +0 -1
  341. package/dist/src/setup/integrations/channels/index.d.ts +0 -7
  342. package/dist/src/setup/integrations/channels/index.js +0 -1
  343. package/dist/src/setup/integrations/channels/runner.d.ts +0 -7
  344. package/dist/src/setup/integrations/channels/runner.js +0 -1
  345. package/dist/src/setup/integrations/channels/setup.d.ts +0 -130
  346. package/dist/src/setup/integrations/channels/setup.js +0 -2
  347. package/dist/src/setup/integrations/channels/slack.d.ts +0 -3
  348. package/dist/src/setup/integrations/channels/slack.js +0 -1
  349. package/dist/src/setup/integrations/channels/types.d.ts +0 -49
  350. package/dist/src/setup/integrations/channels/ui.js +0 -2
  351. package/dist/src/setup/integrations/channels/web.d.ts +0 -3
  352. package/dist/src/setup/integrations/channels/web.js +0 -1
  353. /package/dist/src/{setup/integrations/channels/types.js → cli/dev/command-options.js} +0 -0
  354. /package/dist/src/{harness → tracing}/local-instrumentation-runtime.d.ts +0 -0
  355. /package/dist/src/{harness → tracing}/local-trace-retention.d.ts +0 -0
  356. /package/dist/src/{harness → tracing}/local-trace-span-processor.d.ts +0 -0
@@ -1 +1 @@
1
- import"node:fs";import{join}from"node:path";import{readdir,rm,stat}from"node:fs/promises";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";import{resolveLocalBackendSessionRootPath,resolveLocalBackendTemplateRootPath,resolveLocalBackendTemplatesDirectory}from"#execution/sandbox/bindings/local-backend-utils.js";import{LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT}from"#execution/sandbox/bindings/local-template-prune.js";import{readTemplateMetadata,resolveMicrosandboxMetadataPath}from"#execution/sandbox/bindings/microsandbox-metadata.js";import{loadMicrosandboxWithoutInstall,removeSnapshotIfExists}from"#execution/sandbox/bindings/microsandbox-runtime.js";const MICROSANDBOX_CACHE_DIRECTORY_NAME=`microsandbox`;async function pruneMicrosandboxTemplates(e){let t=resolveMicrosandboxTemplatesDirectory(resolveSandboxCacheDirectory(e.appRoot)),n=e.now??Date.now(),r=e.recentWindowMs??LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,a=e.retainCount??LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,o=await readMicrosandboxTemplateDirectories(t),s=o.filter(e=>!e.isTemporary);await Promise.all([...s.map(async(t,i)=>{i<a||n-t.mtimeMs<=r||await removeTemplateDirectory(e.appRoot,t.path,t.metadata)}),...o.filter(e=>e.isTemporary).map(async t=>{n-t.mtimeMs<=r||await removeTemplateDirectory(e.appRoot,t.path,t.metadata)})])}function resolveMicrosandboxTemplateRootPath(e,t){return resolveLocalBackendTemplateRootPath(e,MICROSANDBOX_CACHE_DIRECTORY_NAME,t)}function resolveMicrosandboxTemplatesDirectory(e){return resolveLocalBackendTemplatesDirectory(e,MICROSANDBOX_CACHE_DIRECTORY_NAME)}function resolveMicrosandboxSessionRootPath(e,t){return resolveLocalBackendSessionRootPath(e,MICROSANDBOX_CACHE_DIRECTORY_NAME,t)}async function readMicrosandboxTemplateDirectories(n){let i;try{i=await readdir(n,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return[];throw e}return(await Promise.all(i.filter(e=>e.isDirectory()).map(async t=>{let i=join(n,t.name);return{isTemporary:t.name.endsWith(`.tmp`),metadata:await readTemplateMetadata(resolveMicrosandboxMetadataPath(i)),mtimeMs:(await stat(i)).mtimeMs,path:i}}))).sort((e,t)=>t.mtimeMs-e.mtimeMs)}async function removeTemplateDirectory(e,t,r){if(await rm(t,{force:!0,recursive:!0}),r===null)return;let i=await loadMicrosandboxWithoutInstall(e);i!==null&&await removeSnapshotIfExists(i,r.snapshotName)}export{pruneMicrosandboxTemplates,resolveMicrosandboxSessionRootPath,resolveMicrosandboxTemplateRootPath,resolveMicrosandboxTemplatesDirectory};
1
+ import{readdir,rm,stat}from"node:fs/promises";import"node:fs";import{join}from"node:path";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";import{resolveLocalBackendSessionRootPath,resolveLocalBackendTemplateRootPath,resolveLocalBackendTemplatesDirectory}from"#execution/sandbox/bindings/local-backend-utils.js";import{LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT}from"#execution/sandbox/bindings/local-template-prune.js";import{readTemplateMetadata,resolveMicrosandboxMetadataPath}from"#execution/sandbox/bindings/microsandbox-metadata.js";import{loadMicrosandboxWithoutInstall,removeSnapshotIfExists}from"#execution/sandbox/bindings/microsandbox-runtime.js";const MICROSANDBOX_CACHE_DIRECTORY_NAME=`microsandbox`;async function pruneMicrosandboxTemplates(e){let t=resolveMicrosandboxTemplatesDirectory(resolveSandboxCacheDirectory(e.appRoot)),n=e.now??Date.now(),r=e.recentWindowMs??LOCAL_SANDBOX_TEMPLATE_RECENT_WINDOW_MS,a=e.retainCount??LOCAL_SANDBOX_TEMPLATE_RETAIN_COUNT,o=await readMicrosandboxTemplateDirectories(t),s=o.filter(e=>!e.isTemporary);await Promise.all([...s.map(async(t,i)=>{i<a||n-t.mtimeMs<=r||await removeTemplateDirectory(e.appRoot,t.path,t.metadata)}),...o.filter(e=>e.isTemporary).map(async t=>{n-t.mtimeMs<=r||await removeTemplateDirectory(e.appRoot,t.path,t.metadata)})])}function resolveMicrosandboxTemplateRootPath(e,t){return resolveLocalBackendTemplateRootPath(e,MICROSANDBOX_CACHE_DIRECTORY_NAME,t)}function resolveMicrosandboxTemplatesDirectory(e){return resolveLocalBackendTemplatesDirectory(e,MICROSANDBOX_CACHE_DIRECTORY_NAME)}function resolveMicrosandboxSessionRootPath(e,t){return resolveLocalBackendSessionRootPath(e,MICROSANDBOX_CACHE_DIRECTORY_NAME,t)}async function readMicrosandboxTemplateDirectories(t){let i;try{i=await readdir(t,{withFileTypes:!0})}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return[];throw e}return(await Promise.all(i.filter(e=>e.isDirectory()).map(async e=>{let i=join(t,e.name);return{isTemporary:e.name.endsWith(`.tmp`),metadata:await readTemplateMetadata(resolveMicrosandboxMetadataPath(i)),mtimeMs:(await stat(i)).mtimeMs,path:i}}))).sort((e,t)=>t.mtimeMs-e.mtimeMs)}async function removeTemplateDirectory(e,n,r){if(await rm(n,{force:!0,recursive:!0}),r===null)return;let i=await loadMicrosandboxWithoutInstall(e);i!==null&&await removeSnapshotIfExists(i,r.snapshotName)}export{pruneMicrosandboxTemplates,resolveMicrosandboxSessionRootPath,resolveMicrosandboxTemplateRootPath,resolveMicrosandboxTemplatesDirectory};
@@ -1 +1 @@
1
- import{EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG,EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}from"#execution/sandbox/development-run.js";import{toErrorMessage}from"#shared/errors.js";import{randomUUID}from"node:crypto";import{DockerUnavailableError,createDockerCli}from"#execution/sandbox/bindings/docker-cli.js";import{DOCKER_SANDBOX_LABEL,stopDockerContainerIfRunning}from"#execution/sandbox/bindings/docker-container.js";import{MICROSANDBOX_METADATA_VERSION,readSessionMetadata,writeSessionMetadata}from"#execution/sandbox/bindings/microsandbox-metadata.js";import{createProviderName,loadMicrosandboxWithoutInstall,removeSnapshotIfExists,stopAndSnapshotMicrosandboxSandbox}from"#execution/sandbox/bindings/microsandbox-runtime.js";async function stopDevelopmentSandboxResources(e){let t=await Promise.allSettled([stopDevelopmentDockerResources(e.devRunId),stopDevelopmentMicrosandboxResources(e.appRoot,e.devRunId,e.log)]);for(let r of t)r.status===`rejected`&&e.log?.(`failed to stop development sandbox resources: ${toErrorMessage(r.reason)}`)}async function stopDevelopmentDockerResources(e){let n=createDockerCli(),r=[`label=${DOCKER_SANDBOX_LABEL}=1`,`label=${DOCKER_SANDBOX_LABEL}.tag.${EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}=${e}`],c;try{c=await n.run([`ps`,`-q`,...r.flatMap(e=>[`--filter`,e])])}catch(e){if(e instanceof DockerUnavailableError)return;throw e}if(c.exitCode!==0)return;let l=c.stdout.trim().split(/\s+/u).filter(Boolean);await Promise.all(l.map(e=>stopDockerContainerIfRunning(n,e)))}async function stopDevelopmentMicrosandboxResources(n,i,a){let o=await loadMicrosandboxWithoutInstall(n);if(o===null)return;let s=await o.Sandbox.listWith({labels:{"eve.backend":`microsandbox`,[EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG]:i}});await Promise.all(s.filter(e=>e.status===`running`||e.status===`draining`).map(async t=>{let n=getMicrosandboxLabel(t.configJson,EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG);if(n===void 0){await(await o.Sandbox.get(t.name)).stopWithTimeout(1e4).catch(()=>{});return}let i=await readSessionMetadata(n);if(i===null||i.sandboxName!==t.name){await(await o.Sandbox.get(t.name)).stopWithTimeout(1e4).catch(()=>{});return}a?.(`snapshotting development microsandbox session "${t.name}" before shutdown`);let s=i.stateSnapshotName,u=createProviderName(`eve-sbx-state`,`${i.sandboxName}:${randomUUID()}`);await stopAndSnapshotMicrosandboxSandbox(o,t.name,u),await writeSessionMetadata(n,{networkPolicy:i.networkPolicy,optionsHash:i.optionsHash,sandboxName:i.sandboxName,stateSnapshotName:u,version:MICROSANDBOX_METADATA_VERSION}),s!==void 0&&await removeSnapshotIfExists(o,s)}))}function getMicrosandboxLabel(e,t){let n;try{n=JSON.parse(e)}catch{return}return findLabel(n,t)}function findLabel(e,t){if(!isRecord(e))return;let n=e[t];if(typeof n==`string`)return n;let r=e.labels;if(isRecord(r)&&typeof r[t]==`string`)return r[t];if(typeof e.labelsJson==`string`){let n=parseJsonRecord(e.labelsJson);if(n!==null&&typeof n[t]==`string`)return n[t]}for(let n of Object.values(e)){let e=findLabel(n,t);if(e!==void 0)return e}}function parseJsonRecord(e){try{let t=JSON.parse(e);return isRecord(t)?t:null}catch{return null}}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{stopDevelopmentSandboxResources};
1
+ import{randomUUID}from"node:crypto";import{EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG,EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}from"#execution/sandbox/development-run.js";import{toErrorMessage}from"#shared/errors.js";import{DockerUnavailableError,createDockerCli}from"#execution/sandbox/bindings/docker-cli.js";import{DOCKER_SANDBOX_LABEL,stopDockerContainerIfRunning}from"#execution/sandbox/bindings/docker-container.js";import{MICROSANDBOX_METADATA_VERSION,readSessionMetadata,writeSessionMetadata}from"#execution/sandbox/bindings/microsandbox-metadata.js";import{createProviderName,loadMicrosandboxWithoutInstall,removeSnapshotIfExists,stopAndSnapshotMicrosandboxSandbox}from"#execution/sandbox/bindings/microsandbox-runtime.js";async function stopDevelopmentSandboxResources(e){let t=await Promise.allSettled([stopDevelopmentDockerResources(e.devRunId),stopDevelopmentMicrosandboxResources(e.appRoot,e.devRunId,e.log)]);for(let n of t)n.status===`rejected`&&e.log?.(`failed to stop development sandbox resources: ${toErrorMessage(n.reason)}`)}async function stopDevelopmentDockerResources(e){let t=createDockerCli(),r=[`label=${DOCKER_SANDBOX_LABEL}=1`,`label=${DOCKER_SANDBOX_LABEL}.tag.${EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG}=${e}`],c;try{c=await t.run([`ps`,`-q`,...r.flatMap(e=>[`--filter`,e])])}catch(e){if(e instanceof DockerUnavailableError)return;throw e}if(c.exitCode!==0)return;let l=c.stdout.trim().split(/\s+/u).filter(Boolean);await Promise.all(l.map(e=>stopDockerContainerIfRunning(t,e)))}async function stopDevelopmentMicrosandboxResources(r,i,a){let o=await loadMicrosandboxWithoutInstall(r);if(o===null)return;let s=await o.Sandbox.listWith({labels:{"eve.backend":`microsandbox`,[EVE_DEVELOPMENT_SANDBOX_RUN_ID_TAG]:i}});await Promise.all(s.filter(e=>e.status===`running`||e.status===`draining`).map(async n=>{let r=getMicrosandboxLabel(n.configJson,EVE_DEVELOPMENT_SANDBOX_METADATA_PATH_TAG);if(r===void 0){await(await o.Sandbox.get(n.name)).stopWithTimeout(1e4).catch(()=>{});return}let i=await readSessionMetadata(r);if(i===null||i.sandboxName!==n.name){await(await o.Sandbox.get(n.name)).stopWithTimeout(1e4).catch(()=>{});return}a?.(`snapshotting development microsandbox session "${n.name}" before shutdown`);let s=i.stateSnapshotName,u=createProviderName(`eve-sbx-state`,`${i.sandboxName}:${randomUUID()}`);await stopAndSnapshotMicrosandboxSandbox(o,n.name,u),await writeSessionMetadata(r,{networkPolicy:i.networkPolicy,optionsHash:i.optionsHash,sandboxName:i.sandboxName,stateSnapshotName:u,version:MICROSANDBOX_METADATA_VERSION}),s!==void 0&&await removeSnapshotIfExists(o,s)}))}function getMicrosandboxLabel(e,t){let n;try{n=JSON.parse(e)}catch{return}return findLabel(n,t)}function findLabel(e,t){if(!isRecord(e))return;let n=e[t];if(typeof n==`string`)return n;let r=e.labels;if(isRecord(r)&&typeof r[t]==`string`)return r[t];if(typeof e.labelsJson==`string`){let n=parseJsonRecord(e.labelsJson);if(n!==null&&typeof n[t]==`string`)return n[t]}for(let n of Object.values(e)){let e=findLabel(n,t);if(e!==void 0)return e}}function parseJsonRecord(e){try{let t=JSON.parse(e);return isRecord(t)?t:null}catch{return null}}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{stopDevelopmentSandboxResources};
@@ -1,3 +1,3 @@
1
- import{normalizeModelPath}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES}from"#execution/sandbox/truncate-output.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{validateAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";import{ripgrepIsAvailable}from"#execution/sandbox/ripgrep-probe.js";async function executeGlobOnSandbox(n,a){let o=a.path??`/workspace`;validateAbsoluteFilePath(o);let s=normalizeModelPath(o),c=Math.min(Math.max(1,a.limit??100),1e3),l=await ripgrepIsAvailable(n)?buildRipgrepCommand({normalizedPath:s,pattern:a.pattern}):buildPosixFindCommand({normalizedPath:s,pattern:a.pattern}),u=await n.run({command:l});if(u.exitCode!==0&&u.exitCode!==1)throw buildGlobExecutionError(l,u.exitCode,u.stderr);let d=u.stdout.split(`
2
- `).filter(e=>e.length>0),f=d.length>c,p=f?d.slice(0,c):d,m=[],h=0,g=!1;for(let n of p){let r=normalizeModelPath(n),i=Buffer.byteLength(r,`utf8`)+1;if(h+i>MAX_OUTPUT_BYTES&&m.length>0){g=!0;break}m.push(r),h+=i}if(m.length===0)return{content:`No files found`,count:0,path:s,truncated:!1};let _=f||g,v=[...m];return _&&(v.push(``),v.push(`(Results truncated: showing first ${m.length} results out of more. Use a more specific path or pattern to narrow results.)`)),{content:v.join(`
3
- `),count:m.length,path:s,truncated:_}}function buildRipgrepCommand(e){return[`rg --files --hidden`,`--glob '!.git/*'`,`--glob ${shellQuote(e.pattern)}`,`-- ${shellQuote(e.normalizedPath)}`].join(` `)}function buildPosixFindCommand(e){let t=translateGlobToFindPattern(e.pattern),r=t.includes(`/`)?`-path ${shellQuote(`*/${t}`)}`:`-name ${shellQuote(t)}`;return[`find ${shellQuote(e.normalizedPath)}`,`-type f`,`-not -path '*/.git/*'`,r].join(` `)}function translateGlobToFindPattern(e){let t=e.replaceAll(`**`,`*`);for(;t.startsWith(`*/`);)t=t.slice(2);return t}function buildGlobExecutionError(e,t,n){let r=n.trim(),i=r.length>0?r:`no stderr output`;return Error(`glob failed (exit ${t}): ${i}\nCommand: ${e}`)}export{executeGlobOnSandbox};
1
+ import{normalizeModelPath}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES}from"#execution/sandbox/truncate-output.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{resolveAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";import{ripgrepIsAvailable}from"#execution/sandbox/ripgrep-probe.js";async function executeGlobOnSandbox(n,a){let o=normalizeModelPath(await resolveAbsoluteFilePath(n,a.path??`/workspace`)),s=Math.min(Math.max(1,a.limit??100),1e3),c=await ripgrepIsAvailable(n)?buildRipgrepCommand({normalizedPath:o,pattern:a.pattern}):buildPosixFindCommand({normalizedPath:o,pattern:a.pattern}),l=await n.run({command:c});if(l.exitCode!==0&&l.exitCode!==1)throw buildGlobExecutionError(c,l.exitCode,l.stderr);let u=l.stdout.split(`
2
+ `).filter(e=>e.length>0),d=u.length>s,f=d?u.slice(0,s):u,p=[],m=0,h=!1;for(let n of f){let r=normalizeModelPath(n),i=Buffer.byteLength(r,`utf8`)+1;if(m+i>MAX_OUTPUT_BYTES&&p.length>0){h=!0;break}p.push(r),m+=i}if(p.length===0)return{content:`No files found`,count:0,path:o,truncated:!1};let g=d||h,_=[...p];return g&&(_.push(``),_.push(`(Results truncated: showing first ${p.length} results out of more. Use a more specific path or pattern to narrow results.)`)),{content:_.join(`
3
+ `),count:p.length,path:o,truncated:g}}function buildRipgrepCommand(e){return[`rg --files --hidden`,`--glob '!.git/*'`,`--glob ${shellQuote(e.pattern)}`,`-- ${shellQuote(e.normalizedPath)}`].join(` `)}function buildPosixFindCommand(e){let t=translateGlobToFindPattern(e.pattern),r=t.includes(`/`)?`-path ${shellQuote(`*/${t}`)}`:`-name ${shellQuote(t)}`;return[`find ${shellQuote(e.normalizedPath)}`,`-type f`,`-not -path '*/.git/*'`,r].join(` `)}function translateGlobToFindPattern(e){let t=e.replaceAll(`**`,`*`);for(;t.startsWith(`*/`);)t=t.slice(2);return t}function buildGlobExecutionError(e,t,n){let r=n.trim(),i=r.length>0?r:`no stderr output`;return Error(`glob failed (exit ${t}): ${i}\nCommand: ${e}`)}export{executeGlobOnSandbox};
@@ -1,3 +1,3 @@
1
- import{normalizeModelPath}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES,capLineLength}from"#execution/sandbox/truncate-output.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{validateAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";import{ripgrepIsAvailable}from"#execution/sandbox/ripgrep-probe.js";async function executeGrepOnSandbox(t,n){let r=n.path??`/workspace`;validateAbsoluteFilePath(r);let o=normalizeModelPath(r),s=Math.min(Math.max(1,n.limit??100),1e3),c=n.context!==void 0&&n.context>0?n.context:0,l=await ripgrepIsAvailable(t)?buildRipgrepCommand({contextLines:c,effectiveLimit:s,glob:n.glob,ignoreCase:n.ignoreCase??!1,literal:n.literal??!1,normalizedPath:o,pattern:n.pattern}):buildPosixGrepCommand({contextLines:c,effectiveLimit:s,glob:n.glob,ignoreCase:n.ignoreCase??!1,literal:n.literal??!1,normalizedPath:o,pattern:n.pattern}),u=await t.run({command:l});if(u.exitCode!==0&&u.exitCode!==1)throw buildGrepExecutionError(l,u.exitCode,u.stderr);let d=u.stdout;return d.trim().length===0?{content:`No matches found`,matchCount:0,path:o,truncated:!1}:processOutput({effectiveLimit:s,normalizedPath:o,stdout:d})}function buildRipgrepCommand(e){let t=[`rg`,`--line-number`,`--color=never`,`--hidden`,`--glob '!.git/*'`];return e.ignoreCase&&t.push(`--ignore-case`),e.literal&&t.push(`--fixed-strings`),e.glob!==void 0&&t.push(`--glob ${shellQuote(e.glob)}`),e.contextLines>0&&t.push(`--context ${e.contextLines}`),t.push(`--max-count ${e.effectiveLimit}`),t.push(`--`),t.push(shellQuote(e.pattern)),t.push(shellQuote(e.normalizedPath)),t.join(` `)}function buildPosixGrepCommand(e){let t=[`grep`,`-r`,`-n`,`--color=never`,`--exclude-dir=.git`];return e.ignoreCase&&t.push(`-i`),e.literal?t.push(`-F`):t.push(`-E`),e.glob!==void 0&&t.push(`--include=${shellQuote(e.glob)}`),e.contextLines>0&&t.push(`-C ${e.contextLines}`),t.push(`-m ${e.effectiveLimit}`),t.push(`--`),t.push(shellQuote(e.pattern)),t.push(shellQuote(e.normalizedPath)),t.join(` `)}function processOutput(e){let r=e.stdout.split(`
1
+ import{normalizeModelPath}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES,capLineLength}from"#execution/sandbox/truncate-output.js";import{shellQuote}from"#execution/sandbox/shell-quote.js";import{resolveAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";import{ripgrepIsAvailable}from"#execution/sandbox/ripgrep-probe.js";async function executeGrepOnSandbox(t,n){let r=normalizeModelPath(await resolveAbsoluteFilePath(t,n.path??`/workspace`)),o=Math.min(Math.max(1,n.limit??100),1e3),s=n.context!==void 0&&n.context>0?n.context:0,c=await ripgrepIsAvailable(t)?buildRipgrepCommand({contextLines:s,effectiveLimit:o,glob:n.glob,ignoreCase:n.ignoreCase??!1,literal:n.literal??!1,normalizedPath:r,pattern:n.pattern}):buildPosixGrepCommand({contextLines:s,effectiveLimit:o,glob:n.glob,ignoreCase:n.ignoreCase??!1,literal:n.literal??!1,normalizedPath:r,pattern:n.pattern}),l=await t.run({command:c});if(l.exitCode!==0&&l.exitCode!==1)throw buildGrepExecutionError(c,l.exitCode,l.stderr);let u=l.stdout;return u.trim().length===0?{content:`No matches found`,matchCount:0,path:r,truncated:!1}:processOutput({effectiveLimit:o,normalizedPath:r,stdout:u})}function buildRipgrepCommand(e){let t=[`rg`,`--line-number`,`--color=never`,`--hidden`,`--glob '!.git/*'`];return e.ignoreCase&&t.push(`--ignore-case`),e.literal&&t.push(`--fixed-strings`),e.glob!==void 0&&t.push(`--glob ${shellQuote(e.glob)}`),e.contextLines>0&&t.push(`--context ${e.contextLines}`),t.push(`--max-count ${e.effectiveLimit}`),t.push(`--`),t.push(shellQuote(e.pattern)),t.push(shellQuote(e.normalizedPath)),t.join(` `)}function buildPosixGrepCommand(e){let t=[`grep`,`-r`,`-n`,`--color=never`,`--exclude-dir=.git`];return e.ignoreCase&&t.push(`-i`),e.literal?t.push(`-F`):t.push(`-E`),e.glob!==void 0&&t.push(`--include=${shellQuote(e.glob)}`),e.contextLines>0&&t.push(`-C ${e.contextLines}`),t.push(`-m ${e.effectiveLimit}`),t.push(`--`),t.push(shellQuote(e.pattern)),t.push(shellQuote(e.normalizedPath)),t.join(` `)}function processOutput(e){let r=e.stdout.split(`
2
2
  `),i=[],a=0,o=0,s=!1;for(let e=0;e<r.length;e+=1){let c=r[e]??``;if(c.length===0&&e===r.length-1)continue;c!==`--`&&c.length>0&&/^.+:\d+:/.test(c)&&o++;let l=capLineLength(c),u=Buffer.byteLength(l,`utf8`)+1;if(a+u>MAX_OUTPUT_BYTES&&i.length>0){s=!0;break}i.push(l),a+=u}let c=s||o>=e.effectiveLimit,l=i.join(`
3
3
  `);if(c){let t=[];o>=e.effectiveLimit&&t.push(`Match limit reached (${e.effectiveLimit}). Use a larger limit or more specific pattern.`),s&&t.push(`Output truncated due to size. Use a more specific path or pattern.`),l+=`\n\n[${t.join(` `)}]`}return{content:l,matchCount:o,path:e.normalizedPath,truncated:c}}function buildGrepExecutionError(e,t,n){let r=n.trim(),i=r.length>0?r:`no stderr output`;return Error(`grep failed (exit ${t}): ${i}\nCommand: ${e}`)}export{executeGrepOnSandbox};
@@ -1,3 +1,3 @@
1
- import{loadContext}from"#context/container.js";import{buildReadFileTargetKey,createReadFileStamp,normalizeModelPath,setReadFileStamp}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES,capLineLength}from"#execution/sandbox/truncate-output.js";import{validateAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";async function executeReadFileOnSandbox(r,i){let{filePath:a,offset:o,limit:s}=i;validateAbsoluteFilePath(a);let c=normalizeModelPath(a),l=o??1,u=s??2e3;if(l<1)throw Error(`offset must be >= 1. Received: ${l}.`);let d=await r.readTextFile({path:a});if(d===null)throw Error(`File not found: ${a}. Verify the path exists and is accessible in the sandbox.`);if(d.includes(`\0`))throw Error(`File "${a}" contains NUL bytes and appears to be a binary file. read_file only supports text files.`);let f=d.split(`
2
- `),p=f.length>0&&f[f.length-1]===``?f.length-1:f.length;if(p===0){if(l>1)throw Error(`offset ${l} is past the end of the file (0 lines). Use the default offset to read an empty file.`)}else if(l>p)throw Error(`offset ${l} is past the end of the file (${p} lines).`);let m=createReadFileStamp({content:d,filePath:c}),h=buildReadFileTargetKey(c);if(setReadFileStamp(loadContext(),h,m),p===0)return{content:``,path:c,totalLines:0,truncated:!1};let g=l-1,_=Math.min(g+u,p),v=f.slice(g,_),y=[],b=0,x=!1;for(let e=0;e<v.length;e++){let t=`${l+e}: ${capLineLength(v[e]??``)}`,n=Buffer.byteLength(t,`utf8`)+1;if(b+n>MAX_OUTPUT_BYTES&&y.length>0){x=!0;break}y.push(t),b+=n}let S=y.join(`
3
- `),C=l+y.length-1;return C<p||x?{content:S,nextOffset:C+1,path:c,totalLines:p,truncated:!0}:{content:S,path:c,totalLines:p,truncated:!1}}export{executeReadFileOnSandbox};
1
+ import{loadContext}from"#context/container.js";import{buildReadFileTargetKey,createReadFileStamp,normalizeModelPath,setReadFileStamp}from"#runtime/framework-tools/file-state.js";import{MAX_OUTPUT_BYTES,capLineLength}from"#execution/sandbox/truncate-output.js";import{resolveAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";async function executeReadFileOnSandbox(r,i){let{filePath:a,offset:o,limit:s}=i,c=await resolveAbsoluteFilePath(r,a),l=normalizeModelPath(c),u=o??1,d=s??2e3;if(u<1)throw Error(`offset must be >= 1. Received: ${u}.`);let f=await r.readTextFile({path:c});if(f===null)throw Error(`File not found: ${a}. Verify the path exists and is accessible in the sandbox.`);if(f.includes(`\0`))throw Error(`File "${a}" contains NUL bytes and appears to be a binary file. read_file only supports text files.`);let p=f.split(`
2
+ `),m=p.length>0&&p[p.length-1]===``?p.length-1:p.length;if(m===0){if(u>1)throw Error(`offset ${u} is past the end of the file (0 lines). Use the default offset to read an empty file.`)}else if(u>m)throw Error(`offset ${u} is past the end of the file (${m} lines).`);let h=createReadFileStamp({content:f,filePath:l}),g=buildReadFileTargetKey(l);if(setReadFileStamp(loadContext(),g,h),m===0)return{content:``,path:l,totalLines:0,truncated:!1};let _=u-1,v=Math.min(_+d,m),y=p.slice(_,v),b=[],x=0,S=!1;for(let e=0;e<y.length;e++){let t=`${u+e}: ${capLineLength(y[e]??``)}`,n=Buffer.byteLength(t,`utf8`)+1;if(x+n>MAX_OUTPUT_BYTES&&b.length>0){S=!0;break}b.push(t),x+=n}let C=b.join(`
3
+ `),w=u+b.length-1;return w<m||S?{content:C,nextOffset:w+1,path:l,totalLines:m,truncated:!0}:{content:C,path:l,totalLines:m,truncated:!1}}export{executeReadFileOnSandbox};
@@ -11,7 +11,7 @@ import type { SandboxSession } from "#public/definitions/sandbox.js";
11
11
  */
12
12
  export declare function requireSandboxSession(abortSignal?: AbortSignal): Promise<SandboxSession>;
13
13
  /**
14
- * Validates that a model-supplied file path is absolute. Throws a
15
- * descriptive error when the path does not start with `/`.
14
+ * Resolves a model-supplied `$HOME` prefix and validates that the resulting
15
+ * sandbox file path is absolute.
16
16
  */
17
- export declare function validateAbsoluteFilePath(filePath: string): void;
17
+ export declare function resolveAbsoluteFilePath(sandbox: SandboxSession, filePath: string): Promise<string>;
@@ -1 +1 @@
1
- import{SandboxKey}from"#context/keys.js";import{loadContext}from"#context/container.js";import{bindSandboxAbortSignal}from"#execution/sandbox/abort-bound-session.js";async function requireSandboxSession(t){let n=loadContext().get(SandboxKey);if(n===void 0)throw Error(`This tool requires sandbox access on the runtime context. Ensure the step is running inside a managed runtime context with sandbox support.`);let r=await n.get();if(r===null)throw Error(`The sandbox is not available in the current runtime context.`);return t===void 0?r:bindSandboxAbortSignal(r,t)}function validateAbsoluteFilePath(e){if(!e.startsWith(`/`))throw Error(`filePath must be an absolute path. Received: "${e}". Use an absolute path such as /workspace/foo.ts.`)}export{requireSandboxSession,validateAbsoluteFilePath};
1
+ import{SandboxKey}from"#context/keys.js";import{loadContext}from"#context/container.js";import{bindSandboxAbortSignal}from"#execution/sandbox/abort-bound-session.js";import{resolveSandboxModelPath}from"#shared/skill-paths.js";async function requireSandboxSession(r){let i=loadContext().get(SandboxKey);if(i===void 0)throw Error(`This tool requires sandbox access on the runtime context. Ensure the step is running inside a managed runtime context with sandbox support.`);let a=await i.get();if(a===null)throw Error(`The sandbox is not available in the current runtime context.`);return r===void 0?a:bindSandboxAbortSignal(a,r)}async function resolveAbsoluteFilePath(e,t){let n=await resolveSandboxModelPath({path:t,sandbox:e});if(!n.startsWith(`/`))throw Error(`filePath must be an absolute path. Received: "${t}". Use an absolute path such as /workspace/foo.ts or a path beginning with \$HOME/.`);return n}export{requireSandboxSession,resolveAbsoluteFilePath};
@@ -1 +1 @@
1
- import{dirname,join}from"node:path";import{mkdir,rm,stat,writeFile}from"node:fs/promises";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";const LOCK_TIMEOUT_MS=900*1e3;async function waitForSandboxTemplatePrewarmLock(e){await waitForLockRelease(resolveSandboxTemplatePrewarmLockPath(e),e.log)}async function withSandboxTemplatePrewarmLock(e,t){let n=resolveSandboxTemplatePrewarmLockPath(e);await acquireLock(n);try{return await t()}finally{await rm(n,{force:!0,recursive:!0}).catch(()=>{})}}function resolveSandboxTemplatePrewarmLockPath(e){return join(resolveSandboxCacheDirectory(e.appRoot),`template-locks`,e.backendName,`${e.templateKey}.lock`)}async function acquireLock(r){let i=Date.now();for(;;){await mkdir(dirname(r),{recursive:!0});try{await mkdir(r),await writeFile(join(r,`owner.json`),`${JSON.stringify({createdAt:new Date().toISOString(),pid:process.pid})}\n`);return}catch(e){if(!isFileExistsError(e))throw e;await waitForExistingLock(r,i,void 0)}}}async function waitForLockRelease(e,t){let n=Date.now(),r=n+1e4;for(;;){try{await stat(e)}catch(e){if(isNotFoundError(e))return;throw e}let a=Date.now();if(t!==void 0&&a>=r){let e=Math.round((a-n)/1e3);t(e===0?`waiting for sandbox template prewarm to finish`:`waiting for sandbox template prewarm to finish (${e}s elapsed)`),r=a+1e4}await waitForExistingLock(e,n,t)}}async function waitForExistingLock(e,t,n){let a=await stat(e).catch(e=>{if(isNotFoundError(e))return null;throw e});if(a!==null){if(Date.now()-a.mtimeMs>18e5){n?.(`removing stale sandbox template prewarm lock`),await rm(e,{force:!0,recursive:!0}).catch(()=>{});return}if(Date.now()-t>LOCK_TIMEOUT_MS)throw Error(`Timed out waiting for sandbox template prewarm lock "${e}" after ${LOCK_TIMEOUT_MS}ms.`);await new Promise(e=>setTimeout(e,250))}}function isFileExistsError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`EEXIST`}function isNotFoundError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}export{waitForSandboxTemplatePrewarmLock,withSandboxTemplatePrewarmLock};
1
+ import{mkdir,rm,stat,writeFile}from"node:fs/promises";import{dirname,join}from"node:path";import{resolveSandboxCacheDirectory}from"#internal/application/paths.js";const LOCK_TIMEOUT_MS=900*1e3;async function waitForSandboxTemplatePrewarmLock(e){await waitForLockRelease(resolveSandboxTemplatePrewarmLockPath(e),e.log)}async function withSandboxTemplatePrewarmLock(e,n){let r=resolveSandboxTemplatePrewarmLockPath(e);await acquireLock(r);try{return await n()}finally{await rm(r,{force:!0,recursive:!0}).catch(()=>{})}}function resolveSandboxTemplatePrewarmLockPath(e){return join(resolveSandboxCacheDirectory(e.appRoot),`template-locks`,e.backendName,`${e.templateKey}.lock`)}async function acquireLock(t){let n=Date.now();for(;;){await mkdir(dirname(t),{recursive:!0});try{await mkdir(t),await writeFile(join(t,`owner.json`),`${JSON.stringify({createdAt:new Date().toISOString(),pid:process.pid})}\n`);return}catch(e){if(!isFileExistsError(e))throw e;await waitForExistingLock(t,n,void 0)}}}async function waitForLockRelease(e,t){let r=Date.now(),i=r+1e4;for(;;){try{await stat(e)}catch(e){if(isNotFoundError(e))return;throw e}let a=Date.now();if(t!==void 0&&a>=i){let e=Math.round((a-r)/1e3);t(e===0?`waiting for sandbox template prewarm to finish`:`waiting for sandbox template prewarm to finish (${e}s elapsed)`),i=a+1e4}await waitForExistingLock(e,r,t)}}async function waitForExistingLock(e,r,i){let a=await stat(e).catch(e=>{if(isNotFoundError(e))return null;throw e});if(a!==null){if(Date.now()-a.mtimeMs>18e5){i?.(`removing stale sandbox template prewarm lock`),await rm(e,{force:!0,recursive:!0}).catch(()=>{});return}if(Date.now()-r>LOCK_TIMEOUT_MS)throw Error(`Timed out waiting for sandbox template prewarm lock "${e}" after ${LOCK_TIMEOUT_MS}ms.`);await new Promise(e=>setTimeout(e,250))}}function isFileExistsError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`EEXIST`}function isNotFoundError(e){return typeof e==`object`&&!!e&&`code`in e&&e.code===`ENOENT`}export{waitForSandboxTemplatePrewarmLock,withSandboxTemplatePrewarmLock};
@@ -1 +1 @@
1
- import{loadContext}from"#context/container.js";import{ReadFileStateKey,buildReadFileTargetKey,createReadFileStamp,normalizeModelPath,setReadFileStamp}from"#runtime/framework-tools/file-state.js";import{validateAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";async function executeWriteFileOnSandbox(e,t){let{filePath:n,content:r}=t;validateAbsoluteFilePath(n);let i=loadContext(),a=normalizeModelPath(n),o=buildReadFileTargetKey(a),s=await e.readTextFile({path:n});if(s===null)return await e.writeTextFile({content:r,path:n}),setReadFileStamp(i,o,createReadFileStamp({content:r,filePath:a})),{existed:!1,path:a};let c=i.ensure(ReadFileStateKey,()=>({byTarget:{}})).byTarget[o];if(c===void 0)throw Error(`You must read file ${n} before overwriting it. Use the read_file tool first.`);let l=createReadFileStamp({content:s,filePath:a});if(l.contentHash!==c.contentHash||l.byteLength!==c.byteLength)throw Error(`File ${n} has been modified since it was last read. Please read the file again before modifying it.`);return await e.writeTextFile({content:r,path:n}),setReadFileStamp(i,o,createReadFileStamp({content:r,filePath:a})),{existed:!0,path:a}}export{executeWriteFileOnSandbox};
1
+ import{loadContext}from"#context/container.js";import{ReadFileStateKey,buildReadFileTargetKey,createReadFileStamp,normalizeModelPath,setReadFileStamp}from"#runtime/framework-tools/file-state.js";import{resolveAbsoluteFilePath}from"#execution/sandbox/require-sandbox.js";async function executeWriteFileOnSandbox(e,t){let{filePath:n,content:r}=t,i=await resolveAbsoluteFilePath(e,n),a=loadContext(),o=normalizeModelPath(i),s=buildReadFileTargetKey(o),c=await e.readTextFile({path:i});if(c===null)return await e.writeTextFile({content:r,path:i}),setReadFileStamp(a,s,createReadFileStamp({content:r,filePath:o})),{existed:!1,path:o};let l=a.ensure(ReadFileStateKey,()=>({byTarget:{}})).byTarget[s];if(l===void 0)throw Error(`You must read file ${n} before overwriting it. Use the read_file tool first.`);let u=createReadFileStamp({content:c,filePath:o});if(u.contentHash!==l.contentHash||u.byteLength!==l.byteLength)throw Error(`File ${n} has been modified since it was last read. Please read the file again before modifying it.`);return await e.writeTextFile({content:r,path:i}),setReadFileStamp(a,s,createReadFileStamp({content:r,filePath:o})),{existed:!0,path:o}}export{executeWriteFileOnSandbox};
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Durable state for the subagent adapter, split from the adapter itself so
3
+ * harness code can identify a delegated child run without reaching the
4
+ * adapter's workflow-coupled behavior (`runtime-boundary.test.ts`).
5
+ */
6
+ /**
7
+ * Durable adapter kind used for delegated subagent child runs.
8
+ *
9
+ * Framework-owned — authored channel code never constructs a subagent
10
+ * adapter directly. Emitted by `buildSubagentRunInput`
11
+ * (`execution/subagent-tool.ts`) when a parent dispatches a child
12
+ * subagent.
13
+ */
14
+ export declare const SUBAGENT_ADAPTER_KIND = "subagent";
15
+ /**
16
+ * Durable state carried on a subagent adapter instance.
17
+ *
18
+ * Populated by `buildSubagentRunInput` at dispatch time so the child
19
+ * run retains the parent lineage metadata required to resume its parent
20
+ * when the child finishes and to forward HITL requests up the chain.
21
+ *
22
+ * The parent's turn identifier is not duplicated here — it lives on
23
+ * `RunInput.parent.turn.id` which is the single source of truth for the
24
+ * child's parent-turn lineage.
25
+ */
26
+ export interface SubagentAdapterState extends Record<string, unknown> {
27
+ readonly callId: string;
28
+ readonly parentContinuationToken: string;
29
+ readonly parentSessionId: string;
30
+ readonly subagentName: string;
31
+ }
32
+ /**
33
+ * Narrow runtime guard for {@link SubagentAdapterState}.
34
+ *
35
+ * Framework adapters live through a JSON round-trip at every workflow
36
+ * step boundary, so consumers that want to treat the adapter state as
37
+ * a structured record must validate the shape explicitly.
38
+ */
39
+ export declare function isSubagentAdapterState(value: unknown): value is SubagentAdapterState;
@@ -0,0 +1 @@
1
+ const SUBAGENT_ADAPTER_KIND=`subagent`;function isSubagentAdapterState(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.callId==`string`&&t.callId.length>0&&typeof t.parentContinuationToken==`string`&&t.parentContinuationToken.length>0&&typeof t.parentSessionId==`string`&&typeof t.subagentName==`string`&&t.subagentName.length>0}export{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState};
@@ -1,38 +1,4 @@
1
1
  import type { ChannelAdapter } from "#channel/adapter.js";
2
- /**
3
- * Durable adapter kind used for delegated subagent child runs.
4
- *
5
- * Framework-owned — authored channel code never constructs a subagent
6
- * adapter directly. Emitted by `buildSubagentRunInput`
7
- * (`execution/subagent-tool.ts`) when a parent dispatches a child
8
- * subagent.
9
- */
10
- export declare const SUBAGENT_ADAPTER_KIND = "subagent";
11
- /**
12
- * Durable state carried on a subagent adapter instance.
13
- *
14
- * Populated by `buildSubagentRunInput` at dispatch time so the child
15
- * run retains the parent lineage metadata required to resume its parent
16
- * when the child finishes and to forward HITL requests up the chain.
17
- *
18
- * The parent's turn identifier is not duplicated here — it lives on
19
- * `RunInput.parent.turn.id` which is the single source of truth for the
20
- * child's parent-turn lineage.
21
- */
22
- export interface SubagentAdapterState extends Record<string, unknown> {
23
- readonly callId: string;
24
- readonly parentContinuationToken: string;
25
- readonly parentSessionId: string;
26
- readonly subagentName: string;
27
- }
28
- /**
29
- * Narrow runtime guard for {@link SubagentAdapterState}.
30
- *
31
- * Framework adapters live through a JSON round-trip at every workflow
32
- * step boundary, so consumers that want to treat the adapter state as
33
- * a structured record must validate the shape explicitly.
34
- */
35
- export declare function isSubagentAdapterState(value: unknown): value is SubagentAdapterState;
36
2
  /**
37
3
  * Framework adapter that bridges a child subagent session to its
38
4
  * parent.
@@ -1 +1 @@
1
- import{createErrorId,createLogger}from"#internal/logging.js";import{ContinuationTokenKey,SessionIdKey}from"#context/keys.js";import{resumeHook}from"#internal/workflow/runtime.js";const log=createLogger(`execution.subagent-adapter`),SUBAGENT_ADAPTER_KIND=`subagent`;function isSubagentAdapterState(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.callId==`string`&&t.callId.length>0&&typeof t.parentContinuationToken==`string`&&t.parentContinuationToken.length>0&&typeof t.parentSessionId==`string`&&typeof t.subagentName==`string`&&t.subagentName.length>0}const SUBAGENT_ADAPTER={kind:SUBAGENT_ADAPTER_KIND,async"authorization.required"(e,t){await forwardSubagentAuthorizationEvent({data:e,type:`authorization.required`},t)},async"authorization.completed"(e,t){await forwardSubagentAuthorizationEvent({data:e,type:`authorization.completed`},t)},async"input.requested"(e,t){let i=t.state;isSubagentAdapterState(i)&&await forwardSubagentInputRequestStep({hookPayload:{callId:i.callId,childContinuationToken:t.ctx.require(ContinuationTokenKey),childSessionId:t.ctx.require(SessionIdKey),event:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},kind:`subagent-input-request`,subagentName:i.subagentName},parentContinuationToken:i.parentContinuationToken})}};async function forwardSubagentAuthorizationEvent(e,t){let n=t.state;isSubagentAdapterState(n)&&await forwardSubagentAuthorizationEventStep({hookPayload:{callId:n.callId,childSessionId:t.ctx.require(SessionIdKey),event:e,kind:`subagent-authorization-event`,subagentName:n.subagentName},parentContinuationToken:n.parentContinuationToken})}async function forwardSubagentAuthorizationEventStep(t){"use step";try{await resumeHook(t.parentContinuationToken,t.hookPayload)}catch(n){let r=createErrorId();throw log.warn(`failed to forward subagent authorization event to parent`,{callId:t.hookPayload.callId,childSessionId:t.hookPayload.childSessionId,errorId:r,eventType:t.hookPayload.event.type,parentContinuationToken:t.parentContinuationToken,subagentName:t.hookPayload.subagentName,error:n}),n}}async function forwardSubagentInputRequestStep(t){"use step";try{await resumeHook(t.parentContinuationToken,t.hookPayload)}catch(n){let r=createErrorId();throw log.warn(`failed to forward proxied HITL batch to parent`,{callId:t.hookPayload.callId,childContinuationToken:t.hookPayload.childContinuationToken,childSessionId:t.hookPayload.childSessionId,errorId:r,parentContinuationToken:t.parentContinuationToken,subagentName:t.hookPayload.subagentName,error:n}),n}}export{SUBAGENT_ADAPTER,SUBAGENT_ADAPTER_KIND,isSubagentAdapterState};
1
+ import{createErrorId,createLogger}from"#internal/logging.js";import{ContinuationTokenKey,SessionIdKey}from"#context/keys.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#execution/subagent-adapter-state.js";import{resumeHook}from"#internal/workflow/runtime.js";const log=createLogger(`execution.subagent-adapter`),SUBAGENT_ADAPTER={kind:SUBAGENT_ADAPTER_KIND,async"authorization.required"(e,t){await forwardSubagentAuthorizationEvent({data:e,type:`authorization.required`},t)},async"authorization.completed"(e,t){await forwardSubagentAuthorizationEvent({data:e,type:`authorization.completed`},t)},async"input.requested"(e,t){let i=t.state;isSubagentAdapterState(i)&&await forwardSubagentInputRequestStep({hookPayload:{callId:i.callId,childContinuationToken:t.ctx.require(ContinuationTokenKey),childSessionId:t.ctx.require(SessionIdKey),event:{requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId},kind:`subagent-input-request`,subagentName:i.subagentName},parentContinuationToken:i.parentContinuationToken})}};async function forwardSubagentAuthorizationEvent(e,t){let n=t.state;isSubagentAdapterState(n)&&await forwardSubagentAuthorizationEventStep({hookPayload:{callId:n.callId,childSessionId:t.ctx.require(SessionIdKey),event:e,kind:`subagent-authorization-event`,subagentName:n.subagentName},parentContinuationToken:n.parentContinuationToken})}async function forwardSubagentAuthorizationEventStep(t){"use step";try{await resumeHook(t.parentContinuationToken,t.hookPayload)}catch(n){let r=createErrorId();throw log.warn(`failed to forward subagent authorization event to parent`,{callId:t.hookPayload.callId,childSessionId:t.hookPayload.childSessionId,errorId:r,eventType:t.hookPayload.event.type,parentContinuationToken:t.parentContinuationToken,subagentName:t.hookPayload.subagentName,error:n}),n}}async function forwardSubagentInputRequestStep(t){"use step";try{await resumeHook(t.parentContinuationToken,t.hookPayload)}catch(n){let r=createErrorId();throw log.warn(`failed to forward proxied HITL batch to parent`,{callId:t.hookPayload.callId,childContinuationToken:t.hookPayload.childContinuationToken,childSessionId:t.hookPayload.childSessionId,errorId:r,parentContinuationToken:t.parentContinuationToken,subagentName:t.hookPayload.subagentName,error:n}),n}}export{SUBAGENT_ADAPTER};
@@ -1,4 +1,4 @@
1
- import type { ChannelInstrumentationProjection, RunInput, SessionAuthContext, SessionCapabilities } from "#channel/types.js";
1
+ import type { ChannelInstrumentationProjection, RunInput, SessionAuthContext, SessionCapabilities, SessionTraceContext } from "#channel/types.js";
2
2
  import type { HarnessSession } from "#harness/types.js";
3
3
  import type { RuntimeSubagentCallActionRequest } from "#runtime/actions/types.js";
4
4
  /**
@@ -49,6 +49,7 @@ export declare function buildSubagentRunInput(input: {
49
49
  readonly initiatorAuth: SessionAuthContext | null;
50
50
  /** Hook token owned by the workflow currently waiting for this child. */
51
51
  readonly parentContinuationToken?: string;
52
+ readonly parentTraceContext?: SessionTraceContext;
52
53
  readonly session: HarnessSession;
53
54
  readonly source: SubagentInputSource;
54
55
  }): SubagentRunInputBuild;
@@ -1 +1 @@
1
- import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{resolveRemainingSessionTokenLimits}from"#harness/subagent-token-budget.js";function buildSubagentRunInput(n){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l,source:u}=n,d=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),f=l.rootSessionId??l.sessionId,p=resolveSubagentDepth(l),m=resolveRemainingSessionTokenLimits(l,n.fanoutSize),h=normalizeRequestedOutputSchema(r.input.outputSchema);return{childContinuationToken:d,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:{callId:r.callId,parentContinuationToken:n.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName,...r.subagentName===`agent`&&l.sandboxState?{parentSandboxState:l.sandboxState,sandboxSessionId:l.sessionId}:{}}},auth:i,capabilities:o,channelMetadata:s,continuationToken:d,initiatorAuth:c,input:{message:formatSubagentCallInputMessage({action:r,source:u}),outputSchema:h},limits:m,mode:`task`,parent:{callId:r.callId,rootSessionId:f,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}},subagentDepth:p.nextChildDepth}}}function formatSubagentCallInputMessage(e){let{message:t}=e.action.input;switch(e.source.type){case`local`:return formatSubagentInput({description:e.source.description,message:t,name:e.action.subagentName,type:`local`}).message;case`runtime`:return formatSubagentInput({message:t,name:e.action.subagentName,type:`runtime`}).message;default:return e.source}}export{buildSubagentRunInput};
1
+ import{mintSubagentContinuationToken}from"#execution/session.js";import{SUBAGENT_ADAPTER_KIND}from"#execution/subagent-adapter-state.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{resolveRemainingSessionTokenLimits}from"#harness/subagent-token-budget.js";function buildSubagentRunInput(n){let{action:r,auth:i,batchEvent:a,capabilities:o,channelMetadata:s,initiatorAuth:c,session:l,source:u}=n,d=mintSubagentContinuationToken(`${l.sessionId}:${r.callId}`),f=l.rootSessionId??l.sessionId,p=resolveSubagentDepth(l),m=resolveRemainingSessionTokenLimits(l,n.fanoutSize),h=normalizeRequestedOutputSchema(r.input.outputSchema);return{childContinuationToken:d,runInput:{adapter:{kind:SUBAGENT_ADAPTER_KIND,state:{callId:r.callId,parentContinuationToken:n.parentContinuationToken??l.continuationToken,parentSessionId:l.sessionId,subagentName:r.subagentName,...r.subagentName===`agent`&&l.sandboxState?{parentSandboxState:l.sandboxState,sandboxSessionId:l.sessionId}:{}}},auth:i,capabilities:o,channelMetadata:s,continuationToken:d,initiatorAuth:c,input:{message:formatSubagentCallInputMessage({action:r,source:u}),outputSchema:h},limits:m,mode:`task`,parent:{callId:r.callId,rootSessionId:f,sessionId:l.sessionId,turn:{id:a.turnId,sequence:a.sequence}},parentTraceContext:n.parentTraceContext,subagentDepth:p.nextChildDepth}}}function formatSubagentCallInputMessage(e){let{message:t}=e.action.input;switch(e.source.type){case`local`:return formatSubagentInput({description:e.source.description,message:t,name:e.action.subagentName,type:`local`}).message;case`runtime`:return formatSubagentInput({message:t,name:e.action.subagentName,type:`runtime`}).message;default:return e.source}}export{buildSubagentRunInput};
@@ -1 +1 @@
1
- import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{createWorkflowRuntime,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{preserveSerializedAgentTraceState}from"#harness/agent-trace-context-store.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let d=getPendingAuthorization(s.state),f;if(d&&o.input?.kind===`deliver`){let e=[],t=[],n=[];for(let r of o.input.payloads){let i=r.authorizationCallback;if(i){let n=d.challenges.find(e=>e.name===i.connectionName);n&&(e.push({name:n.name,resume:n.resume,callback:i.callback,hookUrl:n.hookUrl}),t.push({name:n.name,authorization:n.challenge}))}else n.push(r)}e.length>0&&(c.set(PendingAuthorizationResultKey,e),s={...s,state:clearPendingAuthorization(s.state,e.map(e=>e.name))},f=t,o=n.length>0?{...o,input:{...o.input,payloads:n}}:{...o,input:void 0})}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let p=hydrateDurableSession({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},durable:s,turnAgent:u.turnAgent}),m=buildAdapterContext(l,c),h;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,m):defaultDeliverResult(n);r!=null&&e.push(r)}h=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),h={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...m.state}}),o.input?.kind===`deliver`&&h===void 0){let e=reconcileSessionContinuationToken(c,p),t=serializeContext(c),n=e===p?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let g=u.hookRegistry,_=u.resolvedAgent.dynamicInstructionsResolvers??[],v=u.resolvedAgent.dynamicSkillResolvers??[],y=u.resolvedAgent.dynamicToolResolvers??[],b=buildRuntimeIdentity(u.graph.root),x=process.env.VERCEL_DEPLOYMENT_ID?.trim(),S=x?`deployment:${x}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);getHarnessEmissionState(p.state).sessionStarted?await refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:y,event:createSessionStartedEvent({runtime:b}),messages:p.history,runtimeRevision:S}):c.set(SessionDynamicToolRuntimeRevisionKey,S);let C=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,m);setChannelContext(c,{...l,state:{...m.state}});let r=stampMessageStreamEvent(n);return await C.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:g,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:u.turnAgent.dynamicModel,event:n,fallback:u.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicToolEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:v,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:_,event:n,messages:t??[]})},w=c.require(ModeKey),T;try{throwIfTurnAborted(o.abortSignal),T=await runStep(c,p,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:u.turnAgent.outputSchema,input:h,mode:w,session:e});if(f){let e=getHarnessEmissionState(t.state);for(let{name:t,authorization:n}of f)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},session:e,turnAgent:u.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,createRuntime:createWorkflowRuntime,handleEvent,mode:w,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:u.graph.root,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,h)})}catch(e){if(!isTurnCancellation(e))throw e;return C.releaseLock(),{action:`cancelled`,serializedContext:preserveSerializedAgentTraceState(o.serializedContext,serializeContext(c)),sessionState:o.sessionState}}let E=reconcileSessionContinuationToken(c,T.session),D=serializeContext(c);T={...T,session:E};let O=createDurableSessionState({session:T.session}),k=readTurnSleepDurationMs(c),A=k===void 0?{}:{sleepDurationMs:k};if(T.next!==null&&typeof T.next==`object`&&`done`in T.next){await C.close();let e=getTurnUsageState(T.session.state)?.session;return{action:`done`,output:T.next.output,isError:T.next.isError,...A,serializedContext:D,sessionState:O,usage:e===void 0?void 0:toUsage(e)}}if(T.next===null){C.releaseLock();let e=getPendingWorkflowInterrupt(T.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...A,serializedContext:D,sessionState:O}:{action:`park`,...derivePendingState(T.session),...A,serializedContext:D,sessionState:O}}return C.releaseLock(),{action:`continue`,...A,serializedContext:D,sessionState:O}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return n.parentAction??{kind:`continue`,remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
1
+ import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{createWorkflowRuntime,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{getTurnUsageState,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let d=getPendingAuthorization(s.state),f;if(d&&o.input?.kind===`deliver`){let e=[],t=[],n=[];for(let r of o.input.payloads){let i=r.authorizationCallback;if(i){let n=d.challenges.find(e=>e.name===i.connectionName);n&&(e.push({name:n.name,resume:n.resume,callback:i.callback,hookUrl:n.hookUrl}),t.push({name:n.name,authorization:n.challenge}))}else n.push(r)}e.length>0&&(c.set(PendingAuthorizationResultKey,e),s={...s,state:clearPendingAuthorization(s.state,e.map(e=>e.name))},f=t,o=n.length>0?{...o,input:{...o.input,payloads:n}}:{...o,input:void 0})}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let p=hydrateDurableSession({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},durable:s,turnAgent:u.turnAgent}),m=buildAdapterContext(l,c),h;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,m):defaultDeliverResult(n);r!=null&&e.push(r)}h=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),h={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...m.state}}),o.input?.kind===`deliver`&&h===void 0){let e=reconcileSessionContinuationToken(c,p),t=serializeContext(c),n=e===p?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let g=u.hookRegistry,_=u.resolvedAgent.dynamicInstructionsResolvers??[],v=u.resolvedAgent.dynamicSkillResolvers??[],y=u.resolvedAgent.dynamicToolResolvers??[],b=buildRuntimeIdentity(u.graph.root),x=process.env.VERCEL_DEPLOYMENT_ID?.trim(),S=x?`deployment:${x}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);getHarnessEmissionState(p.state).sessionStarted?await refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:y,event:createSessionStartedEvent({runtime:b}),messages:p.history,runtimeRevision:S}):c.set(SessionDynamicToolRuntimeRevisionKey,S);let C=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,m);setChannelContext(c,{...l,state:{...m.state}});let r=stampMessageStreamEvent(n);return await C.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:g,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:u.turnAgent.dynamicModel,event:n,fallback:u.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicToolEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:v,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:_,event:n,messages:t??[]})},w=c.require(ModeKey),T;try{throwIfTurnAborted(o.abortSignal),T=await runStep(c,p,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:u.turnAgent.outputSchema,input:h,mode:w,session:e});if(f){let e=getHarnessEmissionState(t.state);for(let{name:t,authorization:n}of f)await handleEvent(createAuthorizationCompletedEvent({authorization:n,name:t,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:u.resolvedAgent.config.compaction?.thresholdPercent},session:e,turnAgent:u.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,createRuntime:createWorkflowRuntime,handleEvent,mode:w,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:u.graph.root,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,h)})}catch(e){if(!isTurnCancellation(e))throw e;return C.releaseLock(),{action:`cancelled`,serializedContext:preserveSerializedAgentTraceState(o.serializedContext,serializeContext(c)),sessionState:o.sessionState}}let E=reconcileSessionContinuationToken(c,T.session),D=serializeContext(c);T={...T,session:E};let O=createDurableSessionState({session:T.session}),k=readTurnSleepDurationMs(c),A=k===void 0?{}:{sleepDurationMs:k};if(T.next!==null&&typeof T.next==`object`&&`done`in T.next){await C.close();let e=getTurnUsageState(T.session.state)?.session;return{action:`done`,output:T.next.output,isError:T.next.isError,...A,serializedContext:D,sessionState:O,usage:e===void 0?void 0:toUsage(e)}}if(T.next===null){C.releaseLock();let e=getPendingWorkflowInterrupt(T.session.state);return e!==void 0&&isWorkflowRuntimeActionInterrupt(e.interrupt)?{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...A,serializedContext:D,sessionState:O}:{action:`park`,...derivePendingState(T.session),...A,serializedContext:D,sessionState:O}}return C.releaseLock(),{action:`continue`,...A,serializedContext:D,sessionState:O}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,{auth:e.auth,kind:`deliver`,payloads:[t.payload]});return n.parentAction??{kind:`continue`,remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
@@ -1 +1 @@
1
- import{buildSessionHandle}from"#channel/session.js";import{createLogger}from"#internal/logging.js";import{getAdapterKind}from"#channel/adapter.js";import{deserializeUrlFilePart,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{SandboxKey}from"#context/keys.js";import{basename}from"node:path";import{toErrorMessage}from"#shared/errors.js";import{createHash}from"node:crypto";import{loadContext}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{fileDataToBytes}from"#internal/attachments/data.js";import{EveAttachmentError}from"#internal/attachments/errors.js";import{decodeSandboxRef,encodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const ATTACHMENTS_ROOT=`/workspace/attachments`,log=createLogger(`harness.attachment-staging`),UNSAFE_FILENAME_CHARS=/[^\w.-]+/g;async function stageAttachmentsForAdapter(e,t,n){if(typeof e==`string`)return e;let r=reconstitueFilePartUrls(e);return Promise.all(r.map(async e=>e.type===`file`?stageFilePart(e,t,n):e))}async function stageAttachmentsToSandbox(t){if(typeof t==`string`||!Array.isArray(t)||!hasFileParts(t))return t;let n=loadContext(),r=n.get(SandboxKey);if(r===void 0)return t;let i=await r.get();if(i===null)return t;let o=n.get(ChannelKey);return stageAttachmentsForAdapter(t,i,o?buildAdapterContext(o,n):{ctx:n,state:{},session:buildSessionHandle(n)})}async function hydrateSandboxAttachments(e){if(!messagesContainSandboxRef(e))return e;let t=loadContext().get(SandboxKey);if(t===void 0)throw Error(`Cannot hydrate sandbox-ref FilePart: no SandboxKey is bound on the active eve context. Hydration must run inside a step scope with the framework sandbox provider installed.`);let n=await t.get();if(n===null)throw Error(`Cannot hydrate sandbox-ref FilePart: SandboxKey is bound but no active sandbox session is available.`);return Promise.all(e.map(async e=>{if(!messageContainsSandboxRef(e))return e;let t=await hydrateMessageContent(e.content,n);return{...e,content:t}}))}function hasFileParts(e){for(let t of e)if(t.type===`file`)return!0;return!1}function messagesContainSandboxRef(e){for(let t of e)if(messageContainsSandboxRef(t))return!0;return!1}function messageContainsSandboxRef(e){let t=e.content;if(!Array.isArray(t))return!1;for(let e of t)if(isSandboxRefFilePart(e))return!0;return!1}function isSandboxRefFilePart(e){return typeof e==`object`&&!!e&&e.type===`file`&&isSandboxRefUrl(e.data)}async function hydrateMessageContent(e,t){return Array.isArray(e)?Promise.all(e.map(async e=>{if(!isSandboxRefFilePart(e))return e;let n=e,r=decodeSandboxRef(n.data);if(!shouldInlineSandboxRefAsBytes(r))return renderSandboxRefAsTextPart(r);let i=await t.readBinaryFile({path:r.path});return i===null?(log.warn(`sandbox-ref attachment bytes missing on hydration — degrading to text reference`,{mediaType:r.mediaType,path:r.path,size:r.size}),{text:`FileNotFound: Current snapshot may be newer and does not contain ${r.path}.`,type:`text`}):{...n,data:i,mediaType:r.mediaType}})):e}function shouldInlineSandboxRefAsBytes(e){return e.mediaType.startsWith(`image/`)?e.size<=3145728:e.mediaType===`application/pdf`&&e.size<=20971520}function renderSandboxRefAsTextPart(e){return{text:`Attached file ${e.path} (${e.mediaType})`,type:`text`}}async function stageFilePart(e,t,n){if(isSandboxRefUrl(e.data))return e;if(e.data instanceof URL&&e.data.protocol!==`data:`){let r=await tryFetchFile(e.data.href,n);return r===null?e:stageResolvedBytes(e,r,t)}let r=await fileDataToBytes(e.data);return r===null?e:stageResolvedBytes(e,{bytes:r},t)}async function stageResolvedBytes(e,t,n){let r=t.bytes,i=sha256Prefix(r),a=t.mediaType??e.mediaType??`application/octet-stream`,o=safeFilename(t.filename??e.filename,i),s=`${ATTACHMENTS_ROOT}/${i}/${o}`;await n.writeBinaryFile({content:r,path:s});let c=n.resolvePath(s);return{...e,data:encodeSandboxRef({mediaType:a,path:c,size:r.byteLength}),filename:c,mediaType:a}}async function tryFetchFile(e,t){let r=t.ctx.get(ChannelKey);if(r?.fetchFile===void 0)return null;let i=getAdapterKind(r);try{let t=await r.fetchFile(e);return t===null?null:Buffer.isBuffer(t)?{bytes:t}:t}catch(e){throw e instanceof EveAttachmentError?e:new EveAttachmentError({adapterKind:i,cause:e,kind:`resolver-threw`,message:`fetchFile for adapter kind="${i}" threw: ${toErrorMessage(e)}`})}}function reconstitueFilePartUrls(e){let t=!1,n=e.map(e=>e.type===`file`&&isSerializedUrlFilePart(e.data)?(t=!0,{...e,data:deserializeUrlFilePart(e.data)}):e);return t?n:e}function sha256Prefix(e){return createHash(`sha256`).update(e).digest(`hex`).slice(0,16)}function safeFilename(e,t){if(e===void 0)return`file-${t}`;let n=basename(e).replace(UNSAFE_FILENAME_CHARS,`_`);return n.length>0?n:`file-${t}`}export{ATTACHMENTS_ROOT,hydrateSandboxAttachments,stageAttachmentsForAdapter,stageAttachmentsToSandbox};
1
+ import{createHash}from"node:crypto";import{buildSessionHandle}from"#channel/session.js";import{createLogger}from"#internal/logging.js";import{getAdapterKind}from"#channel/adapter.js";import{deserializeUrlFilePart,isSerializedUrlFilePart}from"#internal/attachments/url-refs.js";import{SandboxKey}from"#context/keys.js";import{basename}from"node:path";import{toErrorMessage}from"#shared/errors.js";import{loadContext}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{fileDataToBytes}from"#internal/attachments/data.js";import{EveAttachmentError}from"#internal/attachments/errors.js";import{decodeSandboxRef,encodeSandboxRef,isSandboxRefUrl}from"#internal/attachments/sandbox-refs.js";const ATTACHMENTS_ROOT=`/workspace/attachments`,log=createLogger(`harness.attachment-staging`),UNSAFE_FILENAME_CHARS=/[^\w.-]+/g;async function stageAttachmentsForAdapter(e,t,n){if(typeof e==`string`)return e;let r=reconstitueFilePartUrls(e);return Promise.all(r.map(async e=>e.type===`file`?stageFilePart(e,t,n):e))}async function stageAttachmentsToSandbox(e){if(typeof e==`string`||!Array.isArray(e)||!hasFileParts(e))return e;let n=loadContext(),r=n.get(SandboxKey);if(r===void 0)return e;let i=await r.get();if(i===null)return e;let a=n.get(ChannelKey);return stageAttachmentsForAdapter(e,i,a?buildAdapterContext(a,n):{ctx:n,state:{},session:buildSessionHandle(n)})}async function hydrateSandboxAttachments(e){if(!messagesContainSandboxRef(e))return e;let t=loadContext().get(SandboxKey);if(t===void 0)throw Error(`Cannot hydrate sandbox-ref FilePart: no SandboxKey is bound on the active eve context. Hydration must run inside a step scope with the framework sandbox provider installed.`);let n=await t.get();if(n===null)throw Error(`Cannot hydrate sandbox-ref FilePart: SandboxKey is bound but no active sandbox session is available.`);return Promise.all(e.map(async e=>{if(!messageContainsSandboxRef(e))return e;let t=await hydrateMessageContent(e.content,n);return{...e,content:t}}))}function hasFileParts(e){for(let t of e)if(t.type===`file`)return!0;return!1}function messagesContainSandboxRef(e){for(let t of e)if(messageContainsSandboxRef(t))return!0;return!1}function messageContainsSandboxRef(e){let t=e.content;if(!Array.isArray(t))return!1;for(let e of t)if(isSandboxRefFilePart(e))return!0;return!1}function isSandboxRefFilePart(e){return typeof e==`object`&&!!e&&e.type===`file`&&isSandboxRefUrl(e.data)}async function hydrateMessageContent(e,t){return Array.isArray(e)?Promise.all(e.map(async e=>{if(!isSandboxRefFilePart(e))return e;let n=e,r=decodeSandboxRef(n.data);if(!shouldInlineSandboxRefAsBytes(r))return renderSandboxRefAsTextPart(r);let i=await t.readBinaryFile({path:r.path});return i===null?(log.warn(`sandbox-ref attachment bytes missing on hydration — degrading to text reference`,{mediaType:r.mediaType,path:r.path,size:r.size}),{text:`FileNotFound: Current snapshot may be newer and does not contain ${r.path}.`,type:`text`}):{...n,data:i,mediaType:r.mediaType}})):e}function shouldInlineSandboxRefAsBytes(e){return e.mediaType.startsWith(`image/`)?e.size<=3145728:e.mediaType===`application/pdf`&&e.size<=20971520}function renderSandboxRefAsTextPart(e){return{text:`Attached file ${e.path} (${e.mediaType})`,type:`text`}}async function stageFilePart(e,t,n){if(isSandboxRefUrl(e.data))return e;if(e.data instanceof URL&&e.data.protocol!==`data:`){let r=await tryFetchFile(e.data.href,n);return r===null?e:stageResolvedBytes(e,r,t)}let r=await fileDataToBytes(e.data);return r===null?e:stageResolvedBytes(e,{bytes:r},t)}async function stageResolvedBytes(e,t,n){let r=t.bytes,i=sha256Prefix(r),a=t.mediaType??e.mediaType??`application/octet-stream`,o=safeFilename(t.filename??e.filename,i),s=`${ATTACHMENTS_ROOT}/${i}/${o}`;await n.writeBinaryFile({content:r,path:s});let c=n.resolvePath(s);return{...e,data:encodeSandboxRef({mediaType:a,path:c,size:r.byteLength}),filename:c,mediaType:a}}async function tryFetchFile(e,t){let n=t.ctx.get(ChannelKey);if(n?.fetchFile===void 0)return null;let i=getAdapterKind(n);try{let t=await n.fetchFile(e);return t===null?null:Buffer.isBuffer(t)?{bytes:t}:t}catch(e){throw e instanceof EveAttachmentError?e:new EveAttachmentError({adapterKind:i,cause:e,kind:`resolver-threw`,message:`fetchFile for adapter kind="${i}" threw: ${toErrorMessage(e)}`})}}function reconstitueFilePartUrls(e){let t=!1,n=e.map(e=>e.type===`file`&&isSerializedUrlFilePart(e.data)?(t=!0,{...e,data:deserializeUrlFilePart(e.data)}):e);return t?n:e}function sha256Prefix(t){return createHash(`sha256`).update(t).digest(`hex`).slice(0,16)}function safeFilename(e,t){if(e===void 0)return`file-${t}`;let n=basename(e).replace(UNSAFE_FILENAME_CHARS,`_`);return n.length>0?n:`file-${t}`}export{ATTACHMENTS_ROOT,hydrateSandboxAttachments,stageAttachmentsForAdapter,stageAttachmentsToSandbox};
@@ -20,9 +20,25 @@ export interface InstrumentationSessionStartedEvent {
20
20
  readonly type: "session.started";
21
21
  readonly agentName?: string;
22
22
  readonly channelKind?: string;
23
+ readonly parentTraceContext?: InstrumentationTraceContext;
23
24
  readonly rootSessionId: string;
24
25
  readonly sessionId: string;
25
26
  }
27
+ export interface InstrumentationTraceContext {
28
+ readonly spanId: string;
29
+ readonly traceFlags: number;
30
+ readonly traceId: string;
31
+ }
32
+ /**
33
+ * Which tool call dispatched a subagent child. The trace structure alone
34
+ * cannot say: one turn's children all parent to the same window.
35
+ */
36
+ export interface InstrumentationParentLineage {
37
+ readonly callId: string;
38
+ readonly sessionId: string;
39
+ readonly subagentName?: string;
40
+ readonly turnId: string;
41
+ }
26
42
  export interface InstrumentationSessionTransitionEvent {
27
43
  readonly type: "session.completed" | "session.failed" | "session.waiting";
28
44
  readonly error?: unknown;
@@ -31,6 +47,8 @@ export interface InstrumentationSessionTransitionEvent {
31
47
  }
32
48
  export interface InstrumentationTurnStartedEvent {
33
49
  readonly type: "turn.started";
50
+ readonly parentLineage?: InstrumentationParentLineage;
51
+ readonly parentTraceContext?: InstrumentationTraceContext;
34
52
  readonly rootSessionId: string;
35
53
  readonly sequence: number;
36
54
  readonly sessionId: string;
@@ -1,9 +1,11 @@
1
- import type { InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
1
+ import type { InstrumentationHooks, InstrumentationParentLineage, InstrumentationTraceContext } from "#harness/instrumentation-lifecycle.js";
2
2
  import type { HandleEventFn } from "#harness/types.js";
3
3
  export interface CreateInstrumentationHandleEventInput {
4
4
  readonly agentName?: string;
5
5
  readonly handleEvent?: HandleEventFn;
6
6
  readonly hooks?: InstrumentationHooks;
7
+ readonly parentLineage?: InstrumentationParentLineage;
8
+ readonly parentTraceContext?: InstrumentationTraceContext;
7
9
  readonly rootSessionId?: string;
8
10
  readonly sessionId: string;
9
11
  readonly turnId?: string;
@@ -1 +1 @@
1
- function createInstrumentationHandleEvent(e){if(e.hooks===void 0)return e.handleEvent;if(e.handleEvent===void 0)return;let t=e.handleEvent,n=e.hooks,r=e.turnId;return async(i,a)=>{await t(i,a);let o=toLifecycleEvent(i,e,r);i.type===`turn.started`&&(r=i.data.turnId),o!==void 0&&await n.publish(o)}}function toLifecycleEvent(e,t,n){switch(e.type){case`session.started`:return{agentName:t.agentName,rootSessionId:t.rootSessionId??t.sessionId,sessionId:t.sessionId,type:`session.started`};case`session.completed`:case`session.waiting`:return{sessionId:t.sessionId,turnId:n,type:e.type};case`session.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:n,type:`session.failed`};case`turn.started`:return{rootSessionId:t.rootSessionId??t.sessionId,sequence:e.data.sequence,sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.started`};case`turn.completed`:case`turn.cancelled`:return{sessionId:t.sessionId,turnId:e.data.turnId,type:e.type};case`turn.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.failed`};default:return}}export{createInstrumentationHandleEvent};
1
+ function createInstrumentationHandleEvent(e){if(e.hooks===void 0)return e.handleEvent;if(e.handleEvent===void 0)return;let t=e.handleEvent,n=e.hooks,r=e.turnId;return async(i,a)=>{await t(i,a);let o=toLifecycleEvent(i,e,r);i.type===`turn.started`&&(r=i.data.turnId),o!==void 0&&await n.publish(o)}}function toLifecycleEvent(e,t,n){switch(e.type){case`session.started`:return{agentName:t.agentName,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,sessionId:t.sessionId,type:`session.started`};case`session.completed`:case`session.waiting`:return{sessionId:t.sessionId,turnId:n,type:e.type};case`session.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:n,type:`session.failed`};case`turn.started`:return{parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,sequence:e.data.sequence,sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.started`};case`turn.completed`:case`turn.cancelled`:return{sessionId:t.sessionId,turnId:e.data.turnId,type:e.type};case`turn.failed`:return{error:Error(e.data.message),sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.failed`};default:return}}export{createInstrumentationHandleEvent};
@@ -0,0 +1,11 @@
1
+ import type { SessionParent } from "#channel/types.js";
2
+ import type { InstrumentationParentLineage } from "#harness/instrumentation-lifecycle.js";
3
+ /**
4
+ * Resolves the dispatch that created the running session, if any. Dispatch
5
+ * splits the lineage across two owners — the identifiers onto
6
+ * {@link SessionParent}, the subagent name onto the adapter state — so both
7
+ * are read here rather than either being duplicated onto the other.
8
+ */
9
+ export declare function resolveParentLineage(parent: SessionParent | undefined, adapter: {
10
+ readonly state?: unknown;
11
+ } | undefined): InstrumentationParentLineage | undefined;
@@ -0,0 +1 @@
1
+ import{isSubagentAdapterState}from"#execution/subagent-adapter-state.js";function resolveParentLineage(e,t){if(e===void 0)return;let n=t?.state;return{callId:e.callId,sessionId:e.sessionId,subagentName:isSubagentAdapterState(n)?n.subagentName:void 0,turnId:e.turn.id}}export{resolveParentLineage};
@@ -1,3 +1,3 @@
1
- import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
1
+ import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey,ParentTraceContextKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createInputRequestedEvent,createResultCompletedEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection}from"#context/dynamic-model-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasStepInput,resolvePendingInput,setPendingInputBatch}from"#harness/input-requests.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{resolveParentLineage}from"#harness/parent-lineage.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
2
2
 
3
- `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0)return{model:await e.config.resolveModel(e.session.agent.modelReference),session:e.session};let t=e.session.agent.dynamicModelDefaultReference??e.session.agent.modelReference,n=getActiveDynamicModelSelection(e.ctx);return n===null?{model:await e.config.resolveModel(t),session:updateSessionModelReference(e.session,t)}:{model:n.model===void 0?await e.config.resolveModel(n.reference):n.model,session:updateSessionModelReference(e.session,n.reference)}}function updateSessionModelReference(e,t){let n=e.agent.modelReference;return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t,priorReference:n})}}function updateCompactionThresholdForModelReference(e){if(e.modelReference.contextWindowTokens===void 0||e.priorReference.contextWindowTokens===void 0)return e.compaction;let t=e.compaction.threshold/e.priorReference.contextWindowTokens;return{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*t))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,c=getInstrumentationConfig();c!==void 0&&ensureOtelIntegration();let d=c===void 0?void 0:trace.getTracer(`eve`),f=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(d&&hasStepInput(t)){let t=c?.functionId??f,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=d.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(d,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(d,p,m){let h=d;m&&(h=setTurnTraceState(h,m.spanContext()));let _=getHarnessEmissionState(h.state),te=contextStorage.getStore()?.get(ParentSessionKey),O=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,rootSessionId:te?.rootSessionId,sessionId:h.sessionId,turnId:activeTurnId(_)}),k=consumeDeferredStepInput({input:p,session:h});h=k.session;let j=await resolvePendingRuntimeActions({emit:O,session:h,stepInput:k.input});if(j.outcome===`unresolved`)return{next:null,session:j.session};h=j.session;let M=getPendingInputRequestIds(h.state),N=convertStaleResponsesToUserMessage({history:j.messages,pendingRequestIds:M,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:M,stepInput:k.input})}),P=N.stepInput,F=N.kind===`converted`?{...P,message:N.displayMessage}:P,I=resolvePendingInput({history:j.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:h,stepInput:P});if(I.outcome===`unresolved`)return O&&I.deferredMessage===!0&&hasStepInput(p)?(_=await emitTurnPreamble(O,F??{},_,t.runtimeIdentity),_=await emitTurnEpilogue(O,_,t.mode,I.session.continuationToken),{next:null,session:setHarnessEmissionState(I.session,_)}):{next:null,session:I.session};if(O&&I.rejectedActions)for(let e of I.rejectedActions.results)await O(createActionResultEvent({rejected:!0,result:e,sequence:I.rejectedActions.event.sequence,stepIndex:I.rejectedActions.event.stepIndex,turnId:I.rejectedActions.event.turnId}));O&&hasStepInput(p)&&(_=await emitTurnPreamble(O,F??{},_,t.runtimeIdentity),h=setHarnessEmissionState(h,_),m&&m.setAttribute(`eve.turn.id`,_.turnId)),h=I.session;let L=I.messages,R=await applySessionLimitContinuation({config:t,emit:O,emissionState:_,limitContinuation:I.limitContinuation,session:h});if(R.result!==null)return R.result;if(h=R.session,P?.context!==void 0&&I.deferredContext!==!0)for(let e of P.context)L.push({content:e,role:`user`});let z=normalizeUserContent(P?.message);if(z!==void 0&&!I.deferredMessage&&!I.consumedMessage){let e=await stageAttachmentsToSandbox(z);L.push({content:e,role:`user`})}let B=contextStorage.getStore();B!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:B,event:createStepStartedEvent({sequence:_.sequence,stepIndex:_.stepIndex,turnId:_.turnId}),fallback:h.agent.dynamicModelDefaultReference??h.agent.modelReference,messages:L});let V=await resolveActiveRuntimeModel({config:t,ctx:B,session:h});h=V.session;let H=V.model,U=detectPromptCachePath(H),W=U.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,re=buildGatewayAttributionHeaders(H,t.runtimeIdentity);({messages:L,session:h}=await maybeCompact({abortSignal:t.abortSignal,emit:O,emissionState:_,messages:L,model:H,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:h,telemetry:enrichTelemetry(c,f)??void 0}));let G=getApprovedTools(h),K=h.outputSchema===void 0&&B!==void 0&&isScheduleAppAuth(B.get(AuthKey))&&B.get(ParentSessionKey)===void 0,ie=await hydrateSandboxAttachments(L),q=[],J=[];for(let e of ie)e.role===`system`?q.push(e):J.push(e);if(B!==void 0){q.push(...buildDynamicInstructionMessages(B));let e=B.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&q.push({role:`system`,content:e})}K&&q.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let Y=J,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=h.agent.system?[{role:`system`,content:h.agent.system}]:[],r=q.length>0||t.length>0?[...t,...n,...q]:void 0,i=r!==void 0&&W?applySystemCacheBreakpoint(r,W):r,a=i===void 0?h.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:c,emissionState:_,environment,modelInput:{instructions:a,messages:Y},session:h})}},runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...Y,{role:`user`,content:e.trailingUserNote}]:Y,o=getAdvertisedTools({session:h,tools:t.tools}),s=await buildToolSetWithProviderTools({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:h.agent.modelReference,tools:o});if(B!==void 0){let n=getAdvertisedTools({session:h,tools:buildDynamicTools(B)}),r=buildToolSetFromDefinitions({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))s[e]=t}h.outputSchema!==void 0&&(s[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(h.outputSchema));let l=O===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:O,emissionState:_,tools:e}),u=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,d=await getAdvertisedTools({modelTools:s,session:h,tools:o,workflow:u});h=d.session;let p=d.modelTools,m=W?applyLastToolCacheBreakpoint(p,W):p,g=t.instrumentation?.hooks,v=activeTurnId(_),y=g===void 0?void 0:{attemptId:`${h.sessionId}:${v}:${_.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:c?.functionId??f,rootSessionId:te?.rootSessionId??h.sessionId,sessionId:h.sessionId,stepIndex:_.stepIndex,turnId:v},b=y===void 0||g===void 0?void 0:createAiSdkHookBridge(y,g,t.instrumentation?.runInContext),x=buildStepHooks({cachePath:U,emit:O,emissionState:_,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:W,session:h}),S=new ToolLoopAgent({headers:re,instructions:n,model:H,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:x.onStepFinish,prepareStep:x.prepareStep,reasoning:h.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(c,f,i,b),toolApproval:buildToolApproval(p),tools:m}),executeModelCall=async()=>{if(O){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&o.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await S.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:s,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(O,_,r.fullStream,{excludedActionToolNames:n,tools:t.tools});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([x.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(O,_,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:s,tools:o});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await S.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await x.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return y!==void 0&&await g?.publish({scope:y,type:`attempt.completed`}),e}catch(e){return y!==void 0&&await g?.publish({error:e,scope:y,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},ae=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:ae++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:h.sessionId,turnId:_.turnId},t.abortSignal),oe=prepareModelCallInput();O&&await emitStepStarted(O,_,L);let X=await continuePendingWorkflowInterrupt({childResults:P?.runtimeActionResults,config:t,emit:O,emissionState:_,runStep,session:h});if(X!==null)return X;let se=await enforceSessionTokenLimit({config:t,emit:O,emissionState:_,messages:L,session:h});if(se!==null)return se;let Z;try{Z=await runOneModelCall({preparedInput:oe,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:h.sessionId,turnId:_.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:K,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:h.sessionId,turnId:_.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(m&&recordErrorOnSpan(m,n),!O)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:h.sessionId,turnId:_.turnId}),_=await emitRecoverableFailedTurn(O,_,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:h.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(h,_)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),u=c===null?extractUpstreamRejectionMessage(n):null,d=c?.message??u?.message??toErrorMessage(n),f=c?.hint===void 0?d:`${d} ${c.hint}`,p=extractModelCallErrorDetails(n),g=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:u}),v=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||u!==null,sessionId:h.sessionId,turnId:_.turnId});if(o===`terminal`)return c===null?log.error(u?.message??`model call failed terminally`,v):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:h.sessionId,turnId:_.turnId}),await emitFailedStep(O,_,{code:`MODEL_CALL_FAILED`,details:g,message:d,sessionId:h.sessionId}),{next:t.mode===`task`?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:h};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(u?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,v),n;return log.error(u?.message??`model call failed; failing the task run`,v),await emitFailedStep(O,_,{code:`MODEL_CALL_FAILED`,details:g,message:d,sessionId:h.sessionId}),{next:{done:!0,isError:!0,output:f},session:h}}return log.error(u?.message??`model call failed — parking session for retry by the user`,v),_=await emitRecoverableFailedTurn(O,_,{code:`MODEL_CALL_FAILED`,continuationToken:h.continuationToken,details:g,message:d}),{next:null,session:setHarnessEmissionState(h,_)}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(h.state),turnId:_.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});h=setTurnUsageState(h,Q);let $;try{$=formatLanguageModelGatewayId(H)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:O,emissionState:_,promptMessages:L,result:Z,runStep,session:h})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:r,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(!(n.role!==`tool`||!Array.isArray(n.content)))for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),f=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),p=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),h=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let ee=normalizeProviderToolHistory({messages:p,providerExecutedOutcomeIds:g}),_=ee.messages,v={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},y=t.workflow===!0?readWorkflowContinuationSecurity(v):void 0;if(y!==void 0){let e=await getWorkflowSandboxInterrupt(i,y);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:v,emissionState:o,interrupt:e,promptMessages:r,responseMessages:_})}}let b=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:f}),x=new Set(b.map(e=>e.action.callId)),S=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...f,...x])}),C=[...b,...S],w=getAdvertisedTools({session:v,tools:t.tools}),T=(i.toolCalls??[]).filter(e=>!f.has(e.toolCallId)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>w.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:v.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:w}));if(T.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:T,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:_,session:{...v,history:[...r]}}),o)};if(C.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:C,responseMessages:_,session:{...v,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:C,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode,e.continuationToken),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let E=findAuthorizationSignalFromToolResults(i.toolResults);if(E){let{challenges:e}=E;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({...v,history:[...r],state:setPendingAuthorization(v.state,{challenges:e})},o)}}let D=_,ne=[...r,...D],A={...v,history:ne};return!(A.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(D.at(-1)?.role===`tool`||ee.outcomeEndsResponse||hasDeferredStepInput(A))?(n&&(o=advanceStep(o),A=setHarnessEmissionState(A,o)),{next:a,session:A}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r,i){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r,i)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`,s.continuationToken),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`,s.continuationToken),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`,o.continuationToken),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:o.continuationToken}),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`,o.continuationToken),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,u=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),d=clearPendingWorkflowInterrupt({...e.session,history:u});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=u.slice(0,t),r=u.slice(t);return d={...d,history:n},parkOnWorkflowInterrupt({baseSession:d,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:d}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};
3
+ `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0)return{model:await e.config.resolveModel(e.session.agent.modelReference),session:e.session};let t=e.session.agent.dynamicModelDefaultReference??e.session.agent.modelReference,n=getActiveDynamicModelSelection(e.ctx);return n===null?{model:await e.config.resolveModel(t),session:updateSessionModelReference(e.session,t)}:{model:n.model===void 0?await e.config.resolveModel(n.reference):n.model,session:updateSessionModelReference(e.session,n.reference)}}function updateSessionModelReference(e,t){let n=e.agent.modelReference;return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t,priorReference:n})}}function updateCompactionThresholdForModelReference(e){if(e.modelReference.contextWindowTokens===void 0||e.priorReference.contextWindowTokens===void 0)return e.compaction;let t=e.compaction.threshold/e.priorReference.contextWindowTokens;return{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*t))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function createToolLoopHarness(t){let n=t.handleEvent,l=getInstrumentationConfig();l!==void 0&&ensureOtelIntegration();let f=l===void 0?void 0:trace.getTracer(`eve`),p=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(f&&hasStepInput(t)){let t=l?.functionId??p,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=f.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(f,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(f,m,h){let g=f;h&&(g=setTurnTraceState(g,h.spanContext()));let y=getHarnessEmissionState(g.state),C=contextStorage.getStore(),k=C?.get(ParentSessionKey),A=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,parentLineage:resolveParentLineage(k,C?.get(ChannelKey)),parentTraceContext:C?.get(ParentTraceContextKey),rootSessionId:k?.rootSessionId,sessionId:g.sessionId,turnId:activeTurnId(y)}),j=consumeDeferredStepInput({input:m,session:g});g=j.session;let M=await resolvePendingRuntimeActions({emit:A,session:g,stepInput:j.input});if(M.outcome===`unresolved`)return{next:null,session:M.session};g=M.session;let N=getPendingInputRequestIds(g.state),P=convertStaleResponsesToUserMessage({history:M.messages,pendingRequestIds:N,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:N,stepInput:j.input})}),F=P.stepInput,I=P.kind===`converted`?{...F,message:P.displayMessage}:F,L=resolvePendingInput({history:M.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:g,stepInput:F});if(L.outcome===`unresolved`)return A&&L.deferredMessage===!0&&hasStepInput(m)?(y=await emitTurnPreamble(A,I??{},y,t.runtimeIdentity),y=await emitTurnEpilogue(A,y,t.mode,L.session.continuationToken),{next:null,session:setHarnessEmissionState(L.session,y)}):{next:null,session:L.session};if(A&&L.rejectedActions)for(let e of L.rejectedActions.results)await A(createActionResultEvent({rejected:!0,result:e,sequence:L.rejectedActions.event.sequence,stepIndex:L.rejectedActions.event.stepIndex,turnId:L.rejectedActions.event.turnId}));A&&hasStepInput(m)&&(y=await emitTurnPreamble(A,I??{},y,t.runtimeIdentity),g=setHarnessEmissionState(g,y),h&&h.setAttribute(`eve.turn.id`,y.turnId)),g=L.session;let R=L.messages,z=await applySessionLimitContinuation({config:t,emit:A,emissionState:y,limitContinuation:L.limitContinuation,session:g});if(z.result!==null)return z.result;if(g=z.session,F?.context!==void 0&&L.deferredContext!==!0)for(let e of F.context)R.push({content:e,role:`user`});let re=normalizeUserContent(F?.message);if(re!==void 0&&!L.deferredMessage&&!L.consumedMessage){let e=await stageAttachmentsToSandbox(re);R.push({content:e,role:`user`})}let B=contextStorage.getStore();B!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:B,event:createStepStartedEvent({sequence:y.sequence,stepIndex:y.stepIndex,turnId:y.turnId}),fallback:g.agent.dynamicModelDefaultReference??g.agent.modelReference,messages:R});let V=await resolveActiveRuntimeModel({config:t,ctx:B,session:g});g=V.session;let H=V.model,U=detectPromptCachePath(H),W=U.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,ie=buildGatewayAttributionHeaders(H,t.runtimeIdentity);({messages:R,session:g}=await maybeCompact({abortSignal:t.abortSignal,emit:A,emissionState:y,messages:R,model:H,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:g,telemetry:enrichTelemetry(l,p)??void 0}));let G=getApprovedTools(g),K=g.outputSchema===void 0&&B!==void 0&&isScheduleAppAuth(B.get(AuthKey))&&B.get(ParentSessionKey)===void 0,ae=await hydrateSandboxAttachments(R),q=[],J=[];for(let e of ae)e.role===`system`?q.push(e):J.push(e);if(B!==void 0){q.push(...buildDynamicInstructionMessages(B));let e=B.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&q.push({role:`system`,content:e})}K&&q.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let Y=J,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=g.agent.system?[{role:`system`,content:g.agent.system}]:[],r=q.length>0||t.length>0?[...t,...n,...q]:void 0,i=r!==void 0&&W?applySystemCacheBreakpoint(r,W):r,a=i===void 0?g.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:l,emissionState:y,environment,modelInput:{instructions:a,messages:Y},session:g})}},runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...Y,{role:`user`,content:e.trailingUserNote}]:Y,o=getAdvertisedTools({session:g,tools:t.tools}),s=await buildToolSetWithProviderTools({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:g.agent.modelReference,tools:o});if(B!==void 0){let n=getAdvertisedTools({session:g,tools:buildDynamicTools(B)}),r=buildToolSetFromDefinitions({approvedTools:G,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r))s[e]=t}g.outputSchema!==void 0&&(s[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(g.outputSchema));let c=A===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:A,emissionState:y,tools:e}),u=t.workflow===!0?{lifecycle:c,maxSubagents:t.workflowMaxSubagents}:void 0,d=await getAdvertisedTools({modelTools:s,session:g,tools:o,workflow:u});g=d.session;let f=d.modelTools,m=W?applyLastToolCacheBreakpoint(f,W):f,h=t.instrumentation?.hooks,_=activeTurnId(y),b=h===void 0?void 0:{attemptId:`${g.sessionId}:${_}:${y.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:l?.functionId??p,rootSessionId:k?.rootSessionId??g.sessionId,sessionId:g.sessionId,stepIndex:y.stepIndex,turnId:_},x=b===void 0||h===void 0?void 0:createAiSdkHookBridge(b,h,t.instrumentation?.runInContext),S=buildStepHooks({cachePath:U,emit:A,emissionState:y,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:W,session:g}),C=new ToolLoopAgent({headers:ie,instructions:n,model:H,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:S.onStepFinish,prepareStep:S.prepareStep,reasoning:g.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(l,p,i,x),toolApproval:buildToolApproval(f),tools:m}),executeModelCall=async()=>{if(A){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&o.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await C.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:s,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(A,y,r.fullStream,{excludedActionToolNames:n,tools:t.tools});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([S.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(A,y,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:s,tools:o});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await C.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await S.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return b!==void 0&&await h?.publish({scope:b,type:`attempt.completed`}),e}catch(e){return b!==void 0&&await h?.publish({error:e,scope:b,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},oe=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:oe++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:g.sessionId,turnId:y.turnId},t.abortSignal),se=prepareModelCallInput();A&&await emitStepStarted(A,y,R);let X=await continuePendingWorkflowInterrupt({childResults:F?.runtimeActionResults,config:t,emit:A,emissionState:y,runStep,session:g});if(X!==null)return X;let ce=await enforceSessionTokenLimit({config:t,emit:A,emissionState:y,messages:R,session:g});if(ce!==null)return ce;let Z;try{Z=await runOneModelCall({preparedInput:se,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:g.sessionId,turnId:y.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:K,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:g.sessionId,turnId:y.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(h&&recordErrorOnSpan(h,n),!A)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:g.sessionId,turnId:y.turnId}),y=await emitRecoverableFailedTurn(A,y,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:g.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(g,y)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),l=c===null?extractUpstreamRejectionMessage(n):null,d=c?.message??l?.message??toErrorMessage(n),f=c?.hint===void 0?d:`${d} ${c.hint}`,p=extractModelCallErrorDetails(n),m=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:l}),_=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||l!==null,sessionId:g.sessionId,turnId:y.turnId});if(o===`terminal`)return c===null?log.error(l?.message??`model call failed terminally`,_):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:g.sessionId,turnId:y.turnId}),await emitFailedStep(A,y,{code:`MODEL_CALL_FAILED`,details:m,message:d,sessionId:g.sessionId}),{next:t.mode===`task`?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:g};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(l?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,_),n;return log.error(l?.message??`model call failed; failing the task run`,_),await emitFailedStep(A,y,{code:`MODEL_CALL_FAILED`,details:m,message:d,sessionId:g.sessionId}),{next:{done:!0,isError:!0,output:f},session:g}}return log.error(l?.message??`model call failed — parking session for retry by the user`,_),y=await emitRecoverableFailedTurn(A,y,{code:`MODEL_CALL_FAILED`,continuationToken:g.continuationToken,details:m,message:d}),{next:null,session:setHarnessEmissionState(g,y)}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(g.state),turnId:y.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});g=setTurnUsageState(g,Q);let $;try{$=formatLanguageModelGatewayId(H)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:A,emissionState:y,promptMessages:R,result:Z,runStep,session:g})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:r,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(!(n.role!==`tool`||!Array.isArray(n.content)))for(let e of n.content)e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),p=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),m=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let _=normalizeProviderToolHistory({messages:p,providerExecutedOutcomeIds:g}),v=_.messages,y={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},b=t.workflow===!0?readWorkflowContinuationSecurity(y):void 0;if(b!==void 0){let e=await getWorkflowSandboxInterrupt(i,b);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:y,emissionState:o,interrupt:e,promptMessages:r,responseMessages:v})}}let x=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),S=new Set(x.map(e=>e.action.callId)),ee=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...S])}),w=[...x,...ee],T=getAdvertisedTools({session:y,tools:t.tools}),E=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(e=>t.tools.get(e.toolName)?.runtimeAction!==void 0).filter(e=>T.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:y.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:T}));if(E.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:E,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:v,session:{...y,history:[...r]}}),o)};if(w.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:w,responseMessages:v,session:{...y,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:w,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode,e.continuationToken),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let D=findAuthorizationSignalFromToolResults(i.toolResults);if(D){let{challenges:e}=D;if(n)for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));return{next:null,session:setHarnessEmissionState({...y,history:[...r],state:setPendingAuthorization(y.state,{challenges:e})},o)}}let te=v,ne=[...r,...te],O={...y,history:ne};return!(O.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(te.at(-1)?.role===`tool`||_.outcomeEndsResponse||hasDeferredStepInput(O))?(n&&(o=advanceStep(o),O=setHarnessEmissionState(O,o)),{next:a,session:O}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:O.outputSchema,session:O,stepOutput:m}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:O.outputSchema,session:O})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r,i){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r,i)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`,s.continuationToken),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`,s.continuationToken),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i}=e,{emissionState:a,session:o}=e;if(i===void 0)return t&&(a=await emitTurnEpilogue(t,a,`conversation`,o.continuationToken),o=setHarnessEmissionState(o,a)),{next:null,session:o};let s=extractFinalOutput(r);return s===void 0?(t&&(a=await emitRecoverableFailedTurn(t,a,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:o.continuationToken}),o=setHarnessEmissionState(o,a)),{next:null,session:o}):(o=persistStructuredAssistantTurn(o,n,s),t&&(a=await emitStructuredResult(t,a,s,`conversation`,o.continuationToken),o=setHarnessEmissionState(o,a)),{next:null,session:o})}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.config.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.config.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),d=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return d={...d,history:n},parkOnWorkflowInterrupt({baseSession:d,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:d}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:i.agent.modelReference,resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{createToolLoopHarness};