eve 0.77.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/src/approval/definition.d.ts +42 -0
  3. package/dist/src/cli/commands/trace-detail.d.ts +2 -2
  4. package/dist/src/cli/commands/trace-detail.js +1 -1
  5. package/dist/src/cli/commands/trace.d.ts +1 -1
  6. package/dist/src/cli/commands/trace.js +1 -1
  7. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
  8. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  9. package/dist/src/cli/dev/tui/traces/trace-store.d.ts +1 -1
  10. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
  11. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +1 -1
  12. package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
  13. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +1 -1
  14. package/dist/src/compiled/.vendor-stamp.json +3 -1
  15. package/dist/src/compiled/@eve/tracing/adapters/agent-transport.d.ts +8 -0
  16. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-payload.d.ts +15 -0
  17. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-telemetry.d.ts +14 -0
  18. package/dist/src/{tracing/agent-span-id-generator.d.ts → compiled/@eve/tracing/adapters/otel-ids.d.ts} +1 -1
  19. package/dist/src/compiled/@eve/tracing/adapters/otel.d.ts +33 -0
  20. package/dist/src/{tracing/agent-otel-content.d.ts → compiled/@eve/tracing/adapters/serialization.d.ts} +9 -3
  21. package/dist/src/compiled/@eve/tracing/agent-tracing.d.ts +84 -0
  22. package/dist/src/compiled/@eve/tracing/ai-sdk.d.ts +7 -0
  23. package/dist/src/compiled/@eve/tracing/ai-sdk.js +1 -0
  24. package/dist/src/compiled/@eve/tracing/capture.d.ts +5 -0
  25. package/dist/src/compiled/@eve/tracing/core/activation.d.ts +3 -0
  26. package/dist/src/compiled/@eve/tracing/core/attributes.d.ts +14 -0
  27. package/dist/src/{tracing/content-attributes.d.ts → compiled/@eve/tracing/core/content-policy.d.ts} +1 -1
  28. package/dist/src/compiled/@eve/tracing/core/context.d.ts +3 -0
  29. package/dist/src/compiled/@eve/tracing/core/delegation.d.ts +13 -0
  30. package/dist/src/compiled/@eve/tracing/core/mcp.d.ts +24 -0
  31. package/dist/src/compiled/@eve/tracing/core/scopes.d.ts +59 -0
  32. package/dist/src/compiled/@eve/tracing/core/snapshot.d.ts +7 -0
  33. package/dist/src/compiled/@eve/tracing/core/span-kinds.d.ts +12 -0
  34. package/dist/src/compiled/@eve/tracing/core/types.d.ts +292 -0
  35. package/dist/src/compiled/@eve/tracing/core/writer.d.ts +15 -0
  36. package/dist/src/compiled/@eve/tracing/delegation.d.ts +2 -0
  37. package/dist/src/compiled/@eve/tracing/delegation.js +1 -0
  38. package/dist/src/compiled/@eve/tracing/index.d.ts +6 -0
  39. package/dist/src/compiled/@eve/tracing/index.js +1 -0
  40. package/dist/src/compiled/@eve/tracing/operations.d.ts +96 -0
  41. package/dist/src/compiled/@eve/tracing/otel.d.ts +12 -0
  42. package/dist/src/compiled/@eve/tracing/otel.js +1 -0
  43. package/dist/src/compiled/@opentelemetry/api/index.d.ts +4 -0
  44. package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
  45. package/dist/src/compiled/_chunks/workflow/delegation-BqhZ398D.js +1 -0
  46. package/dist/src/compiled/_chunks/workflow/mcp-CrGp4EC8.js +5 -0
  47. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  48. package/dist/src/compiler/extension-compatibility.js +1 -1
  49. package/dist/src/context/build-dynamic-tools.js +1 -1
  50. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  51. package/dist/src/context/keys.d.ts +16 -0
  52. package/dist/src/context/keys.js +1 -1
  53. package/dist/src/evals/assertions/collector.d.ts +4 -1
  54. package/dist/src/evals/assertions/collector.js +1 -1
  55. package/dist/src/evals/context.js +1 -1
  56. package/dist/src/evals/index.d.ts +1 -1
  57. package/dist/src/evals/runner/artifacts.js +1 -1
  58. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
  59. package/dist/src/evals/runner/reporters/assertion-scores.d.ts +11 -2
  60. package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
  61. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  62. package/dist/src/evals/runner/reporters/console.js +1 -1
  63. package/dist/src/evals/runner/reporters/datadog.js +2 -2
  64. package/dist/src/evals/runner/reporters/junit.js +1 -1
  65. package/dist/src/evals/runner/verdict.d.ts +2 -2
  66. package/dist/src/evals/runner/verdict.js +1 -1
  67. package/dist/src/evals/types.d.ts +22 -6
  68. package/dist/src/eve-channel/index.js +1 -1
  69. package/dist/src/eve-channel/stream-headers.d.ts +1 -0
  70. package/dist/src/eve-channel/stream-headers.js +1 -0
  71. package/dist/src/execution/agent-sessions/context.d.ts +1 -1
  72. package/dist/src/execution/agent-sessions/context.js +1 -1
  73. package/dist/src/execution/agent-sessions/remote.js +1 -1
  74. package/dist/src/execution/agent-sessions/steps.d.ts +2 -0
  75. package/dist/src/execution/agent-sessions/steps.js +1 -1
  76. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  77. package/dist/src/execution/catalog/connection-entry.js +1 -1
  78. package/dist/src/execution/catalog/search.js +1 -1
  79. package/dist/src/execution/catalog/step-catalog.d.ts +12 -3
  80. package/dist/src/execution/catalog/step-catalog.js +1 -1
  81. package/dist/src/execution/coordination-dispatch-shared.d.ts +1 -2
  82. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  83. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  84. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  85. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  86. package/dist/src/execution/invoke-tool.d.ts +1 -1
  87. package/dist/src/execution/invoke-tool.js +1 -1
  88. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -1
  89. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  90. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  91. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  92. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  93. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  94. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  95. package/dist/src/execution/sandbox/session.d.ts +6 -0
  96. package/dist/src/execution/sandbox/session.js +2 -2
  97. package/dist/src/execution/session/active-turn.d.ts +9 -1
  98. package/dist/src/execution/session/active-turn.js +1 -1
  99. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  100. package/dist/src/execution/session/handoff.d.ts +1 -1
  101. package/dist/src/execution/session/handoff.js +1 -1
  102. package/dist/src/execution/session/next-input.js +1 -1
  103. package/dist/src/execution/session/turn-step.js +1 -1
  104. package/dist/src/execution/session/turn.d.ts +11 -4
  105. package/dist/src/execution/session/turn.js +1 -1
  106. package/dist/src/execution/session-inbox/inbox.d.ts +3 -0
  107. package/dist/src/execution/session-inbox/inbox.js +1 -1
  108. package/dist/src/execution/session-workflow-tool-run.d.ts +14 -12
  109. package/dist/src/execution/session-workflow-tool-run.js +1 -1
  110. package/dist/src/execution/tasks/start.d.ts +14 -1
  111. package/dist/src/execution/tasks/start.js +1 -1
  112. package/dist/src/execution/tasks/steps.d.ts +7 -4
  113. package/dist/src/execution/tasks/steps.js +1 -1
  114. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  115. package/dist/src/execution/tools/workflow/apply-run-messages-step.d.ts +20 -0
  116. package/dist/src/execution/tools/workflow/apply-run-messages-step.js +1 -0
  117. package/dist/src/execution/tools/workflow/ask.d.ts +0 -1
  118. package/dist/src/execution/tools/workflow/ask.js +1 -1
  119. package/dist/src/execution/tools/workflow/interrupt.d.ts +5 -2
  120. package/dist/src/execution/tools/workflow/interrupt.js +1 -1
  121. package/dist/src/execution/tools/workflow/messages.d.ts +14 -0
  122. package/dist/src/execution/tools/workflow/messages.js +1 -1
  123. package/dist/src/execution/tools/workflow/owner.d.ts +18 -6
  124. package/dist/src/execution/tools/workflow/owner.js +1 -1
  125. package/dist/src/execution/tools/workflow/start.d.ts +10 -0
  126. package/dist/src/execution/tools/workflow/start.js +1 -1
  127. package/dist/src/execution/tools/workflow/step.js +1 -1
  128. package/dist/src/execution/tools/workflow/workflow-owner-blocking.d.ts +12 -0
  129. package/dist/src/execution/tools/workflow/workflow-owner-blocking.js +1 -1
  130. package/dist/src/execution/tools/workflow/workflow.js +1 -1
  131. package/dist/src/execution/workflow-runtime.d.ts +18 -3
  132. package/dist/src/execution/workflow-runtime.js +1 -1
  133. package/dist/src/harness/execute-tool.d.ts +2 -2
  134. package/dist/src/harness/hitl/approvals.d.ts +4 -7
  135. package/dist/src/harness/hitl/approvals.js +1 -1
  136. package/dist/src/harness/hitl/approved-calls.d.ts +11 -0
  137. package/dist/src/harness/hitl/approved-calls.js +1 -1
  138. package/dist/src/harness/hitl/candidates.d.ts +0 -4
  139. package/dist/src/harness/hitl/candidates.js +1 -1
  140. package/dist/src/harness/hitl/delivery.d.ts +0 -1
  141. package/dist/src/harness/hitl/delivery.js +1 -1
  142. package/dist/src/harness/hitl/index.d.ts +2 -2
  143. package/dist/src/harness/hitl/index.js +1 -1
  144. package/dist/src/harness/hitl/intake.d.ts +2 -2
  145. package/dist/src/harness/hitl/intake.js +1 -1
  146. package/dist/src/harness/input-extraction.js +1 -1
  147. package/dist/src/harness/model-call/call.js +1 -1
  148. package/dist/src/harness/model-call/run.js +1 -1
  149. package/dist/src/harness/session-machine/state.d.ts +0 -2
  150. package/dist/src/harness/session-machine/view.d.ts +0 -3
  151. package/dist/src/harness/session-machine/view.js +1 -1
  152. package/dist/src/harness/step/after-model.js +1 -1
  153. package/dist/src/harness/tool-loop.js +1 -1
  154. package/dist/src/harness/tools.js +1 -1
  155. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  156. package/dist/src/instrumentation/dispatch.js +1 -1
  157. package/dist/src/instrumentation/memory.d.ts +1 -4
  158. package/dist/src/instrumentation/memory.js +1 -1
  159. package/dist/src/instrumentation/principal-summary.js +1 -1
  160. package/dist/src/instrumentation/providers.js +1 -1
  161. package/dist/src/instrumentation/runtime-context.d.ts +1 -1
  162. package/dist/src/instrumentation/runtime.d.ts +3 -3
  163. package/dist/src/instrumentation/runtime.js +1 -1
  164. package/dist/src/instrumentation/session-init.js +1 -1
  165. package/dist/src/internal/application/stamped-package-version.js +1 -1
  166. package/dist/src/internal/authored-definition/approval.d.ts +3 -1
  167. package/dist/src/internal/authored-definition/approval.js +1 -1
  168. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  169. package/dist/src/internal/logging.js +1 -1
  170. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  171. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  172. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
  173. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  174. package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
  175. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  176. package/dist/src/public/channels/slack/hitl.js +1 -1
  177. package/dist/src/public/definitions/approval.d.ts +1 -1
  178. package/dist/src/public/instrumentation/otel.d.ts +2 -2
  179. package/dist/src/public/instrumentation/otel.js +1 -1
  180. package/dist/src/public/tools/approval/index.d.ts +1 -1
  181. package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
  182. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  183. package/dist/src/runtime/resolve-tool.js +1 -1
  184. package/dist/src/runtime/types.d.ts +2 -2
  185. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
  186. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
  187. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
  188. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  189. package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
  190. package/dist/src/self-modification/extension/trace-inspection.js +1 -1
  191. package/dist/src/setup/scaffold/create/project.js +1 -1
  192. package/dist/src/shared/trace-policy.d.ts +3 -0
  193. package/dist/src/shared/trace-policy.js +1 -1
  194. package/dist/src/tools/definition.d.ts +3 -3
  195. package/dist/src/tools/durable-callbacks.d.ts +5 -3
  196. package/dist/src/tools/durable-callbacks.js +1 -1
  197. package/dist/src/tools/dynamic.d.ts +2 -2
  198. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  199. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  200. package/dist/src/tools/workflow-definition.d.ts +2 -2
  201. package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
  202. package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
  203. package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
  204. package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
  205. package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
  206. package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
  207. package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
  208. package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
  209. package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
  210. package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
  211. package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
  212. package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
  213. package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
  214. package/dist/src/tracing/eve/agent-trace-context.js +1 -0
  215. package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
  216. package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
  217. package/dist/src/tracing/eve/batch-span-processor.js +1 -0
  218. package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
  219. package/dist/src/tracing/eve/content-span-processor.js +1 -0
  220. package/dist/src/tracing/eve/delegation.d.ts +20 -0
  221. package/dist/src/tracing/eve/delegation.js +1 -0
  222. package/dist/src/tracing/eve/gateway.d.ts +16 -0
  223. package/dist/src/tracing/eve/gateway.js +1 -0
  224. package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
  225. package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
  226. package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
  227. package/dist/src/tracing/eve/mcp.d.ts +29 -0
  228. package/dist/src/tracing/eve/mcp.js +1 -0
  229. package/dist/src/tracing/eve/metadata.d.ts +7 -0
  230. package/dist/src/tracing/eve/metadata.js +1 -0
  231. package/dist/src/tracing/eve/operation-input.d.ts +30 -0
  232. package/dist/src/tracing/eve/operation-input.js +1 -0
  233. package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
  234. package/dist/src/tracing/eve/otel-configuration.js +1 -0
  235. package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +4 -11
  236. package/dist/src/tracing/eve/otel-declaration.js +1 -0
  237. package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
  238. package/dist/src/tracing/eve/otel-registration.js +1 -0
  239. package/dist/src/tracing/eve/policy.d.ts +15 -0
  240. package/dist/src/tracing/eve/policy.js +1 -0
  241. package/dist/src/tracing/eve/profile.d.ts +7 -0
  242. package/dist/src/tracing/eve/profile.js +1 -0
  243. package/dist/src/tracing/eve/session.d.ts +27 -0
  244. package/dist/src/tracing/eve/session.js +1 -0
  245. package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
  246. package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
  247. package/dist/src/tracing/local/inspection.d.ts +15 -0
  248. package/dist/src/tracing/local/inspection.js +1 -0
  249. package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
  250. package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
  251. package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
  252. package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
  253. package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
  254. package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
  255. package/dist/src/tracing/local/trace-reader.js +1 -0
  256. package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
  257. package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
  258. package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
  259. package/dist/src/tracing/local/trace-summary.js +1 -0
  260. package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
  261. package/dist/src/tracing/local/traces.js +1 -0
  262. package/docs/agent-config.md +12 -4
  263. package/docs/concepts/built-in-tools.md +9 -9
  264. package/docs/connections/mcp.mdx +22 -1
  265. package/docs/evals/assertions.mdx +50 -3
  266. package/docs/evals/overview.mdx +2 -1
  267. package/docs/evals/reporters.mdx +3 -1
  268. package/docs/guides/dynamic-capabilities.md +6 -2
  269. package/docs/sandbox/index.mdx +2 -0
  270. package/docs/tools/human-in-the-loop.md +24 -2
  271. package/package.json +2 -1
  272. package/dist/src/context/caller-scope.d.ts +0 -7
  273. package/dist/src/context/caller-scope.js +0 -1
  274. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.d.ts +0 -13
  275. package/dist/src/execution/tools/workflow/emit-workflow-tool-run-report-step.js +0 -1
  276. package/dist/src/harness/hitl/approved-call-callers.d.ts +0 -14
  277. package/dist/src/harness/hitl/approved-call-callers.js +0 -1
  278. package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
  279. package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
  280. package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
  281. package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
  282. package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
  283. package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
  284. package/dist/src/tracing/agent-otel-attributes.js +0 -1
  285. package/dist/src/tracing/agent-otel-content.js +0 -4
  286. package/dist/src/tracing/agent-otel-provider.js +0 -2
  287. package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
  288. package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
  289. package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
  290. package/dist/src/tracing/agent-otel-session-context.js +0 -1
  291. package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
  292. package/dist/src/tracing/agent-otel-turn-state.js +0 -1
  293. package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
  294. package/dist/src/tracing/agent-otel-usage.js +0 -1
  295. package/dist/src/tracing/agent-span-contract.d.ts +0 -34
  296. package/dist/src/tracing/agent-span-contract.js +0 -1
  297. package/dist/src/tracing/agent-span-error.js +0 -1
  298. package/dist/src/tracing/agent-span-id-generator.js +0 -1
  299. package/dist/src/tracing/agent-span-naming.d.ts +0 -1
  300. package/dist/src/tracing/agent-span-naming.js +0 -1
  301. package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
  302. package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
  303. package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
  304. package/dist/src/tracing/agent-tool-span-context.js +0 -1
  305. package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
  306. package/dist/src/tracing/agent-trace-context-codec.js +0 -1
  307. package/dist/src/tracing/agent-trace-context-store.js +0 -1
  308. package/dist/src/tracing/agent-trace-context.js +0 -1
  309. package/dist/src/tracing/agent-trace-span-processor.js +0 -1
  310. package/dist/src/tracing/agent-trace-state.d.ts +0 -91
  311. package/dist/src/tracing/batch-span-processor.js +0 -1
  312. package/dist/src/tracing/bounded-error.d.ts +0 -1
  313. package/dist/src/tracing/bounded-error.js +0 -1
  314. package/dist/src/tracing/content-attributes.js +0 -1
  315. package/dist/src/tracing/content-span-processor.js +0 -1
  316. package/dist/src/tracing/error-content-context.d.ts +0 -3
  317. package/dist/src/tracing/error-content-context.js +0 -1
  318. package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
  319. package/dist/src/tracing/invoke-tool-span.js +0 -1
  320. package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
  321. package/dist/src/tracing/local-trace-reader.js +0 -1
  322. package/dist/src/tracing/local-trace-summary.js +0 -1
  323. package/dist/src/tracing/local-traces.js +0 -1
  324. package/dist/src/tracing/otel-declaration.js +0 -1
  325. package/dist/src/tracing/otel-registration.js +0 -1
  326. package/dist/src/tracing/sampled-trace.d.ts +0 -4
  327. package/dist/src/tracing/sampled-trace.js +0 -1
  328. package/dist/src/tracing/suppress-tracing.d.ts +0 -2
  329. package/dist/src/tracing/suppress-tracing.js +0 -1
  330. package/dist/src/tracing/telemetry-budget.d.ts +0 -3
  331. package/dist/src/tracing/telemetry-budget.js +0 -1
  332. /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
  333. /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
  334. /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
  335. /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
  336. /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
  337. /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
  338. /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
  339. /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
  340. /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
  341. /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
  342. /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
  343. /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
  344. /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
  345. /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
  346. /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
  347. /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
  348. /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
  349. /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
  350. /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
  351. /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
@@ -4,8 +4,8 @@ import type { AssertionResult, EveEvalVerdict } from "#evals/types.js";
4
4
  * assertions. An execution error or a failed gate assertion is a hard
5
5
  * failure; a below-threshold soft assertion at worst demotes the eval to
6
6
  * `"scored"` (which `eve eval --strict` later promotes to a failing exit
7
- * code). Soft assertions without a threshold are tracked-only and never
8
- * demote the verdict.
7
+ * code). Entries without an acceptance rule carry no verdict and never
8
+ * demote the eval.
9
9
  */
10
10
  export declare function computeEvalVerdict(input: {
11
11
  readonly error?: string;
@@ -1 +1 @@
1
- function computeEvalVerdict(e){if(e.error!==void 0)return`failed`;let t=!1;for(let n of e.assertions)if(!n.passed){if(n.severity===`gate`)return`failed`;t=!0}return e.skipReason===void 0?t?`scored`:`passed`:`skipped`}export{computeEvalVerdict};
1
+ function computeEvalVerdict(e){if(e.error!==void 0)return`failed`;let t=!1;for(let n of e.assertions)if(n.passed===!1){if(n.severity===`gate`)return`failed`;t=!0}return e.skipReason===void 0?t?`scored`:`passed`:`skipped`}export{computeEvalVerdict};
@@ -169,6 +169,8 @@ export interface AssertionEvaluation {
169
169
  /** Structured diagnostic evidence retained by artifacts and reporters. */
170
170
  readonly metadata?: Readonly<Record<string, unknown>>;
171
171
  }
172
+ /** A score from 0 to 1, or an evaluation carrying one, accepted by `t.score`; may be a promise. */
173
+ export type ScoreInput = number | AssertionEvaluation | Promise<number | AssertionEvaluation>;
172
174
  /**
173
175
  * A value-level assertion produced by the builders in `eve/evals/expect`
174
176
  * (e.g. `includes`, `equals`, `similarity`) and applied to an explicit value
@@ -200,20 +202,28 @@ export interface AssertionHandle {
200
202
  gate(threshold?: number): this;
201
203
  soft(threshold?: number): this;
202
204
  atLeast(threshold: number): this;
203
- /** Adds a stable human-readable label to this recorded assertion. */
205
+ /** Sets this entry's stable `key` and appends the label to its display name. */
204
206
  label(label: string): this;
205
207
  }
206
208
  /**
207
- * The recorded outcome of one assertion, consumed by the verdict, reporters,
208
- * and artifacts. A boolean assertion has `score` 0 or 1.
209
+ * The recorded outcome of one assertion or `t.score`, consumed by the verdict,
210
+ * reporters, and artifacts. `score` is the measurement and a rule does not
211
+ * change it; `threshold` and `passed` describe the rule and are absent when
212
+ * none applies. A boolean assertion has `score` 0 or 1.
209
213
  */
210
214
  export interface AssertionResult {
215
+ /** Display name, e.g. `judge.boolean [citation]`. */
211
216
  readonly name: string;
212
- readonly score: number;
217
+ /** Stable identifier set by `.label(key)`; absent for unlabeled assertions. */
218
+ readonly key?: string;
219
+ /** The measurement; absent when the scorer threw. */
220
+ readonly score?: number;
213
221
  readonly severity: AssertionSeverity;
222
+ /** Effective minimum passing score (a gate defaults to 1); absent when no rule applies. */
214
223
  readonly threshold?: number;
215
- readonly passed: boolean;
216
- /** Whether the assertion failed because its scorer threw instead of producing a score. */
224
+ /** Verdict of the acceptance rule; absent when no rule applies. */
225
+ readonly passed?: boolean;
226
+ /** Whether the scorer threw; an errored entry is always a failed outcome. */
217
227
  readonly errored: boolean;
218
228
  /** Human-readable failure detail, shown in console output and artifacts. */
219
229
  readonly message?: string;
@@ -423,6 +433,12 @@ export interface EveEvalContext<TContext = unknown> extends EveEvalAssertions {
423
433
  send(message: SendTurnInput["message"], options?: SendTurnOptions): Promise<EveEvalTurn>;
424
434
  /** Apply a value-level assertion (from `eve/evals/expect`) to a value. */
425
435
  check(value: unknown, assertion: Assertion): AssertionHandle;
436
+ /**
437
+ * Record a score from 0 to 1. Chain `.label(key)` to name it, `.gate(0.9)`
438
+ * to fail the eval below 0.9, or `.atLeast(0.9)` to mark it `scored`.
439
+ * Without a rule the score has no verdict.
440
+ */
441
+ score(evaluation: ScoreInput): AssertionHandle;
426
442
  /** Record an immediate gate and abort dependent control flow when it fails. */
427
443
  require<T>(value: T, assertion: Assertion): Promise<T>;
428
444
  /** Mark this eval as intentionally skipped and stop executing its test body. */
@@ -1 +1 @@
1
- import{attachClientContext}from"#internal/client-context.js";import{createLogger,logError}from"#internal/logging.js";import{FAIL_CLOSED_FORWARDED_TRACE_ASSERTION,formatTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_ROUTE_PREFIX,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,EVE_SESSION_STUBS_ROUTE_PATTERN,EVE_SUBAGENT_STREAM_ROUTE_PATTERN,createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER}from"#protocol/message.js";import{DELETE,GET,HEAD,PATCH,POST,PUT,defineChannel}from"#public/definitions/channel.js";import{readMatchedStubRules,readStubFailure}from"#execution/tool-stubs/steps.js";import{InvalidToolStubTargetError}from"#tool-stubs/validate-targets.js";import{getRun}from"#internal/workflow/runtime.js";import{handleExpiredLegacyAuthorization}from"#execution/legacy-session/authorization.js";import{resolveForwardedPrincipal}from"#channel/forwarded-principal.js";import{handleConnectionCallbackRequest}from"#execution/connections/callback-route.js";import{handleSessionCallbackRequest}from"#subagents/callback-route.js";import{WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest}from"#execution/workflow-webhook-route.js";import{readAgentInfoRouteResponse,readRemoteAgentStreamHeadersResolver,readRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{legacyTaskInputRoute}from"#execution/legacy-remote-agent/protocol.js";import{parseTraceparent,readAgentDispatchTraceContext}from"#protocol/traceparent.js";import{readForwardedAudienceBaggage,readForwardedParentSessionBaggage}from"#protocol/baggage.js";import{readConversationBaggage}from"#tracing/conversation-context.js";import{sessionAuthFromResult}from"#channel/auth/result.js";import{routeAuth}from"#public/channels/auth.js";import{defaultEveAudience}from"#eve-channel/audience.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{checkUploadPolicy,createSessionStreamResponse,deriveOperationContinuationToken,parseCancelTurnBody,parseCreateBody,parseIncludeTailIndex,parseJsonRequest,parseOptionalJsonRequest,parseResetBody,parseSessionControlBody,parseSessionMessageBody,parseStartIndex,rejectSessionContinuationToken,requireSessionId}from"#eve-channel/request.js";import{findRemoteAgentBinding,healthResponse,normalizeEveCors,resolveOnMessage,strandedSessionResponse}from"#eve-channel/support.js";export*from"#eve-channel/types.js";const log=createLogger(`eve.channel`);function createdSessionBody(e,t){let n={ok:!0,sessionId:e,status:`accepted`};return t.protocolVersion!==void 0&&(n.protocolVersion=t.protocolVersion),n}function eveChannel(e){let t=mergeUploadPolicy(e.uploadPolicy);return defineChannel({cors:normalizeEveCors(e.cors),turnPolicy:e.turnPolicy,audience:t=>{let n=e.audience??defaultEveAudience;return typeof n==`function`?n(t):n},routes:[GET(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),HEAD(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),GET(EVE_INFO_ROUTE_PATH,async(t,n)=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;let i=readAgentInfoRouteResponse(n);return i===void 0?Response.json({error:`Agent info route requires internal channel dispatch context.`,ok:!1},{status:500}):await i()}),GET(`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,handleExpiredLegacyAuthorization),POST(`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,handleExpiredLegacyAuthorization),GET(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),POST(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),POST(EVE_CALLBACK_ROUTE_PATTERN,handleSessionCallbackRequest),POST(legacyTaskInputRoute.path,legacyTaskInputRoute.handler),GET(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PUT(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PATCH(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),DELETE(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(EVE_SESSION_ROUTE_PATH,async(n,r)=>{let i=await routeAuth(n,e.auth);if(i instanceof Response)return i;let a=sessionAuthFromResult(i),o=await parseOptionalJsonRequest(n);if(o instanceof Response)return o;if(o.stubs!==void 0&&i.allowToolStubs!==!0)return Response.json({ok:!1,error:`Tool stubbing is not permitted for this caller.`},{status:403});let s=rejectSessionContinuationToken(o);if(s!==null)return s;let c=await resolveForwardedPrincipal({trustedForwarders:e.trustedForwarders,forwarder:a,payload:o});if(c instanceof Response)return c;let l=parseCreateBody(o);if(l instanceof Response)return l;l.callback!==void 0&&l.legacyRemoteAgentCaller!==void 0&&log.info(`serving a remote agent protocol 1 caller`,{callerOrigin:new URL(l.callback.url).origin,forwarder:i.principalId});let u=l.callback===void 0?`absent`:readForwardedParentSessionBaggage(n.headers.get(`baggage`)),d;if(typeof u==`object`){if(u.callId!==l.callback?.callId)log.warn(`ignoring remote parent lineage with a mismatched callback`,{forwarder:i.principalId});else{let t=c.accepted;if(!t&&e.trustedForwarders!==void 0)try{t=await e.trustedForwarders(a,{})}catch(e){let t=logError(log,`trustedForwarders handler failed`,e,{forwarder:i.principalId});return Response.json({error:`trustedForwarders handler failed.`,errorId:t,ok:!1},{status:500})}t?d=u:log.warn(`ignoring remote parent lineage from an untrusted forwarder`,{forwarder:i.principalId})}}else u===`malformed`&&log.warn(`ignoring malformed remote parent lineage`,{forwarder:i.principalId});let f=l.callback===void 0?void 0:parseTraceparent(n.headers.get(`traceparent`)),p=l.callback===void 0?void 0:readAgentDispatchTraceContext(n.headers.get(`tracestate`),f)??f,m=checkUploadPolicy(l,t);if(m!==null)return m;if(l.operationId!==void 0&&c.auth.principalType===`anonymous`)return Response.json({error:`operationId requires an authenticated principal.`,ok:!1},{status:400});let h=l.operationId===void 0?void 0:await deriveOperationContinuationToken({auth:c.auth,operationId:l.operationId});if(h!==void 0){let e=await r.resolveSession(h);if(e!==void 0)return Response.json(createdSessionBody(e.id,l),{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:e.id},status:202})}let g=f===void 0?`absent`:readForwardedAudienceBaggage(n.headers.get(`baggage`)),_=c.accepted&&f!==void 0&&(f.traceFlags&1)==1?typeof g==`object`?g:g===`malformed`?FAIL_CLOSED_FORWARDED_TRACE_ASSERTION:void 0:void 0,v=p;_!==void 0&&p!==void 0&&(v={...p,forwardedTracePolicy:_}),g===`malformed`?log.warn(`using metadata-only policy for malformed forwarded audience baggage`,{forwarder:i.principalId}):typeof g==`object`&&(_===void 0?log.warn(`ignoring forwarded trace policy without an accepted sampled principal`,{forwarder:i.principalId}):log.info(`accepted forwarded trace policy`,{audience:g.originAudience,ceiling:formatTraceContentCeiling(g.ceiling),forwarder:i.principalId}));let y=l.message===void 0?{auth:c.auth}:await resolveOnMessage({auth:c.auth,config:e,invocation:d===void 0||l.operationId===void 0?void 0:{operationId:l.operationId},message:l.message,request:n});if(y instanceof Response)return y;let b=readRouteSessionCreator(r);if(b===void 0)return Response.json({error:`Session creation requires internal channel dispatch context.`,ok:!1},{status:500});let x;try{x=await b({audienceAuth:a,toolStubs:l.stubs===void 0?void 0:{rules:l.stubs,token:crypto.randomUUID()},auth:y.auth,capabilities:l.capabilities??{requestInput:!0},callback:l.callback,legacyRemoteAgentCaller:l.legacyRemoteAgentCaller,continuationToken:h,initiatorAuth:c.accepted?c.initiatorAuth:void 0,input:attachClientContext({message:l.message,context:y.context,outputSchema:l.outputSchema},l.context),conversationId:l.callback===void 0?void 0:readConversationBaggage(n.headers.get(`baggage`)),parent:d,parentTraceContext:v,traceRoot:d===void 0?void 0:{kind:`own`},title:y.title})}catch(e){if(e instanceof InvalidToolStubTargetError)return Response.json({error:e.message,ok:!1},{status:400});let t=logError(log,`session-create request failed`,e);return Response.json({error:`Failed to create the session.`,errorId:t,ok:!1},{status:500})}return Response.json(createdSessionBody(x.sessionId,l),{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:x.sessionId},status:202})}),POST(EVE_SESSION_ROUTE_PATTERN,async(n,{attachSession:r,params:i})=>{let a=await routeAuth(n,e.auth);if(a instanceof Response)return a;let o=requireSessionId(i);if(o instanceof Response)return o;let s=await parseJsonRequest(n);if(s instanceof Response)return s;let c=await resolveForwardedPrincipal({trustedForwarders:e.trustedForwarders,forwarder:sessionAuthFromResult(a),payload:s});if(c instanceof Response)return c;let l=parseSessionMessageBody(s);if(l instanceof Response)return l;let u=checkUploadPolicy(l,t);if(u!==null)return u;let d,f,p=c.auth;if(l.message!==void 0){let t=await resolveOnMessage({auth:c.auth,config:e,message:l.message,request:n,sessionId:o});if(t instanceof Response)return t;d=t.context,f=t.title,p=t.auth}let m;try{let e=r(o),t=attachClientContext({auth:p,callback:l.callback,context:d,outputSchema:l.outputSchema,turnPolicy:l.turnPolicy,title:f},l.context);m=l.inputResponses===void 0?await e.send(l.message,t):await e.respond(l.inputResponses,t)}catch(e){let t=strandedSessionResponse(e);if(t!==void 0)return t;let n=logError(log,`session-message request failed`,e,{sessionId:o});return Response.json({error:`Failed to send the session message.`,errorId:n,ok:!1},{status:500})}return m.status===`accepted`?Response.json({ok:!0,sessionId:m.sessionId,status:`accepted`,deliveryId:m.deliveryId},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:m.sessionId},status:202}):Response.json({code:m.retryable?`session_not_ready`:`session_not_active`,error:m.retryable===!0?`The session is not ready to accept messages yet.`:`The session is no longer active.`,ok:!1},{headers:{"cache-control":`no-store`},status:409})}),POST(EVE_SESSION_CANCEL_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseCancelTurnBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).cancel({turnId:o.turnId})}catch(e){let t=logError(log,`cancel-turn request failed`,e,{sessionId:a});return Response.json({error:`Failed to cancel the turn.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`accepted`?{ok:!0,sessionId:s.sessionId,status:`accepted`}:{ok:!0,status:`no_active_turn`},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_COMPACT_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseSessionControlBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).compact()}catch(e){let t=logError(log,`session-compaction request failed`,e,{sessionId:a});return Response.json({error:`Failed to compact the session.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`accepted`?{ok:!0,sessionId:s.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_CLEAR_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseSessionControlBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).clear()}catch(e){let t=strandedSessionResponse(e);if(t!==void 0)return t;let n=logError(log,`session-clear request failed`,e,{sessionId:a});return Response.json({error:`Failed to clear the session context.`,errorId:n,ok:!1},{status:500})}return Response.json({ok:!0,...s},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_RESET_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseResetBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).reset({reason:o.reason})}catch(e){let t=logError(log,`session-reset request failed`,e,{sessionId:a});return Response.json({error:`Failed to reset the session.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`reset`?{ok:!0,previousSessionId:s.previousSessionId,status:`reset`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`}})}),GET(EVE_SESSION_STUBS_ROUTE_PATTERN,async(t,{params:n})=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;if(r.allowToolStubs!==!0)return Response.json({error:`Tool stubbing is not permitted for this caller.`,ok:!1},{status:403});let i=requireSessionId(n);if(i instanceof Response)return i;try{return await getRun(i).exists?Response.json({error:await readStubFailure(i)??null,matchedRuleIds:await readMatchedStubRules(i)},{headers:{"cache-control":`no-store`}}):Response.json({error:`Session not found.`,ok:!1},{status:404})}catch(e){let t=logError(log,`tool-stub verification request failed`,e,{sessionId:i});return Response.json({error:`Failed to verify tool stubs.`,errorId:t,ok:!1},{status:500})}}),GET(EVE_SESSION_STREAM_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);return a instanceof Response?a:await createSessionStreamResponse(t,n(a))}),GET(EVE_SUBAGENT_STREAM_ROUTE_PATTERN,async(t,n)=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;let i=n.params.parentSessionId,a=n.params.callId,o=n.params.childSessionId;if(!i||!a||!o)return Response.json({error:`Missing subagent stream coordinates.`,ok:!1},{status:400});let s=parseStartIndex(t);if(s instanceof Response)return s;let c=parseIncludeTailIndex(t),l=createEveSubagentStreamRoutePath({callId:a,childSessionId:o,parentSessionId:i}),u;try{let e=n.attachSession(i),t=await findRemoteAgentBinding({callId:a,childSessionId:o,childStreamPath:l,parent:e});if(t===void 0)throw Error(`Remote subagent binding not found.`);u=t}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let d=readRemoteAgentStreamHeadersResolver(n);if(d===void 0)return Response.json({error:`Subagent stream proxy requires internal channel dispatch context.`,ok:!1},{status:500});let f;try{f=await d(u)}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let p=new URL(createEveSessionStreamRoutePath(o).replace(/^\/+/,``),`${u.url.replace(/\/+$/,``)}/`);s!==void 0&&p.searchParams.set(`startIndex`,String(s));let m=new URL(t.url).searchParams.get(EVE_STREAM_CONTROL_VERSION_QUERY);m!==null&&p.searchParams.set(EVE_STREAM_CONTROL_VERSION_QUERY,m),c&&p.searchParams.set(`includeTailIndex`,`1`);let h=await fetch(p,{cache:`no-store`,headers:f,redirect:`manual`,signal:t.signal}),g=new Headers;for(let e of[`cache-control`,`content-type`,`x-accel-buffering`,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER]){let t=h.headers.get(e);t!==null&&g.set(e,t)}return new Response(h.body,{headers:g,status:h.status,statusText:h.statusText})})],events:e.events,fetchFile:e.fetchFile,uploadPolicy:e.uploadPolicy})}export{eveChannel};
1
+ import{attachClientContext}from"#internal/client-context.js";import{createLogger,logError}from"#internal/logging.js";import{FAIL_CLOSED_FORWARDED_TRACE_ASSERTION,formatTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{EVE_CALLBACK_ROUTE_PATTERN,EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,EVE_HEALTH_ROUTE_PATH,EVE_INFO_ROUTE_PATH,EVE_ROUTE_PREFIX,EVE_SESSION_CANCEL_ROUTE_PATTERN,EVE_SESSION_CLEAR_ROUTE_PATTERN,EVE_SESSION_COMPACT_ROUTE_PATTERN,EVE_SESSION_RESET_ROUTE_PATTERN,EVE_SESSION_ROUTE_PATH,EVE_SESSION_ROUTE_PATTERN,EVE_SESSION_STREAM_ROUTE_PATTERN,EVE_SESSION_STUBS_ROUTE_PATTERN,EVE_SUBAGENT_STREAM_ROUTE_PATTERN,createEveSessionStreamRoutePath,createEveSubagentStreamRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,EVE_STREAM_CONTROL_VERSION_QUERY}from"#protocol/message.js";import{DELETE,GET,HEAD,PATCH,POST,PUT,defineChannel}from"#public/definitions/channel.js";import{readMatchedStubRules,readStubFailure}from"#execution/tool-stubs/steps.js";import{InvalidToolStubTargetError}from"#tool-stubs/validate-targets.js";import{getRun}from"#internal/workflow/runtime.js";import{proxyStreamHeaders}from"#eve-channel/stream-headers.js";import{handleExpiredLegacyAuthorization}from"#execution/legacy-session/authorization.js";import{resolveForwardedPrincipal}from"#channel/forwarded-principal.js";import{handleConnectionCallbackRequest}from"#execution/connections/callback-route.js";import{handleSessionCallbackRequest}from"#subagents/callback-route.js";import{WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest}from"#execution/workflow-webhook-route.js";import{readAgentInfoRouteResponse,readRemoteAgentStreamHeadersResolver,readRouteSessionCreator}from"#internal/nitro/routes/channel-route-context.js";import{legacyTaskInputRoute}from"#execution/legacy-remote-agent/protocol.js";import{parseTraceparent,readAgentDispatchTraceContext}from"#protocol/traceparent.js";import{readForwardedAudienceBaggage,readForwardedParentSessionBaggage}from"#protocol/baggage.js";import{agentDelegation}from"#tracing/eve/delegation.js";import{sessionAuthFromResult}from"#channel/auth/result.js";import{routeAuth}from"#public/channels/auth.js";import{defaultEveAudience}from"#eve-channel/audience.js";import{mergeUploadPolicy}from"#public/channels/upload-policy.js";import{checkUploadPolicy,createSessionStreamResponse,deriveOperationContinuationToken,parseCancelTurnBody,parseCreateBody,parseIncludeTailIndex,parseJsonRequest,parseOptionalJsonRequest,parseResetBody,parseSessionControlBody,parseSessionMessageBody,parseStartIndex,rejectSessionContinuationToken,requireSessionId}from"#eve-channel/request.js";import{findRemoteAgentBinding,healthResponse,normalizeEveCors,resolveOnMessage,strandedSessionResponse}from"#eve-channel/support.js";export*from"#eve-channel/types.js";const log=createLogger(`eve.channel`);function createdSessionBody(e,t){let n={ok:!0,sessionId:e,status:`accepted`};return t.protocolVersion!==void 0&&(n.protocolVersion=t.protocolVersion),n}function eveChannel(e){let t=mergeUploadPolicy(e.uploadPolicy);return defineChannel({cors:normalizeEveCors(e.cors),turnPolicy:e.turnPolicy,audience:t=>{let n=e.audience??defaultEveAudience;return typeof n==`function`?n(t):n},routes:[GET(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),HEAD(EVE_HEALTH_ROUTE_PATH,async()=>healthResponse()),GET(EVE_INFO_ROUTE_PATH,async(t,n)=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;let i=readAgentInfoRouteResponse(n);return i===void 0?Response.json({error:`Agent info route requires internal channel dispatch context.`,ok:!1},{status:500}):await i()}),GET(`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,handleExpiredLegacyAuthorization),POST(`${EVE_ROUTE_PREFIX}/connections/:name/callback/:token`,handleExpiredLegacyAuthorization),GET(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),POST(EVE_CONNECTION_CALLBACK_ROUTE_PATTERN,handleConnectionCallbackRequest),POST(EVE_CALLBACK_ROUTE_PATTERN,handleSessionCallbackRequest),POST(legacyTaskInputRoute.path,legacyTaskInputRoute.handler),GET(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PUT(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),PATCH(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),DELETE(WORKFLOW_WEBHOOK_ROUTE_PATTERN,handleWorkflowWebhookRequest),POST(EVE_SESSION_ROUTE_PATH,async(n,r)=>{let i=await routeAuth(n,e.auth);if(i instanceof Response)return i;let a=sessionAuthFromResult(i),o=await parseOptionalJsonRequest(n);if(o instanceof Response)return o;if(o.stubs!==void 0&&i.allowToolStubs!==!0)return Response.json({ok:!1,error:`Tool stubbing is not permitted for this caller.`},{status:403});let s=rejectSessionContinuationToken(o);if(s!==null)return s;let c=await resolveForwardedPrincipal({trustedForwarders:e.trustedForwarders,forwarder:a,payload:o});if(c instanceof Response)return c;let l=parseCreateBody(o);if(l instanceof Response)return l;l.callback!==void 0&&l.legacyRemoteAgentCaller!==void 0&&log.info(`serving a remote agent protocol 1 caller`,{callerOrigin:new URL(l.callback.url).origin,forwarder:i.principalId});let u=l.callback===void 0?`absent`:readForwardedParentSessionBaggage(n.headers.get(`baggage`)),d;if(typeof u==`object`){if(u.callId!==l.callback?.callId)log.warn(`ignoring remote parent lineage with a mismatched callback`,{forwarder:i.principalId});else{let t=c.accepted;if(!t&&e.trustedForwarders!==void 0)try{t=await e.trustedForwarders(a,{})}catch(e){let t=logError(log,`trustedForwarders handler failed`,e,{forwarder:i.principalId});return Response.json({error:`trustedForwarders handler failed.`,errorId:t,ok:!1},{status:500})}t?d=u:log.warn(`ignoring remote parent lineage from an untrusted forwarder`,{forwarder:i.principalId})}}else u===`malformed`&&log.warn(`ignoring malformed remote parent lineage`,{forwarder:i.principalId});let f=l.callback===void 0?void 0:parseTraceparent(n.headers.get(`traceparent`)),p=l.callback===void 0?void 0:readAgentDispatchTraceContext(n.headers.get(`tracestate`),f)??f,m=checkUploadPolicy(l,t);if(m!==null)return m;if(l.operationId!==void 0&&c.auth.principalType===`anonymous`)return Response.json({error:`operationId requires an authenticated principal.`,ok:!1},{status:400});let h=l.operationId===void 0?void 0:await deriveOperationContinuationToken({auth:c.auth,operationId:l.operationId});if(h!==void 0){let e=await r.resolveSession(h);if(e!==void 0)return Response.json(createdSessionBody(e.id,l),{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:e.id},status:202})}let g=f===void 0?`absent`:readForwardedAudienceBaggage(n.headers.get(`baggage`)),_=c.accepted&&f!==void 0&&(f.traceFlags&1)==1?typeof g==`object`?g:g===`malformed`?FAIL_CLOSED_FORWARDED_TRACE_ASSERTION:void 0:void 0,v=p;_!==void 0&&p!==void 0&&(v={...p,forwardedTracePolicy:_}),g===`malformed`?log.warn(`using metadata-only policy for malformed forwarded audience baggage`,{forwarder:i.principalId}):typeof g==`object`&&(_===void 0?log.warn(`ignoring forwarded trace policy without an accepted sampled principal`,{forwarder:i.principalId}):log.info(`accepted forwarded trace policy`,{audience:g.originAudience,ceiling:formatTraceContentCeiling(g.ceiling),forwarder:i.principalId}));let y=l.message===void 0?{auth:c.auth}:await resolveOnMessage({auth:c.auth,config:e,invocation:d===void 0||l.operationId===void 0?void 0:{operationId:l.operationId},message:l.message,request:n});if(y instanceof Response)return y;let b=readRouteSessionCreator(r);if(b===void 0)return Response.json({error:`Session creation requires internal channel dispatch context.`,ok:!1},{status:500});let x;try{x=await agentDelegation.receive({headers:n.headers,delegated:l.callback!==void 0,trusted:c.accepted,parent:d,callerTrace:p,parentTraceContext:v},({conversationId:e,parentTraceContext:t})=>b({audienceAuth:a,toolStubs:l.stubs===void 0?void 0:{rules:l.stubs,token:crypto.randomUUID()},auth:y.auth,capabilities:l.capabilities??{requestInput:!0},callback:l.callback,legacyRemoteAgentCaller:l.legacyRemoteAgentCaller,continuationToken:h,initiatorAuth:c.accepted?c.initiatorAuth:void 0,input:attachClientContext({message:l.message,context:y.context,outputSchema:l.outputSchema},l.context),conversationId:e,parent:d,parentTraceContext:t,traceRoot:d===void 0?void 0:{kind:`own`},title:y.title}))}catch(e){if(e instanceof InvalidToolStubTargetError)return Response.json({error:e.message,ok:!1},{status:400});let t=logError(log,`session-create request failed`,e);return Response.json({error:`Failed to create the session.`,errorId:t,ok:!1},{status:500})}return Response.json(createdSessionBody(x.sessionId,l),{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:x.sessionId},status:202})}),POST(EVE_SESSION_ROUTE_PATTERN,async(n,{attachSession:r,params:i})=>{let a=await routeAuth(n,e.auth);if(a instanceof Response)return a;let o=requireSessionId(i);if(o instanceof Response)return o;let s=await parseJsonRequest(n);if(s instanceof Response)return s;let c=await resolveForwardedPrincipal({trustedForwarders:e.trustedForwarders,forwarder:sessionAuthFromResult(a),payload:s});if(c instanceof Response)return c;let l=parseSessionMessageBody(s);if(l instanceof Response)return l;let u=checkUploadPolicy(l,t);if(u!==null)return u;let d,f,p=c.auth;if(l.message!==void 0){let t=await resolveOnMessage({auth:c.auth,config:e,message:l.message,request:n,sessionId:o});if(t instanceof Response)return t;d=t.context,f=t.title,p=t.auth}let m;try{let e=r(o),t=attachClientContext({auth:p,callback:l.callback,context:d,outputSchema:l.outputSchema,turnPolicy:l.turnPolicy,title:f},l.context);m=l.inputResponses===void 0?await e.send(l.message,t):await e.respond(l.inputResponses,t)}catch(e){let t=strandedSessionResponse(e);if(t!==void 0)return t;let n=logError(log,`session-message request failed`,e,{sessionId:o});return Response.json({error:`Failed to send the session message.`,errorId:n,ok:!1},{status:500})}return m.status===`accepted`?Response.json({ok:!0,sessionId:m.sessionId,status:`accepted`,deliveryId:m.deliveryId},{headers:{"cache-control":`no-store`,[EVE_SESSION_ID_HEADER]:m.sessionId},status:202}):Response.json({code:m.retryable?`session_not_ready`:`session_not_active`,error:m.retryable===!0?`The session is not ready to accept messages yet.`:`The session is no longer active.`,ok:!1},{headers:{"cache-control":`no-store`},status:409})}),POST(EVE_SESSION_CANCEL_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseCancelTurnBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).cancel({turnId:o.turnId})}catch(e){let t=logError(log,`cancel-turn request failed`,e,{sessionId:a});return Response.json({error:`Failed to cancel the turn.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`accepted`?{ok:!0,sessionId:s.sessionId,status:`accepted`}:{ok:!0,status:`no_active_turn`},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_COMPACT_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseSessionControlBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).compact()}catch(e){let t=logError(log,`session-compaction request failed`,e,{sessionId:a});return Response.json({error:`Failed to compact the session.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`accepted`?{ok:!0,sessionId:s.sessionId,status:`accepted`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_CLEAR_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseSessionControlBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).clear()}catch(e){let t=strandedSessionResponse(e);if(t!==void 0)return t;let n=logError(log,`session-clear request failed`,e,{sessionId:a});return Response.json({error:`Failed to clear the session context.`,errorId:n,ok:!1},{status:500})}return Response.json({ok:!0,...s},{headers:{"cache-control":`no-store`},status:s.status===`accepted`?202:200})}),POST(EVE_SESSION_RESET_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);if(a instanceof Response)return a;let o=await parseResetBody(t);if(o instanceof Response)return o;let s;try{s=await n(a).reset({reason:o.reason})}catch(e){let t=logError(log,`session-reset request failed`,e,{sessionId:a});return Response.json({error:`Failed to reset the session.`,errorId:t,ok:!1},{status:500})}return Response.json(s.status===`reset`?{ok:!0,previousSessionId:s.previousSessionId,status:`reset`}:{ok:!0,status:`no_active_session`},{headers:{"cache-control":`no-store`}})}),GET(EVE_SESSION_STUBS_ROUTE_PATTERN,async(t,{params:n})=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;if(r.allowToolStubs!==!0)return Response.json({error:`Tool stubbing is not permitted for this caller.`,ok:!1},{status:403});let i=requireSessionId(n);if(i instanceof Response)return i;try{return await getRun(i).exists?Response.json({error:await readStubFailure(i)??null,matchedRuleIds:await readMatchedStubRules(i)},{headers:{"cache-control":`no-store`}}):Response.json({error:`Session not found.`,ok:!1},{status:404})}catch(e){let t=logError(log,`tool-stub verification request failed`,e,{sessionId:i});return Response.json({error:`Failed to verify tool stubs.`,errorId:t,ok:!1},{status:500})}}),GET(EVE_SESSION_STREAM_ROUTE_PATTERN,async(t,{attachSession:n,params:r})=>{let i=await routeAuth(t,e.auth);if(i instanceof Response)return i;let a=requireSessionId(r);return a instanceof Response?a:await createSessionStreamResponse(t,n(a))}),GET(EVE_SUBAGENT_STREAM_ROUTE_PATTERN,async(t,n)=>{let r=await routeAuth(t,e.auth);if(r instanceof Response)return r;let i=n.params.parentSessionId,a=n.params.callId,o=n.params.childSessionId;if(!i||!a||!o)return Response.json({error:`Missing subagent stream coordinates.`,ok:!1},{status:400});let s=parseStartIndex(t);if(s instanceof Response)return s;let c=parseIncludeTailIndex(t),l=createEveSubagentStreamRoutePath({callId:a,childSessionId:o,parentSessionId:i}),u;try{let e=n.attachSession(i),t=await findRemoteAgentBinding({callId:a,childSessionId:o,childStreamPath:l,parent:e});if(t===void 0)throw Error(`Remote subagent binding not found.`);u=t}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let d=readRemoteAgentStreamHeadersResolver(n);if(d===void 0)return Response.json({error:`Subagent stream proxy requires internal channel dispatch context.`,ok:!1},{status:500});let f;try{f=await d(u)}catch{return Response.json({error:`Subagent stream not found.`,ok:!1},{status:404})}let p=new URL(createEveSessionStreamRoutePath(o).replace(/^\/+/,``),`${u.url.replace(/\/+$/,``)}/`);s!==void 0&&p.searchParams.set(`startIndex`,String(s));let m=new URL(t.url).searchParams.get(EVE_STREAM_CONTROL_VERSION_QUERY);m!==null&&p.searchParams.set(EVE_STREAM_CONTROL_VERSION_QUERY,m),c&&p.searchParams.set(`includeTailIndex`,`1`);let h=await fetch(p,{cache:`no-store`,headers:f,redirect:`manual`,signal:t.signal}),g=proxyStreamHeaders(h.headers);return new Response(h.body,{headers:g,status:h.status,statusText:h.statusText})})],events:e.events,fetchFile:e.fetchFile,uploadPolicy:e.uploadPolicy})}export{eveChannel};
@@ -0,0 +1 @@
1
+ export declare function proxyStreamHeaders(headers: Headers): Headers;
@@ -0,0 +1 @@
1
+ import{EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER}from"#protocol/message.js";function proxyStreamHeaders(e){let t=[`cache-control`,`content-type`,`x-accel-buffering`,EVE_SESSION_ID_HEADER,EVE_STREAM_FORMAT_HEADER,EVE_STREAM_TAIL_INDEX_HEADER,EVE_STREAM_VERSION_HEADER];return new Headers([...e].filter(([e])=>t.includes(e)))}export{proxyStreamHeaders};
@@ -8,7 +8,7 @@ import { type DurableCompiledArtifactsSource } from "#runtime/durable-compiled-a
8
8
  import type { SandboxState } from "#sandbox/state.js";
9
9
  import type { ConversationContext } from "#shared/conversation-context.js";
10
10
  import type { WorkflowAgentMetadata } from "#tools/workflow-definition.js";
11
- import { type AgentChildTraceDispatch } from "#tracing/agent-invocation-coordinator.js";
11
+ import { type AgentChildTraceDispatch } from "#tracing/eve/agent-invocation-coordinator.js";
12
12
  /**
13
13
  * What a workflow run needs to open `ctx.agent` sessions for its caller,
14
14
  * captured from the calling session for one call: the run's start input
@@ -1 +1 @@
1
- import{readSerializedSessionSchedule}from"#context/session-schedule.js";import{STUB_CONTEXT_KEY}from"#tool-stubs/types.js";import{serializeDurableCompiledArtifactsSource}from"#runtime/durable-compiled-artifacts-source.js";import{findTask,readTaskTable}from"#execution/tasks/table.js";import{resolveRemainingSessionTokenLimits}from"#subagents/token-budget.js";import{resolveToolCallAgentTrace}from"#tracing/agent-invocation-coordinator.js";function resolveStepAgentLimits(e){let t=readTaskTable(e.session.state),n=e.plan.filter(({entry:e})=>e.entryPoint===`serve`&&findTask(t,e.taskId)?.kind===`agent`).length;return resolveRemainingSessionTokenLimits(e.session,n)}function captureAgentSessionContext(e,t,n){let{batch:r,session:i}=e;return{agents:e.workflowAgents,toolStubs:e.serializedContext[STUB_CONTEXT_KEY],bundle:{nodeId:e.bundle.nodeId,source:serializeDurableCompiledArtifactsSource(e.bundle.compiledArtifactsSource)},capabilities:e.capabilities,schedule:readSerializedSessionSchedule(e.serializedContext),channelMetadata:e.channelMetadata,conversation:e.inheritedConversation,dynamicSelections:e.dynamicSubagentSelections,limits:n,localDevRequest:e.localDevRequest,parent:{callId:t,rootSessionId:i.rootSessionId??i.sessionId,sessionId:i.sessionId,turn:{id:r.event.turnId,sequence:r.event.sequence}},sandbox:{sessionId:e.sandboxSessionId,state:i.sandboxState},traceRoot:e.traceRoot,trace:resolveToolCallAgentTrace({callId:t,conversation:e.inheritedConversation,serializedContext:e.serializedContext,sessionId:i.sessionId,turnId:r.event.turnId})}}export{captureAgentSessionContext,resolveStepAgentLimits};
1
+ import{readSerializedSessionSchedule}from"#context/session-schedule.js";import{STUB_CONTEXT_KEY}from"#tool-stubs/types.js";import{serializeDurableCompiledArtifactsSource}from"#runtime/durable-compiled-artifacts-source.js";import{findTask,readTaskTable}from"#execution/tasks/table.js";import{resolveRemainingSessionTokenLimits}from"#subagents/token-budget.js";import{resolveToolCallAgentTrace}from"#tracing/eve/agent-invocation-coordinator.js";function resolveStepAgentLimits(e){let t=readTaskTable(e.session.state),n=e.plan.filter(({entry:e})=>e.entryPoint===`serve`&&findTask(t,e.taskId)?.kind===`agent`).length;return resolveRemainingSessionTokenLimits(e.session,n)}function captureAgentSessionContext(e,t,n){let{batch:r,session:i}=e;return{agents:e.workflowAgents,toolStubs:e.serializedContext[STUB_CONTEXT_KEY],bundle:{nodeId:e.bundle.nodeId,source:serializeDurableCompiledArtifactsSource(e.bundle.compiledArtifactsSource)},capabilities:e.capabilities,schedule:readSerializedSessionSchedule(e.serializedContext),channelMetadata:e.channelMetadata,conversation:e.inheritedConversation,dynamicSelections:e.dynamicSubagentSelections,limits:n,localDevRequest:e.localDevRequest,parent:{callId:t,rootSessionId:i.rootSessionId??i.sessionId,sessionId:i.sessionId,turn:{id:r.event.turnId,sequence:r.event.sequence}},sandbox:{sessionId:e.sandboxSessionId,state:i.sandboxState},traceRoot:e.traceRoot,trace:resolveToolCallAgentTrace({callId:t,conversation:e.inheritedConversation,serializedContext:e.serializedContext,sessionId:i.sessionId,turnId:r.event.turnId})}}export{captureAgentSessionContext,resolveStepAgentLimits};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{decisionToTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{ResetResponseSchema}from"#protocol/reset-session.js";import{formatTraceparent,writeAgentDispatchTracestate}from"#protocol/traceparent.js";import{writeForwardedAudienceBaggage,writeForwardedParentSessionBaggage}from"#protocol/baggage.js";import{writeConversationBaggage}from"#tracing/conversation-context.js";import{REMOTE_AGENT_PROTOCOL_MISMATCH,REMOTE_AGENT_PROTOCOL_VERSION,UNVERSIONED_REMOTE_AGENT_PROTOCOL,formatRemoteAgentProtocolMismatch,readRemoteAgentProtocolVersion}from"#protocol/remote-agent-protocol.js";import{FatalError}from"#compiled/@workflow/core/index.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createRemoteAgentRouteUrl}from"#subagents/remote-route-url.js";import{formatSubagentInput}from"#subagents/invocation.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),protocolVersion:z.number().optional(),sessionId:z.string().min(1),status:z.literal(`accepted`)}),UNKNOWN_REMOTE_OUTCOME=`The request may have completed on the remote agent. Do not retry automatically; check the remote outcome before sending the request again.`;async function startRemoteAgentSession(e){let t=e.parent?.continuationToken??e.session.continuationToken;if(!t)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let n=buildForwardedPrincipalField(e),r={capabilities:e.capabilities??{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,token:t,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(t))},message:formatRemoteAgentCallInputMessage({action:e.action,remote:e.remote}),outputSchema:e.action.input.outputSchema,protocolVersion:REMOTE_AGENT_PROTOCOL_VERSION};n!==void 0&&(r.forwardedPrincipal=n),e.operationId!==void 0&&(r.operationId=e.operationId);let i=await resolveRemoteAgentRequestHeaders(e.remote),a=formatTraceparent(e.parent?.traceContext);a!==void 0&&setHeader(i,`traceparent`,a),setHeader(i,`tracestate`,writeAgentDispatchTracestate(readHeader(i,`tracestate`),e.parent?.traceContext));let o=writeForwardedAudienceBaggage(readHeader(i,`baggage`),buildForwardedTraceAssertion({forwardedPrincipal:n,originAudience:e.originAudience,parentTraceContext:e.parent?.traceContext,traceparent:a})),s=writeConversationBaggage(o,e.parent?.conversationId);setHeader(i,`baggage`,writeForwardedParentSessionBaggage(s,e.parent?.lineage));let c=await fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(r),headers:{"content-type":`application/json`,...i},method:`POST`});if(!c.ok)throw await throwIfRemoteAgentProtocolMismatch(c,e.action.remoteAgentName),Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${c.status}.`);let l;try{l=await c.json()}catch{throw new FatalError(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON. ${UNKNOWN_REMOTE_OUTCOME}`)}let u=CreateSessionResponseSchema.safeParse(l);if(!u.success)throw new FatalError(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid. ${UNKNOWN_REMOTE_OUTCOME}`);let d=readRemoteAgentProtocolVersion(u.data.protocolVersion);if(d!==REMOTE_AGENT_PROTOCOL_VERSION&&d!==UNVERSIONED_REMOTE_AGENT_PROTOCOL)throw new FatalError(`${formatRemoteAgentProtocolMismatch({name:e.action.remoteAgentName,receiverVersion:d})} ${UNKNOWN_REMOTE_OUTCOME} Remote session: ${u.data.sessionId}.`);return{sessionId:u.data.sessionId}}async function throwIfRemoteAgentProtocolMismatch(e,t){let n;try{n=await e.json()}catch{return}if(typeof n!=`object`||!n||Reflect.get(n,`code`)!==REMOTE_AGENT_PROTOCOL_MISMATCH)return;let r=readRemoteAgentProtocolVersion(Reflect.get(n,`protocolVersion`));throw new FatalError(formatRemoteAgentProtocolMismatch({name:t,receiverVersion:r}))}function buildForwardedTraceAssertion(e){let t=decisionToTraceContentCeiling(e.parentTraceContext?.decision);if(e.forwardedPrincipal!==void 0&&e.parentTraceContext!==void 0&&(e.parentTraceContext.traceFlags&1)==1&&e.traceparent!==void 0&&t!==void 0)return{ceiling:t,originAudience:e.originAudience??`unknown`}}async function respondToRemoteAgentSession(e){let t=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionRoutePath(e.remote.sessionId)),{body:JSON.stringify({inputResponses:e.responses,...e.remote.forwardPrincipal===!0&&e.auth!=null&&{forwardedPrincipal:{current:e.auth}}}),headers:{"content-type":`application/json`,...e.headers},method:`POST`,redirect:`error`});if(!t.ok)throw Error(`Remote agent "${e.remote.name}" input answer failed with HTTP ${t.status}.`)}async function continueRemoteAgentSession(e){let t=buildForwardedPrincipalField(e),n={callback:e.callback,message:e.message,outputSchema:e.outputSchema};t!==void 0&&(n.forwardedPrincipal=t);let r=await fetch(createRemoteAgentContinueUrl(e.remote,e.sessionId),{body:JSON.stringify(n),headers:{"content-type":`application/json`,...await resolveRemoteAgentRequestHeaders(e.remote)},method:`POST`});if(!r.ok){let n=r.status===400&&t!==void 0?` The receiver may support forwarded principals only on session creation; upgrade it before retrying.`:``;throw Error(`Remote agent "${e.remote.name}" continue-session request failed with HTTP ${r.status}.${n}`)}}function buildForwardedPrincipalField(e){if(e.remote.forwardPrincipal!==!0||e.auth===null||e.auth===void 0)return;let t={current:e.auth};return e.initiatorAuth!==null&&e.initiatorAuth!==void 0&&(t.initiator=e.initiatorAuth),t}async function cancelRemoteAgentTurn(e){let t=await fetch(createRemoteAgentCancelTurnUrl(e.remote,e.sessionId),{headers:await resolveRemoteAgentRequestHeaders(e.remote),method:`POST`});if(!t.ok)throw Error(`Remote agent "${e.remote.name}" cancel-turn request failed with HTTP ${t.status}.`);let n;try{n=await t.json()}catch{throw Error(`Remote agent "${e.remote.name}" cancel-turn response was not valid JSON.`)}let r=CancelTurnResponseSchema.safeParse(n);if(!r.success||r.data.status===`accepted`&&r.data.sessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" cancel-turn response was invalid.`);return r.data.status===`accepted`?{sessionId:r.data.sessionId,status:`accepted`}:{status:`no_active_turn`}}function readHeader(e,t){let n=Object.keys(e).find(e=>e.toLowerCase()===t);return n===void 0?void 0:e[n]}function setHeader(e,t,n){for(let n of Object.keys(e))n.toLowerCase()===t&&delete e[n];n!==void 0&&(e[t]=n)}async function resetRemoteAgentSession(e){let t=await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionResetRoutePath(e.sessionId)),{body:JSON.stringify({reason:e.reason}),headers:{"content-type":`application/json`,...t},method:`POST`});if(!n.ok)throw Error(`Remote agent "${e.remote.name}" reset-session request failed with HTTP ${n.status}.`);let r=ResetResponseSchema.safeParse(await n.json());if(!r.success||r.data.status===`reset`&&r.data.previousSessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" reset-session response was invalid.`);return r.data}function resolveRemoteAgentForAction(e){let t=e.registry.get(e.nodeId)?.definition;if(e.dynamicRemoteAgent!==void 0){if(t===void 0)throw new FatalError(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);let n=resolveDynamicRemoteAgentCredentials(e.dynamicRemoteAgent),r=e.dynamicRemoteAgent,i={description:r.description,kind:`remote`,logicalPath:t.logicalPath,name:e.remoteAgentName,nodeId:e.nodeId,path:r.path,sourceId:t.sourceId,sourceKind:`module`,url:r.url};return r.forwardPrincipal!==void 0&&(i.forwardPrincipal=r.forwardPrincipal),n.auth!==void 0&&(i.auth=n.auth),n.headers!==void 0&&(i.headers=n.headers),i}if(t?.kind!==`remote`)throw new FatalError(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);return t}async function resolveRemoteAgentStreamHeaders(e){if(e.resolverId===void 0)return{};let t=new Set([e.bundle.graph.root,...e.bundle.graph.nodesByNodeId.values()]);for(let n of t){let t=n.subagentRegistry.subagentsByNodeId.get(e.resolverId)?.definition;if(t!==void 0){if(t.kind!==`remote`||t.name!==e.name||t.url!==e.url)throw Error(`Remote child stream resolver does not match the authored remote agent.`);return await resolveRemoteAgentRequestHeaders(t)}}return await resolveRemoteAgentRequestHeaders(resolveDynamicRemoteAgentCredentials({credentialsStepId:e.resolverId,description:``,path:``,url:e.url}))}function resolveDynamicRemoteAgentCredentials(e){if(e.credentialsStepId===void 0)return{};let t=getStepRegistry().get(e.credentialsStepId);if(t===void 0)throw Error(`Dynamic remote subagent credentials function "${e.credentialsStepId}" is not registered.`);let n=expectObjectRecord(t(),`Dynamic remote subagent credentials are invalid.`),r={};return n.auth!==void 0&&(r.auth=expectFunction(n.auth,`Dynamic remote subagent auth is invalid.`)),n.headers!==void 0&&(r.headers=resolveDynamicRemoteAgentHeaders(n.headers)),r}function resolveDynamicRemoteAgentHeaders(e){if(typeof e==`function`)return e;let t=expectObjectRecord(e,`Dynamic remote subagent headers are invalid.`);for(let e of Object.values(t))if(typeof e!=`string`)throw Error(`Dynamic remote subagent headers are invalid.`);return t}function getStepRegistry(){let e=Symbol.for(`@workflow/core//registeredSteps`),t=globalThis,n=t[e];return n===void 0&&(n=new Map,t[e]=n),n}function createRemoteAgentSessionUrl(e){return createRemoteAgentRouteUrl(e.url,e.path)}function createRemoteAgentCancelTurnUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionCancelRoutePath(t))}function createRemoteAgentContinueUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionRoutePath(t))}async function resolveRemoteAgentRequestHeaders(e){let t={};return e.headers!==void 0&&Object.assign(t,typeof e.headers==`function`?await e.headers():e.headers),e.auth!==void 0&&Object.assign(t,(await e.auth()).headers),t}function formatRemoteAgentCallInputMessage(e){let t=typeof e.action.input.message==`string`?e.action.input.message:``;return formatSubagentInput({description:e.remote.description,message:t,name:e.action.remoteAgentName,type:`remote`}).message}export{cancelRemoteAgentTurn,continueRemoteAgentSession,resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders,respondToRemoteAgentSession,startRemoteAgentSession};
1
+ import{z}from"#compiled/zod/index.js";import{decisionToTraceContentCeiling}from"#shared/forwarded-trace-policy.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionResetRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{ResetResponseSchema}from"#protocol/reset-session.js";import{formatTraceparent,writeAgentDispatchTracestate}from"#protocol/traceparent.js";import{writeForwardedAudienceBaggage,writeForwardedParentSessionBaggage}from"#protocol/baggage.js";import{agentDelegation}from"#tracing/eve/delegation.js";import{REMOTE_AGENT_PROTOCOL_MISMATCH,REMOTE_AGENT_PROTOCOL_VERSION,UNVERSIONED_REMOTE_AGENT_PROTOCOL,formatRemoteAgentProtocolMismatch,readRemoteAgentProtocolVersion}from"#protocol/remote-agent-protocol.js";import{FatalError}from"#compiled/@workflow/core/index.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createRemoteAgentRouteUrl}from"#subagents/remote-route-url.js";import{formatSubagentInput}from"#subagents/invocation.js";import{writeConversationBaggage}from"#tracing/eve/conversation-context.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),protocolVersion:z.number().optional(),sessionId:z.string().min(1),status:z.literal(`accepted`)}),UNKNOWN_REMOTE_OUTCOME=`The request may have completed on the remote agent. Do not retry automatically; check the remote outcome before sending the request again.`;async function startRemoteAgentSession(e){let t=e.parent?.continuationToken??e.session.continuationToken;if(!t)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let n=buildForwardedPrincipalField(e),r={capabilities:e.capabilities??{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,token:t,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(t))},message:formatRemoteAgentCallInputMessage({action:e.action,remote:e.remote}),outputSchema:e.action.input.outputSchema,protocolVersion:REMOTE_AGENT_PROTOCOL_VERSION};n!==void 0&&(r.forwardedPrincipal=n),e.operationId!==void 0&&(r.operationId=e.operationId);let i=await resolveRemoteAgentRequestHeaders(e.remote),a=formatTraceparent(e.parent?.traceContext);a!==void 0&&setHeader(i,`traceparent`,a),setHeader(i,`tracestate`,writeAgentDispatchTracestate(readHeader(i,`tracestate`),e.parent?.traceContext));let o=writeForwardedAudienceBaggage(readHeader(i,`baggage`),buildForwardedTraceAssertion({forwardedPrincipal:n,originAudience:e.originAudience,parentTraceContext:e.parent?.traceContext,traceparent:a})),s=writeConversationBaggage(o,e.parent?.conversationId);setHeader(i,`baggage`,writeForwardedParentSessionBaggage(s,e.parent?.lineage));let c=await agentDelegation.fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(r),headers:{"content-type":`application/json`,...i},method:`POST`});if(!c.ok)throw await throwIfRemoteAgentProtocolMismatch(c,e.action.remoteAgentName),Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${c.status}.`);let l;try{l=await c.json()}catch{throw new FatalError(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON. ${UNKNOWN_REMOTE_OUTCOME}`)}let u=CreateSessionResponseSchema.safeParse(l);if(!u.success)throw new FatalError(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid. ${UNKNOWN_REMOTE_OUTCOME}`);let d=readRemoteAgentProtocolVersion(u.data.protocolVersion);if(d!==REMOTE_AGENT_PROTOCOL_VERSION&&d!==UNVERSIONED_REMOTE_AGENT_PROTOCOL)throw new FatalError(`${formatRemoteAgentProtocolMismatch({name:e.action.remoteAgentName,receiverVersion:d})} ${UNKNOWN_REMOTE_OUTCOME} Remote session: ${u.data.sessionId}.`);return{sessionId:u.data.sessionId}}async function throwIfRemoteAgentProtocolMismatch(e,t){let n;try{n=await e.json()}catch{return}if(typeof n!=`object`||!n||Reflect.get(n,`code`)!==REMOTE_AGENT_PROTOCOL_MISMATCH)return;let r=readRemoteAgentProtocolVersion(Reflect.get(n,`protocolVersion`));throw new FatalError(formatRemoteAgentProtocolMismatch({name:t,receiverVersion:r}))}function buildForwardedTraceAssertion(e){let t=decisionToTraceContentCeiling(e.parentTraceContext?.decision);if(e.forwardedPrincipal!==void 0&&e.parentTraceContext!==void 0&&(e.parentTraceContext.traceFlags&1)==1&&e.traceparent!==void 0&&t!==void 0)return{ceiling:t,originAudience:e.originAudience??`unknown`}}async function respondToRemoteAgentSession(e){let t=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionRoutePath(e.remote.sessionId)),{body:JSON.stringify({inputResponses:e.responses,...e.remote.forwardPrincipal===!0&&e.auth!=null&&{forwardedPrincipal:{current:e.auth}}}),headers:{"content-type":`application/json`,...e.headers},method:`POST`,redirect:`error`});if(!t.ok)throw Error(`Remote agent "${e.remote.name}" input answer failed with HTTP ${t.status}.`)}async function continueRemoteAgentSession(e){let t=buildForwardedPrincipalField(e),n={callback:e.callback,message:e.message,outputSchema:e.outputSchema};t!==void 0&&(n.forwardedPrincipal=t);let r=await fetch(createRemoteAgentContinueUrl(e.remote,e.sessionId),{body:JSON.stringify(n),headers:{"content-type":`application/json`,...await resolveRemoteAgentRequestHeaders(e.remote)},method:`POST`});if(!r.ok){let n=r.status===400&&t!==void 0?` The receiver may support forwarded principals only on session creation; upgrade it before retrying.`:``;throw Error(`Remote agent "${e.remote.name}" continue-session request failed with HTTP ${r.status}.${n}`)}}function buildForwardedPrincipalField(e){if(e.remote.forwardPrincipal!==!0||e.auth===null||e.auth===void 0)return;let t={current:e.auth};return e.initiatorAuth!==null&&e.initiatorAuth!==void 0&&(t.initiator=e.initiatorAuth),t}async function cancelRemoteAgentTurn(e){let t=await fetch(createRemoteAgentCancelTurnUrl(e.remote,e.sessionId),{headers:await resolveRemoteAgentRequestHeaders(e.remote),method:`POST`});if(!t.ok)throw Error(`Remote agent "${e.remote.name}" cancel-turn request failed with HTTP ${t.status}.`);let n;try{n=await t.json()}catch{throw Error(`Remote agent "${e.remote.name}" cancel-turn response was not valid JSON.`)}let r=CancelTurnResponseSchema.safeParse(n);if(!r.success||r.data.status===`accepted`&&r.data.sessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" cancel-turn response was invalid.`);return r.data.status===`accepted`?{sessionId:r.data.sessionId,status:`accepted`}:{status:`no_active_turn`}}function readHeader(e,t){let n=Object.keys(e).find(e=>e.toLowerCase()===t);return n===void 0?void 0:e[n]}function setHeader(e,t,n){for(let n of Object.keys(e))n.toLowerCase()===t&&delete e[n];n!==void 0&&(e[t]=n)}async function resetRemoteAgentSession(e){let t=await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentRouteUrl(e.remote.url,createEveSessionResetRoutePath(e.sessionId)),{body:JSON.stringify({reason:e.reason}),headers:{"content-type":`application/json`,...t},method:`POST`});if(!n.ok)throw Error(`Remote agent "${e.remote.name}" reset-session request failed with HTTP ${n.status}.`);let r=ResetResponseSchema.safeParse(await n.json());if(!r.success||r.data.status===`reset`&&r.data.previousSessionId!==e.sessionId)throw Error(`Remote agent "${e.remote.name}" reset-session response was invalid.`);return r.data}function resolveRemoteAgentForAction(e){let t=e.registry.get(e.nodeId)?.definition;if(e.dynamicRemoteAgent!==void 0){if(t===void 0)throw new FatalError(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);let n=resolveDynamicRemoteAgentCredentials(e.dynamicRemoteAgent),r=e.dynamicRemoteAgent,i={description:r.description,kind:`remote`,logicalPath:t.logicalPath,name:e.remoteAgentName,nodeId:e.nodeId,path:r.path,sourceId:t.sourceId,sourceKind:`module`,url:r.url};return r.forwardPrincipal!==void 0&&(i.forwardPrincipal=r.forwardPrincipal),n.auth!==void 0&&(i.auth=n.auth),n.headers!==void 0&&(i.headers=n.headers),i}if(t?.kind!==`remote`)throw new FatalError(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);return t}async function resolveRemoteAgentStreamHeaders(e){if(e.resolverId===void 0)return{};let t=new Set([e.bundle.graph.root,...e.bundle.graph.nodesByNodeId.values()]);for(let n of t){let t=n.subagentRegistry.subagentsByNodeId.get(e.resolverId)?.definition;if(t!==void 0){if(t.kind!==`remote`||t.name!==e.name||t.url!==e.url)throw Error(`Remote child stream resolver does not match the authored remote agent.`);return await resolveRemoteAgentRequestHeaders(t)}}return await resolveRemoteAgentRequestHeaders(resolveDynamicRemoteAgentCredentials({credentialsStepId:e.resolverId,description:``,path:``,url:e.url}))}function resolveDynamicRemoteAgentCredentials(e){if(e.credentialsStepId===void 0)return{};let t=getStepRegistry().get(e.credentialsStepId);if(t===void 0)throw Error(`Dynamic remote subagent credentials function "${e.credentialsStepId}" is not registered.`);let n=expectObjectRecord(t(),`Dynamic remote subagent credentials are invalid.`),r={};return n.auth!==void 0&&(r.auth=expectFunction(n.auth,`Dynamic remote subagent auth is invalid.`)),n.headers!==void 0&&(r.headers=resolveDynamicRemoteAgentHeaders(n.headers)),r}function resolveDynamicRemoteAgentHeaders(e){if(typeof e==`function`)return e;let t=expectObjectRecord(e,`Dynamic remote subagent headers are invalid.`);for(let e of Object.values(t))if(typeof e!=`string`)throw Error(`Dynamic remote subagent headers are invalid.`);return t}function getStepRegistry(){let e=Symbol.for(`@workflow/core//registeredSteps`),t=globalThis,n=t[e];return n===void 0&&(n=new Map,t[e]=n),n}function createRemoteAgentSessionUrl(e){return createRemoteAgentRouteUrl(e.url,e.path)}function createRemoteAgentCancelTurnUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionCancelRoutePath(t))}function createRemoteAgentContinueUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionRoutePath(t))}async function resolveRemoteAgentRequestHeaders(e){let t={};return e.headers!==void 0&&Object.assign(t,typeof e.headers==`function`?await e.headers():e.headers),e.auth!==void 0&&Object.assign(t,(await e.auth()).headers),t}function formatRemoteAgentCallInputMessage(e){let t=typeof e.action.input.message==`string`?e.action.input.message:``;return formatSubagentInput({description:e.remote.description,message:t,name:e.action.remoteAgentName,type:`remote`}).message}export{cancelRemoteAgentTurn,continueRemoteAgentSession,resetRemoteAgentSession,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders,respondToRemoteAgentSession,startRemoteAgentSession};
@@ -7,6 +7,8 @@ export type AgentSessionAddress = {
7
7
  readonly name: string;
8
8
  readonly nodeId: string;
9
9
  readonly sessionId: string;
10
+ /** Names the session to whichever run holds its inbox. */
11
+ readonly continuationToken: string;
10
12
  } | {
11
13
  readonly callbackBaseUrl: string;
12
14
  readonly kind: "remote";
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{sessionInboxHookToken}from"#execution/session-inbox/address.js";import{ContextContainer,contextStorage}from"#context/container.js";import{createEveCallbackRoutePath}from"#protocol/routes.js";import{SessionStrandedError}from"#channel/session-stranded-error.js";import{createWorkflowRuntime,dispatchWorkflowSessionCommand,requestWorkflowTurnCancellation,waitForCommandHookOwner}from"#execution/workflow-runtime.js";import{resolveDurableCompiledArtifactsSource}from"#runtime/durable-compiled-artifacts-source.js";import{getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{createWorkflowCallbackUrl,resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{resolveAgentAction,resolveAgentStartTarget}from"#execution/agent-sessions/target.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{cancelRemoteAgentTurn,continueRemoteAgentSession,resetRemoteAgentSession,resolveRemoteAgentForAction,startRemoteAgentSession}from"#execution/agent-sessions/remote.js";import{buildSubagentRunInput}from"#subagents/tool.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{stubToolPath}from"#tool-stubs/target.js";const log=createLogger(`execution.agent-sessions`),RUN_FINISHED_REASON=`The workflow run that opened this session finished.`;async function openAgentSessionStep(e){"use step";let{context:t}=e,n=await loadAgentSessionBundle(t),r=resolveAgentAction({bundle:n,callId:t.parent.callId,dynamicSelections:t.dynamicSelections,input:{message:e.message,outputSchema:e.outputSchema,target:e.name}}),i=resolveAgentStartTarget({action:r,bundle:n,dynamicSelections:t.dynamicSelections,isRootSession:t.parent.rootSessionId===t.parent.sessionId}),a={auth:e.auth,bundle:n,context:t,key:e.key,replyTo:e.replyTo};return i.kind===`remote`?await startRemoteSession({...a,target:i}):await startLocalSession({...a,target:i})}async function sendAgentSessionMessageStep(e){"use step";let{address:t,context:n}=e;if(t.kind===`remote`){let r=await resolveSessionRemote(n,t);await continueRemoteAgentSession({auth:e.auth.current,callback:{callId:n.parent.callId,subagentName:t.name,token:e.replyTo,url:createWorkflowCallbackUrl(t.callbackBaseUrl,createEveCallbackRoutePath(e.replyTo))},message:e.message,outputSchema:e.outputSchema,remote:r,sessionId:t.sessionId});return}if((await dispatchWorkflowSessionCommand({command:{auth:e.auth.current,schedule:n.schedule,caller:{callId:n.parent.callId,replyTo:{kind:`hook`,token:e.replyTo},subagentName:t.name},kind:`send`,payload:{message:e.message,outputSchema:e.outputSchema}},sessionId:t.sessionId}).catch(e=>{throw SessionStrandedError.is(e)?Error(`Agent "${t.name}" can no longer receive messages: ${e.message}`,{cause:e}):e})).status!==`accepted`)throw Error(`Agent "${t.name}" can no longer receive messages; its session ended.`)}async function cancelAgentSessionTurnStep(e){"use step";let{address:t}=e;try{if(t.kind===`remote`){let n=await resolveSessionRemote(e.context,t);await cancelRemoteAgentTurn({remote:n,sessionId:t.sessionId});return}await requestWorkflowTurnCancellation({sessionId:t.sessionId})}catch(e){logError(log,`failed to cancel an agent session turn`,e,{name:t.name,sessionId:t.sessionId})}}async function endAgentSessionsStep(e){"use step";await Promise.all(e.sessions.map(endAgentSession))}async function endAgentSession({address:e,context:t}){try{if(e.kind===`remote`){let n=await resolveSessionRemote(t,e);await resetRemoteAgentSession({reason:RUN_FINISHED_REASON,remote:n,sessionId:e.sessionId});return}await dispatchWorkflowSessionCommand({command:{kind:`reset`,reason:RUN_FINISHED_REASON},sessionId:e.sessionId})}catch(t){logError(log,`failed to end an agent session`,t,{name:e.name,sessionId:e.sessionId})}}async function startLocalSession(e){let{auth:t,bundle:n,context:r,target:i}=e,{action:a}=i,{childContinuationToken:o,runInput:s}=buildSubagentRunInput({action:a,auth:t.current,capabilities:r.capabilities,schedule:r.schedule,channelMetadata:r.channelMetadata,continuationKey:e.key,graph:n.graph,inheritedConversation:r.conversation,initiatorAuth:t.initiator,limits:r.limits,parent:createParentContext(r,e.replyTo),sandboxSessionId:r.sandbox.sessionId,selfAgent:i.source.type===`runtime`,session:{continuationToken:e.replyTo,sandboxState:r.sandbox.state,sessionId:r.parent.sessionId},source:i.source}),c=createWorkflowRuntime({compiledArtifactsSource:n.compiledArtifactsSource,dynamicSubagentAgentConfig:i.dynamicSubagentAgentConfig,nodeId:a.nodeId}),l=r.toolStubs;l!==void 0&&(l={...l,agentPath:stubToolPath(l,a.name)}),await contextStorage.run(new ContextContainer({localDevRequest:r.localDevRequest}),()=>c.createSession({...s,toolStubs:l}));let u=await waitForCommandHookOwner(sessionInboxHookToken(o));return{kind:`local`,name:a.name,nodeId:a.nodeId,sessionId:u.runId}}async function startRemoteSession(e){let{auth:t,bundle:n,context:r,target:i}=e,{action:a}=i,o=resolveRemoteAgentForAction({dynamicRemoteAgent:i.dynamicRemoteAgent,nodeId:a.nodeId,registry:n.subagentRegistry.subagentsByNodeId,remoteAgentName:a.remoteAgentName}),s=resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),c=await startRemoteAgentSession({action:a,auth:t.current,callbackBaseUrl:s,capabilities:r.capabilities,initiatorAuth:t.initiator,operationId:`agent-session:${e.key}`,originAudience:r.trace.originAudience,parent:createParentContext(r,e.replyTo),remote:o,session:{continuationToken:e.replyTo}});return{callbackBaseUrl:s,kind:`remote`,forwardPrincipal:o.forwardPrincipal,name:a.remoteAgentName,nodeId:a.nodeId,resolverId:i.dynamicRemoteAgent?.credentialsStepId??a.nodeId,sessionId:c.sessionId,url:o.url}}function createParentContext(e,t){return{continuationToken:t,conversationId:e.trace.conversationId??resolveConversationId(e.parent.rootSessionId),lineage:e.parent,originAudience:e.trace.originAudience,traceContext:e.trace.parentTraceContext,traceRoot:e.traceRoot}}async function resolveSessionRemote(e,t){let n=await loadAgentSessionBundle(e),r=e.dynamicSelections[t.nodeId];return{...resolveRemoteAgentForAction({dynamicRemoteAgent:r?.kind===`remote`?r.remoteAgent:void 0,nodeId:t.nodeId,registry:n.subagentRegistry.subagentsByNodeId,remoteAgentName:t.name}),url:t.url}}async function loadAgentSessionBundle(e){return await getCompiledRuntimeAgentBundle({compiledArtifactsSource:resolveDurableCompiledArtifactsSource(e.bundle.source),nodeId:e.bundle.nodeId})}export{cancelAgentSessionTurnStep,endAgentSessionsStep,openAgentSessionStep,sendAgentSessionMessageStep};
1
+ import{createLogger,logError}from"#internal/logging.js";import{sessionInboxHookToken}from"#execution/session-inbox/address.js";import{ContextContainer,contextStorage}from"#context/container.js";import{createEveCallbackRoutePath}from"#protocol/routes.js";import{agentDelegation}from"#tracing/eve/delegation.js";import{SessionStrandedError}from"#channel/session-stranded-error.js";import{createWorkflowRuntime,dispatchWorkflowSessionCommand,resolveContinuation,waitForCommandHookOwner,waitForSessionInbox}from"#execution/workflow-runtime.js";import{resolveDurableCompiledArtifactsSource}from"#runtime/durable-compiled-artifacts-source.js";import{getStepMetadata,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{createWorkflowCallbackUrl,resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{resolveAgentAction,resolveAgentStartTarget}from"#execution/agent-sessions/target.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{cancelRemoteAgentTurn,continueRemoteAgentSession,resetRemoteAgentSession,resolveRemoteAgentForAction,startRemoteAgentSession}from"#execution/agent-sessions/remote.js";import{buildSubagentRunInput}from"#subagents/tool.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{stubToolPath}from"#tool-stubs/target.js";const log=createLogger(`execution.agent-sessions`),RUN_FINISHED_REASON=`The workflow run that opened this session finished.`;async function openAgentSessionStep(e){"use step";let{context:t}=e,n=await loadAgentSessionBundle(t),r=resolveAgentAction({bundle:n,callId:t.parent.callId,dynamicSelections:t.dynamicSelections,input:{message:e.message,outputSchema:e.outputSchema,target:e.name}}),i=resolveAgentStartTarget({action:r,bundle:n,dynamicSelections:t.dynamicSelections,isRootSession:t.parent.rootSessionId===t.parent.sessionId}),a={auth:e.auth,bundle:n,context:t,key:e.key,replyTo:e.replyTo};return await agentDelegation.resume({context:t,agentName:r.name},()=>i.kind===`remote`?startRemoteSession({...a,target:i}):startLocalSession({...a,target:i}))}async function sendAgentSessionMessageStep(e){"use step";let{address:t,context:n}=e;if(t.kind===`remote`){let r=await resolveSessionRemote(n,t);await continueRemoteAgentSession({auth:e.auth.current,callback:{callId:n.parent.callId,subagentName:t.name,token:e.replyTo,url:createWorkflowCallbackUrl(t.callbackBaseUrl,createEveCallbackRoutePath(e.replyTo))},message:e.message,outputSchema:e.outputSchema,remote:r,sessionId:t.sessionId});return}if((await commandLocalSession({...e,address:t},{auth:e.auth.current,schedule:n.schedule,caller:{callId:n.parent.callId,replyTo:{kind:`hook`,token:e.replyTo},subagentName:t.name},kind:`send`,payload:{message:e.message,outputSchema:e.outputSchema}}).catch(e=>{throw SessionStrandedError.is(e)?Error(`Agent "${t.name}" can no longer receive messages: ${e.message}`,{cause:e}):e})).status!==`accepted`)throw Error(`Agent "${t.name}" can no longer receive messages; its session ended.`)}async function cancelAgentSessionTurnStep(e){"use step";let{address:t}=e;try{if(t.kind===`remote`){let n=await resolveSessionRemote(e.context,t);await cancelRemoteAgentTurn({remote:n,sessionId:t.sessionId});return}await commandLocalSession({...e,address:t},{kind:`cancel`})}catch(e){logError(log,`failed to cancel an agent session turn`,e,{name:t.name,sessionId:t.sessionId})}}async function endAgentSessionsStep(e){"use step";await Promise.all(e.sessions.map(endAgentSession))}async function endAgentSession(e){let{address:t,context:n}=e;try{if(t.kind===`remote`){let e=await resolveSessionRemote(n,t);await resetRemoteAgentSession({reason:RUN_FINISHED_REASON,remote:e,sessionId:t.sessionId});return}await commandLocalSession({...e,address:t},{kind:`reset`,reason:RUN_FINISHED_REASON})}catch(e){logError(log,`failed to end an agent session`,e,{name:t.name,sessionId:t.sessionId})}}async function commandLocalSession(e,t){let{continuationToken:n,sessionId:r}=e.address,i=await dispatchWorkflowSessionCommand({command:t,sessionId:r});if(i.status===`accepted`||i.status===`reset`)return i;let a=await waitForSessionInbox(r)?r:(await resolveContinuation(n))?.sessionId;return a===void 0?i:await dispatchWorkflowSessionCommand({command:t,sessionId:a})}async function startLocalSession(e){let{auth:t,bundle:n,context:r,target:i}=e,{action:a}=i,{childContinuationToken:o,runInput:s}=buildSubagentRunInput({action:a,auth:t.current,capabilities:r.capabilities,schedule:r.schedule,channelMetadata:r.channelMetadata,continuationKey:e.key,graph:n.graph,inheritedConversation:r.conversation,initiatorAuth:t.initiator,limits:r.limits,parent:createParentContext(r,e.replyTo),sandboxSessionId:r.sandbox.sessionId,selfAgent:i.source.type===`runtime`,session:{continuationToken:e.replyTo,sandboxState:r.sandbox.state,sessionId:r.parent.sessionId},source:i.source}),c=createWorkflowRuntime({compiledArtifactsSource:n.compiledArtifactsSource,dynamicSubagentAgentConfig:i.dynamicSubagentAgentConfig,nodeId:a.nodeId}),l=r.toolStubs;l!==void 0&&(l={...l,agentPath:stubToolPath(l,a.name)});let u=(await contextStorage.run(new ContextContainer({localDevRequest:r.localDevRequest}),()=>c.createSession({...s,toolStubs:l}))).sessionId;return getStepMetadata().attempt>1&&({runId:u}=await waitForCommandHookOwner(sessionInboxHookToken(o))),{continuationToken:o,kind:`local`,name:a.name,nodeId:a.nodeId,sessionId:u}}async function startRemoteSession(e){let{auth:t,bundle:n,context:r,target:i}=e,{action:a}=i,o=resolveRemoteAgentForAction({dynamicRemoteAgent:i.dynamicRemoteAgent,nodeId:a.nodeId,registry:n.subagentRegistry.subagentsByNodeId,remoteAgentName:a.remoteAgentName}),s=resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),c=await startRemoteAgentSession({action:a,auth:t.current,callbackBaseUrl:s,capabilities:r.capabilities,initiatorAuth:t.initiator,operationId:`agent-session:${e.key}`,originAudience:r.trace.originAudience,parent:createParentContext(r,e.replyTo),remote:o,session:{continuationToken:e.replyTo}});return{callbackBaseUrl:s,kind:`remote`,forwardPrincipal:o.forwardPrincipal,name:a.remoteAgentName,nodeId:a.nodeId,resolverId:i.dynamicRemoteAgent?.credentialsStepId??a.nodeId,sessionId:c.sessionId,url:o.url}}function createParentContext(e,t){return{continuationToken:t,conversationId:e.trace.conversationId??resolveConversationId(e.parent.rootSessionId),lineage:e.parent,originAudience:e.trace.originAudience,traceContext:e.trace.parentTraceContext,traceRoot:e.traceRoot}}async function resolveSessionRemote(e,t){let n=await loadAgentSessionBundle(e),r=e.dynamicSelections[t.nodeId];return{...resolveRemoteAgentForAction({dynamicRemoteAgent:r?.kind===`remote`?r.remoteAgent:void 0,nodeId:t.nodeId,registry:n.subagentRegistry.subagentsByNodeId,remoteAgentName:t.name}),url:t.url}}async function loadAgentSessionBundle(e){return await getCompiledRuntimeAgentBundle({compiledArtifactsSource:resolveDurableCompiledArtifactsSource(e.bundle.source),nodeId:e.bundle.nodeId})}export{cancelAgentSessionTurnStep,endAgentSessionsStep,openAgentSessionStep,sendAgentSessionMessageStep};
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{appliedSession,saveSessionProjection}from"#harness/session-machine/current.js";import{AuthKey,SandboxKey,TurnDeliveryIdsKey}from"#context/keys.js";import{createDurableSessionValues}from"#execution/durable-session-store.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{withContextScope}from"#context/run-step.js";import{serializeContext}from"#context/serialize.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";import{takeDeferredMessage}from"#harness/hitl/index.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";const log=createLogger(`execution.cancelled-turn`);async function cancelledWithoutCheckpoint(e,t,n){let r=appliedSession(e),i=r??t,a=n;if(r!==void 0){let e=takeDeferredMessage(r);i=e.session,e.message!==void 0&&(a={...n,message:e.message})}if(e.get(SandboxKey)===void 0&&hasFileParts(a?.message))try{return(await withContextScope(e,i,async e=>({result:void 0,session:await preserveCancelledTurnMessage(e,a)}))).session}catch(t){log.warn(`staging a cancelled turn's attachments failed`,{error:t}),e.clearVirtualContext()}return await contextStorage.run(e,()=>preserveCancelledTurnMessage(i,a))}function hasFileParts(e){return Array.isArray(e)&&e.some(e=>e.type===`file`)}async function createCancelledModelCallBatchResult(e){let t=serializeContext(e.ctx),n=e.checkpoint?.result.session??await cancelledWithoutCheckpoint(e.ctx,e.initialSession,e.stepInput),r={...e.checkpoint?.serializedContext??e.beforeBatchContext,[AuthKey.name]:t[AuthKey.name],[TurnDeliveryIdsKey.name]:t[TurnDeliveryIdsKey.name]};return{action:`cancelled`,serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(r,t),t),t),...createDurableSessionValues(saveSessionProjection(n,e.ctx))}}export{createCancelledModelCallBatchResult};
1
+ import{createLogger}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{appliedSession,saveSessionProjection}from"#harness/session-machine/current.js";import{AuthKey,OfferedCatalogToolsKey,SandboxKey,TurnDeliveryIdsKey}from"#context/keys.js";import{createDurableSessionValues}from"#execution/durable-session-store.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{withContextScope}from"#context/run-step.js";import{serializeContext}from"#context/serialize.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";import{takeDeferredMessage}from"#harness/hitl/index.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{preserveSerializedAgentTraceState}from"#tracing/eve/agent-trace-context-store.js";const log=createLogger(`execution.cancelled-turn`);async function cancelledWithoutCheckpoint(e,t,n){let r=appliedSession(e),i=r??t,a=n;if(r!==void 0){let e=takeDeferredMessage(r);i=e.session,e.message!==void 0&&(a={...n,message:e.message})}if(e.get(SandboxKey)===void 0&&hasFileParts(a?.message))try{return(await withContextScope(e,i,async e=>({result:void 0,session:await preserveCancelledTurnMessage(e,a)}))).session}catch(t){log.warn(`staging a cancelled turn's attachments failed`,{error:t}),e.clearVirtualContext()}return await contextStorage.run(e,()=>preserveCancelledTurnMessage(i,a))}function hasFileParts(e){return Array.isArray(e)&&e.some(e=>e.type===`file`)}async function createCancelledModelCallBatchResult(e){let t=serializeContext(e.ctx),n=e.checkpoint?.result.session??await cancelledWithoutCheckpoint(e.ctx,e.initialSession,e.stepInput),r={...e.checkpoint?.serializedContext??e.beforeBatchContext,[AuthKey.name]:t[AuthKey.name],[OfferedCatalogToolsKey.name]:t[OfferedCatalogToolsKey.name],[TurnDeliveryIdsKey.name]:t[TurnDeliveryIdsKey.name]};return{action:`cancelled`,serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(r,t),t),t),...createDurableSessionValues(saveSessionProjection(n,e.ctx))}}export{createCancelledModelCallBatchResult};
@@ -1 +1 @@
1
- import{completeConnectionSignIn,listConnectionTools,listToolMetadata,listingFailureMessage}from"./connection-auth.js";import{closestNames}from"./rank.js";import{connectionToolSignature}from"./signatures.js";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{displayProperName,displayTitle}from"#shared/display-name.js";import{SEARCH_TOOL_NAME}from"#protocol/catalog-tools.js";import{defineJsonSchema,refineJsonSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";import{ContextKey}from"#context/key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isApprovalRecheck}from"#harness/approval-recheck.js";import{isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{connectionToolModelOutput,toConnectionToolResult}from"#runtime/connections/tool-result.js";const CONNECTION_CHANGED_MESSAGE=`The connection for this tool call changed or is unavailable. Request a new tool call and approval.`,ConnectionApprovalPinsKey=new ContextKey(`eve.connectionApprovalPins`);function instanceKey(e){return e.instanceId??``}function connectionEntry(e,t,n){let r=`${displayProperName(t.connectionName)}: ${displayTitle(n)}`;return{approval:connectionApproval(t),deferred:!0,description:``,execute:(r,i)=>callConnectionTool(e,t,n,r,i),inputSchema:refineJsonSchema({},r=>checkInput(e,t,n,r)),label:{start:()=>r},name:connectionToolName(t.connectionName,n),toModelOutput:connectionToolModelOutput}}function connectionSignInEntry(e,t){let n=displayProperName(t.connectionName),r=`Sign in to use the ${n} tools`;return{deferred:!0,description:t.description===``?`${r}.`:`${r}: ${t.description}`,execute:()=>connect(e,t),inputSchema:defineJsonSchema({type:`object`,properties:{},additionalProperties:!1}),label:{start:()=>`Sign in to ${n}`},name:t.connectionName}}async function connect(e,t){let n=await completeConnectionSignIn(e,t),r=await listConnectionTools(t,n);if(`failure`in r)throw Error(r.failure);if(`authorization`in r)return await n.auth.handleError(r.error,r.authorization);let i=displayProperName(t.connectionName),a=`${SEARCH_TOOL_NAME}({ query: "${t.connectionName}__" })`;return n.scoped!==void 0&&n.auth.isJustAuthorized(n.scoped)?`Signed in to ${i}. Find the ${i} tools with ${a}.`:`The ${i} tools are available. Find them with ${a}.`}async function callConnectionTool(e,t,n,r,i){releaseApprovalPin(i.toolCallId,t);let a=await completeConnectionSignIn(e,t),{auth:o,client:s,scoped:c}=a,l=await listConnectionTools(t,a);if(`failure`in l)throw Error(l.failure);if(`authorization`in l)return await o.handleError(l.error,l.authorization);let u=await checkCall(t,l.tools,n,r);if(`issues`in u)throw Error(issuesMessage(u.issues));let{input:d,tool:f}=u,p;try{p=await s.executeTool(f.name,d,{abortSignal:i.abortSignal,callId:i.toolCallId})}catch(e){if(isConnectionAuthorizationRequiredError(e))return await o.handleError(e,c);throw e}let m=toConnectionToolResult(t.protocol,f,p);if(!m.ok)throw Error(m.error);return m.value}async function checkInput(e,t,n,r){let i;try{i=await listToolMetadata(t.connectionName,e.getClient(t.connectionName))}catch(e){return isConnectionAuthorizationRequiredError(e)?{value:r}:{issues:[{message:listingFailureMessage(t.connectionName,e)}]}}let a=await checkCall(t,i,n,r);return`issues`in a?{issues:a.issues}:{value:a.input}}async function checkCall(e,t,n,r){let i=t.find(e=>e.name===n);if(i===void 0)return{issues:[{message:unknownToolMessage(e,n,t)}]};let a=e.toolCall?.providedArguments??{},o=Object.fromEntries(Object.entries(isObject(r)?r:{}).filter(([e])=>!Object.hasOwn(a,e))),s=await defineJsonSchema(i.inputSchema)[`~standard`].validate(o);return s.issues===void 0?{input:s.value,tool:i}:{issues:[...s.issues,{message:`Signature: ${connectionToolSignature(e,i)}`}]}}function issuesMessage(e){return e.map(({message:e,path:t=[]})=>{let n=t.map(e=>String(typeof e==`object`?e.key:e)).join(`.`);return n.length>0?`${n}: ${e}`:e}).join(` `)}function unknownToolMessage(e,t,n){let{connectionName:r}=e,i=closestNames(t,n).map(e=>connectionToolName(r,e));return`Connection "${r}" has no tool named "${t}".${i.length>0?` Closest tools: ${i.join(`, `)}.`:` Find its tools with ${SEARCH_TOOL_NAME}({ query: "${r}__" }).`}`}function connectionApproval(e){let{approval:t}=e;if(t===void 0)return;let n=resolveApprovalPolicy(t),request=t=>requestApproval(e,n,t),r=typeof t==`function`?void 0:t.response;return r===void 0?request:{request,response:t=>authorizeApprovalResponse(e,r,t)}}async function requestApproval(e,t,n){isApprovalRecheck(n)&&!matchesApprovalPin(n.callId,e)&&markApprovalPinChanged(n.callId);let r=await t(n);return!isApprovalRecheck(n)&&parksForApproval(r)&&pinApprovedInstance(n.callId,e),r}function parksForApproval(e){return e===!0||e===`user-approval`||typeof e==`object`&&e.type===`user-approval`}async function authorizeApprovalResponse(e,t,n){return matchesApprovalPin(n.request.callId,e)?await t(n):{reason:CONNECTION_CHANGED_MESSAGE,status:`rejected`}}function pinApprovedInstance(e,t){let n=loadContext();n.get(ConnectionApprovalPinsKey)?.[e]===void 0&&n.set(ConnectionApprovalPinsKey,(n={})=>Object.fromEntries([...Object.entries(n).slice(-49),[e,instanceKey(t)]]))}function matchesApprovalPin(e,t){let n=loadContext().get(ConnectionApprovalPinsKey)?.[e];return n!==void 0&&n===instanceKey(t)}function markApprovalPinChanged(e){loadContext().set(ConnectionApprovalPinsKey,(t={})=>({...t,[e]:`\0changed`}))}function releaseApprovalPin(e,t){let n=loadContext(),r=n.get(ConnectionApprovalPinsKey);if(r?.[e]===void 0)return;let{[e]:i,...a}=r;if(n.set(ConnectionApprovalPinsKey,a),i!==instanceKey(t))throw Error(CONNECTION_CHANGED_MESSAGE)}export{connectionEntry,connectionSignInEntry};
1
+ import{completeConnectionSignIn,listConnectionTools,listToolMetadata,listingFailureMessage}from"./connection-auth.js";import{closestNames}from"./rank.js";import{connectionToolSignature}from"./signatures.js";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{displayProperName,displayTitle}from"#shared/display-name.js";import{SEARCH_TOOL_NAME}from"#protocol/catalog-tools.js";import{defineJsonSchema,refineJsonSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";import{ContextKey}from"#context/key.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isApprovalRecheck,markApprovalRecheck}from"#harness/approval-recheck.js";import{isConnectionAuthorizationRequiredError}from"#connections/errors.js";import{connectionToolModelOutput,toConnectionToolResult}from"#runtime/connections/tool-result.js";const CONNECTION_CHANGED_MESSAGE=`The connection for this tool call changed or is unavailable. Request a new tool call and approval.`,ConnectionApprovalPinsKey=new ContextKey(`eve.connectionApprovalPins`);function instanceKey(e){return e.instanceId??``}function connectionEntry(e,t,n){let r=`${displayProperName(t.connectionName)}: ${displayTitle(n)}`;return{approval:connectionApproval(e,t,n),deferred:!0,description:``,execute:(r,i)=>callConnectionTool(e,t,n,r,i),inputSchema:refineJsonSchema({},r=>checkInput(e,t,n,r)),label:{start:()=>r},name:connectionToolName(t.connectionName,n),toModelOutput:connectionToolModelOutput}}function connectionSignInEntry(e,t){let n=displayProperName(t.connectionName),r=`Sign in to use the ${n} tools`;return{deferred:!0,description:t.description===``?`${r}.`:`${r}: ${t.description}`,execute:()=>connect(e,t),inputSchema:defineJsonSchema({type:`object`,properties:{},additionalProperties:!1}),label:{start:()=>`Sign in to ${n}`},name:t.connectionName}}async function connect(e,t){let n=await completeConnectionSignIn(e,t),r=await listConnectionTools(t,n);if(`failure`in r)throw Error(r.failure);if(`authorization`in r)return await n.auth.handleError(r.error,r.authorization);let i=displayProperName(t.connectionName),a=`${SEARCH_TOOL_NAME}({ query: "${t.connectionName}__" })`;return n.scoped!==void 0&&n.auth.isJustAuthorized(n.scoped)?`Signed in to ${i}. Find the ${i} tools with ${a}.`:`The ${i} tools are available. Find them with ${a}.`}async function callConnectionTool(e,t,n,r,i){releaseApprovalPin(i.toolCallId,t);let a=await completeConnectionSignIn(e,t),{auth:o,client:s,scoped:c}=a,l=await listConnectionTools(t,a);if(`failure`in l)throw Error(l.failure);if(`authorization`in l)return await o.handleError(l.error,l.authorization);let u=await checkCall(t,l.tools,n,r);if(`issues`in u)throw Error(issuesMessage(u.issues));let{input:d,tool:f}=u,p;try{p=await s.executeTool(f.name,d,{abortSignal:i.abortSignal,callId:i.toolCallId})}catch(e){if(isConnectionAuthorizationRequiredError(e))return await o.handleError(e,c);throw e}let m=toConnectionToolResult(t.protocol,f,p);if(!m.ok)throw Error(m.error);return m.value}async function checkInput(e,t,n,r){let i;try{i=await listToolMetadata(t.connectionName,e.getClient(t.connectionName))}catch(e){return isConnectionAuthorizationRequiredError(e)?{value:r}:{issues:[{message:listingFailureMessage(t.connectionName,e)}]}}let a=await checkCall(t,i,n,r);return`issues`in a?{issues:a.issues}:{value:a.input}}async function checkCall(e,t,n,r){let i=t.find(e=>e.name===n);if(i===void 0)return{issues:[{message:unknownToolMessage(e,n,t)}]};let a=e.toolCall?.providedArguments??{},o=Object.fromEntries(Object.entries(isObject(r)?r:{}).filter(([e])=>!Object.hasOwn(a,e))),s=await defineJsonSchema(i.inputSchema)[`~standard`].validate(o);return s.issues===void 0?{input:s.value,tool:i}:{issues:[...s.issues,{message:`Signature: ${connectionToolSignature(e,i)}`}]}}function issuesMessage(e){return e.map(({message:e,path:t=[]})=>{let n=t.map(e=>String(typeof e==`object`?e.key:e)).join(`.`);return n.length>0?`${n}: ${e}`:e}).join(` `)}function unknownToolMessage(e,t,n){let{connectionName:r}=e,i=closestNames(t,n).map(e=>connectionToolName(r,e));return`Connection "${r}" has no tool named "${t}".${i.length>0?` Closest tools: ${i.join(`, `)}.`:` Find its tools with ${SEARCH_TOOL_NAME}({ query: "${r}__" }).`}`}function connectionApproval(e,t,n){let{approval:r}=t;if(r===void 0)return;let i=resolveApprovalPolicy(r),request=async r=>requestApproval(t,i,withToolAnnotations(r,await toolAnnotations(e,t,n))),a=typeof r==`function`?void 0:r.response;return a===void 0?request:{request,response:e=>authorizeApprovalResponse(t,a,e)}}async function requestApproval(e,t,n){isApprovalRecheck(n)&&!matchesApprovalPin(n.callId,e)&&markApprovalPinChanged(n.callId);let r=await t(n);return!isApprovalRecheck(n)&&parksForApproval(r)&&pinApprovedInstance(n.callId,e),r}async function toolAnnotations(e,t,n){try{return(await listToolMetadata(t.connectionName,e.getClient(t.connectionName))).find(e=>e.name===n)?.annotations}catch{return}}function withToolAnnotations(e,t){if(t===void 0)return e;let n={...e,toolAnnotations:t};return isApprovalRecheck(e)?markApprovalRecheck(n):n}function parksForApproval(e){return e===!0||e===`user-approval`||typeof e==`object`&&e.type===`user-approval`}async function authorizeApprovalResponse(e,t,n){return matchesApprovalPin(n.request.callId,e)?await t(n):{reason:CONNECTION_CHANGED_MESSAGE,status:`rejected`}}function pinApprovedInstance(e,t){let n=loadContext();n.get(ConnectionApprovalPinsKey)?.[e]===void 0&&n.set(ConnectionApprovalPinsKey,(n={})=>Object.fromEntries([...Object.entries(n).slice(-49),[e,instanceKey(t)]]))}function matchesApprovalPin(e,t){let n=loadContext().get(ConnectionApprovalPinsKey)?.[e];return n!==void 0&&n===instanceKey(t)}function markApprovalPinChanged(e){loadContext().set(ConnectionApprovalPinsKey,(t={})=>({...t,[e]:`\0changed`}))}function releaseApprovalPin(e,t){let n=loadContext(),r=n.get(ConnectionApprovalPinsKey);if(r?.[e]===void 0)return;let{[e]:i,...a}=r;if(n.set(ConnectionApprovalPinsKey,a),i!==instanceKey(t))throw Error(CONNECTION_CHANGED_MESSAGE)}export{connectionEntry,connectionSignInEntry};
@@ -1 +1 @@
1
- import{completeConnectionSignIn,listConnectionTools,listingFailureMessage}from"./connection-auth.js";import{closestNames,isEmptyQuery,rankCandidates}from"./rank.js";import{connectionToolSignature,entrySignature}from"./signatures.js";import{connectionSignInEntry}from"./connection-entry.js";import{CALL_TOOL_NAME,SEARCH_TOOL_NAME,SKILL_TOOL_NAME}from"#protocol/catalog-tools.js";import{serializeInputSchema,toInputSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";function searchDescription({connections:e,skills:t,tools:n}){return[`Find your own tools, agents, skills, and connected services by keyword; this searches what you can do, not the web.`,n?`A result with \`tool\` has the exact name, description, and TypeScript signature: call it with ${CALL_TOOL_NAME}({ name, input }).`:void 0,t?`A result with \`skill\` has the name and description: load it with ${SKILL_TOOL_NAME}({ name }).`:void 0,`When you already know a name or connection, from the catalog listing, an earlier result, or an error, search it directly: the exact name, or "<connection>__", which is faster and returns only that connection's tools.`,e?`A connection that needs sign-in appears as a tool named after the connection: calling it with ${CALL_TOOL_NAME}({ name }) asks the user to sign in.`:void 0].filter(e=>e!==void 0).join(` `)}const SEARCH_INPUT_SCHEMA=toInputSchema({type:`object`,properties:{query:{type:`string`,minLength:1,description:`Words describing the capability, such as 'list open issues'; an exact name; or a namespace prefix such as 'linear__', which searches only that connection's tools.`},limit:{type:`integer`,minimum:1,maximum:50,description:`Maximum results, best matches first. Defaults to 10.`}},required:[`query`],additionalProperties:!1}),SEARCH_LABEL={start:e=>`Search tools${labelQuery(e)}`,complete:(e,t)=>{let{results:n,unavailable:r=[]}=t,i=`Searched tools${labelQuery(e)}, found ${n.length===0?`nothing`:String(n.length)}`;if(n.length>0||r.length===0)return i;let a=r.length===1?`connection`:`connections`;return`${i}; ${String(r.length)} ${a} unavailable`}};function labelQuery(e){let t=e.query?.trim();return t?` for “${t}”`:``}function createSearchTool(e){return{description:searchDescription(e.reach),execute:t=>search(e,t),frameworkTool:!0,inputSchema:SEARCH_INPUT_SCHEMA,label:SEARCH_LABEL,name:SEARCH_TOOL_NAME}}async function search(e,t){let n=t.query??``;if(isEmptyQuery(n))throw Error(`${SEARCH_TOOL_NAME} needs at least one word in query, such as a capability ("list open issues") or a name or connection prefix ("linear__").`);let r=parseNamespace(n),inScope=e=>r===void 0||inNamespace(e,r),i=[...e.deferred.map(t=>entryCandidate(t,e.describe)),...e.skills.map(skillCandidate)].filter(e=>inScope(e.fullName)),a=[],{registry:o}=e;if(o!==void 0){let e=o.getConnections().filter(({connectionName:e})=>r===void 0||mayOwnNamespace(e,r)),t=await Promise.all(e.map(e=>searchConnection(o,e)));for(let e of t)`unavailable`in e?a.push(e.unavailable):i.push(...e.candidates.filter(e=>inScope(e.fullName)))}if(r!==void 0&&i.length===0&&a.length===0)throw Error(unknownNamespaceMessage(r,o?.getConnections()??[]));let s=clampInteger(t.limit,1,50,10),c=rankCandidates(n,i).slice(0,s).map(e=>e.result());return a.length>0?{results:c,unavailable:a}:{results:c}}function parseNamespace(e){let t=(e.trim().split(/\s+/u)[0]??``).replace(/^[^A-Za-z0-9_-]+/u,``),n=t.slice(0,Math.max(0,t.lastIndexOf(`__`))).replace(/_+$/u,``);return n===``?void 0:n}function inNamespace(e,t){return e===t||e.startsWith(`${t}__`)}function mayOwnNamespace(e,t){return inNamespace(e,t)||t.startsWith(`${e}__`)}function unknownNamespaceMessage(e,t){if(t.some(({connectionName:t})=>t===e))return`Connection "${e}" has no tools.`;let n=closestNames(e,t.map(({connectionName:e,description:t})=>({description:t,name:e})));return`No entries are named "${e}__…". ${n.length>0?`Closest connections: ${n.join(`, `)}.`:`Find names in the catalog listing or your tool list, or call ${SEARCH_TOOL_NAME} with plain words.`}`}async function searchConnection(e,t){let n=t.connectionName,r;try{r=await listConnectionTools(t,await completeConnectionSignIn(e,t))}catch(e){return{unavailable:{connection:n,error:listingFailureMessage(n,e)}}}return`failure`in r?{unavailable:{connection:n,error:r.failure}}:`authorization`in r?{candidates:[signInCandidate(e,t)]}:{candidates:r.tools.map(e=>toolCandidate(t,e))}}function entryCandidate(e,t){let n=serializeInputSchema(e.inputSchema),r=t(e);return{description:r,inputSchema:n,name:e.name,result:()=>({description:r,signature:entrySignature(e,n),tool:e.name}),fullName:e.name}}function skillCandidate({description:e,name:t,path:n}){return{description:e,fullName:t,name:t,result:()=>({description:e,path:n,skill:t})}}function toolCandidate(e,t){let n=connectionToolName(e.connectionName,t.name);return{connection:{description:e.description,name:e.connectionName},description:t.description,inputSchema:t.inputSchema,name:t.name,result:()=>({description:t.description,signature:connectionToolSignature(e,t),tool:n}),fullName:n}}function signInCandidate(e,t){let n=connectionSignInEntry(e,t);return{description:t.description,name:t.connectionName,result:()=>({description:n.description,signature:entrySignature(n),tool:n.name}),fullName:n.name}}function clampInteger(e,t,n,r){return typeof e!=`number`||!Number.isFinite(e)?r:Math.min(n,Math.max(t,Math.trunc(e)))}export{createSearchTool};
1
+ import{completeConnectionSignIn,listConnectionTools,listingFailureMessage}from"./connection-auth.js";import{closestNames,isEmptyQuery,rankCandidates}from"./rank.js";import{connectionToolSignature,entrySignature}from"./signatures.js";import{connectionSignInEntry}from"./connection-entry.js";import{CALL_TOOL_NAME,SEARCH_TOOL_NAME,SKILL_TOOL_NAME}from"#protocol/catalog-tools.js";import{serializeInputSchema,toInputSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";function searchDescription({connections:e,skills:t,tools:n}){return[`Search your own catalog for tools, agents, skills, and connected services that aren't in your tool list. Use it when nothing in your tool list fits the request; it doesn't search the web.`,n?`A result with \`tool\` has the exact name, description, and TypeScript signature: call it with ${CALL_TOOL_NAME}({ name, input }).`:void 0,t?`A result with \`skill\` has the name and description: load it with ${SKILL_TOOL_NAME}({ name }).`:void 0,"`searched` counts the entries the query covered, and `remaining` counts the matches past `limit`: when `remaining` is 0, nothing else the query covered matched. Connections under `unavailable` weren't searched.",`When you already know a name or connection, from the catalog listing, an earlier result, or an error, search it directly: the exact name, or "<connection>__", which is faster and returns only that connection's tools.`,e?`A connection that needs sign-in appears as a tool named after the connection: calling it with ${CALL_TOOL_NAME}({ name }) asks the user to sign in. \`searched\` counts its tools only after sign-in.`:void 0].filter(e=>e!==void 0).join(` `)}const SEARCH_INPUT_SCHEMA=toInputSchema({type:`object`,properties:{query:{type:`string`,minLength:1,description:`Words describing the capability, such as 'list open issues'; an exact name; or a namespace prefix such as 'linear__', which searches only that connection's tools.`},limit:{type:`integer`,minimum:1,maximum:50,description:`Maximum results, best matches first. Defaults to 10.`}},required:[`query`],additionalProperties:!1}),SEARCH_LABEL={start:e=>`Search tools${labelQuery(e)}`,complete:(e,t)=>{let{results:n,unavailable:r=[]}=t,i=`Searched tools${labelQuery(e)}, found ${n.length===0?`nothing`:String(n.length)}`;if(n.length>0||r.length===0)return i;let a=r.length===1?`connection`:`connections`;return`${i}; ${String(r.length)} ${a} unavailable`}};function labelQuery(e){let t=e.query?.trim();return t?` for “${t}”`:``}function createSearchTool(e){return{description:searchDescription(e.reach),execute:t=>search(e,t),frameworkTool:!0,inputSchema:SEARCH_INPUT_SCHEMA,label:SEARCH_LABEL,name:SEARCH_TOOL_NAME}}async function search(e,t){let n=t.query??``;if(isEmptyQuery(n))throw Error(`${SEARCH_TOOL_NAME} needs at least one word in query, such as a capability ("list open issues") or a name or connection prefix ("linear__").`);let r=parseNamespace(n),inScope=e=>r===void 0||inNamespace(e,r),i=[...e.deferred.map(t=>entryCandidate(t,e.describe)),...e.skills.map(skillCandidate)].filter(e=>inScope(e.fullName)),a=[],{registry:o}=e;if(o!==void 0){let e=o.getConnections().filter(({connectionName:e})=>r===void 0||mayOwnNamespace(e,r)),t=await Promise.all(e.map(e=>searchConnection(o,e)));for(let e of t)`unavailable`in e?a.push(e.unavailable):i.push(...e.candidates.filter(e=>inScope(e.fullName)))}if(r!==void 0&&i.length===0&&a.length===0)throw Error(unknownNamespaceMessage(r,o?.getConnections()??[]));let s=clampInteger(t.limit,1,50,10),c=rankCandidates(n,i),l=c.slice(0,s).map(e=>e.result()),u={results:l,remaining:c.length-l.length,searched:i.length};return a.length>0?{...u,unavailable:a}:u}function parseNamespace(e){let t=(e.trim().split(/\s+/u)[0]??``).replace(/^[^A-Za-z0-9_-]+/u,``),n=t.slice(0,Math.max(0,t.lastIndexOf(`__`))).replace(/_+$/u,``);return n===``?void 0:n}function inNamespace(e,t){return e===t||e.startsWith(`${t}__`)}function mayOwnNamespace(e,t){return inNamespace(e,t)||t.startsWith(`${e}__`)}function unknownNamespaceMessage(e,t){if(t.some(({connectionName:t})=>t===e))return`Connection "${e}" has no tools.`;let n=closestNames(e,t.map(({connectionName:e,description:t})=>({description:t,name:e})));return`No entries are named "${e}__…". ${n.length>0?`Closest connections: ${n.join(`, `)}.`:`Find names in the catalog listing or your tool list, or call ${SEARCH_TOOL_NAME} with plain words.`}`}async function searchConnection(e,t){let n=t.connectionName,r;try{r=await listConnectionTools(t,await completeConnectionSignIn(e,t))}catch(e){return{unavailable:{connection:n,error:listingFailureMessage(n,e)}}}return`failure`in r?{unavailable:{connection:n,error:r.failure}}:`authorization`in r?{candidates:[signInCandidate(e,t)]}:{candidates:r.tools.map(e=>toolCandidate(t,e))}}function entryCandidate(e,t){let n=serializeInputSchema(e.inputSchema),r=t(e);return{description:r,inputSchema:n,name:e.name,result:()=>({description:r,signature:entrySignature(e,n),tool:e.name}),fullName:e.name}}function skillCandidate({description:e,name:t,path:n}){return{description:e,fullName:t,name:t,result:()=>({description:e,path:n,skill:t})}}function toolCandidate(e,t){let n=connectionToolName(e.connectionName,t.name);return{connection:{description:e.description,name:e.connectionName},description:t.description,inputSchema:t.inputSchema,name:t.name,result:()=>({description:t.description,signature:connectionToolSignature(e,t),tool:n}),fullName:n}}function signInCandidate(e,t){let n=connectionSignInEntry(e,t);return{description:t.description,name:t.connectionName,result:()=>({description:n.description,signature:entrySignature(n),tool:n.name}),fullName:n.name}}function clampInteger(e,t,n,r){return typeof e!=`number`||!Number.isFinite(e)?r:Math.min(n,Math.max(t,Math.trunc(e)))}export{createSearchTool};
@@ -1,18 +1,19 @@
1
1
  /**
2
2
  * The step's catalog: one table of every entry a model step can reach. Direct
3
- * entries go into the model's tool list next to the catalog tools the agent
3
+ * entries go into the model's tool list next to the catalog tools the session
4
4
  * has: `eve__search` finds entries, `eve__tool` calls deferred entries and
5
5
  * connection tools, and `eve__skill` loads skills. A call resolves to its entry
6
6
  * here and then runs exactly as a direct call would, so only model history
7
7
  * ever names a catalog tool.
8
8
  */
9
- import type { ContextReader } from "#context/key.js";
9
+ import type { ContextAccessor, ContextReader } from "#context/key.js";
10
+ import { type OfferedCatalogTools } from "#context/keys.js";
10
11
  import type { HarnessToolDefinition } from "#harness/execute-tool.js";
11
12
  import type { CallResolver, HarnessSession, HarnessToolLookup, HarnessToolMap } from "#harness/types.js";
12
13
  import type { ResolvedConnectionDefinition } from "#runtime/types.js";
13
14
  import { type CatalogSkill } from "./skills.js";
14
15
  export interface StepCatalog extends HarnessToolLookup {
15
- /** The model's tool list: direct entries, then the catalog tools the agent has. */
16
+ /** The model's tool list: direct entries, then the catalog tools the session has. */
16
17
  readonly advertised: HarnessToolMap;
17
18
  readonly connections: readonly ResolvedConnectionDefinition[];
18
19
  /** Entries reached only through `eve__tool`, connection tools aside. */
@@ -21,6 +22,8 @@ export interface StepCatalog extends HarnessToolLookup {
21
22
  readonly entries: HarnessToolMap;
22
23
  /** Every skill the session can load, deferred or not. */
23
24
  readonly skills: ReadonlyMap<string, CatalogSkill>;
25
+ /** The catalog tools the tool list offers; see {@link recordOfferedCatalogTools}. */
26
+ readonly offered: OfferedCatalogTools;
24
27
  /**
25
28
  * Whether the session offers tasks: one of the agent's own tools it sees
26
29
  * starts them, or the agent resolves subagents at runtime. Both are fixed by
@@ -49,3 +52,9 @@ export declare function buildStepCatalog(input: {
49
52
  readonly endsTurn: boolean;
50
53
  readonly session: Pick<HarnessSession, "rootSessionId">;
51
54
  }): StepCatalog;
55
+ /**
56
+ * Keeps the catalog tools `catalog` offers for every later step of the
57
+ * session. The step that calls the model records them; a step rebuilt to
58
+ * resume a parked call only reads them.
59
+ */
60
+ export declare function recordOfferedCatalogTools(ctx: ContextAccessor | undefined, { offered }: StepCatalog): void;
@@ -1 +1 @@
1
- import{closestNames}from"./rank.js";import{entrySignature}from"./signatures.js";import{connectionEntry,connectionSignInEntry}from"./connection-entry.js";import{createSearchTool}from"./search.js";import{createSkillLoader,sessionSkills,unknownSkillMessage}from"./skills.js";import{isObject}from"#shared/guards.js";import{CALL_TOOL_NAME,SEARCH_TOOL_NAME,SKILL_ENTRY_NAME,SKILL_TOOL_NAME}from"#protocol/catalog-tools.js";import{refineJsonSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";import{eveNamespaceReservation}from"#protocol/runtime-tools.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{startsTasks}from"#execution/tasks/tool-entry-point.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{withTaskTools}from"#execution/tasks/model-step.js";import{runEntryCall}from"#harness/execute-call.js";import{checkToolCallInput}from"#harness/tool-call-io.js";const CALL_TOOL_DESCRIPTION=`Call a tool that isn't in your tool list by its exact name from ${SEARCH_TOOL_NAME}, with \`input\` matching its signature.`,SEARCHABLE_SKILL_DESCRIPTION=`Load a skill's instructions when the request clearly matches a listed skill or one ${SEARCH_TOOL_NAME} found, or the user asks for it, then follow them.`;function catalogToolsFor(e,t){let n=t?.resolvedAgent,r=n?.skills??[],i=(n?.dynamicSkillResolvers.length??0)>0,a=(n?.connections??[]).length>0||(n?.dynamicConnectionResolvers?.length??0)>0,o=i||r.some(e=>e.deferred===!0),s=a||e.some(e=>e.deferred===!0)||(n?.dynamicToolResolvers.length??0)>0||(t?.subagentRegistry.dynamicResolvers.length??0)>0;return{connections:a,search:s||o,searchableSkills:o,skills:r.length>0||i,tools:s}}function buildStepCatalog(e){let visible=t=>isVisible(t,e.session),t=e.ctx?.get(BundleKey),n=catalogToolsFor([...e.agentTools.values()].filter(visible),t),r=(t?.subagentRegistry.dynamicResolvers.length??0)>0||[...e.agentTools.values()].some(e=>visible(e)&&startsTasks(e)),i=stepEntries(e,visible),a=r?withTaskTools(i):i,o=new Map,s=new Map;for(let[e,t]of a)(t.deferred===!0?s:o).set(e,t);let c=e.ctx?.get(ConnectionRegistryKey),l=c?.getConnections()??[],u=sessionSkills(e.ctx),d=createSkillLoader(u),f=new Map(o),toolEntry=e=>a.get(e)??f.get(e)??(c===void 0?void 0:connectionEntryNamed(e,c,l)),describe=t=>describeEntry(t,e.endsTurn),p={advertised:f,connections:l,deferred:s,describe,entries:a,get:e=>e===SKILL_ENTRY_NAME?d:toolEntry(e),offersTasks:r,resolve:e=>{if(e.toolName===CALL_TOOL_NAME&&n.tools){let t=targetName(e.input),n=t===void 0?void 0:toolEntry(t);return t===void 0||n===void 0||!callableByName(n)?void 0:{call:asEntryCall(e,t),definition:n}}if(e.toolName===SKILL_TOOL_NAME&&n.skills){let t=targetName(e.input);return t===void 0||!u.has(t)?void 0:{call:{...e,input:{name:t},toolName:SKILL_ENTRY_NAME},definition:d}}let t=f.get(e.toolName);return t===void 0?void 0:{call:e,definition:t}},skills:u};if(n.search){let e=createSearchTool({deferred:[...s.values()],describe,reach:{connections:n.connections,skills:n.searchableSkills,tools:n.tools},registry:c,skills:[...u.values()].filter(e=>e.deferred)});f.set(e.name,e)}return n.tools&&f.set(CALL_TOOL_NAME,createCallTool(p,toolEntry,n)),n.skills&&f.set(SKILL_TOOL_NAME,createSkillTool(p,toolEntry,n)),p}function targetName(e){return isObject(e)&&typeof e.name==`string`?e.name:void 0}function asEntryCall(e,t){let n=e.input.input;return{...e,input:n??{},toolName:t}}function describeEntry(e,t){return t&&e.endsTurn===!0?`${e.description}\n\nCalling this tool ends your turn once it succeeds: do not write a reply or call other tools in the same step. If it fails, you will see the error and can continue.`.trimStart():e.description}function stepEntries(e,t){let n=new Map([...e.agentTools].filter(([,e])=>t(e)));if(e.ctx===void 0)return n;for(let r of buildDynamicSubagentTools(e.ctx).filter(t))n.set(r.name,r);let r=new Set;for(let i of buildDynamicTools(e.ctx).filter(t))r.has(i.name)||(r.add(i.name),n.set(i.name,i));return n}function isVisible(e,t){return e.rootOnly!==!0&&e.availableInSubagents!==!1&&e.behavior?.availability.includes(`root-session`)!==!0||t.rootSessionId===void 0}function connectionEntryNamed(e,t,n){for(let r of n){if(e===r.connectionName)return connectionSignInEntry(t,r);let n=connectionToolName(r.connectionName,``);if(e.length>n.length&&e.startsWith(n))return connectionEntry(t,r,e.slice(n.length))}}function createCallTool(e,t,n){return{description:n.connections?`${CALL_TOOL_DESCRIPTION} Prefer connected services over web search or general knowledge when a request relates to them.`:CALL_TOOL_DESCRIPTION,execute:(t,n)=>runResolved(e,{input:t,toolName:CALL_TOOL_NAME},n),frameworkTool:!0,inputSchema:refineJsonSchema({type:`object`,properties:{name:{type:`string`,description:`The tool's exact name, as ${SEARCH_TOOL_NAME} returns it.`},input:{type:`object`,description:`Arguments matching the tool's signature. Defaults to {}.`}},required:[`name`],additionalProperties:!1},n=>resolveToolInput(e,t,n)),name:CALL_TOOL_NAME}}function createSkillTool(e,t,n){return{description:n.searchableSkills?SEARCHABLE_SKILL_DESCRIPTION:`Load a skill's instructions when the request clearly matches one of your listed skills or the user asks for it, then follow them.`,execute:(t,n)=>runResolved(e,{input:t,toolName:SKILL_TOOL_NAME},n),frameworkTool:!0,inputSchema:refineJsonSchema({type:`object`,properties:{name:{type:`string`,description:n.searchableSkills?`The skill's name, from your listed skills or ${SEARCH_TOOL_NAME}.`:`The skill's name, from your listed skills.`}},required:[`name`],additionalProperties:!1},async r=>resolveSkillInput(e,t,r.name,n)),name:SKILL_TOOL_NAME}}function runResolved(e,t,n){let r=e.resolve(t);if(r===void 0)throw Error(`A ${t.toolName} call ran without a resolved entry.`);return runEntryCall(r,n)}function callableByName(e){return e.deferred===!0||eveNamespaceReservation(e.name)===void 0&&(e.execute!==void 0||e.workflowId!==void 0)}async function resolveToolInput(e,t,{input:n,name:r}){let i=t(r);if(i===void 0)return failure(`name`,unknownEntryMessage(r,e));if(!callableByName(i))return failure(`name`,`"${r}" is in your tool list; call it directly.`);let a=await checkToolCallInput(i,n,``);if(a.kind===`threw`)throw a.error;return a.kind===`invalid`?{issues:(isConnectionTool(r,e.connections)?a.issues:[...a.issues,{message:`Signature: ${entrySignature(i)}`}]).map(({message:e,path:t=[]})=>({message:e,path:[`input`,...t]}))}:{value:{input:a.value,name:r}}}function resolveSkillInput(e,t,n,r){if(e.skills.has(n))return{value:{name:n}};let i=e.connections.map(e=>e.connectionName),a=i.includes(n)?void 0:t(n);return a===void 0?failure(`name`,unknownSkillMessage(n,e.skills,i,r.searchableSkills)):failure(`name`,a.deferred===!0?`"${n}" is a tool, not a skill; call it with ${CALL_TOOL_NAME}({ name: "${n}" }).`:`"${n}" is a tool in your tool list, not a skill; call it directly.`)}function isConnectionTool(e,t){return t.some(({connectionName:t})=>e.startsWith(connectionToolName(t,``)))}function failure(e,t){return{issues:[{message:t,path:[e]}]}}function unknownEntryMessage(e,t){if(t.skills.has(e))return`"${e}" is a skill; load it with ${SKILL_TOOL_NAME}({ name: "${e}" }).`;let n=[...t.deferred.values()].map(({description:e,name:t})=>({description:e,name:t})),r=closestNames(e,n);return`No tool named "${e}".${r.length>0?` Closest tools: ${r.join(`, `)}.`:` Find tools with ${SEARCH_TOOL_NAME}.`}`}export{buildStepCatalog};
1
+ import{closestNames}from"./rank.js";import{entrySignature}from"./signatures.js";import{connectionEntry,connectionSignInEntry}from"./connection-entry.js";import{createSearchTool}from"./search.js";import{createSkillLoader,sessionSkills,unknownSkillMessage}from"./skills.js";import{isObject}from"#shared/guards.js";import{OfferedCatalogToolsKey}from"#context/keys.js";import{CALL_TOOL_NAME,SEARCH_TOOL_NAME,SKILL_ENTRY_NAME,SKILL_TOOL_NAME}from"#protocol/catalog-tools.js";import{refineJsonSchema}from"#tools/schema.js";import{connectionToolName}from"#connections/ownership.js";import{eveNamespaceReservation}from"#protocol/runtime-tools.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{startsTasks}from"#execution/tasks/tool-entry-point.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{withTaskTools}from"#execution/tasks/model-step.js";import{runEntryCall}from"#harness/execute-call.js";import{checkToolCallInput}from"#harness/tool-call-io.js";const CALL_TOOL_DESCRIPTION=`Call a tool that isn't in your tool list by its exact name from ${SEARCH_TOOL_NAME}, with \`input\` matching its signature.`,SEARCHABLE_SKILL_DESCRIPTION=`Load a skill's instructions when the request clearly matches a listed skill or one ${SEARCH_TOOL_NAME} found, or the user asks for it, then follow them.`;function catalogToolsFor(e){let{offered:t}=e,n=[...e.skills.values()],r=t?.connections===!0||e.connections.length>0,i=t?.searchableSkills===!0||n.some(e=>e.deferred),a=t?.tools===!0||r||e.deferred.size>0;return{connections:r,search:a||i,searchableSkills:i,skills:t?.skills===!0||n.length>0,tools:a}}function buildStepCatalog(e){let visible=t=>isVisible(t,e.session),t=((e.ctx?.get(BundleKey))?.subagentRegistry.dynamicResolvers.length??0)>0||[...e.agentTools.values()].some(e=>visible(e)&&startsTasks(e)),n=stepEntries(e,visible),r=t?withTaskTools(n):n,i=new Map,a=new Map;for(let[e,t]of r)(t.deferred===!0?a:i).set(e,t);let o=e.ctx?.get(ConnectionRegistryKey),s=o?.getConnections()??[],c=sessionSkills(e.ctx),l=catalogToolsFor({connections:s,deferred:a,offered:e.ctx?.get(OfferedCatalogToolsKey),skills:c}),{search:u,...d}=l,f=createSkillLoader(c),p=new Map(i),toolEntry=e=>r.get(e)??p.get(e)??(o===void 0?void 0:connectionEntryNamed(e,o,s)),describe=t=>describeEntry(t,e.endsTurn),m={advertised:p,connections:s,deferred:a,describe,entries:r,get:e=>e===SKILL_ENTRY_NAME?f:toolEntry(e),offered:d,offersTasks:t,resolve:e=>{if(e.toolName===CALL_TOOL_NAME&&l.tools){let t=targetName(e.input),n=t===void 0?void 0:toolEntry(t);return t===void 0||n===void 0||!callableByName(n)?void 0:{call:asEntryCall(e,t),definition:n}}if(e.toolName===SKILL_TOOL_NAME&&l.skills){let t=targetName(e.input);return t===void 0||!c.has(t)?void 0:{call:{...e,input:{name:t},toolName:SKILL_ENTRY_NAME},definition:f}}let t=p.get(e.toolName);return t===void 0?void 0:{call:e,definition:t}},skills:c};if(l.search){let e=createSearchTool({deferred:[...a.values()],describe,reach:{connections:l.connections,skills:l.searchableSkills,tools:l.tools},registry:o,skills:[...c.values()].filter(e=>e.deferred)});p.set(e.name,e)}return l.tools&&p.set(CALL_TOOL_NAME,createCallTool(m,toolEntry,l)),l.skills&&p.set(SKILL_TOOL_NAME,createSkillTool(m,toolEntry,l)),m}function recordOfferedCatalogTools(e,{offered:t}){Object.values(t).includes(!0)&&e?.set(OfferedCatalogToolsKey,t)}function targetName(e){return isObject(e)&&typeof e.name==`string`?e.name:void 0}function asEntryCall(e,t){let n=e.input.input;return{...e,input:n??{},toolName:t}}function describeEntry(e,t){return t&&e.endsTurn===!0?`${e.description}\n\nCalling this tool ends your turn once it succeeds: do not write a reply or call other tools in the same step. If it fails, you will see the error and can continue.`.trimStart():e.description}function stepEntries(e,t){let n=new Map([...e.agentTools].filter(([,e])=>t(e)));if(e.ctx===void 0)return n;for(let r of buildDynamicSubagentTools(e.ctx).filter(t))n.set(r.name,r);let r=new Set;for(let i of buildDynamicTools(e.ctx).filter(t))r.has(i.name)||(r.add(i.name),n.set(i.name,i));return n}function isVisible(e,t){return e.rootOnly!==!0&&e.availableInSubagents!==!1&&e.behavior?.availability.includes(`root-session`)!==!0||t.rootSessionId===void 0}function connectionEntryNamed(e,t,n){for(let r of n){if(e===r.connectionName)return connectionSignInEntry(t,r);let n=connectionToolName(r.connectionName,``);if(e.length>n.length&&e.startsWith(n))return connectionEntry(t,r,e.slice(n.length))}}function createCallTool(e,t,n){return{description:n.connections?`${CALL_TOOL_DESCRIPTION} Prefer connected services over web search or general knowledge when a request relates to them.`:CALL_TOOL_DESCRIPTION,execute:(t,n)=>runResolved(e,{input:t,toolName:CALL_TOOL_NAME},n),frameworkTool:!0,inputSchema:refineJsonSchema({type:`object`,properties:{name:{type:`string`,description:`The tool's exact name, as ${SEARCH_TOOL_NAME} returns it.`},input:{type:`object`,description:`Arguments matching the tool's signature. Defaults to {}.`}},required:[`name`],additionalProperties:!1},n=>resolveToolInput(e,t,n)),name:CALL_TOOL_NAME}}function createSkillTool(e,t,n){return{description:n.searchableSkills?SEARCHABLE_SKILL_DESCRIPTION:`Load a skill's instructions when the request clearly matches one of your listed skills or the user asks for it, then follow them.`,execute:(t,n)=>runResolved(e,{input:t,toolName:SKILL_TOOL_NAME},n),frameworkTool:!0,inputSchema:refineJsonSchema({type:`object`,properties:{name:{type:`string`,description:n.searchableSkills?`The skill's name, from your listed skills or ${SEARCH_TOOL_NAME}.`:`The skill's name, from your listed skills.`}},required:[`name`],additionalProperties:!1},async r=>resolveSkillInput(e,t,r.name,n)),name:SKILL_TOOL_NAME}}function runResolved(e,t,n){let r=e.resolve(t);if(r===void 0)throw Error(`A ${t.toolName} call ran without a resolved entry.`);return runEntryCall(r,n)}function callableByName(e){return e.deferred===!0||eveNamespaceReservation(e.name)===void 0&&(e.execute!==void 0||e.workflowId!==void 0)}async function resolveToolInput(e,t,{input:n,name:r}){let i=t(r);if(i===void 0)return failure(`name`,unknownEntryMessage(r,e));if(!callableByName(i))return failure(`name`,`"${r}" is in your tool list; call it directly.`);let a=await checkToolCallInput(i,n,``);if(a.kind===`threw`)throw a.error;return a.kind===`invalid`?{issues:(isConnectionTool(r,e.connections)?a.issues:[...a.issues,{message:`Signature: ${entrySignature(i)}`}]).map(({message:e,path:t=[]})=>({message:e,path:[`input`,...t]}))}:{value:{input:a.value,name:r}}}function resolveSkillInput(e,t,n,r){if(e.skills.has(n))return{value:{name:n}};let i=e.connections.map(e=>e.connectionName),a=i.includes(n)?void 0:t(n);return a===void 0?failure(`name`,unknownSkillMessage(n,e.skills,i,r.searchableSkills)):failure(`name`,a.deferred===!0?`"${n}" is a tool, not a skill; call it with ${CALL_TOOL_NAME}({ name: "${n}" }).`:`"${n}" is a tool in your tool list, not a skill; call it directly.`)}function isConnectionTool(e,t){return t.some(({connectionName:t})=>e.startsWith(connectionToolName(t,``)))}function failure(e,t){return{issues:[{message:t,path:[e]}]}}function unknownEntryMessage(e,t){if(t.skills.has(e))return`"${e}" is a skill; load it with ${SKILL_TOOL_NAME}({ name: "${e}" }).`;let n=[...t.deferred.values()].map(({description:e,name:t})=>({description:e,name:t})),r=closestNames(e,n);return`No tool named "${e}".${r.length>0?` Closest tools: ${r.join(`, `)}.`:` Find tools with ${SEARCH_TOOL_NAME}.`}`}export{buildStepCatalog,recordOfferedCatalogTools};
@@ -1,4 +1,4 @@
1
- import type { SessionAuthContext } from "#channel/types.js";
1
+ /** Shared owner-side dispatch context preparation. */
2
2
  import { type ChannelAdapter, type ChannelAdapterContext } from "#channel/adapter.js";
3
3
  import { type LocalDevRequestProvenance } from "#context/keys.js";
4
4
  import { ContextContainer } from "#context/container.js";
@@ -61,7 +61,6 @@ export declare function prepareCoordinationDispatch(input: {
61
61
  readonly sessionState: DurableSessionState;
62
62
  }): Promise<PreparedCoordinationDispatch | undefined>;
63
63
  interface DispatchBatch {
64
- readonly approvers?: Readonly<Record<string, SessionAuthContext>>;
65
64
  readonly event: {
66
65
  readonly sequence: number;
67
66
  readonly stepIndex: number;
@@ -1 +1 @@
1
- import{ConversationContextKey}from"#shared/conversation-context.js";import"#channel/adapter.js";import"#context/container.js";import{AuthKey,CapabilitiesKey,ChannelInstrumentationKey,InitiatorAuthKey,LocalDevRequestKey,ParentSessionKey,TraceRootKey}from"#context/keys.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{activeTurnId,runtimeWait,storedProjection,turnPosition}from"#harness/session-machine/view.js";import"#subagents/tool.js";import{readDurableSession}from"#execution/durable-session-store.js";import{deserializeContext}from"#context/serialize.js";import{readDynamicSubagentSelections}from"#context/dynamic-subagent-lifecycle.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{assertUniqueCoordinationCallIds}from"#harness/coordination.js";import{resolveTraceRootSessionId}from"#shared/trace-root.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{resolveWorkflowAgentMetadata}from"#execution/agent-sessions/metadata.js";async function prepareCoordinationDispatch(e){let t=readDurableSession(e.sessionState),n=runtimeWait(t.state);if(n===void 0)return;let r=n.tasks;if(r.length===0)return;let i=n.event.turnId||activeTurnId(turnPosition(storedProjection(t.state))),a=await deserializeContext(e.serializedContext);return{...await prepareActionDispatch({batch:{approvers:n.approvers,event:{...n.event,turnId:i},requests:r},ctx:a,durableSession:t,plan:()=>r,serializedContext:e.serializedContext}),sessionState:e.sessionState}}async function prepareActionDispatch(e){let{batch:t,durableSession:n}=e;assertUniqueCoordinationCallIds(t.requests);let r=e.ctx,i=r.require(BundleKey),a=resolveEffectiveAgentRuntime(i,r),o=hydrateDurableSession({compactionOverrides:{thresholdPercent:a.thresholdPercent},durable:n,turnAgent:a.turnAgent}),s=r.require(ChannelKey),c=e.plan({bundle:i,ctx:r,requests:t.requests,session:o}),l=resolveActiveSandboxSessionId(s.state,o.sessionId);return{adapter:s,adapterCtx:buildAdapterContext(s,r),auth:r.get(AuthKey)??null,batch:t,bundle:i,capabilities:r.get(CapabilitiesKey),channelMetadata:r.get(ChannelInstrumentationKey),dynamicSubagentSelections:readDynamicSubagentSelections(r),inheritedConversation:r.get(ConversationContextKey),initiatorAuth:r.get(InitiatorAuthKey)??null,localDevRequest:r.get(LocalDevRequestKey),parentSession:r.get(ParentSessionKey),plan:c,sandboxSessionId:l,serializedContext:e.serializedContext,session:o,traceRoot:childTraceRoot(r,o.sessionId),workflowAgents:resolveWorkflowAgentMetadata(r)}}function childTraceRoot(e,t){if(e.get(TraceRootKey)!==void 0)return{kind:`inherited`,sessionId:resolveTraceRootSessionId(e,t)}}function resolveActiveSandboxSessionId(e,t){if(typeof e!=`object`||!e)return t;let n=e.sandboxSessionId;return typeof n==`string`&&n.length>0?n:t}export{prepareActionDispatch,prepareCoordinationDispatch};
1
+ import{ConversationContextKey}from"#shared/conversation-context.js";import"#channel/adapter.js";import"#context/container.js";import{AuthKey,CapabilitiesKey,ChannelInstrumentationKey,InitiatorAuthKey,LocalDevRequestKey,ParentSessionKey,TraceRootKey}from"#context/keys.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{activeTurnId,runtimeWait,storedProjection,turnPosition}from"#harness/session-machine/view.js";import"#subagents/tool.js";import{readDurableSession}from"#execution/durable-session-store.js";import{deserializeContext}from"#context/serialize.js";import{readDynamicSubagentSelections}from"#context/dynamic-subagent-lifecycle.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{assertUniqueCoordinationCallIds}from"#harness/coordination.js";import{resolveTraceRootSessionId}from"#shared/trace-root.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{resolveWorkflowAgentMetadata}from"#execution/agent-sessions/metadata.js";async function prepareCoordinationDispatch(e){let t=readDurableSession(e.sessionState),n=runtimeWait(t.state);if(n===void 0)return;let r=n.tasks;if(r.length===0)return;let i=n.event.turnId||activeTurnId(turnPosition(storedProjection(t.state))),a=await deserializeContext(e.serializedContext);return{...await prepareActionDispatch({batch:{event:{...n.event,turnId:i},requests:r},ctx:a,durableSession:t,plan:()=>r,serializedContext:e.serializedContext}),sessionState:e.sessionState}}async function prepareActionDispatch(e){let{batch:t,durableSession:n}=e;assertUniqueCoordinationCallIds(t.requests);let r=e.ctx,i=r.require(BundleKey),a=resolveEffectiveAgentRuntime(i,r),o=hydrateDurableSession({compactionOverrides:{thresholdPercent:a.thresholdPercent},durable:n,turnAgent:a.turnAgent}),s=r.require(ChannelKey),c=e.plan({bundle:i,ctx:r,requests:t.requests,session:o}),l=resolveActiveSandboxSessionId(s.state,o.sessionId);return{adapter:s,adapterCtx:buildAdapterContext(s,r),auth:r.get(AuthKey)??null,batch:t,bundle:i,capabilities:r.get(CapabilitiesKey),channelMetadata:r.get(ChannelInstrumentationKey),dynamicSubagentSelections:readDynamicSubagentSelections(r),inheritedConversation:r.get(ConversationContextKey),initiatorAuth:r.get(InitiatorAuthKey)??null,localDevRequest:r.get(LocalDevRequestKey),parentSession:r.get(ParentSessionKey),plan:c,sandboxSessionId:l,serializedContext:e.serializedContext,session:o,traceRoot:childTraceRoot(r,o.sessionId),workflowAgents:resolveWorkflowAgentMetadata(r)}}function childTraceRoot(e,t){if(e.get(TraceRootKey)!==void 0)return{kind:`inherited`,sessionId:resolveTraceRootSessionId(e,t)}}function resolveActiveSandboxSessionId(e,t){if(typeof e!=`object`||!e)return t;let n=e.sandboxSessionId;return typeof n==`string`&&n.length>0?n:t}export{prepareActionDispatch,prepareCoordinationDispatch};
@@ -1 +1 @@
1
- import{storedProjection}from"#harness/session-machine/view.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{prepareCoordinationDispatch}from"#execution/coordination-dispatch-shared.js";import{publishSessionEvents}from"#execution/publish-session-events.js";import{withSessionStateDelta}from"#execution/session/state-delta.js";import{startWorkflowTask}from"#execution/tools/workflow/start.js";import{sendToTask,startTaskRun}from"#execution/tasks/start.js";import{captureAgentSessionContext,resolveStepAgentLimits}from"#execution/agent-sessions/context.js";import{sessionView}from"#harness/session-machine/commit.js";import{startTask}from"#harness/session-machine/transitions.js";async function dispatchCoordinationStep(e){"use step";return await withSessionStateDelta(e,dispatchCoordination)}async function dispatchCoordination(e){let t=await prepareCoordinationDispatch({serializedContext:e.serializedContext,sessionState:e.sessionState});if(t===void 0)return{results:[],serializedContext:e.serializedContext,sessionState:e.sessionState};let{batch:n,session:r}=t,i=r,a=[],o=[],s=resolveStepAgentLimits(t);for(let r of t.plan){let c=await dispatchWorkflowCall({agentContext:captureAgentSessionContext(t,r.callId,s),auth:{current:n.approvers?.[r.callId]??t.auth,initiator:t.initiatorAuth},batchEvent:n.event,owner:e.workflowToolRunOwner,parentSession:t.parentSession,session:i,task:r});i=c.session,c.result!==void 0&&a.push(c.result),c.started!==void 0&&o.push(c.started)}return{results:a,...await publishSessionEvents({serializedContext:e.serializedContext,sessionState:i===r?t.sessionState:createDurableSessionState({session:i}),sessionWritable:e.sessionWritable},o.flatMap(e=>startTask(sessionView(storedProjection(i.state),i.state),e).events))}}async function dispatchWorkflowCall(e){let{entry:t}=e.task;switch(t.entryPoint){case`execute`:return await startWorkflowTask(e);case`task`:case`serve`:return await startTaskRun({...e,entry:t});case`receive`:return await sendToTask({...e,taskId:t.taskId})}}export{dispatchCoordinationStep};
1
+ import{storedProjection}from"#harness/session-machine/view.js";import{readTaskTable}from"#execution/tasks/table.js";import{createDurableSessionState}from"#execution/durable-session-store.js";import{prepareCoordinationDispatch}from"#execution/coordination-dispatch-shared.js";import{publishSessionEvents}from"#execution/publish-session-events.js";import{withSessionStateDelta}from"#execution/session/state-delta.js";import{startWorkflowTask,startWorkflowToolCallRun}from"#execution/tools/workflow/start.js";import{runEntryToStart,sendToTask,startTaskRun,startsEveryRun}from"#execution/tasks/start.js";import{captureAgentSessionContext,resolveStepAgentLimits}from"#execution/agent-sessions/context.js";import{sessionView}from"#harness/session-machine/commit.js";import{startTask}from"#harness/session-machine/transitions.js";async function dispatchCoordinationStep(e){"use step";return await withSessionStateDelta(e,dispatchCoordination)}async function dispatchCoordination(e){let t=await prepareCoordinationDispatch({serializedContext:e.serializedContext,sessionState:e.sessionState});if(t===void 0)return{results:[],serializedContext:e.serializedContext,sessionState:e.sessionState};let{batch:n,session:r}=t,i=r,a=[],o=[],s=resolveStepAgentLimits(t),c=withPrestartedRuns(t.plan.map(i=>({agentContext:captureAgentSessionContext(t,i.callId,s),auth:{current:t.auth,initiator:t.initiatorAuth},batchEvent:n.event,owner:e.workflowToolRunOwner,parentSession:t.parentSession,session:r,task:i})),readTaskTable(r.state));for(let e of c){let t=await dispatchWorkflowCall({...e,session:i});i=t.session,t.result!==void 0&&a.push(t.result),t.started!==void 0&&o.push(t.started)}return{results:a,...await publishSessionEvents({serializedContext:e.serializedContext,sessionState:i===r?t.sessionState:createDurableSessionState({session:i}),sessionWritable:e.sessionWritable},o.flatMap(e=>startTask(sessionView(storedProjection(i.state),i.state),e).events))}}function withPrestartedRuns(e,t){let n=e.map(e=>e.task),r=n.map(e=>runEntryToStart(t,e));return r.filter(e=>e!==void 0).length>1&&startsEveryRun(t,n)?e.map((e,t)=>{let n=r[t];if(n===void 0)return e;let i=startWorkflowToolCallRun(e,n);return i.catch(()=>{}),{...e,prestarted:{entry:n,run:i}}}):e}async function dispatchWorkflowCall(e){let{entry:t}=e.task;switch(t.entryPoint){case`execute`:return await startWorkflowTask(e);case`task`:case`serve`:return await startTaskRun({...e,entry:t});case`receive`:return await sendToTask({...e,taskId:t.taskId})}}export{dispatchCoordinationStep};
@@ -1 +1 @@
1
- import{runJsProgram}from"#execution/dynamic-workflow/workflow.js";async function runWorkflowProgramTask(e,t){"use workflow";return runJsProgram(e.js,t,{maxSubagents:e.maxSubagents??0})}runWorkflowProgramTask.workflowId=`workflow//eve@0.77.0//runWorkflowProgramTask`;export{runWorkflowProgramTask};
1
+ import{runJsProgram}from"#execution/dynamic-workflow/workflow.js";async function runWorkflowProgramTask(e,t){"use workflow";return runJsProgram(e.js,t,{maxSubagents:e.maxSubagents??0})}runWorkflowProgramTask.workflowId=`workflow//eve@0.79.0//runWorkflowProgramTask`;export{runWorkflowProgramTask};
@@ -1 +1 @@
1
- import{isNonEmptyString}from"#shared/guards.js";import{ConversationContextKey,normalizeConversationContext}from"#shared/conversation-context.js";import{resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{ChannelRequestIdKey,OtelTraceEnabledKey,ScheduleIdKey,SessionTitleKey,SessionTraceSeedKey}from"#context/keys.js";import{CHANNEL_CONTEXT_KEY_NAME}from"#context/key-names.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace}from"#tracing/sampled-trace.js";const EVE_VERSION_ATTRIBUTE=`$eve.version`,EVE_TYPE_ATTRIBUTE=`$eve.type`,EVE_SESSION_ATTRIBUTE=`$eve.session`,EVE_ROOT_ATTRIBUTE=`$eve.root`;function readChannelKind(e){let t=e[CHANNEL_CONTEXT_KEY_NAME]?.kind;return isNonEmptyString(t)?t:void 0}function isWorkflowTraceContentVisible(e){let t=e[SessionTraceSeedKey.name];if(t!==void 0){let n=resolveForwardedTraceSeed(t);if(n.forwardedTracePolicy!==void 0||readParentSessionId(e)!==void 0){let e=n.decision;return e?.action===`record`&&e.recordInputs&&e.recordOutputs}}let n=normalizeConversationContext(e[ConversationContextKey.name]);return shouldCaptureInstrumentationContent({audience:n?.audience??`unknown`,environment:n?.environment??`production`})}function isWorkflowOtelTraceEnabled(e){return e[OtelTraceEnabledKey.name]===!0}function readSessionTraceId(e){let t=e[SessionTraceSeedKey.name];if(t===void 0)return;let n=resolveForwardedTraceSeed(t);if(isSampledTrace(n))return isNonEmptyString(t.traceId)?t.traceId:void 0}function readParentLineage(e){let t=e[`eve.parentSession`],n=t?.callId,r=t?.rootSessionId,i=t?.sessionId,a=t?.turn?.id;return{callId:isNonEmptyString(n)?n:void 0,rootSessionId:isNonEmptyString(r)?r:void 0,sessionId:isNonEmptyString(i)?i:void 0,turnId:isNonEmptyString(a)?a:void 0}}function readParentSessionId(e){return readParentLineage(e).sessionId}function readRootSessionId(e){return readParentLineage(e).rootSessionId}function readChannelRequestId(e){let t=e[ChannelRequestIdKey.name];return isNonEmptyString(t)?t:void 0}function readScheduleId(e){let t=e[ScheduleIdKey.name];return isNonEmptyString(t)?t:void 0}function readSessionTitle(e){let t=e[SessionTitleKey.name];return isNonEmptyString(t)?t:void 0}const EVE_SESSION_TITLE_MAX_CHARS=125;function deriveSessionTitle(e){let t=collectMessageText(e);if(t===void 0||t.length===0)return;let n=t.replace(/\s+/gu,` `).trim();if(n.length===0)return;let r=Array.from(n);return r.length<=125?n:`${r.slice(0,124).join(``)}…`}function collectMessageText(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return;let t=[];for(let n of e)n&&typeof n==`object`&&n.type===`text`&&typeof n.text==`string`&&t.push(n.text);return t.length>0?t.join(` `):void 0}function buildSessionAttributes(e){let t=isWorkflowTraceContentVisible(e.serializedContext),n=isWorkflowOtelTraceEnabled(e.serializedContext);return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.schedule":readScheduleId(e.serializedContext),"$eve.is_otel_trace_enabled":n,"$eve.is_trace_content_visible":t,"$eve.trace_id":readSessionTraceId(e.serializedContext),[EVE_TYPE_ATTRIBUTE]:`session`,"$eve.trigger":readChannelKind(e.serializedContext),"$eve.title":readSessionTitle(e.serializedContext)}}function buildSubagentRootAttributes(e){return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),[EVE_TYPE_ATTRIBUTE]:`subagent`,"$eve.parent":e.parentSessionId,"$eve.parent_call":e.parentCallId,"$eve.parent_turn":e.parentTurnId,[EVE_ROOT_ATTRIBUTE]:e.rootSessionId,"$eve.subagent":e.identity.nodeId,"$eve.trigger":readChannelKind(e.serializedContext)}}export{EVE_ROOT_ATTRIBUTE,EVE_SESSION_ATTRIBUTE,EVE_SESSION_TITLE_MAX_CHARS,EVE_TYPE_ATTRIBUTE,EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,deriveSessionTitle,isWorkflowTraceContentVisible,readChannelKind,readChannelRequestId,readParentLineage,readParentSessionId,readRootSessionId,readScheduleId,readSessionTraceId};
1
+ import{isNonEmptyString}from"#shared/guards.js";import{ConversationContextKey,normalizeConversationContext}from"#shared/conversation-context.js";import{resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{ChannelRequestIdKey,OtelTraceEnabledKey,ScheduleIdKey,SessionTitleKey,SessionTraceSeedKey}from"#context/keys.js";import{CHANNEL_CONTEXT_KEY_NAME}from"#context/key-names.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace}from"#shared/trace-policy.js";const EVE_VERSION_ATTRIBUTE=`$eve.version`,EVE_TYPE_ATTRIBUTE=`$eve.type`,EVE_SESSION_ATTRIBUTE=`$eve.session`,EVE_ROOT_ATTRIBUTE=`$eve.root`;function readChannelKind(e){let t=e[CHANNEL_CONTEXT_KEY_NAME]?.kind;return isNonEmptyString(t)?t:void 0}function isWorkflowTraceContentVisible(e){let t=e[SessionTraceSeedKey.name];if(t!==void 0){let n=resolveForwardedTraceSeed(t);if(n.forwardedTracePolicy!==void 0||readParentSessionId(e)!==void 0){let e=n.decision;return e?.action===`record`&&e.recordInputs&&e.recordOutputs}}let n=normalizeConversationContext(e[ConversationContextKey.name]);return shouldCaptureInstrumentationContent({audience:n?.audience??`unknown`,environment:n?.environment??`production`})}function isWorkflowOtelTraceEnabled(e){return e[OtelTraceEnabledKey.name]===!0}function readSessionTraceId(e){let t=e[SessionTraceSeedKey.name];if(t===void 0)return;let n=resolveForwardedTraceSeed(t);if(isSampledTrace(n))return isNonEmptyString(t.traceId)?t.traceId:void 0}function readParentLineage(e){let t=e[`eve.parentSession`],n=t?.callId,r=t?.rootSessionId,i=t?.sessionId,a=t?.turn?.id;return{callId:isNonEmptyString(n)?n:void 0,rootSessionId:isNonEmptyString(r)?r:void 0,sessionId:isNonEmptyString(i)?i:void 0,turnId:isNonEmptyString(a)?a:void 0}}function readParentSessionId(e){return readParentLineage(e).sessionId}function readRootSessionId(e){return readParentLineage(e).rootSessionId}function readChannelRequestId(e){let t=e[ChannelRequestIdKey.name];return isNonEmptyString(t)?t:void 0}function readScheduleId(e){let t=e[ScheduleIdKey.name];return isNonEmptyString(t)?t:void 0}function readSessionTitle(e){let t=e[SessionTitleKey.name];return isNonEmptyString(t)?t:void 0}const EVE_SESSION_TITLE_MAX_CHARS=125;function deriveSessionTitle(e){let t=collectMessageText(e);if(t===void 0||t.length===0)return;let n=t.replace(/\s+/gu,` `).trim();if(n.length===0)return;let r=Array.from(n);return r.length<=125?n:`${r.slice(0,124).join(``)}…`}function collectMessageText(e){if(typeof e==`string`)return e;if(!Array.isArray(e))return;let t=[];for(let n of e)n&&typeof n==`object`&&n.type===`text`&&typeof n.text==`string`&&t.push(n.text);return t.length>0?t.join(` `):void 0}function buildSessionAttributes(e){let t=isWorkflowTraceContentVisible(e.serializedContext),n=isWorkflowOtelTraceEnabled(e.serializedContext);return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.schedule":readScheduleId(e.serializedContext),"$eve.is_otel_trace_enabled":n,"$eve.is_trace_content_visible":t,"$eve.trace_id":readSessionTraceId(e.serializedContext),[EVE_TYPE_ATTRIBUTE]:`session`,"$eve.trigger":readChannelKind(e.serializedContext),"$eve.title":readSessionTitle(e.serializedContext)}}function buildSubagentRootAttributes(e){return{"$eve.channel_request_id":readChannelRequestId(e.serializedContext),"$eve.is_otel_trace_enabled":isWorkflowOtelTraceEnabled(e.serializedContext),"$eve.is_trace_content_visible":isWorkflowTraceContentVisible(e.serializedContext),"$eve.trace_id":readSessionTraceId(e.serializedContext),[EVE_TYPE_ATTRIBUTE]:`subagent`,"$eve.parent":e.parentSessionId,"$eve.parent_call":e.parentCallId,"$eve.parent_turn":e.parentTurnId,[EVE_ROOT_ATTRIBUTE]:e.rootSessionId,"$eve.subagent":e.identity.nodeId,"$eve.trigger":readChannelKind(e.serializedContext)}}export{EVE_ROOT_ATTRIBUTE,EVE_SESSION_ATTRIBUTE,EVE_SESSION_TITLE_MAX_CHARS,EVE_TYPE_ATTRIBUTE,EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,deriveSessionTitle,isWorkflowTraceContentVisible,readChannelKind,readChannelRequestId,readParentLineage,readParentSessionId,readRootSessionId,readScheduleId,readSessionTraceId};
@@ -5,7 +5,7 @@ import type { HarnessToolMap } from "#harness/types.js";
5
5
  import type { RuntimeCompiledArtifactsSource } from "#runtime/compiled-artifacts-source.js";
6
6
  import type { RuntimeSandboxRegistry } from "#runtime/sandbox/registry.js";
7
7
  import type { CompiledRuntimeAgentBundle } from "#runtime/sessions/compiled-agent-cache.js";
8
- import { type InvokeToolTraceOrigin } from "#tracing/invoke-tool-span.js";
8
+ import { type InvokeToolTraceOrigin } from "#tracing/eve/invoke-tool-span.js";
9
9
  /** What `invokeTool` needs from the agent: its static tools and sandbox. */
10
10
  export interface InvokeToolRuntime {
11
11
  /** Present in a deployed agent so framework helpers can reach the compiled graph. */
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{compiledToolOwner,isInvocableCompiledTool}from"#channel/tool-eligibility.js";import{ContextContainer,contextStorage}from"#context/container.js";import{AuthKey,InitiatorAuthKey,SandboxKey,SessionIdKey,SessionKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{ensureSandboxAccess}from"#execution/sandbox/ensure.js";import{isConnectionAuthorizationFailedError}from"#connections/errors.js";import{AuthorizationHookKey,CallbackBaseUrlKey,isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{checkToolCallInput,toolCallModelOutput}from"#harness/tool-call-io.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAnonymousPrincipal}from"#channel/principal-identity.js";import{deriveToolSessionId,validateToolSessionKey}from"#execution/tool-session/id.js";import{ToolSessionSandboxUnsupportedError,assertToolSessionSandboxSupport,releaseToolSessionHandle}from"#execution/tool-session/sandbox.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createUlid}from"#shared/ulid.js";import{withInvokeToolSpan}from"#tracing/invoke-tool-span.js";const log=createLogger(`invoke-tool`);function ineligibility(e,t){if(!isInvocableCompiledTool(e,t))return compiledToolOwner(e,t).kind===`framework`?`it is a framework tool, which needs a conversation`:t.behavior?.handling===void 0?`it has no server-side execute`:`the harness or the model provider runs it, not its execute`}async function invokeTool(e,t,n,r){let i=e.manifest.tools.find(e=>e.name===t),a=e.tools.get(t);if(i===void 0||a===void 0)return failed(`The agent has no tool named "${t}".`);let o=ineligibility(e.manifest,i)??(a.execute===void 0?`it has no server-side execute`:void 0);if(o!==void 0)return failed(`Tool "${t}" cannot be invoked outside a conversation: ${o}.`);let s=r.key,c=s===void 0?void 0:validateToolSessionKey(s);if(c!==void 0)return{message:c,status:`invalid-input`};if(s!==void 0&&isAnonymousPrincipal(r.auth))return denied(`Tool sessions need an authenticated caller: an anonymous caller cannot send a key. Call without a key for a one-off session.`);let l=`call_${createUlid()}`,u=`call_session_${createUlid()}`,d=s===void 0?u:deriveToolSessionId({current:r.auth,forwardedBy:r.forwardedBy,key:s});return await withInvokeToolSpan({agentName:e.agentName,auth:r.auth,callId:l,origin:e.origin,sessionId:u,toolName:t},i=>runInvocation({callId:l,definition:a,input:n,name:t,observer:i,options:r,runtime:e,sessionId:d}))}async function runInvocation(e){let{callId:t,definition:n,name:r,observer:i,options:a,runtime:o,sessionId:s}=e,c=await checkToolCallInput(n,e.input,t);if(c.kind===`threw`)return i.failedWith(c.error),failedFromError(c.error,r,`input validation failed`);if(c.kind===`invalid`)return{message:c.message,status:`invalid-input`};let l=a.key===void 0?await callSandbox(o,s):await keyedSandbox(o,s),u=createCallContext({auth:a.auth,initiator:a.initiator??a.auth,callId:t,callbackBaseUrl:o.callbackBaseUrl,sessionId:s});u.setVirtualContext(SandboxKey,l.access),o.bundle!==void 0&&u.setVirtualContext(BundleKey,o.bundle);try{return await contextStorage.run(u,()=>runCall({callId:t,definition:n,input:c.value,observer:i,signal:a.signal}))}finally{await l.release().catch(e=>{logError(log,`failed to release a call's sandbox`,e,{sessionId:s,toolName:r})})}}async function keyedSandbox(e,t){let n=await ensureSandboxAccess({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId,ownsSandbox:!1,registry:e.sandboxRegistry,sessionId:t,state:null});return{access:{...n,async get(){return assertToolSessionSandboxSupport(e.sandboxRegistry),await n.get()}},async release(){let t=await n.detach();t!==void 0&&await releaseToolSessionHandle(e.sandboxRegistry,t)}}}async function callSandbox(e,t){let n=await ensureSandboxAccess({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId,ownsSandbox:!0,registry:e.sandboxRegistry,sessionId:t,state:null}),r;return{access:{...n,get(){let e=n.get();return r=e,e}},async release(){r!==void 0&&await r.catch(()=>null)!==null&&await n.delete?.()}}}function createCallContext(e){let t=new ContextContainer;return t.set(AuthKey,e.auth),t.set(InitiatorAuthKey,e.initiator),t.set(SessionIdKey,e.sessionId),t.setVirtualContext(SessionKey,{auth:{current:e.auth,initiator:e.initiator},sessionId:e.sessionId,turn:{id:e.callId,sequence:0}}),t.set(CallbackBaseUrlKey,e.callbackBaseUrl.replace(/\/$/,``)),t.setVirtualContext(AuthorizationHookKey,`invoke-tool:${e.callId}`),t}async function runCall(e){let{callId:t,definition:n,observer:r}=e,i=e.signal??new AbortController().signal;if(n.approval!==void 0){let a;try{a=await resolveApprovalPolicy(n.approval)({...buildCallbackContext(),abortSignal:i,approvedTools:new Set,callId:t,toolInput:e.input,toolName:n.name})}catch(e){return r.failedWith(e),failedFromError(e,n.name,`approval policy failed`)}let o=decideApproval(a);if(o.kind===`denied`)return denied(o.reason);if(o.kind===`user-approval`)return{status:`approval-required`}}let a={abortSignal:i,messages:[],toolCallId:t};await r.executing(e.input);let o,s,c=!1,l=performance.now(),elapsed=()=>performance.now()-l,u;try{o=await n.execute(e.input,a),isAsyncIterable(o)&&(o=await lastIterated(o)),c=!0,isAuthorizationSignal(o)||(s=normalizeToolJsonOutput({boundary:`execute`,output:o,toolCallId:t,toolName:n.name})),u=elapsed()}catch(e){return await r.executed({durationMs:elapsed(),error:e,type:`error`}),r.failedWith(e),c?failedFromError(e,n.name,`tool output could not be serialized`):isConnectionAuthorizationFailedError(e)||e instanceof ToolSessionSandboxUnsupportedError?failed(toErrorMessage(e)):failedFromError(e,n.name,`tool execution failed`)}if(isAuthorizationSignal(o))return await r.executed({durationMs:u,output:modelFacingAuthorizationOutput(o),type:`result`}),{connections:o.challenges.map(e=>e.name),status:`authorization-required`};await r.executed({durationMs:u,output:s,type:`result`});try{return{modelOutput:await toolCallModelOutput(n,s,t),output:s,status:`completed`}}catch(e){return r.failedWith(e),failedFromError(e,n.name,`tool output could not be serialized`)}}function decideApproval(e){if(e===!0||e===`user-approval`)return{kind:`user-approval`};if(e===`denied`)return{kind:`denied`};if(typeof e==`object`&&e){if(e.type===`user-approval`)return{kind:`user-approval`};if(e.type===`denied`)return{kind:`denied`,reason:e.reason}}return{kind:`run`}}async function lastIterated(e){let t;for await(let n of e)t=n;return t}function denied(e){return e===void 0?{status:`denied`}:{reason:e,status:`denied`}}function failed(e){return{message:e,status:`failed`}}function failedFromError(e,t,n){let r=context.with(trace.deleteSpan(context.active()),()=>logError(log,`invokeTool ${n}`,e,{toolName:t}));return{errorId:r,message:`Tool "${t}" failed: ${n}. The error is logged with id ${r}.`,status:`failed`}}export{invokeTool};
1
+ import{createLogger,logError}from"#internal/logging.js";import{compiledToolOwner,isInvocableCompiledTool}from"#channel/tool-eligibility.js";import{ContextContainer,contextStorage}from"#context/container.js";import{AuthKey,InitiatorAuthKey,SandboxKey,SessionIdKey,SessionKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{BundleKey}from"#runtime/sessions/runtime-context-keys.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{ensureSandboxAccess}from"#execution/sandbox/ensure.js";import{isConnectionAuthorizationFailedError}from"#connections/errors.js";import{AuthorizationHookKey,CallbackBaseUrlKey,isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{checkToolCallInput,toolCallModelOutput}from"#harness/tool-call-io.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{isAnonymousPrincipal}from"#channel/principal-identity.js";import{deriveToolSessionId,validateToolSessionKey}from"#execution/tool-session/id.js";import{ToolSessionSandboxUnsupportedError,assertToolSessionSandboxSupport,releaseToolSessionHandle}from"#execution/tool-session/sandbox.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{createUlid}from"#shared/ulid.js";import{withInvokeToolSpan}from"#tracing/eve/invoke-tool-span.js";const log=createLogger(`invoke-tool`);function ineligibility(e,t){if(!isInvocableCompiledTool(e,t))return compiledToolOwner(e,t).kind===`framework`?`it is a framework tool, which needs a conversation`:t.behavior?.handling===void 0?`it has no server-side execute`:`the harness or the model provider runs it, not its execute`}async function invokeTool(e,t,n,r){let i=e.manifest.tools.find(e=>e.name===t),a=e.tools.get(t);if(i===void 0||a===void 0)return failed(`The agent has no tool named "${t}".`);let o=ineligibility(e.manifest,i)??(a.execute===void 0?`it has no server-side execute`:void 0);if(o!==void 0)return failed(`Tool "${t}" cannot be invoked outside a conversation: ${o}.`);let s=r.key,c=s===void 0?void 0:validateToolSessionKey(s);if(c!==void 0)return{message:c,status:`invalid-input`};if(s!==void 0&&isAnonymousPrincipal(r.auth))return denied(`Tool sessions need an authenticated caller: an anonymous caller cannot send a key. Call without a key for a one-off session.`);let l=`call_${createUlid()}`,u=`call_session_${createUlid()}`,d=s===void 0?u:deriveToolSessionId({current:r.auth,forwardedBy:r.forwardedBy,key:s});return await withInvokeToolSpan({agentName:e.agentName,auth:r.auth,callId:l,origin:e.origin,sessionId:u,toolName:t},i=>runInvocation({callId:l,definition:a,input:n,name:t,observer:i,options:r,runtime:e,sessionId:d}))}async function runInvocation(e){let{callId:t,definition:n,name:r,observer:i,options:a,runtime:o,sessionId:s}=e,c=await checkToolCallInput(n,e.input,t);if(c.kind===`threw`)return i.failedWith(c.error),failedFromError(c.error,r,`input validation failed`);if(c.kind===`invalid`)return{message:c.message,status:`invalid-input`};let l=a.key===void 0?await callSandbox(o,s):await keyedSandbox(o,s),u=createCallContext({auth:a.auth,initiator:a.initiator??a.auth,callId:t,callbackBaseUrl:o.callbackBaseUrl,sessionId:s});u.setVirtualContext(SandboxKey,l.access),o.bundle!==void 0&&u.setVirtualContext(BundleKey,o.bundle);try{return await contextStorage.run(u,()=>runCall({callId:t,definition:n,input:c.value,observer:i,signal:a.signal}))}finally{await l.release().catch(e=>{logError(log,`failed to release a call's sandbox`,e,{sessionId:s,toolName:r})})}}async function keyedSandbox(e,t){let n=await ensureSandboxAccess({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId,ownsSandbox:!1,registry:e.sandboxRegistry,sessionId:t,state:null});return{access:{...n,async get(){return assertToolSessionSandboxSupport(e.sandboxRegistry),await n.get()}},async release(){let t=await n.detach();t!==void 0&&await releaseToolSessionHandle(e.sandboxRegistry,t)}}}async function callSandbox(e,t){let n=await ensureSandboxAccess({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId,ownsSandbox:!0,registry:e.sandboxRegistry,sessionId:t,state:null}),r;return{access:{...n,get(){let e=n.get();return r=e,e}},async release(){r!==void 0&&await r.catch(()=>null)!==null&&await n.delete?.()}}}function createCallContext(e){let t=new ContextContainer;return t.set(AuthKey,e.auth),t.set(InitiatorAuthKey,e.initiator),t.set(SessionIdKey,e.sessionId),t.setVirtualContext(SessionKey,{auth:{current:e.auth,initiator:e.initiator},sessionId:e.sessionId,turn:{id:e.callId,sequence:0}}),t.set(CallbackBaseUrlKey,e.callbackBaseUrl.replace(/\/$/,``)),t.setVirtualContext(AuthorizationHookKey,`invoke-tool:${e.callId}`),t}async function runCall(e){let{callId:t,definition:n,observer:r}=e,i=e.signal??new AbortController().signal;if(n.approval!==void 0){let a;try{a=await resolveApprovalPolicy(n.approval)({...buildCallbackContext(),abortSignal:i,approvedTools:new Set,callId:t,toolInput:e.input,toolName:n.name})}catch(e){return r.failedWith(e),failedFromError(e,n.name,`approval policy failed`)}let o=decideApproval(a);if(o.kind===`denied`)return denied(o.reason);if(o.kind===`user-approval`)return{status:`approval-required`}}let a={abortSignal:i,messages:[],toolCallId:t};await r.executing(e.input);let o,s,c=!1,l=performance.now(),elapsed=()=>performance.now()-l,u;try{o=await n.execute(e.input,a),isAsyncIterable(o)&&(o=await lastIterated(o)),c=!0,isAuthorizationSignal(o)||(s=normalizeToolJsonOutput({boundary:`execute`,output:o,toolCallId:t,toolName:n.name})),u=elapsed()}catch(e){return await r.executed({durationMs:elapsed(),error:e,type:`error`}),r.failedWith(e),c?failedFromError(e,n.name,`tool output could not be serialized`):isConnectionAuthorizationFailedError(e)||e instanceof ToolSessionSandboxUnsupportedError?failed(toErrorMessage(e)):failedFromError(e,n.name,`tool execution failed`)}if(isAuthorizationSignal(o))return await r.executed({durationMs:u,output:modelFacingAuthorizationOutput(o),type:`result`}),{connections:o.challenges.map(e=>e.name),status:`authorization-required`};await r.executed({durationMs:u,output:s,type:`result`});try{return{modelOutput:await toolCallModelOutput(n,s,t),output:s,status:`completed`}}catch(e){return r.failedWith(e),failedFromError(e,n.name,`tool output could not be serialized`)}}function decideApproval(e){if(e===!0||e===`user-approval`)return{kind:`user-approval`};if(e===`denied`)return{kind:`denied`};if(typeof e==`object`&&e){if(e.type===`user-approval`)return{kind:`user-approval`};if(e.type===`denied`)return{kind:`denied`,reason:e.reason}}return{kind:`run`}}async function lastIterated(e){let t;for await(let n of e)t=n;return t}function denied(e){return e===void 0?{status:`denied`}:{reason:e,status:`denied`}}function failed(e){return{message:e,status:`failed`}}function failedFromError(e,t,n){let r=context.with(trace.deleteSpan(context.active()),()=>logError(log,`invokeTool ${n}`,e,{toolName:t}));return{errorId:r,message:`Tool "${t}" failed: ${n}. The error is logged with id ${r}.`,status:`failed`}}export{invokeTool};
@@ -1 +1 @@
1
- import{withDevelopmentSandboxTags}from"#execution/sandbox/development-run.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{buildDockerBaseSetupScript}from"#execution/sandbox/bindings/docker-base-setup.js";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";const DOCKER_SANDBOX_LABEL=`eve.sandbox`,DOCKER_KEEPALIVE_ARGS=[`-c`,`sleep 2147483647`];async function startDockerContainer(e){let t=[`run`,`-d`,`--name`,e.containerName,`--label`,`${DOCKER_SANDBOX_LABEL}=1`,`--label`,`${DOCKER_SANDBOX_LABEL}.role=${e.role}`];for(let[n,r]of Object.entries(withDevelopmentSandboxTags(e.tags)??{}))t.push(`--label`,`${DOCKER_SANDBOX_LABEL}.tag.${n}=${r}`);for(let[n,r]of Object.entries(e.options.env))t.push(`-e`,`${n}=${r}`);e.initialNetworkPolicy===`deny-all`&&t.push(`--network`,`none`),e.resourcesPath!==void 0&&t.push(`--mount`,`type=bind,src=${e.resourcesPath},dst=/eve/resources,readonly`),t.push(`--workdir`,WORKSPACE_ROOT,`--entrypoint`,`/bin/sh`,e.image,...DOCKER_KEEPALIVE_ARGS),expectDockerSuccess(await e.cli.run(t),`start sandbox container "${e.containerName}" from "${e.image}"`)}async function runDockerBaseSetup(e,t){expectDockerSuccess(await e.run([`exec`,`--user`,`root`,t,`/bin/sh`,`-c`,buildDockerBaseSetupScript()]),`prepare base runtime in sandbox container "${t}"`)}async function stopDockerContainerIfRunning(e,t){await e.run([`stop`,`-t`,`0`,t]).catch(()=>{})}export{DOCKER_SANDBOX_LABEL,runDockerBaseSetup,startDockerContainer,stopDockerContainerIfRunning};
1
+ import{withDevelopmentSandboxTags}from"#execution/sandbox/development-run.js";import{WORKSPACE_ROOT}from"#runtime/workspace/types.js";import{buildDockerBaseSetupScript}from"#execution/sandbox/bindings/docker-base-setup.js";import{expectDockerSuccess}from"#execution/sandbox/bindings/docker-utils.js";import{SANDBOX_AGENT_ENV}from"#execution/sandbox/session.js";const DOCKER_SANDBOX_LABEL=`eve.sandbox`,DOCKER_KEEPALIVE_ARGS=[`-c`,`sleep 2147483647`];async function startDockerContainer(e){let t=[`run`,`-d`,`--name`,e.containerName,`--label`,`${DOCKER_SANDBOX_LABEL}=1`,`--label`,`${DOCKER_SANDBOX_LABEL}.role=${e.role}`];for(let[n,r]of Object.entries(withDevelopmentSandboxTags(e.tags)??{}))t.push(`--label`,`${DOCKER_SANDBOX_LABEL}.tag.${n}=${r}`);for(let[n,r]of Object.entries({...SANDBOX_AGENT_ENV,...e.options.env}))t.push(`-e`,`${n}=${r}`);e.initialNetworkPolicy===`deny-all`&&t.push(`--network`,`none`),e.resourcesPath!==void 0&&t.push(`--mount`,`type=bind,src=${e.resourcesPath},dst=/eve/resources,readonly`),t.push(`--workdir`,WORKSPACE_ROOT,`--entrypoint`,`/bin/sh`,e.image,...DOCKER_KEEPALIVE_ARGS),expectDockerSuccess(await e.cli.run(t),`start sandbox container "${e.containerName}" from "${e.image}"`)}async function runDockerBaseSetup(e,t){expectDockerSuccess(await e.run([`exec`,`--user`,`root`,t,`/bin/sh`,`-c`,buildDockerBaseSetupScript()]),`prepare base runtime in sandbox container "${t}"`)}async function stopDockerContainerIfRunning(e,t){await e.run([`stop`,`-t`,`0`,t]).catch(()=>{})}export{DOCKER_SANDBOX_LABEL,runDockerBaseSetup,startDockerContainer,stopDockerContainerIfRunning};