eve 0.66.3 → 0.67.1

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 (409) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/dist/src/channel/channel-address.d.ts +0 -2
  3. package/dist/src/channel/channel-address.js +1 -1
  4. package/dist/src/channel/channel-operations.d.ts +0 -5
  5. package/dist/src/channel/channel-operations.js +1 -1
  6. package/dist/src/channel/compiled-channel.d.ts +8 -0
  7. package/dist/src/channel/compiled-channel.js +2 -2
  8. package/dist/src/channel/conversation-context.js +1 -1
  9. package/dist/src/channel/routes.d.ts +1 -2
  10. package/dist/src/channel/schedule-auth.d.ts +0 -2
  11. package/dist/src/channel/schedule-auth.js +1 -1
  12. package/dist/src/channel/schedule.d.ts +2 -2
  13. package/dist/src/channel/schedule.js +1 -1
  14. package/dist/src/channel/types.d.ts +8 -13
  15. package/dist/src/chunks/{use-eve-agent-Di1u2zKu.js → use-eve-agent-D4HVZBjn.js} +1 -6
  16. package/dist/src/chunks/{use-eve-agent-PbSMyJ6e.js → use-eve-agent-DXcE_8Ja.js} +1 -6
  17. package/dist/src/cli/acp/command.js +3 -3
  18. package/dist/src/cli/application-root.d.ts +0 -2
  19. package/dist/src/cli/application-root.js +1 -1
  20. package/dist/src/cli/commands/agent-instructions.d.ts +0 -4
  21. package/dist/src/cli/commands/agent-instructions.js +3 -3
  22. package/dist/src/cli/commands/extension-init.js +1 -1
  23. package/dist/src/cli/commands/init-agent-workspace.js +1 -1
  24. package/dist/src/cli/commands/init-project.d.ts +0 -1
  25. package/dist/src/cli/commands/init-project.js +1 -1
  26. package/dist/src/cli/commands/init.js +1 -1
  27. package/dist/src/cli/commands/logs.d.ts +3 -3
  28. package/dist/src/cli/commands/logs.js +1 -1
  29. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  30. package/dist/src/cli/commands/trace.js +1 -1
  31. package/dist/src/cli/dev/command.d.ts +9 -5
  32. package/dist/src/cli/dev/command.js +1 -3
  33. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  34. package/dist/src/cli/dev/environment.js +1 -1
  35. package/dist/src/cli/dev/run-interactive-ui.d.ts +0 -1
  36. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  37. package/dist/src/cli/dev/tui/blocks.js +1 -1
  38. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  39. package/dist/src/cli/dev/tui/question-panel.d.ts +4 -4
  40. package/dist/src/cli/dev/tui/question-panel.js +1 -1
  41. package/dist/src/cli/dev/tui/runner.d.ts +0 -1
  42. package/dist/src/cli/dev/tui/runner.js +2 -2
  43. package/dist/src/cli/dev/tui/terminal-renderer.js +8 -9
  44. package/dist/src/cli/dev/tui/theme.d.ts +1 -1
  45. package/dist/src/cli/dev/url-target.js +1 -1
  46. package/dist/src/cli/invoke/command.d.ts +2 -5
  47. package/dist/src/cli/invoke/command.js +1 -1
  48. package/dist/src/cli/invoke/invoke.d.ts +2 -2
  49. package/dist/src/cli/invoke/invoke.js +1 -1
  50. package/dist/src/cli/invoke/result.d.ts +14 -194
  51. package/dist/src/cli/invoke/result.js +1 -1
  52. package/dist/src/cli/run.d.ts +0 -4
  53. package/dist/src/cli/run.js +2 -2
  54. package/dist/src/cli/telemetry/index.js +1 -1
  55. package/dist/src/cli/ui/output.d.ts +0 -15
  56. package/dist/src/cli/ui/output.js +2 -5
  57. package/dist/src/client/eve-agent-store.js +1 -1
  58. package/dist/src/client/message-reducer.js +1 -1
  59. package/dist/src/compiled/.vendor-stamp.json +1 -1
  60. package/dist/src/compiler/artifacts.js +1 -1
  61. package/dist/src/compiler/compile-agent.js +1 -1
  62. package/dist/src/compiler/compile-from-memory.d.ts +0 -1
  63. package/dist/src/compiler/compile-from-memory.js +1 -1
  64. package/dist/src/compiler/extension-compatibility.d.ts +25 -18
  65. package/dist/src/compiler/extension-compatibility.js +1 -1
  66. package/dist/src/compiler/manifest.d.ts +48 -14
  67. package/dist/src/compiler/manifest.js +1 -1
  68. package/dist/src/compiler/normalize-agent-config.js +1 -1
  69. package/dist/src/compiler/normalize-channel.js +1 -1
  70. package/dist/src/compiler/normalize-connection.js +1 -1
  71. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  72. package/dist/src/compiler/normalize-subagent.d.ts +0 -2
  73. package/dist/src/compiler/normalize-subagent.js +1 -1
  74. package/dist/src/compiler/remote-agent-node.d.ts +0 -2
  75. package/dist/src/compiler/remote-agent-node.js +1 -1
  76. package/dist/src/compiler/workspace-resources.js +1 -1
  77. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  78. package/dist/src/context/keys.d.ts +0 -3
  79. package/dist/src/context/keys.js +1 -1
  80. package/dist/src/context/memory-lifecycle.d.ts +1 -0
  81. package/dist/src/context/memory-lifecycle.js +1 -1
  82. package/dist/src/discover/diagnostics.d.ts +0 -4
  83. package/dist/src/discover/diagnostics.js +1 -1
  84. package/dist/src/discover/project.js +1 -1
  85. package/dist/src/eve-channel/create-request.d.ts +0 -3
  86. package/dist/src/eve-channel/create-request.js +1 -1
  87. package/dist/src/eve-channel/index.js +1 -1
  88. package/dist/src/eve-channel/request.js +1 -1
  89. package/dist/src/eve-channel/types.d.ts +1 -1
  90. package/dist/src/execution/delegated-session-context.d.ts +2 -0
  91. package/dist/src/execution/delegated-session-context.js +1 -0
  92. package/dist/src/execution/dynamic-connections.d.ts +4 -1
  93. package/dist/src/execution/dynamic-connections.js +1 -1
  94. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  95. package/dist/src/execution/effective-agent-config.js +1 -1
  96. package/dist/src/execution/legacy-session/input.d.ts +0 -2
  97. package/dist/src/execution/legacy-session/input.js +1 -1
  98. package/dist/src/execution/legacy-session/prepare-step.d.ts +0 -1
  99. package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
  100. package/dist/src/execution/node-step.d.ts +4 -2
  101. package/dist/src/execution/node-step.js +1 -1
  102. package/dist/src/execution/proxied-deliver-step.js +1 -1
  103. package/dist/src/execution/publish-channel-event.d.ts +23 -0
  104. package/dist/src/execution/publish-channel-event.js +1 -0
  105. package/dist/src/execution/runtime-context.js +1 -1
  106. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  107. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  108. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  109. package/dist/src/execution/session/entry.js +1 -1
  110. package/dist/src/execution/session/event-sink.d.ts +1 -1
  111. package/dist/src/execution/session/event-sink.js +1 -1
  112. package/dist/src/execution/session/finalization.d.ts +1 -4
  113. package/dist/src/execution/session/finalization.js +1 -1
  114. package/dist/src/execution/session/handoff.d.ts +1 -3
  115. package/dist/src/execution/session/handoff.js +1 -1
  116. package/dist/src/execution/session/input-queue.d.ts +0 -1
  117. package/dist/src/execution/session/input-queue.js +1 -1
  118. package/dist/src/execution/session/next-input.d.ts +0 -1
  119. package/dist/src/execution/session/next-input.js +1 -1
  120. package/dist/src/execution/session/program.d.ts +0 -3
  121. package/dist/src/execution/session/program.js +1 -1
  122. package/dist/src/execution/session/turn-step-result.d.ts +1 -2
  123. package/dist/src/execution/session/turn-step-result.js +1 -1
  124. package/dist/src/execution/session/turn-step.js +1 -1
  125. package/dist/src/execution/session/turn.d.ts +2 -2
  126. package/dist/src/execution/session/turn.js +1 -1
  127. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  128. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  129. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  130. package/dist/src/execution/tools/agent-router.d.ts +0 -2
  131. package/dist/src/execution/tools/agent-router.js +1 -1
  132. package/dist/src/execution/tools/ask-question-workflow.js +1 -1
  133. package/dist/src/execution/tools/connection-search.d.ts +1 -0
  134. package/dist/src/execution/tools/connection-search.js +1 -1
  135. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  136. package/dist/src/execution/tools/subagent/invoke-preparation.js +1 -1
  137. package/dist/src/execution/tools/subagent/start.js +1 -1
  138. package/dist/src/extensions/code/extension/lib/connect-authentication.js +1 -1
  139. package/dist/src/extensions/code/extension/lib/github-shell.js +1 -1
  140. package/dist/src/extensions/code/extension/lib/prwatch-github.js +1 -1
  141. package/dist/src/framework/sources/registry.js +1 -1
  142. package/dist/src/harness/approval-delivery-coordinator.d.ts +3 -13
  143. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  144. package/dist/src/harness/authorization.d.ts +0 -9
  145. package/dist/src/harness/authorization.js +1 -1
  146. package/dist/src/harness/emission.d.ts +2 -3
  147. package/dist/src/harness/emission.js +1 -1
  148. package/dist/src/harness/input-request-resolution.d.ts +2 -0
  149. package/dist/src/harness/input-request-resolution.js +1 -1
  150. package/dist/src/harness/input-requests.d.ts +3 -3
  151. package/dist/src/harness/input-requests.js +1 -1
  152. package/dist/src/harness/pending-input-batches.d.ts +3 -3
  153. package/dist/src/harness/pending-input-batches.js +1 -1
  154. package/dist/src/harness/provider-safety.d.ts +9 -0
  155. package/dist/src/harness/provider-safety.js +1 -1
  156. package/dist/src/harness/proxy-input-requests.d.ts +2 -0
  157. package/dist/src/harness/proxy-input-requests.js +1 -1
  158. package/dist/src/harness/session-limit-enforcement.d.ts +2 -3
  159. package/dist/src/harness/session-limit-enforcement.js +1 -1
  160. package/dist/src/harness/step-hooks.js +1 -1
  161. package/dist/src/harness/tool-loop.js +2 -2
  162. package/dist/src/harness/tools.js +1 -1
  163. package/dist/src/harness/turn-cancellation.d.ts +2 -7
  164. package/dist/src/harness/turn-cancellation.js +1 -1
  165. package/dist/src/harness/types.d.ts +11 -13
  166. package/dist/src/harness/workflow-stream-error.d.ts +0 -7
  167. package/dist/src/harness/workflow-stream-error.js +1 -1
  168. package/dist/src/instrumentation/runtime.js +1 -1
  169. package/dist/src/instrumentation/session-context.js +1 -1
  170. package/dist/src/instrumentation/session-init.js +1 -1
  171. package/dist/src/internal/application/cache-metadata.js +1 -1
  172. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  173. package/dist/src/internal/application/optional-package-import.js +1 -1
  174. package/dist/src/internal/application/optional-package-install.js +1 -1
  175. package/dist/src/internal/application/output-publication-lock.js +1 -1
  176. package/dist/src/internal/application/package.js +1 -1
  177. package/dist/src/internal/application/paths.js +1 -1
  178. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  179. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  180. package/dist/src/internal/authored-definition/core.js +1 -1
  181. package/dist/src/internal/authored-module-evaluation-error.js +1 -1
  182. package/dist/src/internal/authored-module-loader.js +1 -2
  183. package/dist/src/internal/authored-package-boundary.d.ts +0 -1
  184. package/dist/src/internal/authored-package-boundary.js +1 -1
  185. package/dist/src/internal/authored-relative-extension-resolver.js +1 -1
  186. package/dist/src/internal/bundler/extension-scope-plugin.js +1 -1
  187. package/dist/src/internal/bundler/nitro-rolldown.d.ts +3 -1
  188. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  189. package/dist/src/internal/bundler/vendored-dependency-log.d.ts +7 -0
  190. package/dist/src/internal/bundler/vendored-dependency-log.js +1 -0
  191. package/dist/src/internal/external-resources-snapshot.d.ts +46 -0
  192. package/dist/src/internal/external-resources-snapshot.js +1 -0
  193. package/dist/src/internal/external-resources.d.ts +20 -0
  194. package/dist/src/internal/external-resources.js +1 -0
  195. package/dist/src/internal/gateway.d.ts +2 -0
  196. package/dist/src/internal/gateway.js +1 -1
  197. package/dist/src/internal/instrumentation-layout.js +1 -1
  198. package/dist/src/internal/invocation/workflow-execution.d.ts +0 -2
  199. package/dist/src/internal/invocation/workflow-execution.js +1 -1
  200. package/dist/src/internal/materialized-authored-modules.js +1 -1
  201. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  202. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  203. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  204. package/dist/src/internal/nitro/dev-runtime-source-snapshot-local-roots.js +1 -1
  205. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  206. package/dist/src/internal/nitro/host/build-application.js +1 -1
  207. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  208. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  209. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  210. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  211. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  212. package/dist/src/internal/nitro/host/extension-external-dependency-plugin.js +1 -1
  213. package/dist/src/internal/nitro/host/instrumentation-entry.d.ts +3 -0
  214. package/dist/src/internal/nitro/host/instrumentation-entry.js +2 -0
  215. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  216. package/dist/src/internal/nitro/host/nitro-bundler-config.js +1 -1
  217. package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +1 -25
  218. package/dist/src/internal/nitro/host/schedule-task-routes.js +2 -2
  219. package/dist/src/internal/nitro/host/start-development-server.d.ts +0 -8
  220. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  221. package/dist/src/internal/nitro/host/start-production-server.js +1 -1
  222. package/dist/src/internal/nitro/host/workspace-extensions.js +1 -1
  223. package/dist/src/internal/nitro/host.d.ts +1 -1
  224. package/dist/src/internal/nitro/host.js +1 -1
  225. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  226. package/dist/src/internal/nitro/routes/index.js +72 -3
  227. package/dist/src/internal/process/pnpm.js +1 -1
  228. package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
  229. package/dist/src/internal/workflow/development-world-client.js +1 -1
  230. package/dist/src/internal/workflow/development-world-server.js +1 -1
  231. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  232. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  233. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  234. package/dist/src/node_modules/.pnpm/{@vercel_cli-config@0.2.7 → @vercel_cli-config@0.3.0}/node_modules/@vercel/cli-config/dist/index.js +1 -1
  235. package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/authorization.js +1 -1
  236. package/dist/src/node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/connector.js +1 -0
  237. package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/installation.js +1 -1
  238. package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/token.js +1 -1
  239. package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/token-util.js +1 -1
  240. package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/token.js +1 -1
  241. package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/version.js +1 -1
  242. package/dist/src/protocol/message.d.ts +4 -0
  243. package/dist/src/protocol/message.js +1 -1
  244. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +0 -1
  245. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +1 -1
  246. package/dist/src/public/channels/github/api.d.ts +0 -10
  247. package/dist/src/public/channels/github/api.js +1 -1
  248. package/dist/src/public/channels/mcp.js +1 -1
  249. package/dist/src/public/channels/slack/app-manifest.d.ts +9 -0
  250. package/dist/src/public/channels/slack/app-manifest.js +1 -0
  251. package/dist/src/public/channels/slack/hitl.d.ts +0 -4
  252. package/dist/src/public/channels/slack/hitl.js +2 -2
  253. package/dist/src/public/channels/slack/inbound-content.js +6 -3
  254. package/dist/src/public/channels/slack/mrkdwn.d.ts +0 -2
  255. package/dist/src/public/channels/slack/mrkdwn.js +1 -1
  256. package/dist/src/public/channels/slack/slackChannel.d.ts +4 -1
  257. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  258. package/dist/src/public/channels/upload-policy.d.ts +0 -11
  259. package/dist/src/public/channels/upload-policy.js +1 -1
  260. package/dist/src/public/definitions/remote-agent.d.ts +0 -9
  261. package/dist/src/public/definitions/workspace-agent.d.ts +0 -3
  262. package/dist/src/public/definitions/workspace-agent.js +1 -1
  263. package/dist/src/public/next/server.js +1 -1
  264. package/dist/src/public/nuxt/dev-server.js +1 -1
  265. package/dist/src/public/sveltekit/dev-server.js +1 -1
  266. package/dist/src/runtime/agent/bootstrap.d.ts +0 -1
  267. package/dist/src/runtime/agent/bootstrap.js +1 -1
  268. package/dist/src/runtime/connections/mcp-client.js +1 -1
  269. package/dist/src/runtime/connections/mcp-tracing.d.ts +27 -0
  270. package/dist/src/runtime/connections/mcp-tracing.js +1 -0
  271. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  272. package/dist/src/runtime/resolve-agent.js +1 -1
  273. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +0 -2
  274. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
  275. package/dist/src/runtime/subagents/dynamic-remote-agent-config.d.ts +0 -2
  276. package/dist/src/runtime/subagents/dynamic-remote-agent-config.js +1 -1
  277. package/dist/src/runtime/types.d.ts +1 -2
  278. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  279. package/dist/src/services/dev-client/vercel-auth-error.d.ts +1 -9
  280. package/dist/src/services/dev-client/vercel-auth-error.js +2 -3
  281. package/dist/src/setup/boxes/select-model.d.ts +2 -36
  282. package/dist/src/setup/boxes/select-model.js +1 -1
  283. package/dist/src/setup/flows/model-source-change.js +1 -1
  284. package/dist/src/setup/flows/provider.d.ts +2 -45
  285. package/dist/src/setup/flows/provider.js +1 -4
  286. package/dist/src/setup/primitives/pm/pnpm.js +1 -1
  287. package/dist/src/setup/primitives/run-vercel.js +1 -1
  288. package/dist/src/setup/project-resolution.d.ts +0 -2
  289. package/dist/src/setup/project-resolution.js +1 -1
  290. package/dist/src/setup/provider-settings.js +1 -1
  291. package/dist/src/setup/scaffold/connections/catalog.d.ts +0 -13
  292. package/dist/src/setup/scaffold/connections/catalog.js +1 -1
  293. package/dist/src/setup/scaffold/create/project.js +1 -1
  294. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  295. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  296. package/dist/src/setup/vercel-api-failure.d.ts +0 -2
  297. package/dist/src/setup/vercel-api-failure.js +1 -1
  298. package/dist/src/setup/vercel-project.d.ts +2 -21
  299. package/dist/src/setup/vercel-project.js +0 -0
  300. package/dist/src/setup/verified-remote-agent.d.ts +1 -0
  301. package/dist/src/setup/verified-remote-agent.js +1 -1
  302. package/dist/src/shared/action-types.d.ts +2 -2
  303. package/dist/src/shared/agent-definition.d.ts +0 -9
  304. package/dist/src/shared/agent-turn-outcome.d.ts +1 -1
  305. package/dist/src/shared/channel-definition.d.ts +2 -2
  306. package/dist/src/shared/conversation-context.d.ts +0 -4
  307. package/dist/src/shared/conversation-context.js +1 -1
  308. package/dist/src/shared/conversation-identity.d.ts +2 -0
  309. package/dist/src/shared/conversation-identity.js +1 -0
  310. package/dist/src/shared/skill-paths.d.ts +0 -13
  311. package/dist/src/shared/skill-paths.js +2 -2
  312. package/dist/src/shared/validate-authorization.js +1 -1
  313. package/dist/src/shared/vercel-connect-metadata.d.ts +12 -0
  314. package/dist/src/shared/vercel-connect-metadata.js +1 -0
  315. package/dist/src/subagents/agent-handle-errors.d.ts +0 -4
  316. package/dist/src/subagents/agent-handle-errors.js +1 -1
  317. package/dist/src/subagents/callback-route.js +1 -1
  318. package/dist/src/subagents/callback-step.d.ts +0 -22
  319. package/dist/src/subagents/callback-step.js +1 -1
  320. package/dist/src/subagents/event-proxy-step.js +1 -1
  321. package/dist/src/subagents/hitl-proxy.d.ts +3 -5
  322. package/dist/src/subagents/hitl-proxy.js +1 -1
  323. package/dist/src/subagents/invocation.d.ts +5 -6
  324. package/dist/src/subagents/parent-notification.d.ts +1 -18
  325. package/dist/src/subagents/parent-notification.js +1 -1
  326. package/dist/src/subagents/remote-dispatch.js +1 -1
  327. package/dist/src/subagents/tool.d.ts +0 -3
  328. package/dist/src/subagents/tool.js +1 -1
  329. package/dist/src/svelte/index.js +1 -1
  330. package/dist/src/svelte/use-eve-agent.js +1 -1
  331. package/dist/src/tools/framework/agent-contract.d.ts +0 -2
  332. package/dist/src/tools/framework/agent-contract.js +1 -1
  333. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  334. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  335. package/dist/src/tracing/agent-invocation-coordinator.js +1 -1
  336. package/dist/src/tracing/agent-memory-instrumentation.js +1 -1
  337. package/dist/src/tracing/agent-otel-attributes.js +1 -1
  338. package/dist/src/tracing/agent-otel-provider.js +2 -2
  339. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  340. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  341. package/dist/src/tracing/agent-tool-span-context.d.ts +15 -0
  342. package/dist/src/tracing/agent-tool-span-context.js +1 -0
  343. package/dist/src/tracing/agent-trace-context-store.d.ts +0 -2
  344. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  345. package/dist/src/tracing/conversation-context.d.ts +0 -2
  346. package/dist/src/tracing/conversation-context.js +1 -1
  347. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  348. package/dist/src/tracing/otel-declaration.d.ts +4 -9
  349. package/dist/src/vue/index.js +1 -1
  350. package/dist/src/vue/use-eve-agent.js +1 -1
  351. package/docs/agent-config.md +19 -13
  352. package/docs/channels/chat-sdk.mdx +1 -1
  353. package/docs/channels/custom.mdx +1 -1
  354. package/docs/channels/eve.mdx +4 -4
  355. package/docs/channels/mcp.mdx +10 -10
  356. package/docs/channels/slack.mdx +1 -1
  357. package/docs/concepts/sessions-runs-and-streaming.md +5 -6
  358. package/docs/connections/overview.mdx +22 -0
  359. package/docs/guides/deployment/overview.md +1 -1
  360. package/docs/guides/deployment/self-hosting.md +1 -1
  361. package/docs/guides/deployment/vercel.mdx +2 -2
  362. package/docs/guides/dev-tui.md +6 -6
  363. package/docs/guides/dynamic-capabilities.md +2 -2
  364. package/docs/guides/frontend/overview.mdx +5 -3
  365. package/docs/guides/hooks.md +4 -2
  366. package/docs/guides/instrumentation/agent-runs.mdx +7 -7
  367. package/docs/guides/instrumentation/instrumentation.mdx +22 -5
  368. package/docs/guides/instrumentation/otel.mdx +30 -0
  369. package/docs/guides/remote-agents.md +3 -4
  370. package/docs/guides/self-modification.md +1 -1
  371. package/docs/memory/custom-provider.md +1 -1
  372. package/docs/protocols/acp.md +1 -1
  373. package/docs/reference/cli.md +91 -97
  374. package/docs/schedules.mdx +4 -5
  375. package/docs/subagents/index.mdx +5 -7
  376. package/docs/tools/human-in-the-loop.md +4 -0
  377. package/docs/tools/overview.mdx +2 -0
  378. package/docs/tools/workflows.mdx +1 -1
  379. package/docs/tutorial/remember-definitions.mdx +1 -1
  380. package/docs/tutorial/ship-it.mdx +1 -1
  381. package/package.json +3 -2
  382. package/dist/src/cli/commands/channels.d.ts +0 -9
  383. package/dist/src/cli/commands/channels.js +0 -1
  384. package/dist/src/cli/commands/init-confirm.d.ts +0 -12
  385. package/dist/src/cli/commands/init-confirm.js +0 -1
  386. package/dist/src/execution/effective-output-schema.d.ts +0 -22
  387. package/dist/src/execution/effective-output-schema.js +0 -1
  388. package/dist/src/node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/connector.js +0 -1
  389. package/dist/src/setup/gateway-models.d.ts +0 -10
  390. package/dist/src/setup/gateway-models.js +0 -1
  391. package/dist/src/shared/run-mode.d.ts +0 -7
  392. package/dist/src/shared/run-mode.js +0 -1
  393. package/dist/src/subagents/parent-result.d.ts +0 -14
  394. package/dist/src/subagents/parent-result.js +0 -1
  395. /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/index.js +0 -0
  396. /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/internal/base-url.js +0 -0
  397. /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/internal/default-scopes.js +0 -0
  398. /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/internal/env.js +0 -0
  399. /package/dist/src/node_modules/.pnpm/{@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff → @vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494}/node_modules/@vercel/connect/dist/internal/url-validation.js +0 -0
  400. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/auth-errors.js +0 -0
  401. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/exchange-vercel-oidc-token.js +0 -0
  402. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/get-context.js +0 -0
  403. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/get-vercel-oidc-token-sync.js +0 -0
  404. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/get-vercel-oidc-token-with-refresh.js +0 -0
  405. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/index.js +0 -0
  406. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/oauth.js +0 -0
  407. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/token-error.js +0 -0
  408. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/token-io.js +0 -0
  409. /package/dist/src/node_modules/.pnpm/{@vercel_oidc@3.8.8 → @vercel_oidc@3.8.9}/node_modules/@vercel/oidc/dist/verify-vercel-oidc-token.js +0 -0
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{SessionDynamicSubagentSelectionsKey,TurnDynamicSubagentSelectionsKey}from"#context/keys.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getBackgroundTasks}from"#harness/workflow-tool-runs.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{prepareActionDispatch}from"#execution/coordination-dispatch-shared.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME}from"#tools/framework/agent-contract.js";import{isAgentHandleAction}from"#subagents/handle-dispatch.js";import{createRecursiveAgentRootOnlyResult,createUnavailableDynamicSubagentResult,getSubagentName}from"#execution/dispatch-action-failures.js";const log=createLogger(`execution.agent-invocation`);async function prepareOwnerAgentInvocation(e){let t=readDurableSession(e.sessionState),n=await deserializeContext(e.serializedContext),r=getHarnessEmissionState(t.state),i=e.taskId===void 0?void 0:getBackgroundTasks(t.state).get(e.taskId)?.run,a=resolveAgentInvocationAction({ctx:n,input:e.invocation,invocationId:e.invocationId});return await prepareActionDispatch({batch:{requests:[a],event:{...r,stepIndex:i?.origin.stepIndex??r.stepIndex,turnId:i?.origin.turnId??activeTurnId(r)}},ctx:n,durableSession:t,fanoutSize:1,plan:({bundle:t,ctx:n,session:r})=>[planAgentDispatch({action:a,bundle:t,ctx:n,knownAgentIds:e.knownAgentIds,session:r})],planReusesOwnerSandbox:({bundle:e,plan:t})=>ownerPlanReusesSandbox({bundle:e,plan:t}),serializedContext:e.serializedContext})}function planAgentDispatch(e){let t=new Set(e.knownAgentIds??(getAgentHandleStore(e.session.state)?.handles??[]).map(e=>e.identity.id)),n=e.action.input.agentId,r=typeof n==`string`&&n.trim()!==``?n:void 0;if(r!==void 0&&isAgentHandleAction(e.action)){if(t.has(r)){let t=e.bundle.subagentRegistry.dynamicNodeIds?.has(e.action.nodeId)===!0?getDynamicSubagentSelection(e.ctx,e.action.nodeId):void 0;return{action:e.action,agentId:r,dynamicRemoteAgent:e.action.kind===`remote-agent-call`&&t?.kind===`remote`?t.remoteAgent:void 0,kind:`resume`}}log.warn(`unknown agentId on subagent call; starting a new agent`,{agentId:r,callId:e.action.callId})}return classifyFreshStart(e)}function classifyFreshStart(e){let{action:t}=e,n=e.bundle.subagentRegistry.subagentsByNodeId,r=e.bundle.subagentRegistry.dynamicNodeIds?.has(t.nodeId)===!0,i=r?getDynamicSubagentSelection(e.ctx,t.nodeId):void 0;if(r&&(i===void 0||t.kind===`subagent-call`&&i.kind!==`subagent`||t.kind===`remote-agent-call`&&i.kind!==`remote`))return log.warn(`dynamic subagent call blocked after availability changed`,{callId:t.callId,nodeId:t.nodeId,subagentName:getSubagentName(t)}),{kind:`reject`,result:createUnavailableDynamicSubagentResult(t)};if(isRecursiveAgentAction(t,n)&&e.session.rootSessionId!==void 0)return log.warn(`recursive agent call blocked outside the root session`,{callId:t.callId,nodeId:t.nodeId,rootSessionId:e.session.rootSessionId,subagentName:t.subagentName}),{kind:`reject`,result:createRecursiveAgentRootOnlyResult(t)};if(t.kind===`remote-agent-call`)return{kind:`start`,target:{action:t,dynamicRemoteAgent:i?.kind===`remote`?i.remoteAgent:void 0,kind:`remote`}};let a=i?.kind===`subagent`?i.agentConfig:void 0,o=n.get(t.nodeId),s=a?.description??(o?.definition.kind===`subagent`?o.definition.description:void 0);return{kind:`start`,target:{action:t,dynamicSubagentAgentConfig:a,kind:`local`,source:s===void 0?{outputSchema:e.bundle.turnAgent.outputSchema,type:`runtime`}:{description:s,outputSchema:a?.outputSchema??e.bundle.graph?.nodesByNodeId.get(t.nodeId)?.turnAgent?.outputSchema,type:`local`}}}}function ownerPlanReusesSandbox(e){return e.plan.some(t=>{if(t.kind!==`start`||t.target.kind!==`local`)return!1;let n=t.target.action;return n.subagentName===`agent`&&!e.bundle.subagentRegistry.subagentsByNodeId.has(n.nodeId)||e.bundle.graph?.nodesByNodeId.get(n.nodeId)?.sandboxRegistry.sandbox.definition.kind===`parent`})}function isRecursiveAgentAction(e,t){return e.kind===`subagent-call`&&e.subagentName===`agent`&&!t.has(e.nodeId)}function resolveAgentInvocationAction(e){let t=e.ctx.require(BundleKey),n=t.subagentRegistry.subagentsByName.get(e.input.target),r=n===void 0?Object.values({...e.ctx.get(SessionDynamicSubagentSelectionsKey),...e.ctx.get(TurnDynamicSubagentSelectionsKey)}).find(t=>t!==null&&t.prepared?.name===e.input.target):void 0,i=n?.definition??r?.prepared??(e.input.target===AGENT_TOOL_NAME&&t.nodeId===void 0?{description:AGENT_TOOL_DESCRIPTION,kind:`subagent`,name:AGENT_TOOL_NAME,nodeId:ROOT_RUNTIME_AGENT_NODE_ID}:void 0);if(i===void 0)throw Error(`Agent target "${e.input.target}" is not available to this agent.`);let a={message:e.input.message};e.input.agentId!==void 0&&(a.agentId=e.input.agentId),e.input.outputSchema!==void 0&&(a.outputSchema=e.input.outputSchema);let o={callId:e.invocationId,description:i.description??``,input:a,name:i.name,nodeId:i.nodeId};return i.kind===`remote`?{...o,kind:`remote-agent-call`,remoteAgentName:i.name}:{...o,kind:`subagent-call`,subagentName:i.name}}export{planAgentDispatch,prepareOwnerAgentInvocation,resolveAgentInvocationAction};
1
+ import{createLogger}from"#internal/logging.js";import{SessionDynamicSubagentSelectionsKey,TurnDynamicSubagentSelectionsKey}from"#context/keys.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{getHarnessEmissionState}from"#harness/emission.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getBackgroundTasks}from"#harness/workflow-tool-runs.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{activeTurnId}from"#harness/active-turn-id.js";import{prepareActionDispatch}from"#execution/coordination-dispatch-shared.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME}from"#tools/framework/agent-contract.js";import{isAgentHandleAction}from"#subagents/handle-dispatch.js";import{createRecursiveAgentRootOnlyResult,createUnavailableDynamicSubagentResult,getSubagentName}from"#execution/dispatch-action-failures.js";const log=createLogger(`execution.agent-invocation`);async function prepareOwnerAgentInvocation(e){let t=readDurableSession(e.sessionState),n=await deserializeContext(e.serializedContext),r=getHarnessEmissionState(t.state),i=e.taskId===void 0?void 0:getBackgroundTasks(t.state).get(e.taskId)?.run,a=resolveAgentInvocationAction({ctx:n,input:e.invocation,invocationId:e.invocationId});return await prepareActionDispatch({batch:{requests:[a],event:{...r,stepIndex:i?.origin.stepIndex??r.stepIndex,turnId:i?.origin.turnId??activeTurnId(r)}},ctx:n,durableSession:t,fanoutSize:1,plan:({bundle:t,ctx:n,session:r})=>[planAgentDispatch({action:a,bundle:t,ctx:n,knownAgentIds:e.knownAgentIds,session:r})],planReusesOwnerSandbox:({bundle:e,plan:t})=>ownerPlanReusesSandbox({bundle:e,plan:t}),serializedContext:e.serializedContext})}function planAgentDispatch(e){let t=new Set(e.knownAgentIds??(getAgentHandleStore(e.session.state)?.handles??[]).map(e=>e.identity.id)),n=e.action.input.agentId,r=typeof n==`string`&&n.trim()!==``?n:void 0;if(r!==void 0&&isAgentHandleAction(e.action)){if(t.has(r)){let t=e.bundle.subagentRegistry.dynamicNodeIds?.has(e.action.nodeId)===!0?getDynamicSubagentSelection(e.ctx,e.action.nodeId):void 0;return{action:e.action,agentId:r,dynamicRemoteAgent:e.action.kind===`remote-agent-call`&&t?.kind===`remote`?t.remoteAgent:void 0,kind:`resume`}}log.warn(`unknown agentId on subagent call; starting a new agent`,{agentId:r,callId:e.action.callId})}return classifyFreshStart(e)}function classifyFreshStart(e){let{action:t}=e,n=e.bundle.subagentRegistry.subagentsByNodeId,r=e.bundle.subagentRegistry.dynamicNodeIds?.has(t.nodeId)===!0,i=r?getDynamicSubagentSelection(e.ctx,t.nodeId):void 0;if(r&&(i===void 0||t.kind===`subagent-call`&&i.kind!==`subagent`||t.kind===`remote-agent-call`&&i.kind!==`remote`))return log.warn(`dynamic subagent call blocked after availability changed`,{callId:t.callId,nodeId:t.nodeId,subagentName:getSubagentName(t)}),{kind:`reject`,result:createUnavailableDynamicSubagentResult(t)};if(isRecursiveAgentAction(t,n)&&e.session.rootSessionId!==void 0)return log.warn(`recursive agent call blocked outside the root session`,{callId:t.callId,nodeId:t.nodeId,rootSessionId:e.session.rootSessionId,subagentName:t.subagentName}),{kind:`reject`,result:createRecursiveAgentRootOnlyResult(t)};if(t.kind===`remote-agent-call`)return{kind:`start`,target:{action:t,dynamicRemoteAgent:i?.kind===`remote`?i.remoteAgent:void 0,kind:`remote`}};let a=i?.kind===`subagent`?i.agentConfig:void 0,o=n.get(t.nodeId),s=a?.description??(o?.definition.kind===`subagent`?o.definition.description:void 0);return{kind:`start`,target:{action:t,dynamicSubagentAgentConfig:a,kind:`local`,source:s===void 0?{type:`runtime`}:{description:s,type:`local`}}}}function ownerPlanReusesSandbox(e){return e.plan.some(t=>{if(t.kind!==`start`||t.target.kind!==`local`)return!1;let n=t.target.action;return n.subagentName===`agent`&&!e.bundle.subagentRegistry.subagentsByNodeId.has(n.nodeId)||e.bundle.graph?.nodesByNodeId.get(n.nodeId)?.sandboxRegistry.sandbox.definition.kind===`parent`})}function isRecursiveAgentAction(e,t){return e.kind===`subagent-call`&&e.subagentName===`agent`&&!t.has(e.nodeId)}function resolveAgentInvocationAction(e){let t=e.ctx.require(BundleKey),n=t.subagentRegistry.subagentsByName.get(e.input.target),r=n===void 0?Object.values({...e.ctx.get(SessionDynamicSubagentSelectionsKey),...e.ctx.get(TurnDynamicSubagentSelectionsKey)}).find(t=>t!==null&&t.prepared?.name===e.input.target):void 0,i=n?.definition??r?.prepared??(e.input.target===AGENT_TOOL_NAME&&t.nodeId===void 0?{description:AGENT_TOOL_DESCRIPTION,kind:`subagent`,name:AGENT_TOOL_NAME,nodeId:ROOT_RUNTIME_AGENT_NODE_ID}:void 0);if(i===void 0)throw Error(`Agent target "${e.input.target}" is not available to this agent.`);let a={message:e.input.message};e.input.agentId!==void 0&&(a.agentId=e.input.agentId),e.input.outputSchema!==void 0&&(a.outputSchema=e.input.outputSchema);let o={callId:e.invocationId,description:i.description??``,input:a,name:i.name,nodeId:i.nodeId};return i.kind===`remote`?{...o,kind:`remote-agent-call`,remoteAgentName:i.name}:{...o,kind:`subagent-call`,subagentName:i.name}}export{planAgentDispatch,prepareOwnerAgentInvocation,resolveAgentInvocationAction};
@@ -1 +1 @@
1
- import{resolveConversationId}from"#tracing/conversation-context.js";import"#subagents/tool.js";import{startLocalSubagent}from"#subagents/start-local.js";import{startRemoteSubagent}from"#subagents/start-remote.js";async function startSubagent(e){let{trace:t}=e,n={conversationId:t.conversationId??resolveConversationId(e.session.rootSessionId??e.session.sessionId),lineage:{callId:e.target.action.callId,rootSessionId:e.session.rootSessionId??e.session.sessionId,sessionId:e.session.sessionId,turn:{id:e.batchEvent.turnId,sequence:e.batchEvent.sequence}},continuationToken:e.parentContinuationToken,traceContext:t.parentTraceContext,originAudience:t.originAudience};switch(e.target.kind){case`local`:return startLocalSubagent({action:e.target.action,auth:e.auth,bundle:e.bundle,capabilities:e.capabilities,channelMetadata:e.channelMetadata,inheritedConversation:e.inheritedConversation,currentSession:e.currentSession,dynamicSubagentAgentConfig:e.target.dynamicSubagentAgentConfig,fanoutSize:e.fanoutSize,initiatorAuth:e.initiatorAuth,localDevRequest:e.localDevRequest,parent:n,activityObserver:e.taskActivityObserver??e.activityObserver,sandboxSessionId:e.sandboxSessionId,session:e.session,source:e.target.source,taskId:e.taskId});case`remote`:return startRemoteSubagent({action:e.target.action,auth:e.auth,bundle:e.bundle,callbackBaseUrl:e.callbackBaseUrl,currentSession:e.currentSession,dynamicRemoteAgent:e.target.dynamicRemoteAgent,initiatorAuth:e.initiatorAuth,parent:n,activityObserver:e.activityObserver,taskActivityObserver:e.taskActivityObserver,session:e.session,taskId:e.taskId});default:return e.target}}export{startSubagent};
1
+ import"#subagents/tool.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{startLocalSubagent}from"#subagents/start-local.js";import{startRemoteSubagent}from"#subagents/start-remote.js";async function startSubagent(e){let{trace:t}=e,n={conversationId:t.conversationId??resolveConversationId(e.session.rootSessionId??e.session.sessionId),lineage:{callId:e.target.action.callId,rootSessionId:e.session.rootSessionId??e.session.sessionId,sessionId:e.session.sessionId,turn:{id:e.batchEvent.turnId,sequence:e.batchEvent.sequence}},continuationToken:e.parentContinuationToken,traceContext:t.parentTraceContext,originAudience:t.originAudience};switch(e.target.kind){case`local`:return startLocalSubagent({action:e.target.action,auth:e.auth,bundle:e.bundle,capabilities:e.capabilities,channelMetadata:e.channelMetadata,inheritedConversation:e.inheritedConversation,currentSession:e.currentSession,dynamicSubagentAgentConfig:e.target.dynamicSubagentAgentConfig,fanoutSize:e.fanoutSize,initiatorAuth:e.initiatorAuth,localDevRequest:e.localDevRequest,parent:n,activityObserver:e.taskActivityObserver??e.activityObserver,sandboxSessionId:e.sandboxSessionId,session:e.session,source:e.target.source,taskId:e.taskId});case`remote`:return startRemoteSubagent({action:e.target.action,auth:e.auth,bundle:e.bundle,callbackBaseUrl:e.callbackBaseUrl,currentSession:e.currentSession,dynamicRemoteAgent:e.target.dynamicRemoteAgent,initiatorAuth:e.initiatorAuth,parent:n,activityObserver:e.activityObserver,taskActivityObserver:e.taskActivityObserver,session:e.session,taskId:e.taskId});default:return e.target}}export{startSubagent};
@@ -1 +1 @@
1
- import"../extension.js";import{ConnectError,ConnectorInstallationRequiredError,getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/index.js";import{authenticateVercel}from"./credentials.js";async function authenticateTurn(e,t,n=getToken){if(e.vercel===void 0)return;let r=await t(),i=await resolveToken(e.vercel.connector,{subject:{type:`app`}},n);await authenticateVercel(r,{token:i,delivery:e.vercel.delivery,broker:e.broker})}async function resolveToken(e,t,n){try{let r=await n(e,t);if(r.length===0)throw Error(`Connect returned an empty token`);return r}catch(t){let n=t instanceof ConnectorInstallationRequiredError?`connector installation is required`:t instanceof ConnectError?`Connect rejected the token request`:`Connect token request failed`,r=t instanceof Error?t.message:String(t);throw Error(`${n} for ${JSON.stringify(e)}: ${r}`,{cause:t})}}export{authenticateTurn};
1
+ import"../extension.js";import{ConnectError,ConnectorInstallationRequiredError,getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/index.js";import{authenticateVercel}from"./credentials.js";async function authenticateTurn(e,t,n=getToken){if(e.vercel===void 0)return;let r=await t(),i=await resolveToken(e.vercel.connector,{subject:{type:`app`}},n);await authenticateVercel(r,{token:i,delivery:e.vercel.delivery,broker:e.broker})}async function resolveToken(e,t,n){try{let r=await n(e,t);if(r.length===0)throw Error(`Connect returned an empty token`);return r}catch(t){let n=t instanceof ConnectorInstallationRequiredError?`connector installation is required`:t instanceof ConnectError?`Connect rejected the token request`:`Connect token request failed`,r=t instanceof Error?t.message:String(t);throw Error(`${n} for ${JSON.stringify(e)}: ${r}`,{cause:t})}}export{authenticateTurn};
@@ -1 +1 @@
1
- import{getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/index.js";import{shellQuote}from"./shell.js";import{toolingPaths}from"./tooling.js";import{validateRepositoryRoot}from"./repository-root.js";import{posix}from"node:path";const MAX_OUTPUT_BYTES=1e5,leaseQueues=new Map,ALLOWED_GIT_REMOTE_COMMANDS=new Set([`fetch`,`ls-remote`,`pull`,`push`]);function githubShellApproval(e){if(!e)return`not-applicable`;try{return validateGitHubShellInput(e),`not-applicable`}catch(e){return{type:`denied`,reason:e instanceof Error?e.message:`Invalid GitHub command.`}}}async function executeGitHubShell(e,t,n){if(!t)throw Error(`GitHub command access is not configured for this agent.`);let r=validateGitHubShellInput(e),i=await n.getSandbox(),a=resolveWorkingDirectory(i,e.workingDirectory);(r[0]===`git`||r[0]===`gh-signed-commit`)&&(a=await validateRepositoryRoot(i,a));let o=e.permissions[0].repositories,s=await assertCommandTargets(r,o,a,i),c=repositoryNames(o,t.org),l={authorizationDetails:[{type:`github_app_installation`,org:t.org,repositories:c}],subject:{type:`app`}},u=await(n.getConnectToken??getToken)(t.connector,l);if(!u)throw Error(`Connect returned an empty token for ${JSON.stringify(t.connector)}.`);let d=executablePath(r[0],i),f=s?[`-c`,`protocol.allow=never`,`-c`,`protocol.https.allow=always`,r[1],`https://github.com/${s}.git`,...r.slice(3)]:r.slice(1),p=`cd ${shellQuote(a)} && exec ${shellQuote(d)} ${f.map(shellQuote).join(` `)}`,m=`Basic ${Buffer.from(`x-access-token:${u}`).toString(`base64`)}`,h=crypto.randomUUID(),g=`eve-github-${h}`,_=`/tmp/eve-code-gh-${h}`,v=`Basic ${Buffer.from(`x-access-token:${g}`).toString(`base64`)}`,y;try{y=await withGitHubCredentialLease(i,n.sessionId,{authorization:m,placeholder:g,placeholderAuthorization:v,token:u},()=>{let e={GH_CONFIG_DIR:_,GH_PROMPT_DISABLED:`1`};return r[0]!==`git`&&(e.GH_TOKEN=g),e.GIT_CONFIG_COUNT=`2`,e.GIT_CONFIG_KEY_0=`http.https://github.com/.extraheader`,e.GIT_CONFIG_VALUE_0=`Authorization: ${v}`,e.GIT_CONFIG_KEY_1=`core.hooksPath`,e.GIT_CONFIG_VALUE_1=`/dev/null`,e.GIT_TERMINAL_PROMPT=`0`,e.PATH=`/usr/local/bin:/usr/bin:/bin`,i.run({command:p,env:e})},t.broker)}finally{await i.removePath({path:_,recursive:!0,force:!0})}let b=sanitizeOutput(y.stdout,u,m),x=sanitizeOutput(y.stderr,u,m);return{exitCode:y.exitCode,stdout:b.value,stderr:x.value,truncated:b.truncated||x.truncated}}async function withGitHubCredentialLease(e,t,n,r,i){let a=leaseQueues.get(t)??Promise.resolve(),o,s=new Promise(e=>{o=e}),c=a.then(()=>s);leaseQueues.set(t,c),await a;try{return await i(e,{"api.github.com":[{match:{headers:[{key:{exact:`authorization`},value:{regex:`^(?:token|Bearer) ${n.placeholder}$`}}]},transform:[{headers:{authorization:`Bearer ${n.token}`}}]}],"github.com":[{match:{headers:[{key:{exact:`authorization`},value:{exact:n.placeholderAuthorization}}]},transform:[{headers:{authorization:n.authorization}}]}]}),await r()}finally{try{await i(e,null)}finally{o(),leaseQueues.get(t)===c&&leaseQueues.delete(t)}}}function parseCommand(e){let t=e.trim();if(!t)throw Error(`GitHub command must not be empty.`);let n=[],r=``,i=null,a=!1,o=!1;for(let e of t){if(a){r+=e,a=!1,o=!0;continue}if(e===`\\`&&i!==`single`){a=!0,o=!0;continue}if(i===`single`){e===`'`?i=null:r+=e;continue}if(i===`double`){if(e===`"`)i=null;else if(e===`$`||e==="`")throw unsupportedSyntax();else r+=e;continue}if(e===`'`)i=`single`,o=!0;else if(e===`"`)i=`double`,o=!0;else if(/\s/u.test(e))o&&=(n.push(r),r=``,!1);else if(";&|<>$`(){}".includes(e))throw unsupportedSyntax();else r+=e,o=!0}if(a||i)throw Error(`GitHub command contains an unfinished quote or escape.`);if(o&&n.push(r),n.length===0)throw Error(`GitHub command must not be empty.`);return n}function validateGitHubShellInput(e){let t=parseCommand(e.command),n=e.permissions[0];if(e.permissions.length!==1||n?.provider!==`github`)throw Error(`Exactly one GitHub permission is required.`);if(n.access!==`write`)throw Error(`GitHub App commands require explicit write-capable access.`);if(!e.description.trim())throw Error(`description must describe the intended result.`);let[r,i]=t;if(r===`gh`){if(!i)throw Error(`A gh subcommand is required.`)}else if(r===`git`){if(!i||!ALLOWED_GIT_REMOTE_COMMANDS.has(i))throw Error(`Authenticated git supports only fetch, ls-remote, pull, and push; clone with gh repo clone.`)}else if(r!==`gh-signed-commit`)throw Error(`GitHub commands must use gh, an authenticated git remote command, or gh-signed-commit.`);return t}async function assertCommandTargets(e,t,n,r){let i=new Set(t.map(e=>e.toLowerCase())),a,o;if(e[0]===`git`){if(e[2]!==`origin`)throw Error(`Authenticated git commands must use the validated origin remote.`);let t=e[1]===`push`,i=await r.run({command:`cd ${shellQuote(n)} && git remote get-url ${t?`--push `:``}origin`,env:{GIT_TERMINAL_PROMPT:`0`,PATH:`/usr/bin:/bin`}});if(i.exitCode!==0)throw Error(`Could not resolve the origin GitHub repository.`);a=repositoryFromRemote(i.stdout.trim()),o=[a]}else if(e[0]===`gh-signed-commit`){if(o=repoFlagTargets(e.slice(1)),o.length===0)throw Error(`gh-signed-commit requires an explicit --repo owner/repository target.`)}else o=repoFlagTargets(e.slice(1)),e[1]===`repo`&&(e[2]===`clone`||e[2]===`view`||e[2]===`fork`)&&e[3]&&!e[3].startsWith(`-`)&&o.push(canonicalRepository(e[3]));for(let e of o)if(!i.has(e.toLowerCase()))throw Error(`Command target ${JSON.stringify(e)} is not in the declared repositories.`);return a}function repoFlagTargets(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`--repo`||r===`-R`){let i=e[n+1];if(!i)throw Error(`${r} requires an owner/repository value.`);t.push(canonicalRepository(i)),n+=1}else r?.startsWith(`--repo=`)&&t.push(canonicalRepository(r.slice(7)))}return t}function repositoryFromRemote(e){let t=/^https:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(t?.[1])return canonicalRepository(t[1]);let n=/^git@github\.com:([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(n?.[1])return canonicalRepository(n[1]);throw Error(`The origin remote is not a canonical GitHub repository URL.`)}function canonicalRepository(e){let t=e.replace(/\.git$/iu,``);if(!/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u.test(t))throw Error(`Invalid GitHub repository ${JSON.stringify(e)}.`);return t}function repositoryNames(e,t){if(e.length!==1)throw Error(`Exactly one GitHub repository is required.`);let n=new Set;for(let r of e){let e=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)$/u.exec(r);if(!e)throw Error(`Invalid GitHub repository ${JSON.stringify(r)}.`);if(e[1]?.toLowerCase()!==t.toLowerCase())throw Error(`Repository ${JSON.stringify(r)} is outside ${t}.`);n.add(e[2])}if(n.size!==1)throw Error(`Exactly one GitHub repository is required.`);return[...n]}function executablePath(e,t){return e===`gh`?toolingPaths(t).ghReal:e===`gh-signed-commit`?toolingPaths(t).trustedSignedCommit:`git`}function resolveWorkingDirectory(e,t){let n=posix.resolve(`/`,e.resolvePath(``)),r=posix.resolve(`/`,e.resolvePath(t?.trim()||``));if(r!==n&&!r.startsWith(`${n}/`))throw Error(`GitHub command workingDirectory must stay inside the sandbox workspace.`);return r}function sanitizeOutput(e,t,n){let r=e.replaceAll(t,`[redacted]`).replaceAll(n,`[redacted]`);return Buffer.byteLength(r)<=MAX_OUTPUT_BYTES?{value:r,truncated:!1}:{value:`[output truncated: showing final ${MAX_OUTPUT_BYTES} bytes]\n${Buffer.from(r).subarray(-1e5).toString()}`,truncated:!0}}function unsupportedSyntax(){return Error(`GitHub commands support argv syntax only, not pipes, redirects, substitutions, or shell operators.`)}export{executeGitHubShell,githubShellApproval,parseCommand};
1
+ import{getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/index.js";import{shellQuote}from"./shell.js";import{toolingPaths}from"./tooling.js";import{validateRepositoryRoot}from"./repository-root.js";import{posix}from"node:path";const MAX_OUTPUT_BYTES=1e5,leaseQueues=new Map,ALLOWED_GIT_REMOTE_COMMANDS=new Set([`fetch`,`ls-remote`,`pull`,`push`]);function githubShellApproval(e){if(!e)return`not-applicable`;try{return validateGitHubShellInput(e),`not-applicable`}catch(e){return{type:`denied`,reason:e instanceof Error?e.message:`Invalid GitHub command.`}}}async function executeGitHubShell(e,t,n){if(!t)throw Error(`GitHub command access is not configured for this agent.`);let r=validateGitHubShellInput(e),i=await n.getSandbox(),a=resolveWorkingDirectory(i,e.workingDirectory);(r[0]===`git`||r[0]===`gh-signed-commit`)&&(a=await validateRepositoryRoot(i,a));let o=e.permissions[0].repositories,s=await assertCommandTargets(r,o,a,i),c=repositoryNames(o,t.org),l={authorizationDetails:[{type:`github_app_installation`,org:t.org,repositories:c}],subject:{type:`app`}},u=await(n.getConnectToken??getToken)(t.connector,l);if(!u)throw Error(`Connect returned an empty token for ${JSON.stringify(t.connector)}.`);let d=executablePath(r[0],i),f=s?[`-c`,`protocol.allow=never`,`-c`,`protocol.https.allow=always`,r[1],`https://github.com/${s}.git`,...r.slice(3)]:r.slice(1),p=`cd ${shellQuote(a)} && exec ${shellQuote(d)} ${f.map(shellQuote).join(` `)}`,m=`Basic ${Buffer.from(`x-access-token:${u}`).toString(`base64`)}`,h=crypto.randomUUID(),g=`eve-github-${h}`,_=`/tmp/eve-code-gh-${h}`,v=`Basic ${Buffer.from(`x-access-token:${g}`).toString(`base64`)}`,y;try{y=await withGitHubCredentialLease(i,n.sessionId,{authorization:m,placeholder:g,placeholderAuthorization:v,token:u},()=>{let e={GH_CONFIG_DIR:_,GH_PROMPT_DISABLED:`1`};return r[0]!==`git`&&(e.GH_TOKEN=g),e.GIT_CONFIG_COUNT=`2`,e.GIT_CONFIG_KEY_0=`http.https://github.com/.extraheader`,e.GIT_CONFIG_VALUE_0=`Authorization: ${v}`,e.GIT_CONFIG_KEY_1=`core.hooksPath`,e.GIT_CONFIG_VALUE_1=`/dev/null`,e.GIT_TERMINAL_PROMPT=`0`,e.PATH=`/usr/local/bin:/usr/bin:/bin`,i.run({command:p,env:e})},t.broker)}finally{await i.removePath({path:_,recursive:!0,force:!0})}let b=sanitizeOutput(y.stdout,u,m),x=sanitizeOutput(y.stderr,u,m);return{exitCode:y.exitCode,stdout:b.value,stderr:x.value,truncated:b.truncated||x.truncated}}async function withGitHubCredentialLease(e,t,n,r,i){let a=leaseQueues.get(t)??Promise.resolve(),o,s=new Promise(e=>{o=e}),c=a.then(()=>s);leaseQueues.set(t,c),await a;try{return await i(e,{"api.github.com":[{match:{headers:[{key:{exact:`authorization`},value:{regex:`^(?:token|Bearer) ${n.placeholder}$`}}]},transform:[{headers:{authorization:`Bearer ${n.token}`}}]}],"github.com":[{match:{headers:[{key:{exact:`authorization`},value:{exact:n.placeholderAuthorization}}]},transform:[{headers:{authorization:n.authorization}}]}]}),await r()}finally{try{await i(e,null)}finally{o(),leaseQueues.get(t)===c&&leaseQueues.delete(t)}}}function parseCommand(e){let t=e.trim();if(!t)throw Error(`GitHub command must not be empty.`);let n=[],r=``,i=null,a=!1,o=!1;for(let e of t){if(a){r+=e,a=!1,o=!0;continue}if(e===`\\`&&i!==`single`){a=!0,o=!0;continue}if(i===`single`){e===`'`?i=null:r+=e;continue}if(i===`double`){if(e===`"`)i=null;else if(e===`$`||e==="`")throw unsupportedSyntax();else r+=e;continue}if(e===`'`)i=`single`,o=!0;else if(e===`"`)i=`double`,o=!0;else if(/\s/u.test(e))o&&=(n.push(r),r=``,!1);else if(";&|<>$`(){}".includes(e))throw unsupportedSyntax();else r+=e,o=!0}if(a||i)throw Error(`GitHub command contains an unfinished quote or escape.`);if(o&&n.push(r),n.length===0)throw Error(`GitHub command must not be empty.`);return n}function validateGitHubShellInput(e){let t=parseCommand(e.command),n=e.permissions[0];if(e.permissions.length!==1||n?.provider!==`github`)throw Error(`Exactly one GitHub permission is required.`);if(n.access!==`write`)throw Error(`GitHub App commands require explicit write-capable access.`);if(!e.description.trim())throw Error(`description must describe the intended result.`);let[r,i]=t;if(r===`gh`){if(!i)throw Error(`A gh subcommand is required.`)}else if(r===`git`){if(!i||!ALLOWED_GIT_REMOTE_COMMANDS.has(i))throw Error(`Authenticated git supports only fetch, ls-remote, pull, and push; clone with gh repo clone.`)}else if(r!==`gh-signed-commit`)throw Error(`GitHub commands must use gh, an authenticated git remote command, or gh-signed-commit.`);return t}async function assertCommandTargets(e,t,n,r){let i=new Set(t.map(e=>e.toLowerCase())),a,o;if(e[0]===`git`){if(e[2]!==`origin`)throw Error(`Authenticated git commands must use the validated origin remote.`);let t=e[1]===`push`,i=await r.run({command:`cd ${shellQuote(n)} && git remote get-url ${t?`--push `:``}origin`,env:{GIT_TERMINAL_PROMPT:`0`,PATH:`/usr/bin:/bin`}});if(i.exitCode!==0)throw Error(`Could not resolve the origin GitHub repository.`);a=repositoryFromRemote(i.stdout.trim()),o=[a]}else if(e[0]===`gh-signed-commit`){if(o=repoFlagTargets(e.slice(1)),o.length===0)throw Error(`gh-signed-commit requires an explicit --repo owner/repository target.`)}else o=repoFlagTargets(e.slice(1)),e[1]===`repo`&&(e[2]===`clone`||e[2]===`view`||e[2]===`fork`)&&e[3]&&!e[3].startsWith(`-`)&&o.push(canonicalRepository(e[3]));for(let e of o)if(!i.has(e.toLowerCase()))throw Error(`Command target ${JSON.stringify(e)} is not in the declared repositories.`);return a}function repoFlagTargets(e){let t=[];for(let n=0;n<e.length;n+=1){let r=e[n];if(r===`--repo`||r===`-R`){let i=e[n+1];if(!i)throw Error(`${r} requires an owner/repository value.`);t.push(canonicalRepository(i)),n+=1}else r?.startsWith(`--repo=`)&&t.push(canonicalRepository(r.slice(7)))}return t}function repositoryFromRemote(e){let t=/^https:\/\/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(t?.[1])return canonicalRepository(t[1]);let n=/^git@github\.com:([^/]+\/[^/]+?)(?:\.git)?$/iu.exec(e);if(n?.[1])return canonicalRepository(n[1]);throw Error(`The origin remote is not a canonical GitHub repository URL.`)}function canonicalRepository(e){let t=e.replace(/\.git$/iu,``);if(!/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u.test(t))throw Error(`Invalid GitHub repository ${JSON.stringify(e)}.`);return t}function repositoryNames(e,t){if(e.length!==1)throw Error(`Exactly one GitHub repository is required.`);let n=new Set;for(let r of e){let e=/^([A-Za-z0-9-]+)\/([A-Za-z0-9._-]+)$/u.exec(r);if(!e)throw Error(`Invalid GitHub repository ${JSON.stringify(r)}.`);if(e[1]?.toLowerCase()!==t.toLowerCase())throw Error(`Repository ${JSON.stringify(r)} is outside ${t}.`);n.add(e[2])}if(n.size!==1)throw Error(`Exactly one GitHub repository is required.`);return[...n]}function executablePath(e,t){return e===`gh`?toolingPaths(t).ghReal:e===`gh-signed-commit`?toolingPaths(t).trustedSignedCommit:`git`}function resolveWorkingDirectory(e,t){let n=posix.resolve(`/`,e.resolvePath(``)),r=posix.resolve(`/`,e.resolvePath(t?.trim()||``));if(r!==n&&!r.startsWith(`${n}/`))throw Error(`GitHub command workingDirectory must stay inside the sandbox workspace.`);return r}function sanitizeOutput(e,t,n){let r=e.replaceAll(t,`[redacted]`).replaceAll(n,`[redacted]`);return Buffer.byteLength(r)<=MAX_OUTPUT_BYTES?{value:r,truncated:!1}:{value:`[output truncated: showing final ${MAX_OUTPUT_BYTES} bytes]\n${Buffer.from(r).subarray(-1e5).toString()}`,truncated:!0}}function unsupportedSyntax(){return Error(`GitHub commands support argv syntax only, not pipes, redirects, substitutions, or shell operators.`)}export{executeGitHubShell,githubShellApproval,parseCommand};
@@ -1 +1 @@
1
- import extension_default from"../extension.js";import{deleteTokenCacheEntry,getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.2.0_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_3fe44d656b2dcd93a04011e80966afff/node_modules/@vercel/connect/dist/index.js";import{z}from"#compiled/zod/index.js";const RepoSchema=z.string().trim().regex(/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u).transform(e=>e.toLowerCase()),PullRequestWatchInputSchema=z.object({repo:RepoSchema,pullRequestNumber:z.number().int().positive(),reviewOwner:z.string().trim().min(1),redHeadOid:z.string().regex(/^[0-9a-f]{40}$/iu).transform(e=>e.toLowerCase())}),PrwatchDeleteInputSchema=z.object({repo:RepoSchema,pullRequestNumber:z.number().int().positive()}),PullRequestSchema=z.object({head:z.object({sha:z.string().min(1)}),html_url:z.string().url(),merged:z.boolean().optional().default(!1),state:z.enum([`open`,`closed`])}),ReviewSchema=z.object({commit_id:z.string().nullable(),state:z.string(),submitted_at:z.string().nullable(),user:z.object({login:z.string()}).nullable()});function initialPullRequestWatchNotificationState(){return{previousSnapshot:null,redHeadPolls:0,redHeadWakeSent:!1}}function framePullRequestWatchWake(e){return`${e}\n\nThis is an internal watch wake, not a request for a progress report. Continue any necessary work. Send a user-facing response only when the original request is complete or a new blocker requires human input. Otherwise, finish by replying with exactly <eve-empty-delivery/> and no other text. Do not report that nothing changed or that work is still in progress.`}function reviewFingerprint(e){return e?.ownerReviewState===null||e===null?null:`${e.ownerReviewState}:${e.ownerReviewSubmittedAt??``}`}function advancePullRequestWatchNotification(e){let t=e.state.previousSnapshot,n=e.snapshot.headOid!==(t?.headOid??e.redHeadOid),r=t!==null&&reviewFingerprint(e.snapshot)!==reviewFingerprint(t),i=e.snapshot.headOid===e.redHeadOid,a=i?e.state.redHeadPolls+1:0,o=null;return n?o=`head_changed`:r?o=`owner_review_changed`:i&&!e.state.redHeadWakeSent&&a===e.staleAfterPolls&&(o=`red_head_stalled`),{state:{previousSnapshot:e.snapshot,redHeadPolls:a,redHeadWakeSent:e.state.redHeadWakeSent||o===`red_head_stalled`},wakeReason:o}}var RetryablePullRequestWatchError=class extends Error{},GitHubWatchResponseError=class extends Error{status;constructor(e,t){super(t),this.name=`GitHubWatchResponseError`,this.status=e}};function errorStatus(e){return typeof e!=`object`||!e||!(`status`in e)?null:typeof e.status==`number`?e.status:null}function shouldRefreshPullRequestWatchToken(e){return errorStatus(e)===401}function isRetryablePullRequestWatchError(e){let t=errorStatus(e);return t===429||t!==null&&t>=500||e instanceof RetryablePullRequestWatchError||e instanceof TypeError||e instanceof Error&&(/^GitHub watch (?:request|token request) failed:/u.test(e.message)||/\((?:429|5\d{2})\b/u.test(e.message))}function pullRequestWatchSnapshot(e){let t=e.reviewOwner.toLowerCase(),n=e.pullRequest.head.sha.toLowerCase(),r=e.reviews.filter(e=>e.commit_id?.toLowerCase()===n&&e.user?.login.toLowerCase()===t).at(-1);return{headOid:n,ownerApprovedCurrentHead:r?.state.toUpperCase()===`APPROVED`,ownerReviewState:r?.state.toUpperCase()??null,ownerReviewSubmittedAt:r?.submitted_at??null,state:e.pullRequest.merged?`merged`:e.pullRequest.state,url:e.pullRequest.html_url}}function repoParts(e){let[t,n]=e.split(`/`);if(t===void 0||n===void 0)throw Error(`Invalid GitHub repository: ${e}`);return{owner:t,name:n}}function repoFullName(e){let t=repoParts(e);return`${t.owner}/${t.name}`}function repoApiPath(e){let t=repoParts(e);return`/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.name)}`}function redactGithubToken(e,t){return t.length===0?e:e.split(t).join(`[redacted]`)}function githubHeaders(e){return{Accept:`application/vnd.github+json`,Authorization:`Bearer ${e}`,"X-GitHub-Api-Version":`2022-11-28`}}function githubTokenParams(e,t){return{authorizationDetails:[{org:e,repositories:[t],type:`github_app_installation`}],subject:{type:`app`}}}async function mintWatchToken(e){let t=extension_default.config.github;if(t===void 0)throw Error(`GitHub is not configured for this agent.`);let n=repoParts(e);if(n.owner!==t.org.toLowerCase())throw Error(`Repository ${e} is outside ${t.org}.`);let r=await getToken(t.connector,githubTokenParams(t.org,n.name));if(r.length===0)throw Error(`Connect returned an empty GitHub token for ${e}.`);return r}async function invalidateWatchToken(e){let t=extension_default.config.github;if(t===void 0)return;let n=repoParts(e);deleteTokenCacheEntry(t.connector,githubTokenParams(t.org,n.name))}async function githubJson(e,t){let n;try{n=await fetch(e,{headers:githubHeaders(t)})}catch(e){throw new RetryablePullRequestWatchError(`GitHub watch request failed: ${e instanceof Error?e.message:String(e)}`)}if(n.ok)return n.json();let r=await n.text().catch(()=>``),i=`GitHub request failed (${n.status} ${n.statusText})`+(r.length>0?`: ${redactGithubToken(r,t)}`:``);throw n.status===429||n.status>=500?new RetryablePullRequestWatchError(i):new GitHubWatchResponseError(n.status,i)}async function readPullRequestWatchSnapshotWithToken(e,t){let n=`https://api.github.com${repoApiPath(e.repo)}/pulls/${e.pullRequestNumber}`,r=PullRequestSchema.parse(await githubJson(n,t));if(r.state===`closed`||r.merged)return pullRequestWatchSnapshot({pullRequest:r,reviewOwner:e.reviewOwner,reviews:[]});let i=[];for(let r=1;r<=20;r+=1){let a=z.array(ReviewSchema).parse(await githubJson(`${n}/reviews?per_page=100&page=${r}`,t));if(i.push(...a),a.length<100)break;if(r===20)throw Error(`PR #${e.pullRequestNumber} has too many reviews to verify`)}return pullRequestWatchSnapshot({pullRequest:r,reviewOwner:e.reviewOwner,reviews:i})}async function readPullRequestWatchSnapshot(e){for(let t=0;t<2;t+=1){let n;try{n=await mintWatchToken(e.repo)}catch(e){throw isRetryablePullRequestWatchError(e)?new RetryablePullRequestWatchError(`GitHub watch token request failed: ${e instanceof Error?e.message:String(e)}`):e}try{return await readPullRequestWatchSnapshotWithToken(e,n)}catch(n){if(t>0||!shouldRefreshPullRequestWatchToken(n))throw n;await invalidateWatchToken(e.repo)}}throw Error(`Pull request watch token refresh exhausted unexpectedly.`)}export{PrwatchDeleteInputSchema,PullRequestWatchInputSchema,RepoSchema,advancePullRequestWatchNotification,framePullRequestWatchWake,initialPullRequestWatchNotificationState,isRetryablePullRequestWatchError,pullRequestWatchSnapshot,readPullRequestWatchSnapshot,repoFullName,shouldRefreshPullRequestWatchToken};
1
+ import extension_default from"../extension.js";import{deleteTokenCacheEntry,getToken}from"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/token.js";import"../../../../node_modules/.pnpm/@vercel_connect@2.3.3_@ai-sdk_mcp@2.0.52_zod@4.5.4__@auth_core@0.41.2_@chat-adapter_sla_a37674779346d612fa7d2ca9bd316494/node_modules/@vercel/connect/dist/index.js";import{z}from"#compiled/zod/index.js";const RepoSchema=z.string().trim().regex(/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/u).transform(e=>e.toLowerCase()),PullRequestWatchInputSchema=z.object({repo:RepoSchema,pullRequestNumber:z.number().int().positive(),reviewOwner:z.string().trim().min(1),redHeadOid:z.string().regex(/^[0-9a-f]{40}$/iu).transform(e=>e.toLowerCase())}),PrwatchDeleteInputSchema=z.object({repo:RepoSchema,pullRequestNumber:z.number().int().positive()}),PullRequestSchema=z.object({head:z.object({sha:z.string().min(1)}),html_url:z.string().url(),merged:z.boolean().optional().default(!1),state:z.enum([`open`,`closed`])}),ReviewSchema=z.object({commit_id:z.string().nullable(),state:z.string(),submitted_at:z.string().nullable(),user:z.object({login:z.string()}).nullable()});function initialPullRequestWatchNotificationState(){return{previousSnapshot:null,redHeadPolls:0,redHeadWakeSent:!1}}function framePullRequestWatchWake(e){return`${e}\n\nThis is an internal watch wake, not a request for a progress report. Continue any necessary work. Send a user-facing response only when the original request is complete or a new blocker requires human input. Otherwise, finish by replying with exactly <eve-empty-delivery/> and no other text. Do not report that nothing changed or that work is still in progress.`}function reviewFingerprint(e){return e?.ownerReviewState===null||e===null?null:`${e.ownerReviewState}:${e.ownerReviewSubmittedAt??``}`}function advancePullRequestWatchNotification(e){let t=e.state.previousSnapshot,n=e.snapshot.headOid!==(t?.headOid??e.redHeadOid),r=t!==null&&reviewFingerprint(e.snapshot)!==reviewFingerprint(t),i=e.snapshot.headOid===e.redHeadOid,a=i?e.state.redHeadPolls+1:0,o=null;return n?o=`head_changed`:r?o=`owner_review_changed`:i&&!e.state.redHeadWakeSent&&a===e.staleAfterPolls&&(o=`red_head_stalled`),{state:{previousSnapshot:e.snapshot,redHeadPolls:a,redHeadWakeSent:e.state.redHeadWakeSent||o===`red_head_stalled`},wakeReason:o}}var RetryablePullRequestWatchError=class extends Error{},GitHubWatchResponseError=class extends Error{status;constructor(e,t){super(t),this.name=`GitHubWatchResponseError`,this.status=e}};function errorStatus(e){return typeof e!=`object`||!e||!(`status`in e)?null:typeof e.status==`number`?e.status:null}function shouldRefreshPullRequestWatchToken(e){return errorStatus(e)===401}function isRetryablePullRequestWatchError(e){let t=errorStatus(e);return t===429||t!==null&&t>=500||e instanceof RetryablePullRequestWatchError||e instanceof TypeError||e instanceof Error&&(/^GitHub watch (?:request|token request) failed:/u.test(e.message)||/\((?:429|5\d{2})\b/u.test(e.message))}function pullRequestWatchSnapshot(e){let t=e.reviewOwner.toLowerCase(),n=e.pullRequest.head.sha.toLowerCase(),r=e.reviews.filter(e=>e.commit_id?.toLowerCase()===n&&e.user?.login.toLowerCase()===t).at(-1);return{headOid:n,ownerApprovedCurrentHead:r?.state.toUpperCase()===`APPROVED`,ownerReviewState:r?.state.toUpperCase()??null,ownerReviewSubmittedAt:r?.submitted_at??null,state:e.pullRequest.merged?`merged`:e.pullRequest.state,url:e.pullRequest.html_url}}function repoParts(e){let[t,n]=e.split(`/`);if(t===void 0||n===void 0)throw Error(`Invalid GitHub repository: ${e}`);return{owner:t,name:n}}function repoFullName(e){let t=repoParts(e);return`${t.owner}/${t.name}`}function repoApiPath(e){let t=repoParts(e);return`/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.name)}`}function redactGithubToken(e,t){return t.length===0?e:e.split(t).join(`[redacted]`)}function githubHeaders(e){return{Accept:`application/vnd.github+json`,Authorization:`Bearer ${e}`,"X-GitHub-Api-Version":`2022-11-28`}}function githubTokenParams(e,t){return{authorizationDetails:[{org:e,repositories:[t],type:`github_app_installation`}],subject:{type:`app`}}}async function mintWatchToken(e){let t=extension_default.config.github;if(t===void 0)throw Error(`GitHub is not configured for this agent.`);let n=repoParts(e);if(n.owner!==t.org.toLowerCase())throw Error(`Repository ${e} is outside ${t.org}.`);let r=await getToken(t.connector,githubTokenParams(t.org,n.name));if(r.length===0)throw Error(`Connect returned an empty GitHub token for ${e}.`);return r}async function invalidateWatchToken(e){let t=extension_default.config.github;if(t===void 0)return;let n=repoParts(e);deleteTokenCacheEntry(t.connector,githubTokenParams(t.org,n.name))}async function githubJson(e,t){let n;try{n=await fetch(e,{headers:githubHeaders(t)})}catch(e){throw new RetryablePullRequestWatchError(`GitHub watch request failed: ${e instanceof Error?e.message:String(e)}`)}if(n.ok)return n.json();let r=await n.text().catch(()=>``),i=`GitHub request failed (${n.status} ${n.statusText})`+(r.length>0?`: ${redactGithubToken(r,t)}`:``);throw n.status===429||n.status>=500?new RetryablePullRequestWatchError(i):new GitHubWatchResponseError(n.status,i)}async function readPullRequestWatchSnapshotWithToken(e,t){let n=`https://api.github.com${repoApiPath(e.repo)}/pulls/${e.pullRequestNumber}`,r=PullRequestSchema.parse(await githubJson(n,t));if(r.state===`closed`||r.merged)return pullRequestWatchSnapshot({pullRequest:r,reviewOwner:e.reviewOwner,reviews:[]});let i=[];for(let r=1;r<=20;r+=1){let a=z.array(ReviewSchema).parse(await githubJson(`${n}/reviews?per_page=100&page=${r}`,t));if(i.push(...a),a.length<100)break;if(r===20)throw Error(`PR #${e.pullRequestNumber} has too many reviews to verify`)}return pullRequestWatchSnapshot({pullRequest:r,reviewOwner:e.reviewOwner,reviews:i})}async function readPullRequestWatchSnapshot(e){for(let t=0;t<2;t+=1){let n;try{n=await mintWatchToken(e.repo)}catch(e){throw isRetryablePullRequestWatchError(e)?new RetryablePullRequestWatchError(`GitHub watch token request failed: ${e instanceof Error?e.message:String(e)}`):e}try{return await readPullRequestWatchSnapshotWithToken(e,n)}catch(n){if(t>0||!shouldRefreshPullRequestWatchToken(n))throw n;await invalidateWatchToken(e.repo)}}throw Error(`Pull request watch token refresh exhausted unexpectedly.`)}export{PrwatchDeleteInputSchema,PullRequestWatchInputSchema,RepoSchema,advancePullRequestWatchNotification,framePullRequestWatchWake,initialPullRequestWatchNotificationState,isRetryablePullRequestWatchError,pullRequestWatchSnapshot,readPullRequestWatchSnapshot,repoFullName,shouldRefreshPullRequestWatchToken};
@@ -1 +1 @@
1
- import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createAgentSourceRegistry,defineProgrammaticAgentSource,loadProgrammaticModuleNamespace,memoizeModuleNamespaceFactories}from"#compiler/source-graph.js";const revision=`eve@${resolveInstalledPackageInfo().version}:compiled-manifest-v50`,localDefaults=defineProgrammaticAgentSource({id:`eve:defaults`,revision,modules:[{logicalPath:`agent.ts`,loadNamespace:()=>import(`#framework/sources/modules/agent.js`)},{logicalPath:`sandbox.ts`,semanticRevision:`eve:default-sandbox:v1`,loadNamespace:()=>import(`#framework/sources/modules/sandbox.js`)},{logicalPath:`tools/bash.ts`,loadNamespace:()=>import(`#tools/provided/bash.js`)},{logicalPath:`tools/read_file.ts`,loadNamespace:()=>import(`#tools/provided/read-file.js`)},{logicalPath:`tools/write_file.ts`,loadNamespace:()=>import(`#tools/provided/write-file.js`)},{logicalPath:`tools/web_fetch.ts`,loadNamespace:()=>import(`#tools/provided/web-fetch.js`)},{logicalPath:`tools/load_skill.ts`,loadNamespace:()=>import(`#tools/provided/load-skill.js`)},{logicalPath:`tools/connection_search.ts`,loadNamespace:()=>import(`#tools/framework/connection-search.js`)},{logicalPath:`tools/task_cancel.ts`,loadNamespace:()=>import(`#tools/framework/task-cancel.js`)},{logicalPath:`tools/web_search.ts`,loadNamespace:()=>import(`#tools/provided/web-search.js`)}]}),rootDefaults=defineProgrammaticAgentSource({id:`eve:root-defaults`,revision,modules:[{logicalPath:`tools/agent.ts`,loadNamespace:()=>import(`#tools/framework/agent.js`)},{logicalPath:`channels/eve.ts`,loadNamespace:()=>import(`#framework/sources/modules/eve-channel.js`)},{logicalPath:`channels/home.ts`,loadNamespace:()=>import(`#framework/sources/modules/home-channel.js`)}]}),memoryWrapperTemplateSource=defineProgrammaticAgentSource({id:`eve:memory-wrapper`,revision,modules:[{logicalPath:`tools/memory-wrapper.ts`,loadNamespace:async e=>{let{loadMemoryWrapperNamespace:t}=await import(`#framework/sources/modules/memory-wrapper.js`);return await t(e)}}]}),frameworkAgentSourceRegistry=createAgentSourceRegistry([{applyTo:`all-local-nodes`,source:localDefaults},{applyTo:`root`,source:rootDefaults}],{templates:[memoryWrapperTemplateSource]}),memoryWrapperTemplate=frameworkAgentSourceRegistry.templates.get(memoryWrapperTemplateSource.id);async function loadFrameworkProgrammaticModule(e,t){return memoizeModuleNamespaceFactories(await loadProgrammaticModuleNamespace({backing:e,dependencyNamespaces:t,registries:[frameworkAgentSourceRegistry]}))}export{frameworkAgentSourceRegistry,loadFrameworkProgrammaticModule,memoryWrapperTemplate};
1
+ import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createAgentSourceRegistry,defineProgrammaticAgentSource,loadProgrammaticModuleNamespace,memoizeModuleNamespaceFactories}from"#compiler/source-graph.js";const revision=`eve@${resolveInstalledPackageInfo().version}:compiled-manifest-v52`,localDefaults=defineProgrammaticAgentSource({id:`eve:defaults`,revision,modules:[{logicalPath:`agent.ts`,loadNamespace:()=>import(`#framework/sources/modules/agent.js`)},{logicalPath:`sandbox.ts`,semanticRevision:`eve:default-sandbox:v1`,loadNamespace:()=>import(`#framework/sources/modules/sandbox.js`)},{logicalPath:`tools/bash.ts`,loadNamespace:()=>import(`#tools/provided/bash.js`)},{logicalPath:`tools/read_file.ts`,loadNamespace:()=>import(`#tools/provided/read-file.js`)},{logicalPath:`tools/write_file.ts`,loadNamespace:()=>import(`#tools/provided/write-file.js`)},{logicalPath:`tools/web_fetch.ts`,loadNamespace:()=>import(`#tools/provided/web-fetch.js`)},{logicalPath:`tools/load_skill.ts`,loadNamespace:()=>import(`#tools/provided/load-skill.js`)},{logicalPath:`tools/connection_search.ts`,loadNamespace:()=>import(`#tools/framework/connection-search.js`)},{logicalPath:`tools/task_cancel.ts`,loadNamespace:()=>import(`#tools/framework/task-cancel.js`)},{logicalPath:`tools/web_search.ts`,loadNamespace:()=>import(`#tools/provided/web-search.js`)}]}),rootDefaults=defineProgrammaticAgentSource({id:`eve:root-defaults`,revision,modules:[{logicalPath:`tools/agent.ts`,loadNamespace:()=>import(`#tools/framework/agent.js`)},{logicalPath:`channels/eve.ts`,loadNamespace:()=>import(`#framework/sources/modules/eve-channel.js`)},{logicalPath:`channels/home.ts`,loadNamespace:()=>import(`#framework/sources/modules/home-channel.js`)}]}),memoryWrapperTemplateSource=defineProgrammaticAgentSource({id:`eve:memory-wrapper`,revision,modules:[{logicalPath:`tools/memory-wrapper.ts`,loadNamespace:async e=>{let{loadMemoryWrapperNamespace:t}=await import(`#framework/sources/modules/memory-wrapper.js`);return await t(e)}}]}),frameworkAgentSourceRegistry=createAgentSourceRegistry([{applyTo:`all-local-nodes`,source:localDefaults},{applyTo:`root`,source:rootDefaults}],{templates:[memoryWrapperTemplateSource]}),memoryWrapperTemplate=frameworkAgentSourceRegistry.templates.get(memoryWrapperTemplateSource.id);async function loadFrameworkProgrammaticModule(e,t){return memoizeModuleNamespaceFactories(await loadProgrammaticModuleNamespace({backing:e,dependencyNamespaces:t,registries:[frameworkAgentSourceRegistry]}))}export{frameworkAgentSourceRegistry,loadFrameworkProgrammaticModule,memoryWrapperTemplate};
@@ -1,9 +1,10 @@
1
1
  import { type AuthorizationChallenge } from "#harness/authorization.js";
2
2
  import type { HarnessSession, HarnessToolMap, StepInput } from "#harness/types.js";
3
+ import type { InputRequest } from "#shared/input.js";
3
4
  export interface ApprovalDeliveryResult {
4
5
  readonly challenges: readonly AuthorizationChallenge[];
5
6
  readonly feedback: readonly string[];
6
- readonly kind: "continue" | "continue-coordination" | "authorization-required" | "park";
7
+ readonly kind: "continue" | "continue-coordination" | "authorization-required" | "responses-completed" | "park";
7
8
  readonly session: HarnessSession;
8
9
  readonly stepInput?: StepInput;
9
10
  }
@@ -25,21 +26,10 @@ export interface ApprovalDeliveryResult {
25
26
  * creation commit before long-running policy execution. Candidate results also
26
27
  * commit before lifecycle events are projected by the next stack layer.
27
28
  */
28
- /** Returns whether this invocation should prepare tools for persisted policy work. */
29
- export declare function shouldPrepareApprovalPolicyTools(input: {
30
- readonly now?: number;
31
- readonly session: HarnessSession;
32
- readonly stepInput?: StepInput;
33
- }): boolean;
34
- /** Returns whether this invocation can replay a previously approved tool call. */
35
- export declare function shouldPrepareApprovalReplayTools(input: {
36
- readonly now?: number;
37
- readonly session: HarnessSession;
38
- readonly stepInput?: StepInput;
39
- }): boolean;
40
29
  export declare function coordinateApprovalDelivery(input: {
41
30
  readonly now?: number;
42
31
  readonly session: HarnessSession;
43
32
  readonly stepInput?: StepInput;
44
33
  readonly tools: HarnessToolMap;
34
+ readonly prepareTools?: (request: InputRequest) => Promise<HarnessToolMap>;
45
35
  }): Promise<ApprovalDeliveryResult>;
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{AuthKey,SessionKey}from"#context/keys.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildApprovalResponseAuth,handleApprovalResponsePolicyError}from"#execution/tool-auth.js";import{getPendingInputBatches}from"#harness/pending-input-batches.js";import{clearPendingAuthorization,getAuthorizationResult,getPendingAuthorization,isAuthorizationSignal}from"#harness/authorization.js";import{createApprovalCandidate,expireApprovalCandidates,finishApprovalCandidate,getActiveApprovalCandidate,getApprovalAuditState,markApprovalCandidateAuthorizationRequired,settleAllowedCandidate,settleDirectApprovalResponse}from"#harness/approval-candidates.js";import{isApprovalRequest}from"#harness/input-request-class.js";const UNAUTHENTICATED_APPROVAL_FEEDBACK=`Authentication is required to respond to this approval.`;function shouldPrepareApprovalPolicyTools(e){let t=getPendingInputBatches(e.session.state),n=[...(e.stepInput?.attributedInputResponses??[]).map(({response:e})=>e),...e.stepInput?.inputResponses??[]];if(t.some(e=>e.requests.some(e=>isApprovalRequest(e)&&n.some(t=>t.requestId===e.requestId))))return!1;let r=e.now??Date.now();return getApprovalAuditState(e.session.state).activeCandidates.some(e=>e.expiresAt>r&&(e.status===`pending`||(e.authorizationChallenges?.some(e=>getAuthorizationResult(e.name)!==void 0)??!1)))}function shouldPrepareApprovalReplayTools(e){if(shouldPrepareApprovalPolicyTools(e))return!0;let t=getPendingInputBatches(e.session.state),n=[...(e.stepInput?.attributedInputResponses??[]).map(({response:e})=>e),...e.stepInput?.inputResponses??[]],r=t.length===1?t[0]:void 0;r!==void 0&&typeof e.stepInput?.message==`string`&&!n.some(e=>r.requests.some(t=>t.requestId===e.requestId))&&n.push(...resolveTextToResponses(e.stepInput.message,r.requests.filter(e=>!r.responseAuthRequiredRequestIds?.includes(e.requestId))));let i=new Set(n.filter(e=>e.optionId===`approve`).map(e=>e.requestId));return t.some(e=>e.requests.some(e=>isApprovalRequest(e)&&i.has(e.requestId)))}async function coordinateApprovalDelivery(e){let t=e.now??Date.now(),n=getApprovalAuditState(e.session.state).activeCandidates.filter(e=>e.expiresAt<=t).flatMap(e=>e.authorizationChallenges?.map(e=>e.name)??[]),r=expireApprovalCandidates({now:t,state:e.session.state}),i={...e.session,state:clearPendingAuthorization(r,n)},a=getApprovalAuditState(i.state),o=getPendingInputBatches(i.state),s=new Set(o.flatMap(e=>e.requests.map(e=>e.requestId))),c=a.settlements.filter(e=>s.has(e.requestId)),l=new Set(a.settlements.map(e=>e.requestId)),u=new Set([...l].filter(e=>!s.has(e))),d=hasResponseForRequest(e.stepInput,u),f=d?removeConsumedResponses(e.stepInput,u):e.stepInput;if(d&&c.length===0&&!hasMeaningfulInput(f))return deliveryResult(i,f,`park`);if(o.length===0)return deliveryResult(i,f);let p=f,m=new Set(o.flatMap(e=>e.responseAuthRequiredRequestIds??[])),h=o.flatMap(e=>e.requests),g=new Map(h.map(e=>[e.requestId,e])),_=[],v=[],y=new Set,b=!1,x=getApprovalAuditState(i.state).activeCandidates,S=[...p?.attributedInputResponses??[],...(p?.inputResponses??[]).map(e=>({auth:void 0,response:e}))];for(let{auth:e,response:n}of S){let r=g.get(n.requestId);if(r===void 0||!isApprovalRequest(r))continue;if(!m.has(n.requestId)){let r=contextStorage.getStore(),a=e===void 0?r?.get(AuthKey)??r?.get(SessionKey)?.auth.current??null:e;if(a!==null&&(n.optionId===`approve`||n.optionId===`cancel`)){let e=settleDirectApprovalResponse({actor:a,outcome:n.optionId===`approve`?`allowed`:`cancelled`,requestId:n.requestId,settledAt:t,state:i.state});i={...i,state:e.state},b||=e.changed}continue}if(y.add(n.requestId),n.optionId===`cancel`){let r=e===void 0?buildCallbackContext().session.auth.current:e;if(r===null){v.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let a=settleDirectApprovalResponse({actor:r,outcome:`cancelled`,requestId:n.requestId,settledAt:t,state:i.state});i={...i,state:a.state},b||=a.changed;continue}if(n.optionId!==`approve`)continue;let a=e===void 0?buildCallbackContext().session.auth.current:e;if(a===null){v.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let o=createApprovalCandidate({candidateIdPrefix:approvalCandidateIdPrefix(r.requestId,a),createdAt:t,expiresAt:t+6e5,requestId:r.requestId,responder:a,state:i.state});i={...i,state:o.state},b||=o.changed}let C=removeConsumedResponses(p,y);if(y.size>0)return deliveryResult(i,C,b?`continue-coordination`:`continue`,[],v);if(b)return deliveryResult(i,C,`continue`,[],v);let w=new Set(getPendingAuthorization(i.state)?.challenges.map(e=>e.name)??[]);for(let n of x){if(n.status===`authorization-required`){let e=n.authorizationChallenges??[];if(!e.some(e=>getAuthorizationResult(e.name)!==void 0)){_.push(...e.filter(e=>!w.has(e.name)));continue}}let r=g.get(n.requestId);if(r===void 0||getActiveApprovalCandidate(i.state,n.candidateId)===void 0)continue;let a=await authorizeCandidate({candidateId:n.candidateId,now:t,request:r,responder:n.responder,session:i,tools:e.tools});i=a.session,b||=a.didCommit,_.push(...a.challenges);let o=getApprovalAuditState(i.state).settlements.find(e=>e.requestId===n.requestId);o!==void 0&&c.push(o)}let T=appendSettledResponses(C,c);return c.length>0?deliveryResult(i,T,`continue`):b?deliveryResult(i,T,`continue-coordination`):deliveryResult(i,T,_.length>0?`authorization-required`:`continue`,_)}async function authorizeCandidate(e){let t={...e.session,state:expireApprovalCandidates({now:e.now,state:e.session.state})};if(getActiveApprovalCandidate(t.state,e.candidateId)===void 0)return{challenges:[],didCommit:!1,session:t};let n=e.tools.get(e.request.action.toolName)?.approval,r=n!==void 0&&typeof n!=`function`?n.response:void 0;if(r===void 0)return failCandidate({...e,reason:`Approval authorization is temporarily unavailable. Please try again.`,session:t});try{let n=buildCallbackContext(),i=await withAuthorizerTimeout(r({auth:buildApprovalResponseAuth({responder:e.responder,scope:e.candidateId}),request:{callId:e.request.action.callId,requestId:e.request.requestId,toolInput:e.request.action.input,toolName:e.request.action.toolName},response:{decision:`approve`},responder:e.responder,session:{id:n.session.id,initiator:n.session.auth.initiator,parent:n.session.parent,turn:n.session.turn}}));if(i.status===`rejected`)return t={...t,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:i.reason,state:t.state,status:`rejected`})},{challenges:[],didCommit:!0,session:t};if(i.status!==`allowed`)return failCandidate({...e,session:t});let a=settleAllowedCandidate({candidateId:e.candidateId,settledAt:e.now,state:t.state});return{challenges:[],didCommit:a.changed,session:{...t,state:a.state}}}catch(n){let r=await handleApprovalResponsePolicyError(n).catch(()=>void 0);if(isAuthorizationSignal(r)){let n=r.challenges.map(e=>Date.parse(e.challenge.expiresAt??``)).filter(Number.isFinite).sort((e,t)=>e-t)[0];return t={...t,state:markApprovalCandidateAuthorizationRequired({authorizationChallenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),candidateId:e.candidateId,expiresAt:n,state:t.state})},{challenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),didCommit:!0,session:t}}return failCandidate({...e,session:t})}}function failCandidate(e){let t=e.reason??`We couldn’t verify your approval. Please try again.`;return{challenges:[],didCommit:!0,session:{...e.session,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:t,state:e.session.state,status:`failed`})}}}function hasResponseForRequest(e,t){return e?.attributedInputResponses?.some(({response:e})=>t.has(e.requestId))===!0||e?.inputResponses?.some(e=>t.has(e.requestId))===!0}function hasMeaningfulInput(e){return e?.message!==void 0||(e?.attributedInputResponses?.length??0)>0||(e?.inputResponses?.length??0)>0||(e?.runtimeActionResults?.length??0)>0}function appendSettledResponses(e,t){if(t.length===0)return e;let n=new Set([...(e?.inputResponses??[]).map(e=>e.requestId),...(e?.attributedInputResponses??[]).map(({response:e})=>e.requestId)]),r=t.filter(e=>!n.has(e.requestId));return r.length===0?e:{...e,inputResponses:[...e?.inputResponses??[],...r.map(e=>({optionId:e.outcome===`allowed`?`approve`:`cancel`,requestId:e.requestId}))]}}function removeConsumedResponses(e,t){if(e===void 0)return;let n=(e.attributedInputResponses??[]).filter(({response:e})=>!t.has(e.requestId)),r=[...(e.inputResponses??[]).filter(e=>!t.has(e.requestId)),...n.map(({response:e})=>e)];return{...e,attributedInputResponses:void 0,inputResponses:r}}function deliveryResult(e,t,n=`continue`,r=[],i=[]){return{challenges:r,feedback:i,kind:n,session:e,stepInput:t}}function approvalCandidateIdPrefix(e,t){let n=[t.authenticator,t.issuer??``,t.principalType,t.principalId].join(`:`);return`${encodeCandidateIdPart(e)}.${encodeCandidateIdPart(n)}`}function encodeCandidateIdPart(e){return Array.from(e,e=>e.codePointAt(0).toString(36)).join(`-`)}async function withAuthorizerTimeout(e){let t;try{return await Promise.race([Promise.resolve(e),new Promise((e,n)=>{t=setTimeout(()=>n(Error(`Approval response authorizer timed out.`)),1e4)})])}finally{t!==void 0&&clearTimeout(t)}}export{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools,shouldPrepareApprovalReplayTools};
1
+ import{contextStorage}from"#context/container.js";import{AuthKey,SessionKey}from"#context/keys.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildApprovalResponseAuth,handleApprovalResponsePolicyError}from"#execution/tool-auth.js";import{getPendingInputBatches}from"#harness/pending-input-batches.js";import{clearPendingAuthorization,getAuthorizationResult,getPendingAuthorization,isAuthorizationSignal}from"#harness/authorization.js";import{createApprovalCandidate,expireApprovalCandidates,finishApprovalCandidate,getActiveApprovalCandidate,getApprovalAuditState,markApprovalCandidateAuthorizationRequired,settleAllowedCandidate,settleDirectApprovalResponse}from"#harness/approval-candidates.js";import{isApprovalRequest}from"#harness/input-request-class.js";const UNAUTHENTICATED_APPROVAL_FEEDBACK=`Authentication is required to respond to this approval.`;async function coordinateApprovalDelivery(e){let t=e.now??Date.now(),n=getApprovalAuditState(e.session.state).activeCandidates.filter(e=>e.expiresAt<=t),r=n.flatMap(e=>e.authorizationChallenges?.map(e=>e.attemptId??e.candidateId??e.name)??[]),i=expireApprovalCandidates({now:t,state:e.session.state}),a={...e.session,state:clearPendingAuthorization(i,r)},o=getApprovalAuditState(a.state),s=getPendingInputBatches(a.state),c=new Set(s.flatMap(e=>e.requests.map(e=>e.requestId))),l=o.settlements.filter(e=>c.has(e.requestId)),u=new Set(o.settlements.map(e=>e.requestId)),d=new Set([...u].filter(e=>!c.has(e))),f=hasResponseForRequest(e.stepInput,d),p=f?removeConsumedResponses(e.stepInput,d):e.stepInput;if(f&&l.length===0&&!hasMeaningfulInput(p))return deliveryResult(a,p,`park`);if(s.length===0)return deliveryResult(a,p);let m=p,h=new Set(s.flatMap(e=>e.responseAuthRequiredRequestIds??[])),g=s.flatMap(e=>e.requests),_=new Map(g.map(e=>[e.requestId,e])),v=[],y=[],b=new Set,x=!1,S=getApprovalAuditState(a.state).activeCandidates,C=[...m?.attributedInputResponses??[],...(m?.inputResponses??[]).map(e=>({auth:void 0,response:e}))];for(let{auth:e,response:n}of C){let r=_.get(n.requestId);if(r===void 0||!isApprovalRequest(r))continue;if(!h.has(n.requestId)){let r=contextStorage.getStore(),i=e===void 0?r?.get(AuthKey)??r?.get(SessionKey)?.auth.current??null:e;if(i!==null&&(n.optionId===`approve`||n.optionId===`cancel`)){let e=settleDirectApprovalResponse({actor:i,outcome:n.optionId===`approve`?`allowed`:`cancelled`,requestId:n.requestId,settledAt:t,state:a.state});a={...a,state:e.state},x||=e.changed}continue}if(b.add(n.requestId),n.optionId===`cancel`){let r=e===void 0?buildCallbackContext().session.auth.current:e;if(r===null){y.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let i=settleDirectApprovalResponse({actor:r,outcome:`cancelled`,requestId:n.requestId,settledAt:t,state:a.state});a={...a,state:i.state},x||=i.changed;continue}if(n.optionId!==`approve`)continue;let i=e===void 0?buildCallbackContext().session.auth.current:e;if(i===null){y.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let o=createApprovalCandidate({candidateIdPrefix:approvalCandidateIdPrefix(r.requestId,i),createdAt:t,expiresAt:t+6e5,requestId:r.requestId,responder:i,state:a.state});a={...a,state:o.state},x||=o.changed}let w=removeConsumedResponses(m,b);if(b.size>0)return deliveryResult(a,w,x?`continue-coordination`:`continue`,[],y);if(x)return deliveryResult(a,w,`continue`,[],y);let T=new Set(getPendingAuthorization(a.state)?.challenges.map(e=>e.name)??[]);for(let n of S){if(n.status===`authorization-required`){let e=n.authorizationChallenges??[];if(!e.some(e=>getAuthorizationResult(e.name)!==void 0)){v.push(...e.filter(e=>!T.has(e.name)));continue}}let r=_.get(n.requestId);if(r===void 0||getActiveApprovalCandidate(a.state,n.candidateId)===void 0)continue;let i=await authorizeCandidate({candidateId:n.candidateId,now:t,request:r,responder:n.responder,session:a,tools:await e.prepareTools?.(r)??e.tools});a=i.session,x||=i.didCommit,v.push(...i.challenges);let o=getApprovalAuditState(a.state).settlements.find(e=>e.requestId===n.requestId);o!==void 0&&l.push(o)}let E=appendSettledResponses(w,l);return(x||n.length>0)&&getApprovalAuditState(a.state).activeCandidates.length===0?deliveryResult(a,E,`responses-completed`):l.length>0?deliveryResult(a,E,`continue`):x?deliveryResult(a,E,`continue-coordination`):deliveryResult(a,E,v.length>0?`authorization-required`:`continue`,v)}async function authorizeCandidate(e){let t={...e.session,state:expireApprovalCandidates({now:e.now,state:e.session.state})};if(getActiveApprovalCandidate(t.state,e.candidateId)===void 0)return{challenges:[],didCommit:!1,session:t};let n=e.tools.get(e.request.action.toolName)?.approval,r=n!==void 0&&typeof n!=`function`?n.response:void 0;if(r===void 0)return failCandidate({...e,reason:`Approval authorization is temporarily unavailable. Please try again.`,session:t});try{let n=buildCallbackContext(),i=await withAuthorizerTimeout(r({auth:buildApprovalResponseAuth({responder:e.responder,scope:e.candidateId}),request:{callId:e.request.action.callId,requestId:e.request.requestId,toolInput:e.request.action.input,toolName:e.request.action.toolName},response:{decision:`approve`},responder:e.responder,session:{id:n.session.id,initiator:n.session.auth.initiator,parent:n.session.parent,turn:n.session.turn}}));if(i.status===`rejected`)return t={...t,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:i.reason,state:t.state,status:`rejected`})},{challenges:[],didCommit:!0,session:t};if(i.status!==`allowed`)return failCandidate({...e,session:t});let a=settleAllowedCandidate({candidateId:e.candidateId,settledAt:e.now,state:t.state});return{challenges:[],didCommit:a.changed,session:{...t,state:a.state}}}catch(n){let r=await handleApprovalResponsePolicyError(n).catch(()=>void 0);if(isAuthorizationSignal(r)){let n=r.challenges.map(e=>Date.parse(e.challenge.expiresAt??``)).filter(Number.isFinite).sort((e,t)=>e-t)[0];return t={...t,state:markApprovalCandidateAuthorizationRequired({authorizationChallenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),candidateId:e.candidateId,expiresAt:n,state:t.state})},{challenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),didCommit:!0,session:t}}return failCandidate({...e,session:t})}}function failCandidate(e){let t=e.reason??`We couldn’t verify your approval. Please try again.`;return{challenges:[],didCommit:!0,session:{...e.session,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:t,state:e.session.state,status:`failed`})}}}function hasResponseForRequest(e,t){return e?.attributedInputResponses?.some(({response:e})=>t.has(e.requestId))===!0||e?.inputResponses?.some(e=>t.has(e.requestId))===!0}function hasMeaningfulInput(e){return e?.message!==void 0||(e?.attributedInputResponses?.length??0)>0||(e?.inputResponses?.length??0)>0||(e?.runtimeActionResults?.length??0)>0}function appendSettledResponses(e,t){if(t.length===0)return e;let n=new Set([...(e?.inputResponses??[]).map(e=>e.requestId),...(e?.attributedInputResponses??[]).map(({response:e})=>e.requestId)]),r=t.filter(e=>!n.has(e.requestId));return r.length===0?e:{...e,inputResponses:[...e?.inputResponses??[],...r.map(e=>({optionId:e.outcome===`allowed`?`approve`:`cancel`,requestId:e.requestId}))]}}function removeConsumedResponses(e,t){if(e===void 0)return;let n=(e.attributedInputResponses??[]).filter(({response:e})=>!t.has(e.requestId)),r=[...(e.inputResponses??[]).filter(e=>!t.has(e.requestId)),...n.map(({response:e})=>e)];return{...e,attributedInputResponses:void 0,inputResponses:r}}function deliveryResult(e,t,n=`continue`,r=[],i=[]){return{challenges:r,feedback:i,kind:n,session:e,stepInput:t}}function approvalCandidateIdPrefix(e,t){let n=[t.authenticator,t.issuer??``,t.principalType,t.principalId].join(`:`);return`${encodeCandidateIdPart(e)}.${encodeCandidateIdPart(n)}`}function encodeCandidateIdPart(e){return Array.from(e,e=>e.codePointAt(0).toString(36)).join(`-`)}async function withAuthorizerTimeout(e){let t;try{return await Promise.race([Promise.resolve(e),new Promise((e,n)=>{t=setTimeout(()=>n(Error(`Approval response authorizer timed out.`)),1e4)})])}finally{t!==void 0&&clearTimeout(t)}}export{coordinateApprovalDelivery};
@@ -49,15 +49,6 @@ export interface AuthorizationResult {
49
49
  * and parks the session. Channels render sign-in buttons.
50
50
  */
51
51
  export declare function requestAuthorization(challenges: readonly AuthorizationChallenge[]): AuthorizationSignal;
52
- /**
53
- * Returns a model-safe copy of `signal` with runtime-only challenge state stripped.
54
- *
55
- * Used for the copy the AI SDK records as a tool output. The shape stays a
56
- * valid {@link AuthorizationSignal} so every `isAuthorizationSignal` consumer
57
- * still detects it; the park detector reads the full resume, principal, and
58
- * resolved-instance state from the harness's out-of-band stash.
59
- */
60
- export declare function redactSignalResume(signal: AuthorizationSignal): AuthorizationSignal;
61
52
  /**
62
53
  * Reads the authorization callback on resume. Returns `undefined` if
63
54
  * not resuming from an authorization request.
@@ -1 +1 @@
1
- import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{contextStorage,loadContext}from"#context/container.js";import{ActivityRootTurnIdKey,SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(t&&t.length!==0)return e===void 0?t[0]:t.find(t=>t.name===e)}function getAuthorizationResults(){return loadContext().get(PendingAuthorizationResultKey)??[]}function consumeAuthorizationResult(e,t){let n=loadContext(),r=n.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(n=>n.name===e&&n.instanceId===t);if(i===-1&&t!==void 0&&r.some(t=>t.name===e&&t.instanceId!==void 0))throw Error(`Authorization for "${e}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return n.delete(PendingAuthorizationResultKey),o.length>0&&n.set(PendingAuthorizationResultKey,o),a}function getHookUrl(e,t){let n=loadContext(),r=n.get(SessionIdKey),i=n.get(CallbackBaseUrlKey),a=n.get(AuthorizationHookKey)??(r?authHookToken(r):void 0);if(a&&i)return createWorkflowCallbackUrl(i,createEveConnectionCallbackRoutePath(e,t,a))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return sessionInboxHookToken(sessionCommandHookToken(e))}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),AuthorizationHookKey=new ContextKey(`eve.authorizationHook`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=resolveActiveAuthorizationChallenges(t.challenges),r=getPendingAuthorization(e),i=r?.challenges??[],a=getSupersededAuthorizationChallenges(e,n),o=contextStorage.getStore()?.get(ActivityRootTurnIdKey),s={...r?.activityRootTurnIds};for(let e of a)delete s[authorizationAttemptKey(e)];if(o!==void 0)for(let e of n)s[authorizationAttemptKey(e)]=o;return{...e,[PENDING_AUTHORIZATION_KEY]:{...Object.keys(s).length===0?{}:{activityRootTurnIds:s},challenges:[...i.filter(e=>!a.includes(e)),...n]}}}function resolveActiveAuthorizationChallenges(e){return e.filter((t,n)=>!e.slice(n+1).some(e=>t.name===e.name&&samePrincipal(t.principal,e.principal)))}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(authorizationAttemptKey(e)));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:pendingAuthorizationValue(n,i)}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function pendingAuthorizationValue(e,t){let n=Object.fromEntries(t.flatMap(t=>{let n=authorizationAttemptKey(t),r=e.activityRootTurnIds?.[n];return r===void 0?[]:[[n,r]]}));return{...Object.keys(n).length===0?{}:{activityRootTurnIds:n},challenges:t}}function authorizationAttemptKey(e){return e.attemptId??e.candidateId??e.name}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(typeof t==`object`&&t)return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{AuthorizationHookKey,CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getAuthorizationResults,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,resolveActiveAuthorizationChallenges,setPendingAuthorization};
1
+ import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{contextStorage,loadContext}from"#context/container.js";import{ActivityRootTurnIdKey,SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(t&&t.length!==0)return e===void 0?t[0]:t.find(t=>t.name===e)}function getAuthorizationResults(){return loadContext().get(PendingAuthorizationResultKey)??[]}function consumeAuthorizationResult(e,t){let n=loadContext(),r=n.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(n=>n.name===e&&n.instanceId===t);if(i===-1&&t!==void 0&&r.some(t=>t.name===e&&t.instanceId!==void 0))throw Error(`Authorization for "${e}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return n.delete(PendingAuthorizationResultKey),o.length>0&&n.set(PendingAuthorizationResultKey,o),a}function getHookUrl(e,t){let n=loadContext(),r=n.get(SessionIdKey),i=n.get(CallbackBaseUrlKey),a=n.get(AuthorizationHookKey)??(r?authHookToken(r):void 0);if(a&&i)return createWorkflowCallbackUrl(i,createEveConnectionCallbackRoutePath(e,t,a))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return sessionInboxHookToken(sessionCommandHookToken(e))}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),AuthorizationHookKey=new ContextKey(`eve.authorizationHook`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=resolveActiveAuthorizationChallenges(t.challenges),r=getPendingAuthorization(e),i=r?.challenges??[],a=getSupersededAuthorizationChallenges(e,n),o=contextStorage.getStore()?.get(ActivityRootTurnIdKey),s={...r?.activityRootTurnIds};for(let e of a)delete s[authorizationAttemptKey(e)];if(o!==void 0)for(let e of n)s[authorizationAttemptKey(e)]=o;return{...e,[PENDING_AUTHORIZATION_KEY]:{...Object.keys(s).length===0?{}:{activityRootTurnIds:s},challenges:[...i.filter(e=>!a.includes(e)),...n]}}}function resolveActiveAuthorizationChallenges(e){return e.filter((t,n)=>!e.slice(n+1).some(e=>t.name===e.name&&samePrincipal(t.principal,e.principal)))}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(authorizationAttemptKey(e)));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:pendingAuthorizationValue(n,i)}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function pendingAuthorizationValue(e,t){let n=Object.fromEntries(t.flatMap(t=>{let n=authorizationAttemptKey(t),r=e.activityRootTurnIds?.[n];return r===void 0?[]:[[n,r]]}));return{...Object.keys(n).length===0?{}:{activityRootTurnIds:n},challenges:t}}function authorizationAttemptKey(e){return e.attemptId??e.candidateId??e.name}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(typeof t==`object`&&t)return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{AuthorizationHookKey,CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getAuthorizationResults,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,requestAuthorization,resolveActiveAuthorizationChallenges,setPendingAuthorization};
@@ -6,7 +6,6 @@ type InlineToolResultPart = Extract<ToolResponsePart, {
6
6
  type: "tool-result";
7
7
  }>;
8
8
  import type { RuntimeIdentity, RuntimeTraceContext } from "#protocol/message.js";
9
- import type { RunMode } from "#shared/run-mode.js";
10
9
  import type { JsonObject } from "#shared/json.js";
11
10
  import type { HarnessEmissionState } from "#harness/emission-state.js";
12
11
  import type { HarnessEmitFn, HarnessToolMap, StepInput } from "#harness/types.js";
@@ -50,10 +49,10 @@ export declare function emitRecoverableFailedTurn(emitFn: HarnessEmitFn, state:
50
49
  */
51
50
  export declare function advanceStep(state: HarnessEmissionState): HarnessEmissionState;
52
51
  /**
53
- * Emits `turn.completed` and either `session.waiting` or `session.completed`.
52
+ * Emits `turn.completed` and `session.waiting`.
54
53
  * Returns updated emission state with an incremented sequence.
55
54
  */
56
- export declare function emitTurnEpilogue(emitFn: HarnessEmitFn, state: HarnessEmissionState, mode: RunMode): Promise<HarnessEmissionState>;
55
+ export declare function emitTurnEpilogue(emitFn: HarnessEmitFn, state: HarnessEmissionState): Promise<HarnessEmissionState>;
57
56
  /**
58
57
  * Result of consuming one step's `fullStream`.
59
58
  *
@@ -1 +1 @@
1
- import{createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{frameworkMessageKindForStepInput}from"#harness/messages.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createInvalidToolCallInputError,isInvalidToolCall,resolveProviderToolCallRequest}from"#harness/tool-call-input-errors.js";import{projectDeltaPresentation,projectResultPresentation}from"#harness/tool-presentation.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission-state.js";async function emitTurnPreamble(e,t,n,r,i,a){let o=n.turnId!==``,s=o?n.turnId:`turn_${n.sequence}`;if(n.sessionStarted||await e(createSessionStartedEvent({runtime:i,trace:a})),o||await e(createTurnStartedEvent({sequence:n.sequence,trace:a,turnId:s}),r),t.message!==void 0){let r=frameworkMessageKindForStepInput(t);await e(createMessageReceivedEvent({kind:r===`execution.background_task`?r:void 0,message:t.message,sequence:n.sequence,turnId:s}))}let c={sessionStarted:!0,sequence:n.sequence,stepIndex:o?n.stepIndex:0,turnId:s};return o&&n.assistantOutputStarted?{...c,assistantOutputStarted:!0}:c}async function emitStepStarted(e,t,n,r){await e(createStepStartedEvent({modelId:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),r)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t,n){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),n===`conversation`?await e(createSessionWaitingEvent()):await e(createSessionCompletedEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(e,t,n,r,i){let a=``,o=``,s=`stop`,c,l=new Set,u=new Set,d=new Set,f=new Set,p=new Set,m=new Set,h=[],g=[],_=new Map,v=new Map,flushCurrentMessage=async()=>{o.length!==0&&(await e(createMessageCompletedEvent({finishReason:`tool-calls`,message:o,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),o=``)},emitActionInput=async(n,r,i)=>e(createActionInputAppendedEvent({callId:n,inputTextDelta:i,sequence:t.sequence,stepIndex:t.stepIndex,toolName:r,turnId:t.turnId})),emitActionRequest=async n=>{let{action:r}=n;u.has(r.callId)||(o.trim().length>0&&await flushCurrentMessage(),u.add(r.callId),_.set(r.callId,r.input),await e(createActionsRequestedEvent({actions:[r],presentation:collectActionPresentation([n]),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})))},collectProviderToolCall=async e=>{if(f.has(e.toolCallId)||(f.add(e.toolCallId),u.has(e.toolCallId)))return;u.add(e.toolCallId),o.trim().length>0&&await flushCurrentMessage();let t=resolveProviderToolCallRequest(e,i?.tools??new Map);if(t.toolError!==void 0){m.add(e.toolCallId),await emitActionResult(createRuntimeToolResultFromToolError(t.toolError)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(t.toolError));return}_.set(t.request.action.callId,t.request.action.input),r.observe(t.request)},emitActionResult=async n=>{if(d.has(n.callId))return;d.add(n.callId);let r=n.isError===!0?void 0:projectResultPresentation(i?.tools.get(n.toolName),n.callId,_.get(n.callId),n.output);await e(createActionResultEvent({presentation:r,result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}))},emitActionPartial=async n=>{let r=projectDeltaPresentation(i?.tools.get(n.toolName),n.callId,_.get(n.callId),n.output);await e(createActionPartialEvent({presentation:r,result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}))},emitToolCall=async e=>{if(isInvalidToolCall(e)){m.add(e.toolCallId);return}if(!(i===void 0||i.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createPresentedRuntimeActionRequestFromToolCall({toolCall:e,tools:i.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});m.add(e.toolCallId),o.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let d of n)if(c===void 0)switch(d.type){case`reasoning-delta`:await r.flush(),a+=d.text,await e(createReasoningAppendedEvent({reasoningDelta:d.text,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));break;case`text-delta`:await r.flush(),a.trim().length>0&&(await e(createReasoningCompletedEvent({reasoning:a,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),a=``),o+=d.text,await e(createMessageAppendedEvent({messageDelta:d.text,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));break;case`tool-input-start`:if(i===void 0||d.providerExecuted===!0||i.excludedActionToolNames.has(d.toolName)){v.delete(d.id);break}await r.flush(),o.trim().length>0&&await flushCurrentMessage(),v.set(d.id,{toolName:d.toolName});break;case`tool-input-delta`:{let e=v.get(d.id);if(e===void 0)break;await r.flush(),await emitActionInput(d.id,e.toolName,d.delta);break}case`tool-input-end`:v.delete(d.id);break;case`tool-call`:{let e=d;v.delete(e.toolCallId),l.add(e.toolCallId),e.providerExecuted===!0?await collectProviderToolCall(e):(await r.flush(),await emitToolCall(e));break}case`tool-result`:{let e=d;if(e.preliminary===!0){e.providerExecuted!==!0&&await emitActionPartial(createRuntimeToolResultFromStepResult(e));break}if(e.providerExecuted===!0){await collectProviderToolCall({input:`input`in e?e.input:void 0,toolCallId:e.toolCallId,toolName:e.toolName}),await r.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(e));break}if(l.has(d.toolCallId)){if(isInlineAuthorizationToolResult(e))break;u.has(d.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(e)),p.add(d.toolCallId));break}if(await r.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(e)){p.add(d.toolCallId),h.push(e);break}await emitActionResult(createRuntimeToolResultFromStepResult(e)),p.add(d.toolCallId);break}case`tool-error`:{let e=d;e.providerExecuted===!0?(await collectProviderToolCall(e),await r.flush(),await emitActionResult(createRuntimeToolResultFromToolError(e))):u.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(e)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(e)));break}case`finish-step`:s=normalizeAssistantStepFinishReason(d.finishReason),await r.flush();break;case`error`:c=normalizeModelStreamError(d.error);break;case`abort`:throw new DOMException(d.reason??`The model stream was aborted.`,`AbortError`)}if(await r.flush(),c!==void 0)throw c;return a.trim().length>0&&await e(createReasoningCompletedEvent({reasoning:a,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),s!==`content-filter`&&s!==`tool-calls`&&hasEmptyDeliverySentinel(o)?await e(createMessageCompletedEvent({finishReason:s,message:null,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})):s!==`content-filter`&&o.trim().length>0&&await e(createMessageCompletedEvent({finishReason:s,message:o,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),{emittedActionCallIds:u,handledInlineToolResultCallIds:p,invalidInputToolCallIds:m,inlineAuthorizationResults:h,trailingInlineToolResultParts:g}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState};
1
+ import{createActionInputAppendedEvent,createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{frameworkMessageKindForStepInput}from"#harness/messages.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createInvalidToolCallInputError,isInvalidToolCall,resolveProviderToolCallRequest}from"#harness/tool-call-input-errors.js";import{projectDeltaPresentation,projectResultPresentation}from"#harness/tool-presentation.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission-state.js";async function emitTurnPreamble(e,t,n,r,i,a){let o=n.turnId!==``,s=o?n.turnId:`turn_${n.sequence}`;if(n.sessionStarted||await e(createSessionStartedEvent({runtime:i,trace:a})),o||await e(createTurnStartedEvent({sequence:n.sequence,trace:a,turnId:s}),r),t.message!==void 0){let r=frameworkMessageKindForStepInput(t);await e(createMessageReceivedEvent({kind:r===`execution.background_task`?r:void 0,message:t.message,sequence:n.sequence,turnId:s}))}let c={sessionStarted:!0,sequence:n.sequence,stepIndex:o?n.stepIndex:0,turnId:s};return o&&n.assistantOutputStarted?{...c,assistantOutputStarted:!0}:c}async function emitStepStarted(e,t,n,r){await e(createStepStartedEvent({modelId:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),r)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(e,t,n,r,i){let a=``,o=``,s=`stop`,c,l=new Set,u=new Set,d=new Set,f=new Set,p=new Set,m=new Set,h=[],g=[],_=new Map,v=new Map,flushCurrentMessage=async()=>{o.length!==0&&(await e(createMessageCompletedEvent({finishReason:`tool-calls`,message:o,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),o=``)},emitActionInput=async(n,r,i)=>e(createActionInputAppendedEvent({callId:n,inputTextDelta:i,sequence:t.sequence,stepIndex:t.stepIndex,toolName:r,turnId:t.turnId})),emitActionRequest=async n=>{let{action:r}=n;u.has(r.callId)||(o.trim().length>0&&await flushCurrentMessage(),u.add(r.callId),_.set(r.callId,r.input),await e(createActionsRequestedEvent({actions:[r],presentation:collectActionPresentation([n]),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})))},collectProviderToolCall=async e=>{if(f.has(e.toolCallId)||(f.add(e.toolCallId),u.has(e.toolCallId)))return;u.add(e.toolCallId),o.trim().length>0&&await flushCurrentMessage();let t=resolveProviderToolCallRequest(e,i?.tools??new Map);if(t.toolError!==void 0){m.add(e.toolCallId),await emitActionResult(createRuntimeToolResultFromToolError(t.toolError)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(t.toolError));return}_.set(t.request.action.callId,t.request.action.input),r.observe(t.request)},emitActionResult=async n=>{if(d.has(n.callId))return;d.add(n.callId);let r=n.isError===!0?void 0:projectResultPresentation(i?.tools.get(n.toolName),n.callId,_.get(n.callId),n.output);await e(createActionResultEvent({presentation:r,result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}))},emitActionPartial=async n=>{let r=projectDeltaPresentation(i?.tools.get(n.toolName),n.callId,_.get(n.callId),n.output);await e(createActionPartialEvent({presentation:r,result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}))},emitToolCall=async e=>{if(isInvalidToolCall(e)){m.add(e.toolCallId);return}if(!(i===void 0||i.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createPresentedRuntimeActionRequestFromToolCall({toolCall:e,tools:i.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});m.add(e.toolCallId),o.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let d of n)if(c===void 0)switch(d.type){case`reasoning-delta`:await r.flush(),a+=d.text,await e(createReasoningAppendedEvent({reasoningDelta:d.text,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));break;case`text-delta`:await r.flush(),a.trim().length>0&&(await e(createReasoningCompletedEvent({reasoning:a,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),a=``),o+=d.text,await e(createMessageAppendedEvent({messageDelta:d.text,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));break;case`tool-input-start`:if(i===void 0||d.providerExecuted===!0||i.excludedActionToolNames.has(d.toolName)){v.delete(d.id);break}await r.flush(),o.trim().length>0&&await flushCurrentMessage(),v.set(d.id,{toolName:d.toolName});break;case`tool-input-delta`:{let e=v.get(d.id);if(e===void 0)break;await r.flush(),await emitActionInput(d.id,e.toolName,d.delta);break}case`tool-input-end`:v.delete(d.id);break;case`tool-call`:{let e=d;v.delete(e.toolCallId),l.add(e.toolCallId),e.providerExecuted===!0?await collectProviderToolCall(e):(await r.flush(),await emitToolCall(e));break}case`tool-result`:{let e=d;if(e.preliminary===!0){e.providerExecuted!==!0&&await emitActionPartial(createRuntimeToolResultFromStepResult(e));break}if(e.providerExecuted===!0){await collectProviderToolCall({input:`input`in e?e.input:void 0,toolCallId:e.toolCallId,toolName:e.toolName}),await r.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(e));break}if(l.has(d.toolCallId)){if(isInlineAuthorizationToolResult(e))break;u.has(d.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(e)),p.add(d.toolCallId));break}if(await r.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(e)){p.add(d.toolCallId),h.push(e);break}await emitActionResult(createRuntimeToolResultFromStepResult(e)),p.add(d.toolCallId);break}case`tool-error`:{let e=d;e.providerExecuted===!0?(await collectProviderToolCall(e),await r.flush(),await emitActionResult(createRuntimeToolResultFromToolError(e))):u.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(e)),p.add(e.toolCallId),g.push(createToolResultMessagePartFromToolError(e)));break}case`finish-step`:s=normalizeAssistantStepFinishReason(d.finishReason),await r.flush();break;case`error`:c=normalizeModelStreamError(d.error);break;case`abort`:throw new DOMException(d.reason??`The model stream was aborted.`,`AbortError`)}if(await r.flush(),c!==void 0)throw c;return a.trim().length>0&&await e(createReasoningCompletedEvent({reasoning:a,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),s!==`content-filter`&&s!==`tool-calls`&&hasEmptyDeliverySentinel(o)?await e(createMessageCompletedEvent({finishReason:s,message:null,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})):s!==`content-filter`&&o.trim().length>0&&await e(createMessageCompletedEvent({finishReason:s,message:o,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),{emittedActionCallIds:u,handledInlineToolResultCallIds:p,invalidInputToolCallIds:m,inlineAuthorizationResults:h,trailingInlineToolResultParts:g}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState};
@@ -8,11 +8,13 @@ export interface ResolvedInputBatch {
8
8
  readonly outcome: "answered" | ApprovalTerminalStatus;
9
9
  readonly request: InputRequest;
10
10
  readonly response?: InputResponse;
11
+ readonly toolReplayIdentity?: string;
11
12
  }[];
12
13
  }
13
14
  export declare function buildResolvedInputBatch(batch: {
14
15
  readonly event?: PendingInputBatchEvent;
15
16
  readonly requests: readonly InputRequest[];
17
+ readonly toolReplayIdentities?: Readonly<Record<string, string>>;
16
18
  }, responses: readonly InputResponse[]): ResolvedInputBatch | undefined;
17
19
  export declare function resolveApprovalOutcome(response: InputResponse | undefined): {
18
20
  readonly approved: boolean;
@@ -1 +1 @@
1
- import{isApprovalRequest}from"#harness/input-request-class.js";const TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function buildResolvedInputBatch(e,t){if(e.event===void 0)return;let n=new Map(t.map(e=>[e.requestId,e]));return{event:e.event,inputs:e.requests.map(e=>{let t=n.get(e.requestId);return{outcome:isApprovalRequest(e)?resolveApprovalOutcome(t).status:t===void 0?`ignored`:`answered`,request:e,response:t}})}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`cancel`||e.optionId===`deny`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}export{TOOL_EXECUTION_DENIED_MESSAGE,buildResolvedInputBatch,resolveApprovalOutcome};
1
+ import{isApprovalRequest}from"#harness/input-request-class.js";const TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function buildResolvedInputBatch(e,t){if(e.event===void 0)return;let n=new Map(t.map(e=>[e.requestId,e]));return{event:e.event,inputs:e.requests.map(t=>{let r=n.get(t.requestId);return{outcome:isApprovalRequest(t)?resolveApprovalOutcome(r).status:r===void 0?`ignored`:`answered`,request:t,response:r,...e.toolReplayIdentities?.[t.requestId]===void 0?{}:{toolReplayIdentity:e.toolReplayIdentities[t.requestId]}}})}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`cancel`||e.optionId===`deny`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}export{TOOL_EXECUTION_DENIED_MESSAGE,buildResolvedInputBatch,resolveApprovalOutcome};
@@ -3,6 +3,7 @@ import type { RuntimeToolCallActionRequest } from "#shared/action-types.js";
3
3
  import type { InputRequest } from "#shared/input.js";
4
4
  import { getApprovedTools } from "#harness/hitl/approval-input-requests.js";
5
5
  import type { RejectedActionBatch } from "#harness/hitl/approval-input-requests.js";
6
+ import type { PendingInputBatch } from "#harness/pending-input-batches.js";
6
7
  import type { ResolvePendingInputResult } from "#harness/hitl/pending-input-resolution.js";
7
8
  import { clearPendingSessionLimitPrompt } from "#harness/hitl/session-limit-input-requests.js";
8
9
  import type { HarnessSession, StepInput } from "#harness/types.js";
@@ -14,8 +15,8 @@ export { appendPendingInputBatch, consumeDeferredStepInput, getPendingInputReque
14
15
  export declare function hasStepInput(input?: StepInput): boolean;
15
16
  /** Stored partial answers are not runnable work until they can resolve a batch. */
16
17
  export declare function hasRunnableDeferredStepInput(session: HarnessSession): boolean;
17
- /** Returns true when any pending batch still contains a tool approval. */
18
- export declare function hasPendingApprovalBatch(session: HarnessSession): boolean;
18
+ /** Selects the complete approval batch that pending-input resolution will resume. */
19
+ export declare function selectApprovalReplayBatch(session: HarnessSession, stepInput?: StepInput): PendingInputBatch | undefined;
19
20
  /**
20
21
  * Resolves pending input at the start of a harness step.
21
22
  *
@@ -28,7 +29,6 @@ export declare function resolvePendingInput(input: {
28
29
  readonly activeTurnId?: string;
29
30
  /** True while the harness has an open turn to continue. */
30
31
  readonly internalStep?: boolean;
31
- readonly deferMessagesWhileApprovalsPending?: boolean;
32
32
  readonly history?: readonly ModelMessage[];
33
33
  readonly resolveApprovalKey?: (request: InputRequest) => string | undefined;
34
34
  readonly session: HarnessSession;
@@ -1 +1 @@
1
- import{readClientContext}from"#internal/client-context.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{appendPendingInputBatch,consumeDeferredStepInput,getDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{resolveToolCallInputObject}from"#harness/coordination.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{compactStepInput}from"#harness/hitl/pending-input-resolution.js";import{hasTailApprovalResponse}from"#harness/current-messages.js";import{findAnsweredApprovalBatches,getApprovedTools,resolveApprovalInputBatches}from"#harness/hitl/approval-input-requests.js";import{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput}from"#harness/hitl/session-limit-input-requests.js";function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function hasRunnableDeferredStepInput(e){let t=getDeferredStepInput(e);if(t===void 0)return!1;if(t.message!==void 0||(t.context?.length??0)>0||readClientContext(t)!==void 0||t.outputSchema!==void 0||(t.runtimeActionResults?.length??0)>0)return!0;let n=[...t.inputResponses??[],...(t.attributedInputResponses??[]).map(({response:e})=>e)];if(n.length===0)return!1;let r=getPendingInputBatches(e.state),i=routePendingInput(r);switch(i.kind){case`session-limit`:return i.batch.requests.every(e=>n.some(t=>t.requestId===e.requestId));case`approvals`:return findAnsweredApprovalBatches(r,n).length>0}}function hasPendingApprovalBatch(e){return getPendingInputBatches(e.state).some(e=>e.requests.some(e=>isApprovalRequest(e)))}function resolvePendingInput(e){let t=[...e.history??e.session.history],n=getPendingInputBatches(e.session.state);if(n.length===0)return{outcome:`continue`,messages:t,session:e.session};let r=routePendingInput(n),i=hasTailApprovalResponse(t),a=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,o=a===void 0?e.stepInput:resolveTextMessageInput(a,e.stepInput),s=canonicalizeInputResponses(o?.inputResponses??[]);if(e.internalStep===!0&&canContinuePastHistoricalInput({activeTurnId:e.activeTurnId,batches:n,responses:s,route:r})&&o?.message===void 0)return{outcome:`continue`,messages:t,session:o===void 0?e.session:queueDeferredStepInput(e.session,compactStepInput(o))};if(r.kind===`approvals`&&e.deferMessagesWhileApprovalsPending===!0&&o?.message!==void 0&&findAnsweredApprovalBatches(n,s).length===0)return{deferredMessage:!0,outcome:`unresolved`,messages:t,session:queueDeferredStepInput(e.session,compactStepInput(o))};if(s.length===0&&o?.message===void 0){let n=compactStepInput(o);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||readClientContext(n)!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let c={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:o,responses:s,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...c,pendingBatch:r.batch});case`approvals`:return resolveApprovalInputBatches({...c,resolveApprovalKey:e.resolveApprovalKey})}}function canContinuePastHistoricalInput(e){return e.activeTurnId===void 0||e.route.kind===`session-limit`||e.responses.length>0&&findAnsweredApprovalBatches(e.batches,e.responses).length>0?!1:e.batches.every(t=>t.event!==void 0&&t.event.turnId!==e.activeTurnId)}function routePendingInput(e){let t=e.find(e=>isSessionLimitInputBatch(e));if(t!==void 0)return{batch:t,kind:`session-limit`};for(let t of e)for(let e of t.requests)if(!isApprovalRequest(e))throw TypeError(`Unhandled pending input request kind: ${e.kind}`);return{kind:`approvals`}}function canonicalizeInputResponses(e){let t=new Map;for(let n of e)t.set(n.requestId,n);return[...t.values()]}function resolveTextMessageInput(e,t){if(typeof t?.message!=`string`)return t;let n=new Set(e.requests.map(e=>e.requestId));if(t.inputResponses?.some(e=>n.has(e.requestId)))return t;let r=new Set(e.responseAuthRequiredRequestIds??[]),i=e.requests.filter(e=>!r.has(e.requestId)),a=resolveTextToResponses(t.message,i);return a.length===0?t:compactStepInput({...t,inputResponses:[...t.inputResponses??[],...a],messageConsumed:!0,message:void 0})}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}export{appendPendingInputBatch,clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasPendingInputBatch,hasRunnableDeferredStepInput,hasStepInput,resolvePendingInput};
1
+ import{readClientContext}from"#internal/client-context.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{appendPendingInputBatch,consumeDeferredStepInput,getDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{resolveToolCallInputObject}from"#harness/coordination.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{compactStepInput}from"#harness/hitl/pending-input-resolution.js";import{hasTailApprovalResponse}from"#harness/current-messages.js";import{findAnsweredApprovalBatches,getApprovedTools,resolveApprovalInputBatches}from"#harness/hitl/approval-input-requests.js";import{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput}from"#harness/hitl/session-limit-input-requests.js";function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function hasRunnableDeferredStepInput(e){let t=getDeferredStepInput(e);if(t===void 0)return!1;if(t.message!==void 0||(t.context?.length??0)>0||readClientContext(t)!==void 0||t.outputSchema!==void 0||(t.runtimeActionResults?.length??0)>0)return!0;let n=[...t.inputResponses??[],...(t.attributedInputResponses??[]).map(({response:e})=>e)];if(n.length===0)return!1;let r=getPendingInputBatches(e.state),i=routePendingInput(r);switch(i.kind){case`session-limit`:return i.batch.requests.every(e=>n.some(t=>t.requestId===e.requestId));case`approvals`:return findAnsweredApprovalBatches(r,n).length>0}}function selectApprovalReplayBatch(e,t){let n=getPendingInputBatches(e.state);if(n.some(isSessionLimitInputBatch))return;let r=canonicalizeInputResponses((n.length===1?resolveTextMessageInput(n[0],t):t)?.inputResponses??[]),i=findAnsweredApprovalBatches(n,r)[0];return i?.requests.some(e=>isApprovalRequest(e)&&r.some(t=>t.requestId===e.requestId&&t.optionId===`approve`))?i:void 0}function resolvePendingInput(e){let t=[...e.history??e.session.history],n=getPendingInputBatches(e.session.state);if(n.length===0)return{outcome:`continue`,messages:t,session:e.session};let r=routePendingInput(n),i=hasTailApprovalResponse(t),a=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,o=a===void 0?e.stepInput:resolveTextMessageInput(a,e.stepInput),s=canonicalizeInputResponses(o?.inputResponses??[]);if(e.internalStep===!0&&canContinuePastHistoricalInput({activeTurnId:e.activeTurnId,batches:n,responses:s,route:r})&&o?.message===void 0)return{outcome:`continue`,messages:t,session:o===void 0?e.session:queueDeferredStepInput(e.session,compactStepInput(o))};if(s.length===0&&o?.message===void 0){let n=compactStepInput(o);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||readClientContext(n)!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let c={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:o,responses:s,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...c,pendingBatch:r.batch});case`approvals`:return resolveApprovalInputBatches({...c,resolveApprovalKey:e.resolveApprovalKey})}}function canContinuePastHistoricalInput(e){return e.activeTurnId===void 0||e.route.kind===`session-limit`||e.responses.length>0&&findAnsweredApprovalBatches(e.batches,e.responses).length>0?!1:e.batches.every(t=>t.event!==void 0&&t.event.turnId!==e.activeTurnId)}function routePendingInput(e){let t=e.find(e=>isSessionLimitInputBatch(e));if(t!==void 0)return{batch:t,kind:`session-limit`};for(let t of e)for(let e of t.requests)if(!isApprovalRequest(e))throw TypeError(`Unhandled pending input request kind: ${e.kind}`);return{kind:`approvals`}}function canonicalizeInputResponses(e){let t=new Map;for(let n of e)t.set(n.requestId,n);return[...t.values()]}function resolveTextMessageInput(e,t){if(typeof t?.message!=`string`)return t;let n=new Set(e.requests.map(e=>e.requestId));if(t.inputResponses?.some(e=>n.has(e.requestId)))return t;let r=new Set(e.responseAuthRequiredRequestIds??[]),i=e.requests.filter(e=>!r.has(e.requestId)),a=resolveTextToResponses(t.message,i);return a.length===0?t:compactStepInput({...t,inputResponses:[...t.inputResponses??[],...a],messageConsumed:!0,message:void 0})}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}export{appendPendingInputBatch,clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,hasRunnableDeferredStepInput,hasStepInput,resolvePendingInput,selectApprovalReplayBatch};
@@ -15,6 +15,7 @@ export interface PendingInputBatchEvent {
15
15
  * assistant turn's requests plus its withheld model output.
16
16
  */
17
17
  export interface PendingInputBatch {
18
+ readonly toolReplayIdentities?: Readonly<Record<string, string>>;
18
19
  readonly event?: PendingInputBatchEvent;
19
20
  readonly activityRootTurnId?: string;
20
21
  readonly requests: readonly InputRequest[];
@@ -50,6 +51,7 @@ export declare function removePendingInputBatches(session: HarnessSession, batch
50
51
  * batches stay open and independently answerable.
51
52
  */
52
53
  export declare function appendPendingInputBatch(input: {
54
+ readonly toolReplayIdentities?: Readonly<Record<string, string>>;
53
55
  readonly event?: PendingInputBatchEvent;
54
56
  readonly activityRootTurnId?: string;
55
57
  readonly requests: readonly InputRequest[];
@@ -61,15 +63,13 @@ export declare function activityRootTurnIdForInputResponses(state: SessionStateM
61
63
  export declare function activityRequestIdsForRootTurn(state: SessionStateMap | undefined, rootTurnId: string): readonly string[];
62
64
  /**
63
65
  * Merges any queued follow-up input into the current step input and clears it
64
- * from session state. When `preferCurrentInput` is set, fresh input is returned
65
- * alone and the queued input remains deferred.
66
+ * from session state.
66
67
  *
67
68
  * Used when the harness has to process a pending tool-approval response first
68
69
  * and defer the user's new message to the next internal model step.
69
70
  */
70
71
  export declare function consumeDeferredStepInput(input: {
71
72
  readonly input?: StepInput;
72
- readonly preferCurrentInput?: boolean;
73
73
  readonly session: HarnessSession;
74
74
  }): {
75
75
  readonly input?: StepInput;
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{ActivityRootTurnIdKey}from"#context/keys.js";import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(Array.isArray(t.requests)&&Array.isArray(t.responseMessages))return t}function getPendingInputBatches(e){let t=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(t)){let e=t.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let n=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),r=n===void 0?[]:[n];return assertUniqueRequestIds(r),r}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,t){assertUniqueRequestIds(t);let n={...e.state};return delete n[LEGACY_PENDING_INPUT_BATCH_KEY],t.length===0?delete n[PENDING_INPUT_BATCHES_KEY]:n[PENDING_INPUT_BATCHES_KEY]=t.map(e=>({event:e.event,activityRootTurnId:e.activityRootTurnId,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(n).length>0?n:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,activityRootTurnId:e.activityRootTurnId??contextStorage.getStore()?.get(ActivityRootTurnIdKey),responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:e.requests,responseMessages:e.responseMessages}])}function activityRootTurnIdForInputResponses(e,t){return getPendingInputBatches(e).find(e=>e.requests.some(e=>t.has(e.requestId)))?.activityRootTurnId}function activityRequestIdsForRootTurn(e,t){return getPendingInputBatches(e).flatMap(e=>e.activityRootTurnId===t?e.requests.map(e=>e.requestId):[])}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;if(e.preferCurrentInput===!0&&e.input!==void 0)return{input:e.input,session:e.session};let n=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:n}:{input:coalesceTurnInputs(t,e.input),session:n}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let n=getDeferredStepInput(e),r=n===void 0?t:coalesceTurnInputs(n,t),i={...e.state};return i[DEFERRED_STEP_INPUT_KEY]=r,{...e,state:i}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{activityRequestIdsForRootTurn,activityRootTurnIdForInputResponses,appendPendingInputBatch,consumeDeferredStepInput,getDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
1
+ import{contextStorage}from"#context/container.js";import{ActivityRootTurnIdKey}from"#context/keys.js";import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(Array.isArray(t.requests)&&Array.isArray(t.responseMessages))return t}function getPendingInputBatches(e){let t=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(t)){let e=t.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let n=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),r=n===void 0?[]:[n];return assertUniqueRequestIds(r),r}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,t){assertUniqueRequestIds(t);let n={...e.state};return delete n[LEGACY_PENDING_INPUT_BATCH_KEY],t.length===0?delete n[PENDING_INPUT_BATCHES_KEY]:n[PENDING_INPUT_BATCHES_KEY]=t.map(e=>({event:e.event,activityRootTurnId:e.activityRootTurnId,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,toolReplayIdentities:e.toolReplayIdentities,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(n).length>0?n:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,activityRootTurnId:e.activityRootTurnId??contextStorage.getStore()?.get(ActivityRootTurnIdKey),responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,toolReplayIdentities:e.toolReplayIdentities,requests:e.requests,responseMessages:e.responseMessages}])}function activityRootTurnIdForInputResponses(e,t){return getPendingInputBatches(e).find(e=>e.requests.some(e=>t.has(e.requestId)))?.activityRootTurnId}function activityRequestIdsForRootTurn(e,t){return getPendingInputBatches(e).flatMap(e=>e.activityRootTurnId===t?e.requests.map(e=>e.requestId):[])}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;let n=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:n}:{input:coalesceTurnInputs(t,e.input),session:n}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let n=getDeferredStepInput(e),r=n===void 0?t:coalesceTurnInputs(n,t),i={...e.state};return i[DEFERRED_STEP_INPUT_KEY]=r,{...e,state:i}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{activityRequestIdsForRootTurn,activityRootTurnIdForInputResponses,appendPendingInputBatch,consumeDeferredStepInput,getDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
@@ -1,3 +1,4 @@
1
+ import type { LanguageModel } from "ai";
1
2
  import type { SessionAuthContext } from "#channel/types.js";
2
3
  import type { RuntimeModelReference } from "#runtime/agent/bootstrap.js";
3
4
  /**
@@ -5,3 +6,11 @@ import type { RuntimeModelReference } from "#runtime/agent/bootstrap.js";
5
6
  * raw eve principal. Authored provider options take precedence over the default.
6
7
  */
7
8
  export declare function mergeProviderSafetyIdentifier(modelReference: RuntimeModelReference, providerOptions: Readonly<Record<string, unknown>> | undefined, auth: SessionAuthContext | null): Record<string, unknown> | undefined;
9
+ /** Composes the per-call defaults shared by model steps and compaction. */
10
+ export declare function resolveCallProviderOptions(input: {
11
+ readonly auth: SessionAuthContext | null;
12
+ readonly conversationId: string;
13
+ readonly model: LanguageModel;
14
+ readonly modelReference: RuntimeModelReference;
15
+ readonly providerOptions: Readonly<Record<string, unknown>> | undefined;
16
+ }): Record<string, unknown> | undefined;
@@ -1 +1 @@
1
- import{invocationOwnerKey}from"#internal/invocation/metadata.js";import{mergeObjects}from"#shared/objects.js";function mergeProviderSafetyIdentifier(e,t,n){if(n===null)return t;let r=invocationOwnerKey(n),i=e.id.split(`/`,1)[0]?.toLowerCase(),a=i===`openai`?{openai:{safetyIdentifier:r}}:i===`anthropic`?{anthropic:{metadata:{userId:r}}}:void 0;return a===void 0?t:mergeObjects(a,t)}export{mergeProviderSafetyIdentifier};
1
+ import{mergeGatewaySessionId}from"#internal/gateway.js";import{invocationOwnerKey}from"#internal/invocation/metadata.js";import{mergeObjects}from"#shared/objects.js";function mergeProviderSafetyIdentifier(e,t,n){if(n===null)return t;let r=invocationOwnerKey(n),i=e.id.split(`/`,1)[0]?.toLowerCase(),a=i===`openai`?{openai:{safetyIdentifier:r}}:i===`anthropic`?{anthropic:{metadata:{userId:r}}}:void 0;return a===void 0?t:mergeObjects(a,t)}function resolveCallProviderOptions(e){return mergeGatewaySessionId(e.model,mergeProviderSafetyIdentifier(e.modelReference,e.providerOptions,e.auth),e.conversationId)}export{mergeProviderSafetyIdentifier,resolveCallProviderOptions};
@@ -29,6 +29,8 @@ export interface ProxyInputRequest {
29
29
  /** Trusted parent-derived capability URL for a remote task child. */
30
30
  readonly childResponseUrl?: string;
31
31
  readonly kind: InputRequestKind;
32
+ /** Question metadata lets the human-facing parent resolve plain text before proxying by ID. */
33
+ readonly question?: AnswerHookQuestion;
32
34
  /** Present when the route is authorized by a parent-owned durable task. */
33
35
  readonly taskId?: string;
34
36
  }
@@ -1 +1 @@
1
- import{isLoopbackHostname}from"#shared/network-address.js";import{isSessionInboxAddress}from"#execution/session-inbox/address.js";import{inputOptionSchema}from"#shared/input.js";const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function createTaskInputRequestId(e,t){return`${e}:${t}`}function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){return{...e.session,state:upsertProxyInputRequestState({entries:e.entries,forChildContinuationToken:e.forChildContinuationToken,state:e.session.state})}}function upsertProxyInputRequestState(e){let t={};for(let[n,r]of Object.entries(readMap(e.state)))r.childContinuationToken!==e.forChildContinuationToken&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;let n={...e.state};return Object.keys(t).length===0?delete n[PROXY_INPUT_REQUESTS_KEY]:n[PROXY_INPUT_REQUESTS_KEY]=t,Object.keys(n).length>0?n:void 0}function clearProxyInputRequestsForChild(e,t){return clearProxyInputRequestsWhere(e,e=>e.childContinuationToken===t)}function clearProxyInputRequestsWhere(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(t(a)){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function clearProxyInputRequestsForTask(e,t){return clearProxyInputRequestsWhere(e,e=>e.taskId===t)}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e,t){let n={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)};return e.event.requests.map(r=>{let i={batch:n,childContinuationToken:e.childContinuationToken,kind:r.kind};return t!==void 0&&(i.taskId=t),e.childSessionInbox?.sessionId===e.childSessionId&&(i.childSessionInbox=e.childSessionInbox),[r.requestId,i]})}function readMap(e){let t=e?.[PROXY_INPUT_REQUESTS_KEY];if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=parseProxyInputRequest(r,e);t!==void 0&&(n[e]=t)}return n}function writeMap(e,t){let n={...e.state};return Object.keys(t).length===0?(delete n[PROXY_INPUT_REQUESTS_KEY],{...e,state:Object.keys(n).length>0?n:void 0}):(n[PROXY_INPUT_REQUESTS_KEY]=t,{...e,state:n})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n=`taskId`in e?e.taskId:void 0,r=`childRequestId`in e?e.childRequestId:void 0,i=`childResponseUrl`in e?e.childResponseUrl:void 0;if(n!==void 0&&(typeof n!=`string`||n.length===0)||r!==void 0&&(typeof r!=`string`||r.length===0)||n===void 0!=(r===void 0)||i!==void 0&&(typeof i!=`string`||!isAllowedChildResponseUrl(i)))return;let a=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0,o=`answerHook`in e?parseAnswerHookRoute(e.answerHook):void 0;if(`answerHook`in e&&o===void 0)return;let s=`childSessionInbox`in e?e.childSessionInbox:void 0;if(s!==void 0&&!isSessionInboxAddress(s))return;let c={childContinuationToken:e.childContinuationToken,kind:e.kind};return o!==void 0&&(c.answerHook=o),s!==void 0&&(c.childSessionInbox=s),a!==void 0&&a.requestIds.includes(t)&&(c.batch=a),typeof r==`string`&&(c.childRequestId=r),typeof i==`string`&&(c.childResponseUrl=i),typeof n==`string`&&(c.taskId=n),c}function parseAnswerHookRoute(e){if(typeof e!=`object`||!e||!(`runId`in e)||typeof e.runId!=`string`||e.runId.length===0)return;if(!(`question`in e)||e.question===void 0)return{runId:e.runId};let t=parseAnswerHookQuestion(e.question);return t===void 0?void 0:{question:t,runId:e.runId}}function parseAnswerHookQuestion(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t={};for(let n of[`allowFreeform`,`dismissible`]){let r=Reflect.get(e,n);if(r!==void 0){if(typeof r!=`boolean`)return;t[n]=r}}let n=Reflect.get(e,`options`);if(n!==void 0){let e=inputOptionSchema.array().safeParse(n);if(!e.success)return;t.options=e.data}return t}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isAllowedChildResponseUrl(e){let t;try{t=new URL(e)}catch{return!1}return t.protocol===`https:`||t.protocol===`http:`&&isLoopbackHostname(t.hostname)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,clearProxyInputRequestsForTask,clearProxyInputRequestsWhere,createTaskInputRequestId,getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequestState,upsertProxyInputRequests};
1
+ import{isLoopbackHostname}from"#shared/network-address.js";import{isSessionInboxAddress}from"#execution/session-inbox/address.js";import{inputOptionSchema}from"#shared/input.js";const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function createTaskInputRequestId(e,t){return`${e}:${t}`}function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){return{...e.session,state:upsertProxyInputRequestState({entries:e.entries,forChildContinuationToken:e.forChildContinuationToken,state:e.session.state})}}function upsertProxyInputRequestState(e){let t={};for(let[n,r]of Object.entries(readMap(e.state)))r.childContinuationToken!==e.forChildContinuationToken&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;let n={...e.state};return Object.keys(t).length===0?delete n[PROXY_INPUT_REQUESTS_KEY]:n[PROXY_INPUT_REQUESTS_KEY]=t,Object.keys(n).length>0?n:void 0}function clearProxyInputRequestsForChild(e,t){return clearProxyInputRequestsWhere(e,e=>e.childContinuationToken===t)}function clearProxyInputRequestsWhere(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(t(a)){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function clearProxyInputRequestsForTask(e,t){return clearProxyInputRequestsWhere(e,e=>e.taskId===t)}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e,t){let n={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)};return e.event.requests.map(r=>{let i={batch:n,childContinuationToken:e.childContinuationToken,kind:r.kind};return r.kind===`question`&&(i.question={...r.allowFreeform!==void 0&&{allowFreeform:r.allowFreeform},...r.options!==void 0&&{options:[...r.options]}}),t!==void 0&&(i.taskId=t),e.childSessionInbox?.sessionId===e.childSessionId&&(i.childSessionInbox=e.childSessionInbox),[r.requestId,i]})}function readMap(e){let t=e?.[PROXY_INPUT_REQUESTS_KEY];if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=parseProxyInputRequest(r,e);t!==void 0&&(n[e]=t)}return n}function writeMap(e,t){let n={...e.state};return Object.keys(t).length===0?(delete n[PROXY_INPUT_REQUESTS_KEY],{...e,state:Object.keys(n).length>0?n:void 0}):(n[PROXY_INPUT_REQUESTS_KEY]=t,{...e,state:n})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n=`taskId`in e?e.taskId:void 0,r=`childRequestId`in e?e.childRequestId:void 0,i=`childResponseUrl`in e?e.childResponseUrl:void 0;if(n!==void 0&&(typeof n!=`string`||n.length===0)||r!==void 0&&(typeof r!=`string`||r.length===0)||n===void 0!=(r===void 0)||i!==void 0&&(typeof i!=`string`||!isAllowedChildResponseUrl(i)))return;let a=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0,o=`answerHook`in e?parseAnswerHookRoute(e.answerHook):void 0;if(`answerHook`in e&&o===void 0)return;let s=`question`in e?parseAnswerHookQuestion(e.question):void 0;if(`question`in e&&s===void 0)return;let c=`childSessionInbox`in e?e.childSessionInbox:void 0;if(c!==void 0&&!isSessionInboxAddress(c))return;let l={childContinuationToken:e.childContinuationToken,kind:e.kind};return o!==void 0&&(l.answerHook=o),c!==void 0&&(l.childSessionInbox=c),a!==void 0&&a.requestIds.includes(t)&&(l.batch=a),typeof r==`string`&&(l.childRequestId=r),typeof i==`string`&&(l.childResponseUrl=i),s!==void 0&&(l.question=s),typeof n==`string`&&(l.taskId=n),l}function parseAnswerHookRoute(e){if(typeof e!=`object`||!e||!(`runId`in e)||typeof e.runId!=`string`||e.runId.length===0)return;if(!(`question`in e)||e.question===void 0)return{runId:e.runId};let t=parseAnswerHookQuestion(e.question);return t===void 0?void 0:{question:t,runId:e.runId}}function parseAnswerHookQuestion(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t={};for(let n of[`allowFreeform`,`dismissible`]){let r=Reflect.get(e,n);if(r!==void 0){if(typeof r!=`boolean`)return;t[n]=r}}let n=Reflect.get(e,`options`);if(n!==void 0){let e=inputOptionSchema.array().safeParse(n);if(!e.success)return;t.options=e.data}return t}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isAllowedChildResponseUrl(e){let t;try{t=new URL(e)}catch{return!1}return t.protocol===`https:`||t.protocol===`http:`&&isLoopbackHostname(t.hostname)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,clearProxyInputRequestsForTask,clearProxyInputRequestsWhere,createTaskInputRequestId,getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequestState,upsertProxyInputRequests};
@@ -36,9 +36,8 @@ export declare function applySessionLimitContinuation(input: SessionLimitPolicyI
36
36
  * Pre-model-call gate for the session token budget.
37
37
  *
38
38
  * Returns `null` when the session is within budget. Over budget, sessions
39
- * that can reach a human park on the deterministic continuation prompt;
40
- * task-mode sessions without HITL fail fast with
41
- * `SESSION_TOKEN_LIMIT_REACHED`.
39
+ * that can request input park on the deterministic continuation prompt;
40
+ * others fail fast with `SESSION_TOKEN_LIMIT_REACHED`.
42
41
  */
43
42
  export declare function enforceSessionUsageLimit(input: SessionLimitPolicyInput & {
44
43
  readonly messages: readonly HarnessModelMessage[];
@@ -1 +1 @@
1
- import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{bumpSessionRuntimeUsageLimits,getSessionTokenUsage,getSessionUsageLimitViolation}from"#harness/turn-tag-state.js";import{appendPendingInputBatch}from"#harness/input-requests.js";import{SessionLimitDeclinedError}from"#harness/turn-cancellation.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:bumpSessionRuntimeUsageLimits(e.session)};if(e.config.mode!==`conversation`&&e.session.continuationToken===``){let t=getSessionUsageLimitViolation(e.session);return{result:t===null?{next:{done:!0,output:``},session:e.session}:await failSessionUsageLimit({...e,violation:t}),session:e.session}}throw new SessionLimitDeclinedError}async function enforceSessionUsageLimit(e){let t=getSessionUsageLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return violationWindow(t)>0&&n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionUsageLimit({...e,emit:n,violation:t}):failSessionUsageLimit({...e,violation:t})}async function parkOnSessionUsageLimit(e){let t=createSessionLimitContinuationRequest({sessionId:e.session.sessionId,violation:e.violation}),n=e.emissionState,r=appendPendingInputBatch({event:{sequence:n.sequence,stepIndex:n.stepIndex,turnId:n.turnId},requests:[t],responseMessages:[],session:{...e.session,history:[...e.messages]}});return await e.emit(createInputRequestedEvent({requests:[t],sequence:n.sequence,stepIndex:n.stepIndex,turnId:n.turnId})),e.config.mode===`conversation`&&(n=await emitTurnEpilogue(e.emit,n,e.config.mode)),{next:null,session:setHarnessEmissionState(r,n)}}function violationWindow(e){return e.kind===`token-cost`?e.limitUsd:e.limit}function formatSessionLimitMessage(e){return e===`token-cost`?`The session reached its configured model token-cost limit.`:`The session reached its configured ${e} token limit.`}async function failSessionUsageLimit(e){let t=getSessionTokenUsage(e.session),n=formatSessionLimitMessage(e.violation.kind),r=e.violation.kind===`token-cost`?{costUsd:t.costUsd,kind:e.violation.kind,limitUsd:e.violation.limitUsd,usedCostUsd:e.violation.usedCostUsd}:{inputTokens:t.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:t.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:e.violation.kind===`token-cost`?`SESSION_TOKEN_COST_LIMIT_REACHED`:`SESSION_TOKEN_LIMIT_REACHED`,details:r,message:n,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`||void 0,output:e.config.mode===`task`?n:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionUsageLimit};
1
+ import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{bumpSessionRuntimeUsageLimits,getSessionTokenUsage,getSessionUsageLimitViolation}from"#harness/turn-tag-state.js";import{appendPendingInputBatch}from"#harness/input-requests.js";import{SessionLimitDeclinedError}from"#harness/turn-cancellation.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:bumpSessionRuntimeUsageLimits(e.session)};throw new SessionLimitDeclinedError}async function enforceSessionUsageLimit(e){let t=getSessionUsageLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return violationWindow(t)>0&&n!==void 0&&e.config.capabilities?.requestInput===!0?parkOnSessionUsageLimit({...e,emit:n,violation:t}):failSessionUsageLimit({...e,violation:t})}async function parkOnSessionUsageLimit(e){let t=createSessionLimitContinuationRequest({sessionId:e.session.sessionId,violation:e.violation}),n=e.emissionState,r=appendPendingInputBatch({event:{sequence:n.sequence,stepIndex:n.stepIndex,turnId:n.turnId},requests:[t],responseMessages:[],session:{...e.session,history:[...e.messages]}});return await e.emit(createInputRequestedEvent({requests:[t],sequence:n.sequence,stepIndex:n.stepIndex,turnId:n.turnId})),n=await emitTurnEpilogue(e.emit,n),{next:null,session:setHarnessEmissionState(r,n)}}function violationWindow(e){return e.kind===`token-cost`?e.limitUsd:e.limit}function formatSessionLimitMessage(e){return e===`token-cost`?`The session reached its configured model token-cost limit.`:`The session reached its configured ${e} token limit.`}async function failSessionUsageLimit(e){let t=getSessionTokenUsage(e.session),n=formatSessionLimitMessage(e.violation.kind),r=e.violation.kind===`token-cost`?{costUsd:t.costUsd,kind:e.violation.kind,limitUsd:e.violation.limitUsd,usedCostUsd:e.violation.usedCostUsd}:{inputTokens:t.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:t.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:e.violation.kind===`token-cost`?`SESSION_TOKEN_COST_LIMIT_REACHED`:`SESSION_TOKEN_LIMIT_REACHED`,details:r,message:n,sessionId:e.session.sessionId}),{next:{done:!0,output:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionUsageLimit};