eve 0.78.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 (270) hide show
  1. package/CHANGELOG.md +14 -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/evals/assertions/collector.d.ts +4 -1
  52. package/dist/src/evals/assertions/collector.js +1 -1
  53. package/dist/src/evals/context.js +1 -1
  54. package/dist/src/evals/index.d.ts +1 -1
  55. package/dist/src/evals/runner/artifacts.js +1 -1
  56. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
  57. package/dist/src/evals/runner/reporters/assertion-scores.d.ts +11 -2
  58. package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
  59. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  60. package/dist/src/evals/runner/reporters/console.js +1 -1
  61. package/dist/src/evals/runner/reporters/datadog.js +2 -2
  62. package/dist/src/evals/runner/reporters/junit.js +1 -1
  63. package/dist/src/evals/runner/verdict.d.ts +2 -2
  64. package/dist/src/evals/runner/verdict.js +1 -1
  65. package/dist/src/evals/types.d.ts +22 -6
  66. package/dist/src/eve-channel/index.js +1 -1
  67. package/dist/src/eve-channel/stream-headers.d.ts +1 -0
  68. package/dist/src/eve-channel/stream-headers.js +1 -0
  69. package/dist/src/execution/agent-sessions/context.d.ts +1 -1
  70. package/dist/src/execution/agent-sessions/context.js +1 -1
  71. package/dist/src/execution/agent-sessions/remote.js +1 -1
  72. package/dist/src/execution/agent-sessions/steps.js +1 -1
  73. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  74. package/dist/src/execution/catalog/connection-entry.js +1 -1
  75. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  76. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  77. package/dist/src/execution/invoke-tool.d.ts +1 -1
  78. package/dist/src/execution/invoke-tool.js +1 -1
  79. package/dist/src/execution/session/turn-step.js +1 -1
  80. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  81. package/dist/src/execution/workflow-runtime.js +1 -1
  82. package/dist/src/harness/execute-tool.d.ts +2 -2
  83. package/dist/src/harness/input-extraction.js +1 -1
  84. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  85. package/dist/src/instrumentation/dispatch.js +1 -1
  86. package/dist/src/instrumentation/memory.d.ts +1 -4
  87. package/dist/src/instrumentation/memory.js +1 -1
  88. package/dist/src/instrumentation/principal-summary.js +1 -1
  89. package/dist/src/instrumentation/providers.js +1 -1
  90. package/dist/src/instrumentation/runtime-context.d.ts +1 -1
  91. package/dist/src/instrumentation/runtime.d.ts +3 -3
  92. package/dist/src/instrumentation/runtime.js +1 -1
  93. package/dist/src/instrumentation/session-init.js +1 -1
  94. package/dist/src/internal/application/stamped-package-version.js +1 -1
  95. package/dist/src/internal/authored-definition/approval.d.ts +3 -1
  96. package/dist/src/internal/authored-definition/approval.js +1 -1
  97. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  98. package/dist/src/internal/logging.js +1 -1
  99. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  100. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  101. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
  102. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  103. package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
  104. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  105. package/dist/src/public/channels/slack/hitl.js +1 -1
  106. package/dist/src/public/definitions/approval.d.ts +1 -1
  107. package/dist/src/public/instrumentation/otel.d.ts +2 -2
  108. package/dist/src/public/instrumentation/otel.js +1 -1
  109. package/dist/src/public/tools/approval/index.d.ts +1 -1
  110. package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
  111. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  112. package/dist/src/runtime/resolve-tool.js +1 -1
  113. package/dist/src/runtime/types.d.ts +2 -2
  114. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
  115. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
  116. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
  117. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  118. package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
  119. package/dist/src/self-modification/extension/trace-inspection.js +1 -1
  120. package/dist/src/setup/scaffold/create/project.js +1 -1
  121. package/dist/src/shared/trace-policy.d.ts +3 -0
  122. package/dist/src/shared/trace-policy.js +1 -1
  123. package/dist/src/tools/definition.d.ts +3 -3
  124. package/dist/src/tools/durable-callbacks.d.ts +5 -3
  125. package/dist/src/tools/durable-callbacks.js +1 -1
  126. package/dist/src/tools/dynamic.d.ts +2 -2
  127. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  128. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  129. package/dist/src/tools/workflow-definition.d.ts +2 -2
  130. package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
  131. package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
  132. package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
  133. package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
  134. package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
  135. package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
  136. package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
  137. package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
  138. package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
  139. package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
  140. package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
  141. package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
  142. package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
  143. package/dist/src/tracing/eve/agent-trace-context.js +1 -0
  144. package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
  145. package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
  146. package/dist/src/tracing/eve/batch-span-processor.js +1 -0
  147. package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
  148. package/dist/src/tracing/eve/content-span-processor.js +1 -0
  149. package/dist/src/tracing/eve/delegation.d.ts +20 -0
  150. package/dist/src/tracing/eve/delegation.js +1 -0
  151. package/dist/src/tracing/eve/gateway.d.ts +16 -0
  152. package/dist/src/tracing/eve/gateway.js +1 -0
  153. package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
  154. package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
  155. package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
  156. package/dist/src/tracing/eve/mcp.d.ts +29 -0
  157. package/dist/src/tracing/eve/mcp.js +1 -0
  158. package/dist/src/tracing/eve/metadata.d.ts +7 -0
  159. package/dist/src/tracing/eve/metadata.js +1 -0
  160. package/dist/src/tracing/eve/operation-input.d.ts +30 -0
  161. package/dist/src/tracing/eve/operation-input.js +1 -0
  162. package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
  163. package/dist/src/tracing/eve/otel-configuration.js +1 -0
  164. package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +4 -11
  165. package/dist/src/tracing/eve/otel-declaration.js +1 -0
  166. package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
  167. package/dist/src/tracing/eve/otel-registration.js +1 -0
  168. package/dist/src/tracing/eve/policy.d.ts +15 -0
  169. package/dist/src/tracing/eve/policy.js +1 -0
  170. package/dist/src/tracing/eve/profile.d.ts +7 -0
  171. package/dist/src/tracing/eve/profile.js +1 -0
  172. package/dist/src/tracing/eve/session.d.ts +27 -0
  173. package/dist/src/tracing/eve/session.js +1 -0
  174. package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
  175. package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
  176. package/dist/src/tracing/local/inspection.d.ts +15 -0
  177. package/dist/src/tracing/local/inspection.js +1 -0
  178. package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
  179. package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
  180. package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
  181. package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
  182. package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
  183. package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
  184. package/dist/src/tracing/local/trace-reader.js +1 -0
  185. package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
  186. package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
  187. package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
  188. package/dist/src/tracing/local/trace-summary.js +1 -0
  189. package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
  190. package/dist/src/tracing/local/traces.js +1 -0
  191. package/docs/connections/mcp.mdx +22 -1
  192. package/docs/evals/assertions.mdx +50 -3
  193. package/docs/evals/overview.mdx +2 -1
  194. package/docs/evals/reporters.mdx +3 -1
  195. package/docs/tools/human-in-the-loop.md +23 -1
  196. package/package.json +2 -1
  197. package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
  198. package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
  199. package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
  200. package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
  201. package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
  202. package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
  203. package/dist/src/tracing/agent-otel-attributes.js +0 -1
  204. package/dist/src/tracing/agent-otel-content.js +0 -4
  205. package/dist/src/tracing/agent-otel-provider.js +0 -2
  206. package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
  207. package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
  208. package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
  209. package/dist/src/tracing/agent-otel-session-context.js +0 -1
  210. package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
  211. package/dist/src/tracing/agent-otel-turn-state.js +0 -1
  212. package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
  213. package/dist/src/tracing/agent-otel-usage.js +0 -1
  214. package/dist/src/tracing/agent-span-contract.d.ts +0 -34
  215. package/dist/src/tracing/agent-span-contract.js +0 -1
  216. package/dist/src/tracing/agent-span-error.js +0 -1
  217. package/dist/src/tracing/agent-span-id-generator.js +0 -1
  218. package/dist/src/tracing/agent-span-naming.d.ts +0 -1
  219. package/dist/src/tracing/agent-span-naming.js +0 -1
  220. package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
  221. package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
  222. package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
  223. package/dist/src/tracing/agent-tool-span-context.js +0 -1
  224. package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
  225. package/dist/src/tracing/agent-trace-context-codec.js +0 -1
  226. package/dist/src/tracing/agent-trace-context-store.js +0 -1
  227. package/dist/src/tracing/agent-trace-context.js +0 -1
  228. package/dist/src/tracing/agent-trace-span-processor.js +0 -1
  229. package/dist/src/tracing/agent-trace-state.d.ts +0 -91
  230. package/dist/src/tracing/batch-span-processor.js +0 -1
  231. package/dist/src/tracing/bounded-error.d.ts +0 -1
  232. package/dist/src/tracing/bounded-error.js +0 -1
  233. package/dist/src/tracing/content-attributes.js +0 -1
  234. package/dist/src/tracing/content-span-processor.js +0 -1
  235. package/dist/src/tracing/error-content-context.d.ts +0 -3
  236. package/dist/src/tracing/error-content-context.js +0 -1
  237. package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
  238. package/dist/src/tracing/invoke-tool-span.js +0 -1
  239. package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
  240. package/dist/src/tracing/local-trace-reader.js +0 -1
  241. package/dist/src/tracing/local-trace-summary.js +0 -1
  242. package/dist/src/tracing/local-traces.js +0 -1
  243. package/dist/src/tracing/otel-declaration.js +0 -1
  244. package/dist/src/tracing/otel-registration.js +0 -1
  245. package/dist/src/tracing/sampled-trace.d.ts +0 -4
  246. package/dist/src/tracing/sampled-trace.js +0 -1
  247. package/dist/src/tracing/suppress-tracing.d.ts +0 -2
  248. package/dist/src/tracing/suppress-tracing.js +0 -1
  249. package/dist/src/tracing/telemetry-budget.d.ts +0 -3
  250. package/dist/src/tracing/telemetry-budget.js +0 -1
  251. /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
  252. /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
  253. /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
  254. /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
  255. /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
  256. /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
  257. /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
  258. /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
  259. /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
  260. /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
  261. /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
  262. /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
  263. /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
  264. /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
  265. /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
  266. /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
  267. /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
  268. /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
  269. /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
  270. /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
@@ -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};
@@ -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,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 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 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
+ 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,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/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
+ 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{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.78.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{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{currentProjection,enterSessionProjection,saveSessionProjection}from"#harness/session-machine/current.js";import{AuthKey,CapabilitiesKey,ChannelDeliveryKey,HandleEventKey,InitiatorAuthKey,OccurrenceIdKey,ParentSessionKey,ScheduleIdKey,ScheduleInstanceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,SessionTitleKey,StaticModelReferenceKey,TurnDeliveryIdsKey}from"#context/keys.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{coalesceTurnInputs,validateHarnessModelMessages}from"#harness/messages.js";import{activeTurnId,isBetweenTurns,turnPosition}from"#harness/session-machine/view.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{createDurableSessionValues,readDurableSession}from"#execution/durable-session-store.js";import{runStep}from"#context/run-step.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import*as agentTraceState from"#tracing/agent-trace-context-store.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{openSessionEventPublisher}from"#execution/publish-session-events.js";import{withSessionStateDelta}from"#execution/session/state-delta.js";import{dropClosedRecords}from"#harness/session-machine/commit.js";import{sessionStartedForResolvers,turnStartedForResolvers}from"#harness/session-machine/resolver-events.js";import{derivePendingState}from"#execution/session/pending-turn-state.js";import{rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{setChannelContext}from"#execution/channel-context.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{deriveSessionTitle}from"#execution/eve-workflow-attributes.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{bindTurnCallerContext}from"#subagents/parent-notification.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{recoverDynamicConnectionRehydration}from"#execution/dynamic-connection-recovery.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{attributeAnswers}from"#execution/session/answer-caller.js";import{resolveSessionStepResult}from"#execution/session/turn-step-result.js";import{createTurnEventHandler}from"#execution/session/turn-event-handler.js";import{countRunUsage}from"#execution/agent-sessions/usage.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{runModelCallBatch}from"#execution/model-call-batching.js";import{createCancelledModelCallBatchResult}from"#execution/cancelled-model-call-batch.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(e){"use step";return await withSessionStateDelta(e,e=>runSessionStep({...e,serializedContext:bindTurnCallerContext(e.caller,e.serializedContext)}))}async function runSessionStep(e){let t={};try{return await runSessionStepBody(e,t)}finally{await t.title}}async function runSessionStepBody(e,t){let n=e.input?.delivery,r=n,i=e.input?.runtimeResults,a=readDurableSession(e.sessionState);for(let e of i?.delegatedUsage??[])a=countRunUsage(a,e);let o=await deserializeContext(e.serializedContext);enterSessionProjection(o,a.state);let s=o.require(ChannelKey),c=o.require(BundleKey),l=resolveEffectiveAgentRuntime(c,o);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&o.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let u=getPendingAuthorization(a.state),d;if(u&&r!==void 0){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(u,r.payloads);if(r={...r,payloads:t},e.length>0){let n=e.map(e=>e.result.attemptId),i=e.map(e=>e.result);o.set(PendingAuthorizationResultKey,i),a={...a,state:clearPendingAuthorization(a.state,n)},d=e,t.length===0&&(r=void 0)}}r?.payloads.some(e=>e.message!==void 0)&&(o.delete(ScheduleIdKey),o.delete(ScheduleInstanceKey),o.delete(OccurrenceIdKey),r.schedule!==void 0&&(o.set(ScheduleIdKey,r.schedule.definition),r.schedule.instance!==void 0&&o.set(ScheduleInstanceKey,r.schedule.instance),r.schedule.occurrenceId!==void 0&&o.set(OccurrenceIdKey,r.schedule.occurrenceId)));let f=o.get(AuthKey),p=o.has(InitiatorAuthKey);r?.auth!==void 0&&(o.set(AuthKey,r.auth??null),o.has(InitiatorAuthKey)||o.set(InitiatorAuthKey,r.auth??null));let m=r===void 0?d?.find(({challenge:e})=>e.candidateId===void 0)?.challenge.requester:void 0;m!==void 0&&o.set(AuthKey,m);let h={...hydrateDurableSession({compactionOverrides:{thresholdPercent:l.thresholdPercent},durable:a,turnAgent:l.turnAgent}),history:validateHarnessModelMessages(e.history)},g=createExecutionHistoryView(h),_=bindSessionInstrumentation({agentName:l.turnAgent.id,ctx:o,rootSessionId:h.rootSessionId??h.sessionId,sessionId:h.sessionId}),v=turnPosition(currentProjection(o)),y=isBetweenTurns(currentProjection(o));if(!v.sessionStarted&&!o.has(SessionTitleKey)&&!o.has(ParentSessionKey)){let e=n?.payloads.find(e=>e.message!==void 0)?.message,r=deriveSessionTitle(n?.title??e);r!==void 0&&(o.set(SessionTitleKey,r),t.title=setEveAttributes({"$eve.title":r}))}n!==void 0&&(await contextStorage.run(o,()=>_?.preparePreamble({sequence:v.sequence,sessionStarted:v.sessionStarted})),await contextStorage.run(o,()=>_?.instrumentChannelDelivery({agentName:c.turnAgent.id,ctx:o,delivery:n,rootSessionId:h.rootSessionId??h.sessionId,sequence:v.sequence,sessionId:h.sessionId,turnId:activeTurnId(v)})));let failChannelDeliveries=async e=>{await contextStorage.run(o,()=>_?.instrumentChannelDelivery({ctx:o,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await _?.flush()},b=openSessionEventPublisher({ctx:o,origin:`own`,sessionWritable:e.sessionWritable}),{adapterCtx:x}=b.dispatcher,S=new AbortController,C=e.abortSignal===void 0?S.signal:AbortSignal.any([e.abortSignal,S.signal]);try{let u=bindDynamicConnections(o,c.resolvedAgent),m={...c.graph.root,turnAgent:l.turnAgent},w=!1,T=createTurnEventHandler({abortSignal:C,bundle:c,canCancelTurn:e.input?.control===void 0,hookCancellation:S,ctx:o,dynamicConnections:u,effectiveAgent:l,effectiveNode:m,instrumentation:_,publisher:b}),handleEvent=async(e,t)=>{e.type===`compaction.completed`&&(w=!0),await T(e,t)},E=r!==void 0&&!y?structuredClone(x.state):void 0,D;if(r!==void 0){let e=[];try{for(let t of r.payloads){let n=s.deliver?await s.deliver(t,x):defaultDeliverResult(t);n!=null&&e.push(n)}}catch(e){throw await failChannelDeliveries(e),e}D=e.length===0?void 0:e.reduce(coalesceTurnInputs)}let O=r?.auth===void 0?void 0:attributeAnswers({responder:r.auth,state:a.state,stepInput:D});if(O!==void 0&&(D=O,f===void 0?o.delete(AuthKey):o.set(AuthKey,f),p||o.delete(InitiatorAuthKey)),r!==void 0&&D===void 0&&!y)f===void 0?o.delete(AuthKey):o.set(AuthKey,f),x.state=E;else if(n?.payloads.some(e=>e.message!==void 0)){let e=n.deliveryMetadata?.map(e=>e.deliveryId)??[];o.set(TurnDeliveryIdsKey,v.turnId?[...new Set([...o.get(TurnDeliveryIdsKey)??[],...e])]:e)}else!v.sessionStarted&&o.get(ChannelDeliveryKey)!==void 0&&o.set(TurnDeliveryIdsKey,[o.require(ChannelDeliveryKey).deliveryId]);if(i!==void 0&&(i.acceptedAtMsByCallId!==void 0&&o.set(RuntimeActionSettlementTimesKey,i.acceptedAtMsByCallId),D={...D,runtimeActionResults:i.results}),n!==void 0){let e={...s,state:{...x.state}};setChannelContext(o,e)}if(r!==void 0&&D===void 0&&y){await contextStorage.run(o,()=>_?.instrumentChannelDelivery({ctx:o,includeTurn:!1,outcome:`completed`})),await _?.flush();let t=saveSessionProjection(reconcileSessionContinuationToken(o,h),o),n=serializeContext(o),r=t===h?{history:e.history,sessionState:e.sessionState}:createDurableSessionValues(t);return{action:`park`,...derivePendingState(t,currentProjection(o)),serializedContext:n,...r}}let k=c.subagentRegistry.dynamicResolvers??[],A=c.resolvedAgent.dynamicToolResolvers??[],j=buildRuntimeIdentity(m);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(c.compiledArtifactsSource),n=v.sessionStarted;if(o.setVirtualContext(StaticModelReferenceKey,l.turnAgent.model??null),!n)o.set(SessionDynamicSubagentRuntimeRevisionKey,t),o.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=sessionStartedForResolvers(j);await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:o,resolvers:k,event:e,messages:g.initial.messages,runtimeRevision:t}),contextStorage.run(o,async()=>await refreshDynamicSessionToolsForRuntimeRevision({ctx:o,resolvers:A,event:e,messages:g.initial.messages,runtimeRevision:t}))]),y||await rebindMissingCompiledDynamicToolCallbacks({ctx:o,event:turnStartedForResolvers({sequence:v.sequence,turnId:activeTurnId(v)}),messages:g.initial.messages,resolvers:A})}}catch(e){throw await failChannelDeliveries(e),e}let M=c.resolvedAgent.config?.experimental?.workflow?.modelCallsPerStep??1,N=o.get(CapabilitiesKey),runHarnessStep=async(n,r,i)=>{let a=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:l.thresholdPercent},session:n,turnAgent:l.turnAgent});return createExecutionNodeStep({steeringSignal:e.steeringSignal,abortSignal:C,capabilities:N,clearOnly:e.input?.control===`clear`,compactOnly:e.input?.control===`compact`,createRuntime:createWorkflowRuntime,handleEvent,prepareApprovalTurn:e=>u.dispatch(turnStartedForResolvers(e)),signInCompletions:i,historyProjector:g.projector,historyView:g.prepare(a),instrumentation:_,modelResolutionScope:{moduleMap:c.moduleMap,nodeId:c.nodeId},node:m,titleAttributeWrite:t.title})(a,r)},P,F;try{throwIfTurnAborted(C),F=await runModelCallBatch({steeringSignal:e.steeringSignal,initialInput:D,initialSession:h,modelCallsPerStep:M,runStep:async({firstCall:e,session:t,stepInput:n})=>{let r=await runStep(o,t,async t=>{o.setVirtualContext(HandleEventKey,handleEvent),o.setVirtualContext(StaticModelReferenceKey,l.turnAgent.model??null);let r=e&&D?.outputSchema!==void 0?{...t,outputSchema:D.outputSchema}:t,i=turnPosition(currentProjection(o));try{await u.rehydrate(i,j,isBetweenTurns(currentProjection(o))?void 0:{sequence:i.sequence,turnId:activeTurnId(i)})}catch(e){let t=await recoverDynamicConnectionRehydration({emit:handleEvent,error:e,projection:currentProjection(o),session:r});if(t!==void 0)return t;throw e}let a=e&&d!==void 0?d.map(({challenge:e})=>e):void 0;return runHarnessStep(r,n,a)});r.settledTurn===void 0&&throwIfTurnAborted(C);let i={...r,session:saveSessionProjection(r.session,o)};return P={result:i,serializedContext:serializeContext(o)},i}})}catch(t){if(!isTurnCancellation(t)&&!C.aborted)throw await failChannelDeliveries(t),t;return createCancelledModelCallBatchResult({beforeBatchContext:e.serializedContext,checkpoint:P,ctx:o,initialSession:h,stepInput:D})}let I=saveSessionProjection(dropClosedRecords(reconcileSessionContinuationToken(o,F.session),currentProjection(o)),o);agentTraceState.pruneAgentTraceState(o,I.sessionId,I.state);let L=serializeContext(o);F={...F,session:I};let R=resolveSessionStepResult(F,L);return R.action===`done`&&await b.writer.close(),w?{...R,compacted:!0}:R}finally{b.writer.release()}}export{turnStep};
1
+ import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{currentProjection,enterSessionProjection,saveSessionProjection}from"#harness/session-machine/current.js";import{AuthKey,CapabilitiesKey,ChannelDeliveryKey,HandleEventKey,InitiatorAuthKey,OccurrenceIdKey,ParentSessionKey,ScheduleIdKey,ScheduleInstanceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,SessionTitleKey,StaticModelReferenceKey,TurnDeliveryIdsKey}from"#context/keys.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{coalesceTurnInputs,validateHarnessModelMessages}from"#harness/messages.js";import{activeTurnId,isBetweenTurns,turnPosition}from"#harness/session-machine/view.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{createDurableSessionValues,readDurableSession}from"#execution/durable-session-store.js";import{runStep}from"#context/run-step.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import*as agentTraceState from"#tracing/eve/agent-trace-context-store.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{openSessionEventPublisher}from"#execution/publish-session-events.js";import{withSessionStateDelta}from"#execution/session/state-delta.js";import{dropClosedRecords}from"#harness/session-machine/commit.js";import{sessionStartedForResolvers,turnStartedForResolvers}from"#harness/session-machine/resolver-events.js";import{derivePendingState}from"#execution/session/pending-turn-state.js";import{rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{setChannelContext}from"#execution/channel-context.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{deriveSessionTitle}from"#execution/eve-workflow-attributes.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{bindTurnCallerContext}from"#subagents/parent-notification.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{recoverDynamicConnectionRehydration}from"#execution/dynamic-connection-recovery.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{attributeAnswers}from"#execution/session/answer-caller.js";import{resolveSessionStepResult}from"#execution/session/turn-step-result.js";import{createTurnEventHandler}from"#execution/session/turn-event-handler.js";import{countRunUsage}from"#execution/agent-sessions/usage.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{runModelCallBatch}from"#execution/model-call-batching.js";import{createCancelledModelCallBatchResult}from"#execution/cancelled-model-call-batch.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(e){"use step";return await withSessionStateDelta(e,e=>runSessionStep({...e,serializedContext:bindTurnCallerContext(e.caller,e.serializedContext)}))}async function runSessionStep(e){let t={};try{return await runSessionStepBody(e,t)}finally{await t.title}}async function runSessionStepBody(e,t){let n=e.input?.delivery,r=n,i=e.input?.runtimeResults,a=readDurableSession(e.sessionState);for(let e of i?.delegatedUsage??[])a=countRunUsage(a,e);let o=await deserializeContext(e.serializedContext);enterSessionProjection(o,a.state);let s=o.require(ChannelKey),c=o.require(BundleKey),l=resolveEffectiveAgentRuntime(c,o);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&o.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let u=getPendingAuthorization(a.state),d;if(u&&r!==void 0){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(u,r.payloads);if(r={...r,payloads:t},e.length>0){let n=e.map(e=>e.result.attemptId),i=e.map(e=>e.result);o.set(PendingAuthorizationResultKey,i),a={...a,state:clearPendingAuthorization(a.state,n)},d=e,t.length===0&&(r=void 0)}}r?.payloads.some(e=>e.message!==void 0)&&(o.delete(ScheduleIdKey),o.delete(ScheduleInstanceKey),o.delete(OccurrenceIdKey),r.schedule!==void 0&&(o.set(ScheduleIdKey,r.schedule.definition),r.schedule.instance!==void 0&&o.set(ScheduleInstanceKey,r.schedule.instance),r.schedule.occurrenceId!==void 0&&o.set(OccurrenceIdKey,r.schedule.occurrenceId)));let f=o.get(AuthKey),p=o.has(InitiatorAuthKey);r?.auth!==void 0&&(o.set(AuthKey,r.auth??null),o.has(InitiatorAuthKey)||o.set(InitiatorAuthKey,r.auth??null));let m=r===void 0?d?.find(({challenge:e})=>e.candidateId===void 0)?.challenge.requester:void 0;m!==void 0&&o.set(AuthKey,m);let h={...hydrateDurableSession({compactionOverrides:{thresholdPercent:l.thresholdPercent},durable:a,turnAgent:l.turnAgent}),history:validateHarnessModelMessages(e.history)},g=createExecutionHistoryView(h),_=bindSessionInstrumentation({agentName:l.turnAgent.id,ctx:o,rootSessionId:h.rootSessionId??h.sessionId,sessionId:h.sessionId}),v=turnPosition(currentProjection(o)),y=isBetweenTurns(currentProjection(o));if(!v.sessionStarted&&!o.has(SessionTitleKey)&&!o.has(ParentSessionKey)){let e=n?.payloads.find(e=>e.message!==void 0)?.message,r=deriveSessionTitle(n?.title??e);r!==void 0&&(o.set(SessionTitleKey,r),t.title=setEveAttributes({"$eve.title":r}))}n!==void 0&&(await contextStorage.run(o,()=>_?.preparePreamble({sequence:v.sequence,sessionStarted:v.sessionStarted})),await contextStorage.run(o,()=>_?.instrumentChannelDelivery({agentName:c.turnAgent.id,ctx:o,delivery:n,rootSessionId:h.rootSessionId??h.sessionId,sequence:v.sequence,sessionId:h.sessionId,turnId:activeTurnId(v)})));let failChannelDeliveries=async e=>{await contextStorage.run(o,()=>_?.instrumentChannelDelivery({ctx:o,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await _?.flush()},b=openSessionEventPublisher({ctx:o,origin:`own`,sessionWritable:e.sessionWritable}),{adapterCtx:x}=b.dispatcher,S=new AbortController,C=e.abortSignal===void 0?S.signal:AbortSignal.any([e.abortSignal,S.signal]);try{let u=bindDynamicConnections(o,c.resolvedAgent),m={...c.graph.root,turnAgent:l.turnAgent},w=!1,T=createTurnEventHandler({abortSignal:C,bundle:c,canCancelTurn:e.input?.control===void 0,hookCancellation:S,ctx:o,dynamicConnections:u,effectiveAgent:l,effectiveNode:m,instrumentation:_,publisher:b}),handleEvent=async(e,t)=>{e.type===`compaction.completed`&&(w=!0),await T(e,t)},E=r!==void 0&&!y?structuredClone(x.state):void 0,D;if(r!==void 0){let e=[];try{for(let t of r.payloads){let n=s.deliver?await s.deliver(t,x):defaultDeliverResult(t);n!=null&&e.push(n)}}catch(e){throw await failChannelDeliveries(e),e}D=e.length===0?void 0:e.reduce(coalesceTurnInputs)}let O=r?.auth===void 0?void 0:attributeAnswers({responder:r.auth,state:a.state,stepInput:D});if(O!==void 0&&(D=O,f===void 0?o.delete(AuthKey):o.set(AuthKey,f),p||o.delete(InitiatorAuthKey)),r!==void 0&&D===void 0&&!y)f===void 0?o.delete(AuthKey):o.set(AuthKey,f),x.state=E;else if(n?.payloads.some(e=>e.message!==void 0)){let e=n.deliveryMetadata?.map(e=>e.deliveryId)??[];o.set(TurnDeliveryIdsKey,v.turnId?[...new Set([...o.get(TurnDeliveryIdsKey)??[],...e])]:e)}else!v.sessionStarted&&o.get(ChannelDeliveryKey)!==void 0&&o.set(TurnDeliveryIdsKey,[o.require(ChannelDeliveryKey).deliveryId]);if(i!==void 0&&(i.acceptedAtMsByCallId!==void 0&&o.set(RuntimeActionSettlementTimesKey,i.acceptedAtMsByCallId),D={...D,runtimeActionResults:i.results}),n!==void 0){let e={...s,state:{...x.state}};setChannelContext(o,e)}if(r!==void 0&&D===void 0&&y){await contextStorage.run(o,()=>_?.instrumentChannelDelivery({ctx:o,includeTurn:!1,outcome:`completed`})),await _?.flush();let t=saveSessionProjection(reconcileSessionContinuationToken(o,h),o),n=serializeContext(o),r=t===h?{history:e.history,sessionState:e.sessionState}:createDurableSessionValues(t);return{action:`park`,...derivePendingState(t,currentProjection(o)),serializedContext:n,...r}}let k=c.subagentRegistry.dynamicResolvers??[],A=c.resolvedAgent.dynamicToolResolvers??[],j=buildRuntimeIdentity(m);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(c.compiledArtifactsSource),n=v.sessionStarted;if(o.setVirtualContext(StaticModelReferenceKey,l.turnAgent.model??null),!n)o.set(SessionDynamicSubagentRuntimeRevisionKey,t),o.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=sessionStartedForResolvers(j);await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:o,resolvers:k,event:e,messages:g.initial.messages,runtimeRevision:t}),contextStorage.run(o,async()=>await refreshDynamicSessionToolsForRuntimeRevision({ctx:o,resolvers:A,event:e,messages:g.initial.messages,runtimeRevision:t}))]),y||await rebindMissingCompiledDynamicToolCallbacks({ctx:o,event:turnStartedForResolvers({sequence:v.sequence,turnId:activeTurnId(v)}),messages:g.initial.messages,resolvers:A})}}catch(e){throw await failChannelDeliveries(e),e}let M=c.resolvedAgent.config?.experimental?.workflow?.modelCallsPerStep??1,N=o.get(CapabilitiesKey),runHarnessStep=async(n,r,i)=>{let a=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:l.thresholdPercent},session:n,turnAgent:l.turnAgent});return createExecutionNodeStep({steeringSignal:e.steeringSignal,abortSignal:C,capabilities:N,clearOnly:e.input?.control===`clear`,compactOnly:e.input?.control===`compact`,createRuntime:createWorkflowRuntime,handleEvent,prepareApprovalTurn:e=>u.dispatch(turnStartedForResolvers(e)),signInCompletions:i,historyProjector:g.projector,historyView:g.prepare(a),instrumentation:_,modelResolutionScope:{moduleMap:c.moduleMap,nodeId:c.nodeId},node:m,titleAttributeWrite:t.title})(a,r)},P,F;try{throwIfTurnAborted(C),F=await runModelCallBatch({steeringSignal:e.steeringSignal,initialInput:D,initialSession:h,modelCallsPerStep:M,runStep:async({firstCall:e,session:t,stepInput:n})=>{let r=await runStep(o,t,async t=>{o.setVirtualContext(HandleEventKey,handleEvent),o.setVirtualContext(StaticModelReferenceKey,l.turnAgent.model??null);let r=e&&D?.outputSchema!==void 0?{...t,outputSchema:D.outputSchema}:t,i=turnPosition(currentProjection(o));try{await u.rehydrate(i,j,isBetweenTurns(currentProjection(o))?void 0:{sequence:i.sequence,turnId:activeTurnId(i)})}catch(e){let t=await recoverDynamicConnectionRehydration({emit:handleEvent,error:e,projection:currentProjection(o),session:r});if(t!==void 0)return t;throw e}let a=e&&d!==void 0?d.map(({challenge:e})=>e):void 0;return runHarnessStep(r,n,a)});r.settledTurn===void 0&&throwIfTurnAborted(C);let i={...r,session:saveSessionProjection(r.session,o)};return P={result:i,serializedContext:serializeContext(o)},i}})}catch(t){if(!isTurnCancellation(t)&&!C.aborted)throw await failChannelDeliveries(t),t;return createCancelledModelCallBatchResult({beforeBatchContext:e.serializedContext,checkpoint:P,ctx:o,initialSession:h,stepInput:D})}let I=saveSessionProjection(dropClosedRecords(reconcileSessionContinuationToken(o,F.session),currentProjection(o)),o);agentTraceState.pruneAgentTraceState(o,I.sessionId,I.state);let L=serializeContext(o);F={...F,session:I};let R=resolveSessionStepResult(F,L);return R.action===`done`&&await b.writer.close(),w?{...R,compacted:!0}:R}finally{b.writer.release()}}export{turnStep};
@@ -1 +1 @@
1
- import{decide}from"#ai/decide.js";async function runAgentRouterTask(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal),{message:r,status:i}=await(await t.agent(n).send(e.message,{signal:t.abortSignal})).result();if(i===`failed`)throw Error(`Agent "${n}" failed to handle the task.`);return r??null}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await decide({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}runAgentRouterTask.workflowId=`workflow//eve@0.78.0//runAgentRouterTask`;export{runAgentRouterTask};
1
+ import{decide}from"#ai/decide.js";async function runAgentRouterTask(e,t){"use workflow";let n=await chooseTarget(e.message,descriptions(t),t.abortSignal),{message:r,status:i}=await(await t.agent(n).send(e.message,{signal:t.abortSignal})).result();if(i===`failed`)throw Error(`Agent "${n}" failed to handle the task.`);return r??null}async function chooseTarget(e,t,n){"use step";let r=Object.keys(t);if(r.length===0)throw Error(`agentRouter requires at least one available agent with a description.`);return r.length===1?r[0]:(await decide({abortSignal:n,state:{message:e},questions:{route:{type:`choice`,instructions:`Which subagent should handle this task?`,criteria:t}}})).answers.route.choice}function descriptions(e){return Object.fromEntries(Object.entries(e.agents).flatMap(([e,t])=>{let n=t.description.trim();return n.length===0?[]:[[e,n]]}))}runAgentRouterTask.workflowId=`workflow//eve@0.79.0//runAgentRouterTask`;export{runAgentRouterTask};
@@ -1 +1 @@
1
- import{createLogger,logError}from"#internal/logging.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{SESSION_HANDOFF_VERSION}from"#execution/session/entry-input.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,r.graph);let i=buildRunContext({bundle:r,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&i.set(SessionPredecessorKey,n);let a=resolveEffectiveAgentRuntime(r,i);initializeSessionInstrumentation({agentName:a.turnAgent.id,ctx:i});let o=a.limits?.sessionTimeoutMs,s=r.resolvedAgent.config?.experimental?.workflow?.retention,c=serializeContext(i),l=readParentLineage(c),u={kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:c};t.limits!==void 0&&(u.limits=t.limits),t.continuationConflictCommand!==void 0&&(u.continuationConflictCommand=t.continuationConflictCommand),o!==void 0&&(u.sessionTimeoutMs=o),s!==void 0&&(u.retention=s);let d={...l.sessionId===void 0?buildSessionAttributes({serializedContext:c}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:l.callId,parentSessionId:l.sessionId,parentTurnId:l.turnId,rootSessionId:l.rootSessionId??l.sessionId,serializedContext:c}),...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},f;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(d)};s!==void 0&&(e.experimental_retention=s),f=await startWorkflowOnDeployment(workflowEntryReference,[u],u.ownerDeploymentId,e)}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:t.continuationToken}),e}let p,getEvents=()=>(p??=readSessionEventStream(f.runId),p);return{get events(){return getEvents()},sessionId:f.runId}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{command:t,continuationToken:n,successor:r}=e;try{return await dispatchWorkflowCommand(n,t)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(t.kind!==`send`||r===void 0)return await settleStrandedCommand(n,t,e);if((t.payload.inputResponses?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,n,`message`);return{sessionId:(await startSession(r,{sessionId:i})).sessionId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){if(t?.follow===!1)return readSessionEventHistory(e,t.startIndex);try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return readSessionEventStream(e,t?.startIndex)},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},resolveContinuation}}async function startSessionOwnerStep(e){"use step";let{activationToken:t,anchorRunId:n,checkpoint:r,targetDeploymentId:i,...a}=e,o={...a,activationToken:t,checkpoint:r,handoffVersion:SESSION_HANDOFF_VERSION,kind:`handoff`,ownerDeploymentId:i,sessionWritable:getRun(n).getWritable(),sessionId:n};await startWorkflowOnDeployment(workflowEntryReference,[o],i,r.retention===void 0?void 0:{experimental_retention:r.retention})}async function dispatchWorkflowCommand(e,t){let n;try{let r=await resumeSessionInbox(e,t);n={runId:r.ownerRunId,sessionId:await r.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],n.runId),activeCommandResult(t,n.sessionId)}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId};try{return await dispatchWorkflowCommand(t,e.command)}catch(n){if(!(n instanceof StrandedSessionOwnerError))throw n;return await settleStrandedCommand(t,e.command,n)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e){try{return await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startSessionOwnerStep,startWorkflowOnCurrentDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
1
+ import{createLogger,logError}from"#internal/logging.js";import{sessionCommandHookToken,sessionInboxHookToken}from"#execution/session-inbox/address.js";import{SessionPredecessorKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{validateToolStubTargets}from"#tool-stubs/validate-targets.js";import{getHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{SessionStrandedError,describeStrandedSession}from"#channel/session-stranded-error.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{serializeContext}from"#context/serialize.js";import{AcceptedSessionIdentityError,SessionHandoffPendingError,logicalSessionToken,resolveSessionInbox,resumeSessionInbox}from"#execution/session-inbox/resume.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{StrandedSessionOwnerError,assertRunnableSessionInbox,findSessionHookHolder}from"#execution/session-inbox/owner.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{EVE_VERSION_ATTRIBUTE,buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{endStrandedSession}from"#execution/session-inbox/end-stranded-session.js";import{SESSION_HOOK_HANDOVER_TIMEOUT_MS,waitForSessionHooksRelease}from"#execution/session-inbox/hook-release.js";import{SESSION_TIMEOUT_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{buildRunContext}from"#execution/runtime-context.js";import{readSessionEventHistory,readSessionEventStream,readSessionStreamTailIndex}from"#execution/session-event-stream.js";import{SESSION_HANDOFF_VERSION}from"#execution/session/entry-input.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/eve/agent-trace-context.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`};function createWorkflowRuntime(e){let startSession=async(t,n)=>{let r=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:e.compiledArtifactsSource,nodeId:e.nodeId});t.toolStubs!==void 0&&t.toolStubs.rootSessionId===void 0&&validateToolStubTargets(t.toolStubs.rules,r.graph);let i=buildRunContext({bundle:r,dynamicSubagentAgentConfig:e.dynamicSubagentAgentConfig,run:t});n!==void 0&&i.set(SessionPredecessorKey,n);let a=resolveEffectiveAgentRuntime(r,i);initializeSessionInstrumentation({agentName:a.turnAgent.id,ctx:i});let o=a.limits?.sessionTimeoutMs,s=r.resolvedAgent.config?.experimental?.workflow?.retention,c=serializeContext(i),l=readParentLineage(c),u={kind:`initial`,input:t.input,ownerDeploymentId:await resolveCurrentWorkflowDeploymentId(),serializedContext:c};t.limits!==void 0&&(u.limits=t.limits),t.continuationConflictCommand!==void 0&&(u.continuationConflictCommand=t.continuationConflictCommand),o!==void 0&&(u.sessionTimeoutMs=o),s!==void 0&&(u.retention=s);let d={...l.sessionId===void 0?buildSessionAttributes({serializedContext:c}):buildSubagentRootAttributes({identity:{nodeId:r.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:l.callId,parentSessionId:l.sessionId,parentTurnId:l.turnId,rootSessionId:l.rootSessionId??l.sessionId,serializedContext:c}),...t.externalInvocation===void 0?{}:buildInvocationAttributes(t.externalInvocation)},f;try{let e={allowReservedAttributes:!0,attributes:normalizeEveAttributes(d)};s!==void 0&&(e.experimental_retention=s),f=await startWorkflowOnDeployment(workflowEntryReference,[u],u.ownerDeploymentId,e)}catch(e){throw logError(log,`failed to start workflow run`,e,{continuationToken:t.continuationToken}),e}let p,getEvents=()=>(p??=readSessionEventStream(f.runId),p);return{get events(){return getEvents()},sessionId:f.runId}};return{async createSession(e){return await startSession(e)},async dispatchContinuation(e){let{command:t,continuationToken:n,successor:r}=e;try{return await dispatchWorkflowCommand(n,t)}catch(e){if(!(e instanceof StrandedSessionOwnerError))throw e;if(t.kind!==`send`||r===void 0)return await settleStrandedCommand(n,t,e);if((t.payload.inputResponses?.length??0)>0)throw sessionStrandedError(e,`Its pending requests can no longer be answered; send a new message to start a fresh session.`);let i=await endStrandedSession(e,n,`message`);return{sessionId:(await startSession(r,{sessionId:i})).sessionId,status:`accepted`}}},async dispatchSession(e){return await dispatchWorkflowSessionCommand(e)},async getEventStream(e,t){if(t?.follow===!1)return readSessionEventHistory(e,t.startIndex);try{await assertRunnableSessionInbox(sessionInboxHookToken(sessionCommandHookToken(e)))}catch(e){throw e instanceof StrandedSessionOwnerError?sessionStrandedError(e):e}return readSessionEventStream(e,t?.startIndex)},async getStreamTailIndex(e){return await readSessionStreamTailIndex(e)},resolveContinuation}}async function startSessionOwnerStep(e){"use step";let{activationToken:t,anchorRunId:n,checkpoint:r,targetDeploymentId:i,...a}=e,o={...a,activationToken:t,checkpoint:r,handoffVersion:SESSION_HANDOFF_VERSION,kind:`handoff`,ownerDeploymentId:i,sessionWritable:getRun(n).getWritable(),sessionId:n};await startWorkflowOnDeployment(workflowEntryReference,[o],i,r.retention===void 0?void 0:{experimental_retention:r.retention})}async function dispatchWorkflowCommand(e,t){let n;try{let r=await resumeSessionInbox(e,t);n={runId:r.ownerRunId,sessionId:await r.sessionId}}catch(n){if(n instanceof StrandedSessionOwnerError)throw n;let r=t.kind===`send`&&typeof e!=`string`,i={status:`session_not_active`,retryable:!0};if(n instanceof SessionHandoffPendingError){if(r)return i;throw n}if(isInactiveCommandTarget(n))return r&&await isRunActive(e.sessionId)?i:inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForSessionHooksRelease([sessionCommandHookToken(n.sessionId),logicalSessionToken(e)],n.runId),activeCommandResult(t,n.sessionId)}async function settleStrandedCommand(e,t,n){switch(t.kind){case`reset`:return{previousSessionId:await endStrandedSession(n,e,`reset`),status:`reset`};case`send`:case`clear`:throw sessionStrandedError(n);default:return inactiveCommandResult(t)}}function sessionStrandedError(e,t){let n=e.eveVersion===void 0?{}:{eveVersion:e.eveVersion};return new SessionStrandedError(n,describeStrandedSession(n,t))}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:e.kind===`send`&&e.delivery!==void 0?{sessionId:t,status:`accepted`,deliveryId:e.delivery.deliveryId}:{sessionId:t,status:`accepted`}}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function dispatchWorkflowSessionCommand(e){let t={sessionId:e.sessionId};try{return await dispatchWorkflowCommand(t,e.command)}catch(n){if(!(n instanceof StrandedSessionOwnerError))throw n;return await settleStrandedCommand(t,e.command,n)}}async function isRunActive(e){try{let t=await getRun(e).status;return t===`pending`||t===`running`}catch(e){if(isInactiveCommandTarget(e))return!1;throw e}}function isInactiveCommandTarget(e){if(e instanceof AcceptedSessionIdentityError)return!1;if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function resolveContinuation(e){try{return await resolveSessionInbox(e)}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}async function waitForCommandHookOwner(e){let t=await pollUntil(async()=>{try{return normalizeWorkflowHook(await getHookByToken(e))}catch(e){if(!HookNotFoundError.is(e))throw e;return}},SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(t===void 0)throw new HookNotFoundError(e);return t}async function waitForSessionInbox(e){let t=sessionInboxHookToken(sessionCommandHookToken(e)),n=await pollUntil(async()=>await findSessionHookHolder(t)!==void 0||!await hasRunEnded(e)&&void 0,SESSION_HOOK_HANDOVER_TIMEOUT_MS);if(n===void 0)throw Error(`Session "${e}" did not start taking commands within ${SESSION_HOOK_HANDOVER_TIMEOUT_MS/1e3} seconds.`);return n}async function pollUntil(e,t){let n=Date.now()+t;for(let t=20;;t=Math.min(t*2,200)){let r=await e();if(r!==void 0||Date.now()>=n)return r;await new Promise(e=>setTimeout(e,t))}}async function hasRunEnded(e){try{let t=await getRun(e).status;return t!==`pending`&&t!==`running`}catch(e){for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t))return!1;if(isInactiveCommandTarget(e))return!0;throw e}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,await resolveCurrentWorkflowDeploymentId(),n)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>{if(n.length===0||n===`latest`)throw Error(`Workflow starts require an exact deployment id.`);return await start(e,t,{...r,allowReservedAttributes:!0,attributes:{...r?.attributes,[EVE_VERSION_ATTRIBUTE]:EVE_PACKAGE_INFO.version},deploymentId:n})})}async function resolveCurrentWorkflowDeploymentId(){let e=process.env.VERCEL_DEPLOYMENT_ID?.trim()||await(await getWorld()).getDeploymentId();if(e.length===0||e===`latest`)throw Error(`Workflow runtime could not resolve an exact deployment id.`);return e}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{createWorkflowRuntime,dispatchWorkflowSessionCommand,hasRunEnded,pollUntil,resolveContinuation,sessionTimeoutWorkflowReference,startSessionOwnerStep,startWorkflowOnCurrentDeployment,waitForCommandHookOwner,waitForSessionInbox,workflowEntryReference,workflowToolRunWorkflowReference};
@@ -1,5 +1,5 @@
1
1
  import type { FlexibleSchema } from "ai";
2
- import type { Approval } from "#approval/definition.js";
2
+ import type { ToolApproval } from "#approval/definition.js";
3
3
  import type { InternalToolDefinition, InternalToolLabelDefinition, ToolExecuteOptions } from "#tools/definition.js";
4
4
  import type { JsonValue } from "#shared/json.js";
5
5
  import type { PreparedToolBehavior } from "#tools/behavior.js";
@@ -23,7 +23,7 @@ export interface HarnessToolDefinition {
23
23
  readonly frameworkAction?: "task-cancel" | "task-wait";
24
24
  readonly inputSchema: FlexibleSchema;
25
25
  readonly name: string;
26
- readonly approval?: Approval;
26
+ readonly approval?: ToolApproval;
27
27
  readonly outputSchema?: FlexibleSchema;
28
28
  /**
29
29
  * Advertise this tool only to the root session, hiding it from subagent
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{displayTitle}from"#shared/display-name.js";import{projectToolStartLabel}from"#harness/action-presentation.js";import{createRuntimeToolCallActionFromToolCall}from"#harness/tool-call-action.js";const ToolCallDescriptorSchema=z.object({input:z.unknown(),toolCallId:z.string(),toolName:z.string()}),PersistedToolCallSchema=ToolCallDescriptorSchema.extend({type:z.literal(`tool-call`)}),ToolApprovalRequestSchema=z.object({approvalId:z.string(),isAutomatic:z.boolean().optional().catch(void 0),toolCall:ToolCallDescriptorSchema.optional().catch(void 0),toolCallId:z.string().optional().catch(void 0),type:z.literal(`tool-approval-request`)});function extractToolApprovalInputRequests(e){return extractApprovalRequests(e)}function extractApprovalRequests(e){let t=[],n=new Map;for(let t of e.content){let e=PersistedToolCallSchema.safeParse(t);e.success&&n.set(e.data.toolCallId,e.data)}for(let r of e.content){let i=ToolApprovalRequestSchema.safeParse(r);if(!i.success)continue;let a=i.data;if(a.isAutomatic===!0)continue;let o=a.toolCall??(a.toolCallId===void 0?void 0:n.get(a.toolCallId));if(o===void 0||e.excludedCallIds?.has(o.toolCallId))continue;let s=createRuntimeToolCallActionFromToolCall({toolCall:o}),c=projectToolStartLabel(e.tools.get(s.toolName),s.input)??displayTitle(s.toolName);t.push({action:s,allowFreeform:!1,display:`confirmation`,kind:`tool-approval`,options:[{id:`approve`,label:`Approve`},{id:`cancel`,label:`Cancel`}],prompt:`Approve ${c}?`,requestId:a.approvalId})}return t}export{extractToolApprovalInputRequests};
1
+ import{z}from"#compiled/zod/index.js";import{displayTitle}from"#shared/display-name.js";import{projectToolStartLabel}from"#harness/action-presentation.js";import{createRuntimeToolCallActionFromToolCall}from"#harness/tool-call-action.js";const ToolCallDescriptorSchema=z.object({input:z.unknown(),toolCallId:z.string(),toolName:z.string()}),PersistedToolCallSchema=ToolCallDescriptorSchema.extend({type:z.literal(`tool-call`)}),ToolApprovalRequestSchema=z.object({approvalId:z.string(),isAutomatic:z.boolean().optional().catch(void 0),toolCall:ToolCallDescriptorSchema.optional().catch(void 0),toolCallId:z.string().optional().catch(void 0),type:z.literal(`tool-approval-request`)});function extractToolApprovalInputRequests(e){return extractApprovalRequests(e)}function extractApprovalRequests(e){let t=[],n=new Map;for(let t of e.content){let e=PersistedToolCallSchema.safeParse(t);e.success&&n.set(e.data.toolCallId,e.data)}for(let r of e.content){let i=ToolApprovalRequestSchema.safeParse(r);if(!i.success)continue;let a=i.data;if(a.isAutomatic===!0)continue;let o=a.toolCall??(a.toolCallId===void 0?void 0:n.get(a.toolCallId));if(o===void 0||e.excludedCallIds?.has(o.toolCallId))continue;let s=createRuntimeToolCallActionFromToolCall({toolCall:o}),c=e.tools.get(s.toolName),l=typeof o.input==`object`&&o.input!==null&&!Array.isArray(o.input)?o.input:{},u=c?.approval,d=u===void 0||typeof u==`function`?void 0:u.prompt?.({callId:o.toolCallId,input:l,toolName:o.toolName});if(d!==void 0&&typeof d!=`string`)throw Error(`Tool "${o.toolName}" approval prompt must return a string.`);let f=projectToolStartLabel(c,s.input)??displayTitle(s.toolName);t.push({action:s,allowFreeform:!1,display:`confirmation`,kind:`tool-approval`,options:[{id:`approve`,label:`Approve`},{id:`cancel`,label:`Cancel`}],prompt:d??`Approve ${f}?`,requestId:a.approvalId})}return t}export{extractToolApprovalInputRequests};
@@ -1 +1 @@
1
- import{attemptIdempotencyKey,modelCallIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{structuralProviderMetadata}from"#instrumentation/content.js";function createAiSdkHookBridge(e,t,n=directRunInContext,r,i){let a={capturesInputs:t.capturesInputs??t.capturesContent,capturesOutputs:t.capturesOutputs??t.capturesContent,modelCallIndexes:new Map,modelCallStartEvents:new Map,modelKeys:new Map,runtimeContext:r!==void 0&&Object.keys(r).length>0?Object.freeze({...r}):void 0,scope:e,toolKeys:new Map,toolCalls:new Map,isFrameworkTool:i},nextModelCallKey=e=>{let t=a.modelCallIndexes.get(e)??0;return a.modelCallIndexes.set(e,t+1),modelCallIdempotencyKey(a.scope,e,t)};return{onStart(e){a.operation=Object.freeze({modelId:e.modelId,operationId:e.operationId,provider:e.provider})},async onStepStart(e){a.stepNumber=e.stepNumber;let n=toStepAttemptStarted(a);n!==void 0&&await t.publish(n)},async onLanguageModelCallStart(e){let n=a.stepNumber??0,r=nextModelCallKey(n);a.modelKeys.set(e.callId,r);let i=toModelCallStarted(a,r,e);a.modelCallStartEvents.set(e.callId,{event:i,stepNumber:n}),await t.publish(i)},async executeLanguageModelCall({callId:r,execute:i}){let o=a.modelKeys.get(r);if(o===void 0){let e=a.modelCallStartEvents.get(r);if(e===void 0)return i();o=nextModelCallKey(e.stepNumber),a.modelKeys.set(r,o),await t.publish(Object.freeze({...e.event,idempotencyKey:o}))}try{return await n({idempotencyKey:o,scope:e,type:`model.call`},i)}catch(n){throw a.modelKeys.get(r)===o&&a.modelKeys.delete(r),await t.publish(Object.freeze({error:n,idempotencyKey:o,scope:e,type:`model.call.failed`})),n}},async onLanguageModelCallEnd(e){let n=a.modelKeys.get(e.callId);if(n===void 0)return;a.modelKeys.delete(e.callId),a.modelCallStartEvents.delete(e.callId);let r=toModelCallCompleted(a,n,e);await t.publish(r)},async onStepEnd(e){if(e.providerMetadata===void 0)return;let n=a.capturesOutputs?e.providerMetadata:structuralProviderMetadata(e.providerMetadata);await t.publish(Object.freeze({idempotencyKey:attemptIdempotencyKey(a.scope),providerMetadata:n,scope:a.scope,type:`step.attempt.metadata`}))},onToolExecutionStart(e){let t=toolCallIdempotencyKey(a.scope,e.toolCall.toolCallId,a.stepNumber??0);a.toolKeys.set(e.toolCall.toolCallId,t);let n=toToolCallStarted(a,t,e);a.toolCalls.set(e.toolCall.toolCallId,n)},executeTool({toolCallId:e,execute:t}){let r=a.toolCalls.get(e);return r===void 0?t():n({...r,type:`tool.call`},t)},onToolExecutionEnd(e){let t=e.toolCall.toolCallId;a.toolKeys.get(t)!==void 0&&(a.toolKeys.delete(t),a.toolCalls.delete(t))},async onAbort(e){await failOpenOperations(e.reason)},async onError(e){await failOpenOperations(e.error)}};async function failOpenOperations(n){let r=[];for(let i of a.modelKeys.values())r.push(t.publish(Object.freeze({error:n,idempotencyKey:i,scope:e,type:`model.call.failed`})));a.modelKeys.clear(),a.modelCallStartEvents.clear(),a.toolKeys.clear(),a.toolCalls.clear(),await Promise.all(r)}}const directRunInContext=(e,t)=>t();function toStepAttemptStarted(e){if(e.operation!==void 0&&e.stepNumber!==void 0)return Object.freeze({idempotencyKey:attemptIdempotencyKey(e.scope),operation:e.operation,runtimeContext:e.runtimeContext,scope:e.scope,type:`step.attempt.started`})}function toModelCallStarted(e,t,n){return Object.freeze({idempotencyKey:t,input:e.capturesInputs?Object.freeze({instructions:n.instructions,messages:Object.freeze([...n.messages]),tools:n.tools===void 0?void 0:Object.freeze([...n.tools])}):void 0,model:Object.freeze({modelId:n.modelId,provider:n.provider}),runtimeContext:e.runtimeContext,scope:e.scope,type:`model.call.started`})}function toModelCallCompleted(e,t,n){return Object.freeze({content:e.capturesOutputs?toContentParts(n.content):void 0,finishReason:n.finishReason,idempotencyKey:t,responseModelId:n.modelId,responseId:n.responseId,scope:e.scope,type:`model.call.completed`,usage:toUsage(n.usage)})}function toUsage(e){return Object.freeze({inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens}),inputTokens:e.inputTokens,outputTokens:e.outputTokens})}function toContentParts(e){let t=[];for(let n of e)switch(n.type){case`text`:case`reasoning`:t.push(Object.freeze({text:n.text,type:n.type}));break;case`tool-call`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,toolName:n.toolName,type:`tool-call`}));break;case`tool-result`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,output:n.output,toolName:n.toolName,type:`tool-result`}));break;case`tool-error`:t.push(Object.freeze({callId:n.toolCallId,error:n.error,input:n.input,toolName:n.toolName,type:`tool-error`}))}return Object.freeze(t)}function toToolCallStarted(e,t,n){return Object.freeze({callId:n.toolCall.toolCallId,frameworkTool:e.isFrameworkTool?.(n.toolCall.toolName)===!0,idempotencyKey:t,input:e.capturesInputs?n.toolCall.input:void 0,scope:e.scope,toolName:n.toolCall.toolName,startedAtMs:Date.now(),type:`tool.call.started`})}export{createAiSdkHookBridge};
1
+ import{attemptIdempotencyKey,modelCallIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{structuralProviderMetadata}from"#instrumentation/content.js";import{modelContent,modelUsage}from"#compiled/@eve/tracing/ai-sdk.js";function createAiSdkHookBridge(e,t,n=directRunInContext,r,i){let a={capturesInputs:t.capturesInputs??t.capturesContent,capturesOutputs:t.capturesOutputs??t.capturesContent,modelCallIndexes:new Map,modelCallStartEvents:new Map,modelKeys:new Map,runtimeContext:r!==void 0&&Object.keys(r).length>0?Object.freeze({...r}):void 0,scope:e,toolKeys:new Map,toolCalls:new Map,isFrameworkTool:i},nextModelCallKey=e=>{let t=a.modelCallIndexes.get(e)??0;return a.modelCallIndexes.set(e,t+1),modelCallIdempotencyKey(a.scope,e,t)};return{onStart(e){a.operation=Object.freeze({modelId:e.modelId,operationId:e.operationId,provider:e.provider})},async onStepStart(e){a.stepNumber=e.stepNumber;let n=toStepAttemptStarted(a);n!==void 0&&await t.publish(n)},async onLanguageModelCallStart(e){let n=a.stepNumber??0,r=nextModelCallKey(n);a.modelKeys.set(e.callId,r);let i=toModelCallStarted(a,r,e);a.modelCallStartEvents.set(e.callId,{event:i,stepNumber:n}),await t.publish(i)},async executeLanguageModelCall({callId:r,execute:i}){let o=a.modelKeys.get(r);if(o===void 0){let e=a.modelCallStartEvents.get(r);if(e===void 0)return i();o=nextModelCallKey(e.stepNumber),a.modelKeys.set(r,o),await t.publish(Object.freeze({...e.event,idempotencyKey:o}))}try{return await n({idempotencyKey:o,scope:e,type:`model.call`},i)}catch(n){throw a.modelKeys.get(r)===o&&a.modelKeys.delete(r),await t.publish(Object.freeze({error:n,idempotencyKey:o,scope:e,type:`model.call.failed`})),n}},async onLanguageModelCallEnd(e){let n=a.modelKeys.get(e.callId);if(n===void 0)return;a.modelKeys.delete(e.callId),a.modelCallStartEvents.delete(e.callId);let r=toModelCallCompleted(a,n,e);await t.publish(r)},async onStepEnd(e){if(e.providerMetadata===void 0)return;let n=a.capturesOutputs?e.providerMetadata:structuralProviderMetadata(e.providerMetadata);await t.publish(Object.freeze({idempotencyKey:attemptIdempotencyKey(a.scope),providerMetadata:n,scope:a.scope,type:`step.attempt.metadata`}))},onToolExecutionStart(e){let t=toolCallIdempotencyKey(a.scope,e.toolCall.toolCallId,a.stepNumber??0);a.toolKeys.set(e.toolCall.toolCallId,t);let n=toToolCallStarted(a,t,e);a.toolCalls.set(e.toolCall.toolCallId,n)},executeTool({toolCallId:e,execute:t}){let r=a.toolCalls.get(e);return r===void 0?t():n({...r,type:`tool.call`},t)},onToolExecutionEnd(e){let t=e.toolCall.toolCallId;a.toolKeys.get(t)!==void 0&&(a.toolKeys.delete(t),a.toolCalls.delete(t))},async onAbort(e){await failOpenOperations(e.reason)},async onError(e){await failOpenOperations(e.error)}};async function failOpenOperations(n){let r=[];for(let i of a.modelKeys.values())r.push(t.publish(Object.freeze({error:n,idempotencyKey:i,scope:e,type:`model.call.failed`})));a.modelKeys.clear(),a.modelCallStartEvents.clear(),a.toolKeys.clear(),a.toolCalls.clear(),await Promise.all(r)}}const directRunInContext=(e,t)=>t();function toStepAttemptStarted(e){if(e.operation!==void 0&&e.stepNumber!==void 0)return Object.freeze({idempotencyKey:attemptIdempotencyKey(e.scope),operation:e.operation,runtimeContext:e.runtimeContext,scope:e.scope,type:`step.attempt.started`})}function toModelCallStarted(e,t,n){return Object.freeze({idempotencyKey:t,input:e.capturesInputs?Object.freeze({instructions:n.instructions,messages:Object.freeze([...n.messages]),tools:n.tools===void 0?void 0:Object.freeze([...n.tools])}):void 0,model:Object.freeze({modelId:n.modelId,provider:n.provider}),runtimeContext:e.runtimeContext,scope:e.scope,type:`model.call.started`})}function toModelCallCompleted(e,t,n){return Object.freeze({content:e.capturesOutputs?Object.freeze(modelContent(n.content).map(e=>Object.freeze(e))):void 0,finishReason:n.finishReason,idempotencyKey:t,responseModelId:n.modelId,responseId:n.responseId,scope:e.scope,type:`model.call.completed`,usage:Object.freeze(modelUsage(n.usage))})}function toToolCallStarted(e,t,n){return Object.freeze({callId:n.toolCall.toolCallId,frameworkTool:e.isFrameworkTool?.(n.toolCall.toolName)===!0,idempotencyKey:t,input:e.capturesInputs?n.toolCall.input:void 0,scope:e.scope,toolName:n.toolCall.toolName,startedAtMs:Date.now(),type:`tool.call.started`})}export{createAiSdkHookBridge};