eve 0.78.0 → 0.79.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/src/approval/definition.d.ts +42 -0
  3. package/dist/src/chunks/{use-eve-agent-BSYe_Re7.js → use-eve-agent-Ch-Q-s12.js} +43 -13
  4. package/dist/src/chunks/{use-eve-agent-B8brxCk-.js → use-eve-agent-Vsl-S0yI.js} +43 -13
  5. package/dist/src/cli/commands/trace-detail.d.ts +2 -2
  6. package/dist/src/cli/commands/trace-detail.js +1 -1
  7. package/dist/src/cli/commands/trace.d.ts +1 -1
  8. package/dist/src/cli/commands/trace.js +1 -1
  9. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
  10. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  11. package/dist/src/cli/dev/tui/traces/trace-store.d.ts +1 -1
  12. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
  13. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +1 -1
  14. package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
  15. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +1 -1
  16. package/dist/src/client/abort-signal.d.ts +2 -0
  17. package/dist/src/client/abort-signal.js +1 -0
  18. package/dist/src/client/conversation-client.d.ts +2 -0
  19. package/dist/src/client/conversation-client.js +1 -1
  20. package/dist/src/client/eve-agent-store-state.d.ts +9 -0
  21. package/dist/src/client/eve-agent-store.js +1 -1
  22. package/dist/src/client/ndjson.js +1 -1
  23. package/dist/src/client/open-stream.js +1 -1
  24. package/dist/src/client/session-turn-dispatch.js +1 -1
  25. package/dist/src/client/session-utils.js +1 -1
  26. package/dist/src/client/session.js +1 -1
  27. package/dist/src/compiled/.vendor-stamp.json +3 -1
  28. package/dist/src/compiled/@eve/tracing/adapters/agent-transport.d.ts +8 -0
  29. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-payload.d.ts +15 -0
  30. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-telemetry.d.ts +14 -0
  31. package/dist/src/{tracing/agent-span-id-generator.d.ts → compiled/@eve/tracing/adapters/otel-ids.d.ts} +1 -1
  32. package/dist/src/compiled/@eve/tracing/adapters/otel.d.ts +33 -0
  33. package/dist/src/{tracing/agent-otel-content.d.ts → compiled/@eve/tracing/adapters/serialization.d.ts} +9 -3
  34. package/dist/src/compiled/@eve/tracing/agent-tracing.d.ts +84 -0
  35. package/dist/src/compiled/@eve/tracing/ai-sdk.d.ts +7 -0
  36. package/dist/src/compiled/@eve/tracing/ai-sdk.js +1 -0
  37. package/dist/src/compiled/@eve/tracing/capture.d.ts +5 -0
  38. package/dist/src/compiled/@eve/tracing/core/activation.d.ts +3 -0
  39. package/dist/src/compiled/@eve/tracing/core/attributes.d.ts +14 -0
  40. package/dist/src/{tracing/content-attributes.d.ts → compiled/@eve/tracing/core/content-policy.d.ts} +1 -1
  41. package/dist/src/compiled/@eve/tracing/core/context.d.ts +3 -0
  42. package/dist/src/compiled/@eve/tracing/core/delegation.d.ts +13 -0
  43. package/dist/src/compiled/@eve/tracing/core/mcp.d.ts +24 -0
  44. package/dist/src/compiled/@eve/tracing/core/scopes.d.ts +59 -0
  45. package/dist/src/compiled/@eve/tracing/core/snapshot.d.ts +7 -0
  46. package/dist/src/compiled/@eve/tracing/core/span-kinds.d.ts +12 -0
  47. package/dist/src/compiled/@eve/tracing/core/types.d.ts +297 -0
  48. package/dist/src/compiled/@eve/tracing/core/writer.d.ts +15 -0
  49. package/dist/src/compiled/@eve/tracing/delegation.d.ts +2 -0
  50. package/dist/src/compiled/@eve/tracing/delegation.js +1 -0
  51. package/dist/src/compiled/@eve/tracing/index.d.ts +6 -0
  52. package/dist/src/compiled/@eve/tracing/index.js +1 -0
  53. package/dist/src/compiled/@eve/tracing/operations.d.ts +96 -0
  54. package/dist/src/compiled/@eve/tracing/otel.d.ts +12 -0
  55. package/dist/src/compiled/@eve/tracing/otel.js +1 -0
  56. package/dist/src/compiled/@opentelemetry/api/index.d.ts +4 -0
  57. package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
  58. package/dist/src/compiled/_chunks/workflow/delegation-BqhZ398D.js +1 -0
  59. package/dist/src/compiled/_chunks/workflow/mcp-C01bDEX-.js +5 -0
  60. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  61. package/dist/src/compiler/extension-compatibility.js +1 -1
  62. package/dist/src/compiler/project-sources.js +1 -1
  63. package/dist/src/context/build-dynamic-tools.js +1 -1
  64. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  65. package/dist/src/context/memory-tools.js +1 -1
  66. package/dist/src/evals/assertions/collector.d.ts +4 -1
  67. package/dist/src/evals/assertions/collector.js +1 -1
  68. package/dist/src/evals/context.js +1 -1
  69. package/dist/src/evals/index.d.ts +1 -1
  70. package/dist/src/evals/runner/artifacts.js +1 -1
  71. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
  72. package/dist/src/evals/runner/reporters/assertion-scores.d.ts +13 -2
  73. package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
  74. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  75. package/dist/src/evals/runner/reporters/console.js +1 -1
  76. package/dist/src/evals/runner/reporters/datadog.js +2 -2
  77. package/dist/src/evals/runner/reporters/junit.js +1 -1
  78. package/dist/src/evals/runner/verdict.d.ts +2 -2
  79. package/dist/src/evals/runner/verdict.js +1 -1
  80. package/dist/src/evals/types.d.ts +22 -6
  81. package/dist/src/eve-channel/index.js +1 -1
  82. package/dist/src/eve-channel/request.js +1 -1
  83. package/dist/src/eve-channel/stream-headers.d.ts +1 -0
  84. package/dist/src/eve-channel/stream-headers.js +1 -0
  85. package/dist/src/execution/agent-sessions/context.d.ts +1 -1
  86. package/dist/src/execution/agent-sessions/context.js +1 -1
  87. package/dist/src/execution/agent-sessions/remote.js +1 -1
  88. package/dist/src/execution/agent-sessions/steps.js +1 -1
  89. package/dist/src/execution/authorization-callback-match.d.ts +2 -2
  90. package/dist/src/execution/authorization-callback-match.js +1 -1
  91. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  92. package/dist/src/execution/catalog/connection-entry.js +1 -1
  93. package/dist/src/execution/durable-session-store.js +1 -1
  94. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  95. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  96. package/dist/src/execution/forward-session-input.js +1 -1
  97. package/dist/src/execution/invoke-tool.d.ts +1 -1
  98. package/dist/src/execution/invoke-tool.js +1 -1
  99. package/dist/src/execution/proxied-deliver-step.js +1 -1
  100. package/dist/src/execution/publish-session-events.d.ts +13 -2
  101. package/dist/src/execution/publish-session-events.js +1 -1
  102. package/dist/src/execution/sandbox/bindings/vercel-create-sdk.js +1 -1
  103. package/dist/src/execution/sandbox/bindings/vercel-credentials.d.ts +2 -0
  104. package/dist/src/execution/sandbox/bindings/vercel-credentials.js +1 -1
  105. package/dist/src/execution/sandbox/bindings/vercel-lifecycle.js +1 -1
  106. package/dist/src/execution/sandbox/bindings/vercel-lookup.js +1 -1
  107. package/dist/src/execution/sandbox/bindings/vercel.d.ts +3 -6
  108. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  109. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  110. package/dist/src/execution/session/handoff-steps.js +1 -1
  111. package/dist/src/execution/session/handoff.d.ts +1 -1
  112. package/dist/src/execution/session/handoff.js +1 -1
  113. package/dist/src/execution/session/input-queue.d.ts +13 -6
  114. package/dist/src/execution/session/input-queue.js +1 -1
  115. package/dist/src/execution/session/pending-turn-state.js +1 -1
  116. package/dist/src/execution/session/turn-step.js +1 -1
  117. package/dist/src/execution/session/turn.d.ts +4 -1
  118. package/dist/src/execution/session/turn.js +1 -1
  119. package/dist/src/execution/tasks/steps.d.ts +1 -1
  120. package/dist/src/execution/tasks/steps.js +1 -1
  121. package/dist/src/execution/tool-auth.js +1 -1
  122. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  123. package/dist/src/execution/tools/workflow/answer.d.ts +1 -1
  124. package/dist/src/execution/tools/workflow/withdraw-step.d.ts +2 -2
  125. package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
  126. package/dist/src/execution/workflow-callback-url.d.ts +10 -1
  127. package/dist/src/execution/workflow-callback-url.js +1 -1
  128. package/dist/src/execution/workflow-runtime.js +1 -1
  129. package/dist/src/harness/authorization.d.ts +3 -13
  130. package/dist/src/harness/authorization.js +1 -1
  131. package/dist/src/harness/compaction/step.d.ts +1 -0
  132. package/dist/src/harness/compaction/step.js +1 -1
  133. package/dist/src/harness/coordination.js +1 -1
  134. package/dist/src/harness/execute-tool.d.ts +2 -2
  135. package/dist/src/harness/hitl/approvals.d.ts +1 -1
  136. package/dist/src/harness/hitl/approvals.js +1 -1
  137. package/dist/src/harness/hitl/approved-calls.d.ts +3 -0
  138. package/dist/src/harness/hitl/approved-calls.js +1 -1
  139. package/dist/src/harness/hitl/candidates.d.ts +13 -0
  140. package/dist/src/harness/hitl/candidates.js +1 -1
  141. package/dist/src/harness/hitl/coordinator.js +1 -1
  142. package/dist/src/harness/hitl/index.d.ts +2 -5
  143. package/dist/src/harness/hitl/index.js +1 -1
  144. package/dist/src/harness/hitl/intake.js +1 -1
  145. package/dist/src/harness/{proxy-input-requests.d.ts → hitl/relays.d.ts} +3 -39
  146. package/dist/src/harness/hitl/relays.js +1 -0
  147. package/dist/src/harness/hitl/requests.d.ts +64 -0
  148. package/dist/src/harness/hitl/requests.js +1 -0
  149. package/dist/src/harness/hitl/sign-ins.d.ts +9 -0
  150. package/dist/src/harness/hitl/sign-ins.js +1 -0
  151. package/dist/src/harness/inline-tool-authorization.js +1 -1
  152. package/dist/src/harness/input-extraction.js +1 -1
  153. package/dist/src/harness/model-call/call.js +1 -1
  154. package/dist/src/harness/model-call/model.d.ts +3 -1
  155. package/dist/src/harness/model-call/model.js +1 -1
  156. package/dist/src/harness/session-machine/commit.d.ts +14 -3
  157. package/dist/src/harness/session-machine/commit.js +1 -1
  158. package/dist/src/harness/session-machine/transitions.d.ts +16 -0
  159. package/dist/src/harness/session-machine/transitions.js +1 -1
  160. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  161. package/dist/src/instrumentation/dispatch.js +1 -1
  162. package/dist/src/instrumentation/memory.d.ts +1 -4
  163. package/dist/src/instrumentation/memory.js +1 -1
  164. package/dist/src/instrumentation/principal-summary.js +1 -1
  165. package/dist/src/instrumentation/providers.js +1 -1
  166. package/dist/src/instrumentation/runtime-context.d.ts +1 -1
  167. package/dist/src/instrumentation/runtime.d.ts +4 -3
  168. package/dist/src/instrumentation/runtime.js +1 -1
  169. package/dist/src/instrumentation/session-init.js +1 -1
  170. package/dist/src/internal/application/stamped-package-version.js +1 -1
  171. package/dist/src/internal/authored-definition/approval.d.ts +3 -1
  172. package/dist/src/internal/authored-definition/approval.js +1 -1
  173. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  174. package/dist/src/internal/authored-definition/source-identity.d.ts +6 -0
  175. package/dist/src/internal/authored-definition/source-identity.js +1 -1
  176. package/dist/src/internal/authored-module-map-loader.js +1 -1
  177. package/dist/src/internal/helpers/markdown.js +1 -1
  178. package/dist/src/internal/logging.js +1 -1
  179. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  180. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  181. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
  182. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  183. package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
  184. package/dist/src/internal/workflow/is-inactive-workflow-run-error.d.ts +2 -0
  185. package/dist/src/internal/workflow/is-inactive-workflow-run-error.js +1 -1
  186. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  187. package/dist/src/protocol/baggage.d.ts +1 -0
  188. package/dist/src/protocol/baggage.js +1 -1
  189. package/dist/src/public/channels/slack/hitl.js +1 -1
  190. package/dist/src/public/definitions/approval.d.ts +1 -1
  191. package/dist/src/public/definitions/connections/mcp.js +1 -1
  192. package/dist/src/public/definitions/connections/openapi.js +1 -1
  193. package/dist/src/public/instrumentation/otel.d.ts +2 -2
  194. package/dist/src/public/instrumentation/otel.js +1 -1
  195. package/dist/src/public/sandbox/vercel.d.ts +2 -0
  196. package/dist/src/public/tools/approval/index.d.ts +1 -1
  197. package/dist/src/public/tools/index.d.ts +1 -1
  198. package/dist/src/public/tools/result.d.ts +10 -7
  199. package/dist/src/react/use-eve-agent.d.ts +6 -0
  200. package/dist/src/react/use-eve-agent.js +1 -1
  201. package/dist/src/runtime/authorization-context.d.ts +5 -0
  202. package/dist/src/runtime/authorization-context.js +1 -1
  203. package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
  204. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  205. package/dist/src/runtime/connections/openapi-operations.js +1 -1
  206. package/dist/src/runtime/connections/scoped-authorization.d.ts +6 -0
  207. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  208. package/dist/src/runtime/resolve-connection.js +1 -1
  209. package/dist/src/runtime/resolve-tool.js +1 -1
  210. package/dist/src/runtime/types.d.ts +2 -2
  211. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
  212. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
  213. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
  214. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  215. package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
  216. package/dist/src/self-modification/extension/trace-inspection.js +1 -1
  217. package/dist/src/setup/scaffold/create/project.js +1 -1
  218. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  219. package/dist/src/setup/scaffold/create/web-template.js +18 -10
  220. package/dist/src/shared/git.js +1 -1
  221. package/dist/src/shared/instrumentation-content.d.ts +1 -1
  222. package/dist/src/shared/instrumentation-content.js +1 -1
  223. package/dist/src/shared/instrumentation-decision.d.ts +3 -0
  224. package/dist/src/shared/instrumentation-decision.js +1 -1
  225. package/dist/src/shared/skill-package.js +1 -1
  226. package/dist/src/shared/trace-policy.d.ts +3 -0
  227. package/dist/src/shared/trace-policy.js +1 -1
  228. package/dist/src/subagents/adapter.js +1 -1
  229. package/dist/src/subagents/event-proxy-step.d.ts +1 -1
  230. package/dist/src/subagents/event-proxy-step.js +1 -1
  231. package/dist/src/subagents/hitl-proxy.d.ts +1 -1
  232. package/dist/src/subagents/hitl-proxy.js +1 -1
  233. package/dist/src/svelte/index.js +1 -1
  234. package/dist/src/svelte/use-eve-agent.d.ts +6 -0
  235. package/dist/src/svelte/use-eve-agent.js +1 -1
  236. package/dist/src/tools/definition.d.ts +41 -4
  237. package/dist/src/tools/durable-callbacks.d.ts +5 -3
  238. package/dist/src/tools/durable-callbacks.js +1 -1
  239. package/dist/src/tools/dynamic.d.ts +2 -2
  240. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  241. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  242. package/dist/src/tools/workflow-definition.d.ts +2 -2
  243. package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
  244. package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
  245. package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
  246. package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
  247. package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
  248. package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
  249. package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
  250. package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
  251. package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
  252. package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
  253. package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
  254. package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
  255. package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
  256. package/dist/src/tracing/eve/agent-trace-context.js +1 -0
  257. package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
  258. package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
  259. package/dist/src/tracing/eve/batch-span-processor.js +1 -0
  260. package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
  261. package/dist/src/tracing/eve/content-span-processor.js +1 -0
  262. package/dist/src/tracing/eve/delegation.d.ts +20 -0
  263. package/dist/src/tracing/eve/delegation.js +1 -0
  264. package/dist/src/tracing/eve/gateway.d.ts +17 -0
  265. package/dist/src/tracing/eve/gateway.js +1 -0
  266. package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
  267. package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
  268. package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
  269. package/dist/src/tracing/eve/mcp.d.ts +29 -0
  270. package/dist/src/tracing/eve/mcp.js +1 -0
  271. package/dist/src/tracing/eve/metadata.d.ts +7 -0
  272. package/dist/src/tracing/eve/metadata.js +1 -0
  273. package/dist/src/tracing/eve/operation-input.d.ts +30 -0
  274. package/dist/src/tracing/eve/operation-input.js +1 -0
  275. package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
  276. package/dist/src/tracing/eve/otel-configuration.js +1 -0
  277. package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +13 -19
  278. package/dist/src/tracing/eve/otel-declaration.js +1 -0
  279. package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
  280. package/dist/src/tracing/eve/otel-registration.js +1 -0
  281. package/dist/src/tracing/eve/policy.d.ts +15 -0
  282. package/dist/src/tracing/eve/policy.js +1 -0
  283. package/dist/src/tracing/eve/profile.d.ts +7 -0
  284. package/dist/src/tracing/eve/profile.js +1 -0
  285. package/dist/src/tracing/eve/session.d.ts +27 -0
  286. package/dist/src/tracing/eve/session.js +1 -0
  287. package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
  288. package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
  289. package/dist/src/tracing/local/inspection.d.ts +15 -0
  290. package/dist/src/tracing/local/inspection.js +1 -0
  291. package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
  292. package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
  293. package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
  294. package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
  295. package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
  296. package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
  297. package/dist/src/tracing/local/trace-reader.js +1 -0
  298. package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
  299. package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
  300. package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
  301. package/dist/src/tracing/local/trace-summary.js +1 -0
  302. package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
  303. package/dist/src/tracing/local/traces.js +1 -0
  304. package/dist/src/vue/index.js +1 -1
  305. package/dist/src/vue/use-eve-agent.d.ts +6 -0
  306. package/dist/src/vue/use-eve-agent.js +1 -1
  307. package/docs/agent-config.md +48 -0
  308. package/docs/channels/eve.mdx +2 -0
  309. package/docs/connections/mcp.mdx +22 -1
  310. package/docs/connections/overview.mdx +9 -6
  311. package/docs/evals/assertions.mdx +50 -3
  312. package/docs/evals/overview.mdx +2 -1
  313. package/docs/evals/reporters.mdx +3 -1
  314. package/docs/guides/frontend/overview.mdx +10 -1
  315. package/docs/guides/hooks.md +2 -2
  316. package/docs/guides/instrumentation/otel.mdx +3 -0
  317. package/docs/reference/cli.md +1 -1
  318. package/docs/reference/typescript-api.md +7 -6
  319. package/docs/sandbox/vercel.mdx +9 -0
  320. package/docs/skills.mdx +1 -1
  321. package/docs/tools/human-in-the-loop.md +44 -1
  322. package/package.json +2 -1
  323. package/dist/src/harness/proxy-input-requests.js +0 -1
  324. package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
  325. package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
  326. package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
  327. package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
  328. package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
  329. package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
  330. package/dist/src/tracing/agent-otel-attributes.js +0 -1
  331. package/dist/src/tracing/agent-otel-content.js +0 -4
  332. package/dist/src/tracing/agent-otel-provider.js +0 -2
  333. package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
  334. package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
  335. package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
  336. package/dist/src/tracing/agent-otel-session-context.js +0 -1
  337. package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
  338. package/dist/src/tracing/agent-otel-turn-state.js +0 -1
  339. package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
  340. package/dist/src/tracing/agent-otel-usage.js +0 -1
  341. package/dist/src/tracing/agent-span-contract.d.ts +0 -34
  342. package/dist/src/tracing/agent-span-contract.js +0 -1
  343. package/dist/src/tracing/agent-span-error.js +0 -1
  344. package/dist/src/tracing/agent-span-id-generator.js +0 -1
  345. package/dist/src/tracing/agent-span-naming.d.ts +0 -1
  346. package/dist/src/tracing/agent-span-naming.js +0 -1
  347. package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
  348. package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
  349. package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
  350. package/dist/src/tracing/agent-tool-span-context.js +0 -1
  351. package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
  352. package/dist/src/tracing/agent-trace-context-codec.js +0 -1
  353. package/dist/src/tracing/agent-trace-context-store.js +0 -1
  354. package/dist/src/tracing/agent-trace-context.js +0 -1
  355. package/dist/src/tracing/agent-trace-span-processor.js +0 -1
  356. package/dist/src/tracing/agent-trace-state.d.ts +0 -91
  357. package/dist/src/tracing/batch-span-processor.js +0 -1
  358. package/dist/src/tracing/bounded-error.d.ts +0 -1
  359. package/dist/src/tracing/bounded-error.js +0 -1
  360. package/dist/src/tracing/content-attributes.js +0 -1
  361. package/dist/src/tracing/content-span-processor.js +0 -1
  362. package/dist/src/tracing/error-content-context.d.ts +0 -3
  363. package/dist/src/tracing/error-content-context.js +0 -1
  364. package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
  365. package/dist/src/tracing/invoke-tool-span.js +0 -1
  366. package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
  367. package/dist/src/tracing/local-trace-reader.js +0 -1
  368. package/dist/src/tracing/local-trace-summary.js +0 -1
  369. package/dist/src/tracing/local-traces.js +0 -1
  370. package/dist/src/tracing/otel-declaration.js +0 -1
  371. package/dist/src/tracing/otel-registration.js +0 -1
  372. package/dist/src/tracing/sampled-trace.d.ts +0 -4
  373. package/dist/src/tracing/sampled-trace.js +0 -1
  374. package/dist/src/tracing/suppress-tracing.d.ts +0 -2
  375. package/dist/src/tracing/suppress-tracing.js +0 -1
  376. package/dist/src/tracing/telemetry-budget.d.ts +0 -3
  377. package/dist/src/tracing/telemetry-budget.js +0 -1
  378. /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
  379. /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
  380. /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
  381. /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
  382. /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
  383. /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
  384. /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
  385. /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
  386. /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
  387. /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
  388. /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
  389. /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
  390. /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
  391. /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
  392. /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
  393. /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
  394. /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
  395. /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
  396. /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
  397. /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
@@ -0,0 +1,64 @@
1
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
2
+ import type { HarnessSessionBase, SessionStateMap } from "#harness/types.js";
3
+ import type { DurableApprovalState } from "./candidates.js";
4
+ import { type ProxyInputRequest } from "./relays.js";
5
+ /** Where builds before checkpoint version 15 kept the requests. Only checkpoint upgrades read them. */
6
+ export declare const LEGACY_HITL_STATE_KEYS: {
7
+ readonly approvals: "eve.runtime.hitl.approvalState";
8
+ readonly signIns: "eve.runtime.pendingAuthorization";
9
+ readonly relays: "eve.runtime.proxyInputRequests";
10
+ };
11
+ /**
12
+ * A read-only snapshot of the human-in-the-loop records, the one way code outside `harness/hitl/`
13
+ * reads them.
14
+ */
15
+ export interface HitlState {
16
+ /** The sign-in attempts the session waits on. */
17
+ readonly signIns: readonly AuthorizationChallenge[];
18
+ /** Requests this session relays for a child session or a workflow run, by `requestId`. */
19
+ readonly relays: ReadonlyMap<string, ProxyInputRequest>;
20
+ }
21
+ /** Each record is parsed on first read: most readers want one. */
22
+ export declare function readHitlState(state: SessionStateMap | undefined): HitlState;
23
+ /**
24
+ * Whether the session holds a sign-in or relayed request, or a record of them it can't read.
25
+ * Settling the last one deletes its record; a malformed record that ordinary readers read as
26
+ * empty must not let a session hand off.
27
+ */
28
+ export declare function holdsHitlRequests(state: SessionStateMap | undefined): boolean;
29
+ /** What a session-machine transition changes in these records. */
30
+ export interface HitlStateChange {
31
+ /** Every sign-in the session waits on once the change applies; `[]` withdraws them all. */
32
+ readonly signIns?: readonly AuthorizationChallenge[];
33
+ readonly relays?: RelayChange;
34
+ }
35
+ /** Relay routes a transition records or retires. */
36
+ export interface RelayChange {
37
+ /** A child's fresh batch: it replaces the routes that child's input source held. */
38
+ readonly upsert?: {
39
+ readonly entries: readonly (readonly [requestId: string, route: ProxyInputRequest])[];
40
+ readonly forChildContinuationToken: string;
41
+ readonly inputSource?: string;
42
+ };
43
+ /** Routes whose answers went down to the asker, or whose request closed. */
44
+ readonly retire?: readonly string[];
45
+ }
46
+ /** Writes a transition's change. Production callers are the machine save and its closed-route cleanup. */
47
+ export declare function writeHitlState<T extends {
48
+ readonly state?: SessionStateMap;
49
+ }>(session: T, change: HitlStateChange): T;
50
+ /**
51
+ * Moves the records builds before checkpoint version 15 kept under
52
+ * {@link LEGACY_HITL_STATE_KEYS} into the requests record as they were stored; each reader is as
53
+ * lenient as its old one. Only the checkpoint upgrade calls it.
54
+ */
55
+ export declare function upgradeLegacyHitlState(state: Readonly<Record<string, unknown>>): Record<string, unknown>;
56
+ /** The approval records. Only `candidates.ts` calls it. */
57
+ export declare function readApprovalState(state: SessionStateMap | undefined): DurableApprovalState;
58
+ /** Saves the approval records. Only `candidates.ts` calls it. */
59
+ export declare function writeApprovalState(state: SessionStateMap | undefined, approvalState: DurableApprovalState): SessionStateMap;
60
+ /**
61
+ * Drops what a cleared context owned: sign-in attempts and responders' approval progress. `clear`
62
+ * reported each close; relay routes for live tasks stay.
63
+ */
64
+ export declare function discardClearedHitlState<T extends HarnessSessionBase>(session: T): T;
@@ -0,0 +1 @@
1
+ import{resolveActiveAuthorizationChallenges}from"./sign-ins.js";import{parseProxyInputRequest}from"./relays.js";import{isObject}from"#shared/guards.js";const REQUESTS_KEY=`eve.runtime.hitl.requests`,LEGACY_HITL_STATE_KEYS={approvals:`eve.runtime.hitl.approvalState`,signIns:`eve.runtime.pendingAuthorization`,relays:`eve.runtime.proxyInputRequests`};function readHitlState(e){let t,n;return{get signIns(){return t??=readSignIns(e)},get relays(){return n??=new Map(Object.entries(readRelays(e)))}}}function holdsHitlRequests(e){let t=e?.[REQUESTS_KEY];if(t===void 0)return!1;if(!isObject(t)||Array.isArray(t))return!0;let{signIns:n,relays:r}=t;return n!==void 0||r!==void 0&&(!isObject(r)||Object.keys(r).length>0)}function writeHitlState(e,t){let n=e.state;return t.signIns!==void 0&&(n=writeSignIns(n,resolveActiveAuthorizationChallenges(t.signIns))),t.relays?.upsert!==void 0&&(n=upsertRelays(n,t.relays.upsert)),t.relays?.retire!==void 0&&(n=retireRelays(n,t.relays.retire)),n===e.state?e:{...e,state:n}}function readRequests(e){let t=e?.[REQUESTS_KEY];return isObject(t)?t:{}}function writeRequests(e,t,n){let{[t]:r,...i}=readRequests(e);if(r===void 0&&n===void 0)return e;let a=n===void 0?i:{...i,[t]:n},{[REQUESTS_KEY]:o,...s}=e??{};return Object.keys(a).length>0?{...s,[REQUESTS_KEY]:a}:Object.keys(s).length>0?s:void 0}function upgradeLegacyHitlState(e){let{[LEGACY_HITL_STATE_KEYS.approvals]:t,[LEGACY_HITL_STATE_KEYS.signIns]:n,[LEGACY_HITL_STATE_KEYS.relays]:r,...i}=e,a=i;a=writeRequests(a,`approvals`,t),a=writeRequests(a,`signIns`,isObject(n)&&n.challenges!==void 0?n.challenges:n);let o=isObject(r)&&Object.keys(r).length===0;return a=writeRequests(a,`relays`,o?void 0:r),a??{}}function readActiveCandidates(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,{...t,decision:t.decision===`cancel`?`cancel`:`approve`}]))}function readApprovalState(e){let t=readRequests(e).approvals;if(typeof t!=`object`||!t)return{activeCandidates:{},candidateHistory:[],nextCandidateSequence:0,settlements:{}};let n=t;return{activeCandidates:typeof n.activeCandidates==`object`&&n.activeCandidates!==null?readActiveCandidates(n.activeCandidates):{},candidateHistory:Array.isArray(n.candidateHistory)?n.candidateHistory:[],nextCandidateSequence:typeof n.nextCandidateSequence==`number`&&Number.isSafeInteger(n.nextCandidateSequence)&&n.nextCandidateSequence>=0?n.nextCandidateSequence:deriveNextCandidateSequence(n),settlements:typeof n.settlements==`object`&&n.settlements!==null?n.settlements:{}}}function deriveNextCandidateSequence(e){return Object.keys(e.activeCandidates??{}).length+(Array.isArray(e.candidateHistory)?e.candidateHistory.length:0)}function writeApprovalState(e,t){return writeRequests(e,`approvals`,t)??{}}function discardClearedHitlState(e){let t=writeRequests(writeSignIns(e.state,[]),`approvals`,void 0);return{...e,state:t}}function readSignIns(e){let t=readRequests(e).signIns;return Array.isArray(t)?t:[]}function writeSignIns(e,t){return writeRequests(e,`signIns`,t.length>0?t:void 0)}function readRelays(e){let t=readRequests(e).relays;if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=parseProxyInputRequest(r,e);t!==void 0&&(n[e]=t)}return n}function writeRelays(e,t){return writeRequests(e,`relays`,Object.keys(t).length>0?t:void 0)}function upsertRelays(e,t){let n=Object.entries(readRelays(e)).filter(([,e])=>e.childContinuationToken!==t.forChildContinuationToken||e.inputSource!==t.inputSource);return writeRelays(e,Object.fromEntries([...n,...t.entries]))}function retireRelays(e,t){let n=readRelays(e);return t.some(e=>Object.hasOwn(n,e))?writeRelays(e,Object.fromEntries(Object.entries(n).filter(([e])=>!t.includes(e)))):e}export{LEGACY_HITL_STATE_KEYS,discardClearedHitlState,holdsHitlRequests,readApprovalState,readHitlState,upgradeLegacyHitlState,writeApprovalState,writeHitlState};
@@ -0,0 +1,9 @@
1
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
2
+ /** The pending sign-ins once `challenges` are asked for: each replaces the attempt it supersedes. */
3
+ export declare function withSignIns(previous: readonly AuthorizationChallenge[], challenges: readonly AuthorizationChallenge[]): readonly AuthorizationChallenge[];
4
+ /** Keeps the last challenge for each sign-in and principal. */
5
+ export declare function resolveActiveAuthorizationChallenges(challenges: readonly AuthorizationChallenge[]): readonly AuthorizationChallenge[];
6
+ /** The attempts in `previous` that `replacements` replace: the same sign-in and principal. */
7
+ export declare function supersededChallenges(previous: readonly AuthorizationChallenge[], replacements: readonly AuthorizationChallenge[]): readonly AuthorizationChallenge[];
8
+ /** The key a sign-in callback names its attempt by. */
9
+ export declare function signInAttemptKey(challenge: AuthorizationChallenge): string;
@@ -0,0 +1 @@
1
+ function withSignIns(e,t){let n=resolveActiveAuthorizationChallenges(t),r=supersededChallenges(e,n);return[...e.filter(e=>!r.includes(e)),...n]}function resolveActiveAuthorizationChallenges(e){return e.filter((t,n)=>!e.slice(n+1).some(e=>sameSignIn(t,e)))}function supersededChallenges(e,t){return e.filter(e=>t.some(t=>sameSignIn(e,t)))}function sameSignIn(e,t){let n=e.grant!==void 0&&e.grant===t.grant&&e.candidateId===t.candidateId;return(e.name===t.name||n)&&samePrincipal(e.principal,t.principal)}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function signInAttemptKey(e){return e.attemptId??e.candidateId??e.name}export{resolveActiveAuthorizationChallenges,signInAttemptKey,supersededChallenges,withSignIns};
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput,resolveActiveAuthorizationChallenges}from"#harness/authorization.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";function isInlineAuthorizationToolResult(e){return isPendingAuthorizationToolOutput(e.output)||readAuthorizationSignal(e)!==void 0}function resolveInlineAuthorizationInterrupt(e){let t=[],n=new Set,r=new Map;for(let i of e.toolResults??[]){let e=readAuthorizationSignal(i);if(e!==void 0){t.push(e),n.add(i.toolCallId);for(let t of e.challenges){let e=r.get(t.name)??[];r.set(t.name,[...e,i.toolCallId])}}}if(t.length!==0)return{callIdsByName:r,challenges:resolveActiveAuthorizationChallenges(t.flatMap(e=>e.challenges)),history:withoutCalls(e.messages,n)}}function readAuthorizationSignal(e){let t=contextStorage.getStore(),n=t===void 0?void 0:readToolInterrupt(t,e.toolCallId);return n!==void 0&&isAuthorizationSignal(n)?n:isAuthorizationSignal(e.output)?e.output:void 0}function withoutCalls(e,t){return e.flatMap(e=>{if(e.role===`assistant`&&Array.isArray(e.content)){let n=e.content.some(e=>e.type===`tool-call`&&t.has(e.toolCallId)),r=e.content.filter(e=>e.type!==`tool-call`||!t.has(e.toolCallId)),i=r.some(e=>e.type===`tool-call`);return r.length===0||n&&!i?[]:[{...e,content:r}]}if(e.role===`tool`){let n=e.content.filter(e=>e.type!==`tool-result`||!t.has(e.toolCallId));return n.length===0?[]:[{...e,content:n}]}return[e]})}export{isInlineAuthorizationToolResult,resolveInlineAuthorizationInterrupt,withoutCalls};
1
+ import{contextStorage}from"#context/container.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{resolveActiveAuthorizationChallenges}from"#harness/hitl/sign-ins.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";function isInlineAuthorizationToolResult(e){return isPendingAuthorizationToolOutput(e.output)||readAuthorizationSignal(e)!==void 0}function resolveInlineAuthorizationInterrupt(e){let t=[],n=new Set,r=new Map;for(let i of e.toolResults??[]){let e=readAuthorizationSignal(i);if(e!==void 0){t.push(e),n.add(i.toolCallId);for(let t of e.challenges){let e=r.get(t.name)??[];r.set(t.name,[...e,i.toolCallId])}}}if(t.length!==0)return{callIdsByName:r,challenges:resolveActiveAuthorizationChallenges(t.flatMap(e=>e.challenges)),history:withoutCalls(e.messages,n)}}function readAuthorizationSignal(e){let t=contextStorage.getStore(),n=t===void 0?void 0:readToolInterrupt(t,e.toolCallId);return n!==void 0&&isAuthorizationSignal(n)?n:isAuthorizationSignal(e.output)?e.output:void 0}function withoutCalls(e,t){return e.flatMap(e=>{if(e.role===`assistant`&&Array.isArray(e.content)){let n=e.content.some(e=>e.type===`tool-call`&&t.has(e.toolCallId)),r=e.content.filter(e=>e.type!==`tool-call`||!t.has(e.toolCallId)),i=r.some(e=>e.type===`tool-call`);return r.length===0||n&&!i?[]:[{...e,content:r}]}if(e.role===`tool`){let n=e.content.filter(e=>e.type!==`tool-result`||!t.has(e.toolCallId));return n.length===0?[]:[{...e,content:n}]}return[e]})}export{isInlineAuthorizationToolResult,resolveInlineAuthorizationInterrupt,withoutCalls};
@@ -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{buildGatewayAttributionHeaders}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{emitStreamContent}from"#harness/emission.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry()}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:a,onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){if(i.interrupted?await d?.complete():await d?.fail(e),i.check(),isAbortError(e)&&!i.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,f.length>0||p.length>0);let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
1
+ import{buildGatewayAttributionHeaders,withGatewayTraceContext}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,ModelStreamStalledError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{emitStreamContent}from"#harness/emission.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`),MODEL_OUTPUT_TIMEOUT_MS=6e5;var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry(),traceContextHeaders:n.instrumentation?.gatewayTraceContextHeaders}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:withGatewayTraceContext(a,this.profile,this.step.instrumentation?.gatewayTraceContextHeaders),onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),timeout:{chunkMs:MODEL_OUTPUT_TIMEOUT_MS,firstChunkMs:MODEL_OUTPUT_TIMEOUT_MS},toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){if(i.interrupted?await d?.complete():await d?.fail(e),i.check(),isAbortError(e)&&!i.signal.aborted)throw new ModelStreamStalledError({cause:e});return rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,f.length>0||p.length>0);let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n)throw new EmptyModelResponseError}function isAbortError(e){return e instanceof Error&&(e.name===`AbortError`||e.name===`TimeoutError`)}export{ModelCaller};
@@ -1,4 +1,4 @@
1
- import type { LanguageModel } from "ai";
1
+ import { type LanguageModel } from "ai";
2
2
  import type { HarnessSession, ToolLoopHarnessConfig } from "#harness/types.js";
3
3
  import { contextStorage } from "#context/container.js";
4
4
  import type { ModelProfile } from "#harness/model-profile.js";
@@ -7,6 +7,8 @@ import type { ModelProfile } from "#harness/model-profile.js";
7
7
  * Gateway-routed model. Direct-provider models receive no Gateway-specific headers.
8
8
  */
9
9
  export declare function buildGatewayAttributionHeaders(profile: ModelProfile, runtimeIdentity: ToolLoopHarnessConfig["runtimeIdentity"]): Record<string, string> | undefined;
10
+ /** Injects the active model-call context when a Gateway request reaches the provider boundary. */
11
+ export declare function withGatewayTraceContext(model: LanguageModel, profile: ModelProfile, createTraceContextHeaders?: () => Record<string, string> | undefined): LanguageModel;
10
12
  export declare function resolveEffectiveRuntimeModel(input: {
11
13
  readonly config: ToolLoopHarnessConfig;
12
14
  readonly ctx: ReturnType<typeof contextStorage.getStore>;
@@ -1 +1 @@
1
- import"#context/container.js";import{appendPackageUserAgent}from"#internal/user-agent.js";import{getEffectiveModelSelection}from"#context/effective-model.js";function buildGatewayAttributionHeaders(e,t){if(!e.gateway)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0,a=Object.fromEntries(appendPackageUserAgent(new Headers));return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}async function resolveEffectiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getEffectiveModelSelection(e.ctx);if(t===null)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return e.agent.modelReference===t?e:{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}export{buildGatewayAttributionHeaders,resolveEffectiveRuntimeModel};
1
+ import{gateway,wrapLanguageModel}from"ai";import"#context/container.js";import{appendPackageUserAgent}from"#internal/user-agent.js";import{getEffectiveModelSelection}from"#context/effective-model.js";function buildGatewayAttributionHeaders(e,t){if(!e.gateway)return;let n=t?.agentName??t?.agentId,r=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,i=r?`https://${r}`:void 0,a=Object.fromEntries(appendPackageUserAgent(new Headers));return n&&(a[`x-title`]=n),i&&(a[`http-referer`]=i),a}function withGatewayTraceContext(e,t,n){if(!t.gateway||n===void 0)return e;let r=globalThis.AI_SDK_DEFAULT_PROVIDER??gateway;if(typeof e==`string`&&typeof r.languageModel!=`function`)return e;let i=typeof e==`string`?r.languageModel(e):e;return i.provider.split(`.`)[0]===`gateway`?wrapLanguageModel({model:i,middleware:{async transformParams({params:e}){let t=n();return t===void 0?e:{...e,headers:{...e.headers,...t}}}}}):e}async function resolveEffectiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getEffectiveModelSelection(e.ctx);if(t===null)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return e.agent.modelReference===t?e:{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}export{buildGatewayAttributionHeaders,resolveEffectiveRuntimeModel,withGatewayTraceContext};
@@ -1,11 +1,12 @@
1
1
  import type { ModelMessage } from "ai";
2
- import { type AuthorizationChallenge } from "#harness/authorization.js";
2
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
3
3
  import type { HarnessSessionBase, SessionStateMap } from "#harness/types.js";
4
4
  import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
5
5
  import type { SessionProjection } from "#protocol/session-projection.js";
6
+ import { type RelayChange } from "#harness/hitl/requests.js";
6
7
  import { type TurnState } from "./state.js";
7
8
  import type { SessionView } from "./view.js";
8
- /** What a transition returns. Nothing else changes session state. */
9
+ /** What a machine transition returns; approval storage still has direct writers. */
9
10
  export interface Transition {
10
11
  readonly turn: TurnState;
11
12
  readonly events: readonly UnstampedMessageStreamEvent[];
@@ -15,6 +16,8 @@ export interface Transition {
15
16
  readonly clearsHistory?: true;
16
17
  /** Every sign-in the session waits on once the transition applies; `[]` withdraws them all. */
17
18
  readonly signIns?: readonly AuthorizationChallenge[];
19
+ /** Relay routes the transition records or retires. */
20
+ readonly relays?: RelayChange;
18
21
  }
19
22
  /** Publishes one event; `messages` is the conversation hooks see with it. */
20
23
  export type Publish = (event: UnstampedMessageStreamEvent, messages?: readonly ModelMessage[]) => Promise<void>;
@@ -23,6 +26,14 @@ export declare function sessionView(projection: SessionProjection, state: Sessio
23
26
  * Publishes a transition's events, then saves what it changed. A transition that changes history
24
27
  * needs a session restored with it.
25
28
  */
26
- export declare function applyTransition<T extends HarnessSessionBase>(session: T, transition: Transition, publish: Publish, messages?: readonly ModelMessage[]): Promise<T>;
29
+ export declare function applyTransition<T extends {
30
+ readonly state?: SessionStateMap;
31
+ }>(session: T, transition: Transition, publish: Publish, messages?: readonly ModelMessage[]): Promise<T>;
32
+ /** Publishes a transition's events, in order. */
33
+ export declare function publishTransition(transition: Transition, publish: Publish, messages?: readonly ModelMessage[]): Promise<void>;
34
+ /** Saves what a transition changes once its events are published. */
35
+ export declare function saveTransition<T extends {
36
+ readonly state?: SessionStateMap;
37
+ }>(session: T, transition: Transition): T;
27
38
  /** Drops the private records whose owner the projection shows closed. */
28
39
  export declare function dropClosedRecords<T extends HarnessSessionBase>(session: T, projection: SessionProjection): T;
@@ -1 +1 @@
1
- import{readTurnState,writeTurnState}from"./state.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{getSessionUsage}from"#harness/turn-tag-state.js";import{clearPendingAuthorization,getPendingAuthorization,setPendingAuthorization}from"#harness/authorization.js";import{clearProxyInputRequestsWhere,getProxyInputRequests}from"#harness/proxy-input-requests.js";function sessionView(e,t){return{projection:e,relayedRequestIds:new Set(getProxyInputRequests(t).keys()),signIns:getPendingAuthorization(t)?.challenges??[],turn:readTurnState(t),usage:getSessionUsage({state:t})}}const READS_HISTORY=new Set([`turn.started`,`step.started`,`turn.completed`]);async function applyTransition(e,t,n,r){for(let e of t.events)await n(e,READS_HISTORY.has(e.type)?r:void 0);let i=t.signIns===void 0?e.state:t.signIns.length===0?clearPendingAuthorization(e.state):setPendingAuthorization(clearPendingAuthorization(e.state),{challenges:t.signIns}),a=writeTurnState({...e,state:i},t.turn),o=t.commit??[];if(t.clearsHistory!==!0&&o.length===0)return a;if(!(`history`in e))throw Error(`A transition that changes history needs the session's history.`);let{history:s}=e,c=t.clearsHistory?[]:validateHarnessModelMessages([...s,...o]);return{...a,history:c}}function dropClosedRecords(e,t){return clearProxyInputRequestsWhere(e,(e,n)=>{let r=t.inputs[n];return r===void 0||r.status===`settled`})}export{applyTransition,dropClosedRecords,sessionView};
1
+ import{readTurnState,writeTurnState}from"./state.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{getSessionUsage}from"#harness/turn-tag-state.js";import{readHitlState,writeHitlState}from"#harness/hitl/requests.js";function sessionView(e,t){let n=readHitlState(t);return{projection:e,relayedRequestIds:new Set(n.relays.keys()),signIns:n.signIns,turn:readTurnState(t),usage:getSessionUsage({state:t})}}const READS_HISTORY=new Set([`turn.started`,`step.started`,`turn.completed`]);async function applyTransition(e,t,n,r){return await publishTransition(t,n,r),saveTransition(e,t)}async function publishTransition(e,t,n){for(let r of e.events)await t(r,READS_HISTORY.has(r.type)?n:void 0)}function saveTransition(e,t){let n=writeTurnState(writeHitlState(e,t),t.turn),r=t.commit??[];if(t.clearsHistory!==!0&&r.length===0)return n;if(!(`history`in e))throw Error(`A transition that changes history needs the session's history.`);let{history:i}=e,a=t.clearsHistory?[]:validateHarnessModelMessages([...i,...r]);return{...n,history:a}}function dropClosedRecords(e,t){let n=[...readHitlState(e.state).relays.keys()].filter(e=>{let n=t.inputs[e];return n===void 0||n.status===`settled`});return writeHitlState(e,{relays:{retire:n}})}export{applyTransition,dropClosedRecords,publishTransition,saveTransition,sessionView};
@@ -7,6 +7,7 @@ import type { InputRequest } from "#shared/input.js";
7
7
  import type { JsonObject, JsonValue } from "#shared/json.js";
8
8
  import type { TokenUsage } from "#shared/token-usage.js";
9
9
  import type { Transition } from "./commit.js";
10
+ import { type WorkflowAskRoute } from "#harness/hitl/relays.js";
10
11
  import type { StepCoordinates, SuspendedStep, TurnState } from "./state.js";
11
12
  import { type SessionView } from "./view.js";
12
13
  type ToolResponsePart = Extract<ModelMessage, {
@@ -155,6 +156,9 @@ export declare function finishRun(view: SessionView, run: {
155
156
  export declare function relay(view: SessionView, input: {
156
157
  readonly payload: SubagentInputRequestHookPayload | SubagentAuthorizationEventHookPayload;
157
158
  readonly replacedRequestIds?: Iterable<string>;
159
+ /** The workflow tool run that relays the request, and the hook its `ctx.ask()` answers reach. */
160
+ readonly runId?: string;
161
+ readonly workflowAsk?: WorkflowAskRoute;
158
162
  }): Transition;
159
163
  /**
160
164
  * Answers to relayed requests are on their way to the asker: each request resolves here.
@@ -169,6 +173,11 @@ export declare function routeAnswer(view: SessionView, input: {
169
173
  readonly event: StepCoordinates;
170
174
  readonly resolutions: readonly InputResolution[];
171
175
  }[];
176
+ /**
177
+ * Answers left other relayed requests pending, and nothing for the turn itself: the open
178
+ * turn stays held, as after a partial approval answer.
179
+ */
180
+ readonly holds?: boolean;
172
181
  }): Transition;
173
182
  /**
174
183
  * A workflow run's sign-in, reported to the session that owns the run, which relays it. Built
@@ -180,6 +189,13 @@ export declare function runSignIn(from: {
180
189
  readonly taskId?: string;
181
190
  readonly turnId: string;
182
191
  }, challenge: AuthorizationChallenge, outcome?: "authorized" | "failed"): import("#protocol/message.js").AuthorizationCompletedStreamEvent | import("#protocol/message.js").AuthorizationRequiredStreamEvent;
192
+ /**
193
+ * Sign-in callbacks matched the attempts `attemptIds` name: the session stops waiting on them.
194
+ * Their completions report once the turn they resume runs (`completeSignIn`).
195
+ */
196
+ export declare function matchSignIns(view: SessionView, input: {
197
+ readonly attemptIds: readonly string[];
198
+ }): Transition;
183
199
  /** Sign-in callbacks arrived: each completion is reported at the coordinates of the turn that asked. */
184
200
  export declare function completeSignIn(view: SessionView, input: {
185
201
  readonly completions: readonly AuthorizationChallenge[];
@@ -1 +1 @@
1
- import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({predecessor:t.predecessor,runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t,l=t.terminal!==void 0;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,terminal:l,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
1
+ import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{toProxyInputRequestEntries}from"#harness/hitl/relays.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";import{signInAttemptKey}from"#harness/hitl/sign-ins.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({predecessor:t.predecessor,runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t,l=t.terminal!==void 0;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,terminal:l,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}if(r.push(...hold(e,{on:`input`}).events),n.kind!==`subagent-input-request`)return unchanged(e,r);let i=toProxyInputRequestEntries(n).map(([e,n])=>[e,{...n,...t.workflowAsk!==void 0&&{workflowAsk:t.workflowAsk},...t.runId!==void 0&&{runId:t.runId}}]);return{...unchanged(e,r),relays:{upsert:{entries:i,forChildContinuationToken:n.childContinuationToken,inputSource:n.inputSource}}}}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));t.holds===!0&&n.push(...hold(e,{on:`input`}).events);let r=t.children.flatMap(e=>e.resolutions.map(e=>e.requestId));return{...unchanged(e,n),...r.length>0&&{relays:{retire:r}}}}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function matchSignIns(e,t){let n=new Set(t.attemptIds);return{...unchanged(e,[]),signIns:e.signIns.filter(e=>!n.has(signInAttemptKey(e)))}}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,matchSignIns,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
@@ -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};
@@ -1 +1 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#instrumentation/state.js";import{withInstrumentationDecision,withoutInstrumentationContent}from"#instrumentation/content.js";import{resolveTracePolicy}from"#shared/trace-policy.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=[...r.serialBefore,...r.parallel,...r.serialAfter],a=new Set;function forTrace(e){let t=new WeakMap,o=new Map(i.map(t=>[t,resolveTracePolicy(t.tracePolicy,e,e=>{a.has(t)||(a.add(t),log.warn(`instrumentation provider trace policy failed`,{error:formatError(e),provider:t.name}))})])),s=[...o.values()].some(e=>e.action===`record`&&e.recordInputs),c=[...o.values()].some(e=>e.action===`record`&&e.recordOutputs),l=s||c,publish=async e=>{let i=snapshotInstrumentationEvent(withInstrumentationDecision(e,{action:`record`,recordInputs:s,recordOutputs:c}),t,e),a=i.type===`session.completed`||i.type===`session.failed`,l=i.type===`turn.cancelled`||i.type===`turn.failed`;if(a||l){let e=takeInstrumentationActionScopes(i.sessionId,l?i.turnId:void 0),t=terminalActionFailure(i);for(let n of e)await publish({...t,idempotencyKey:n.idempotencyKey,scope:n.scope,type:`tool.call.failed`})}let u=new Map,visibleEvent=e=>{let t=o.get(e);if(t===void 0||t.action===`drop`)return withoutInstrumentationContent(i);if(t.recordInputs&&t.recordOutputs)return i;let n=`${String(t.recordInputs)}:${String(t.recordOutputs)}`,r=u.get(n);return r===void 0&&(r=withInstrumentationDecision(i,t),u.set(n,r)),r},admitted=e=>o.get(e)?.action===`record`;try{try{for(let e of r.serialBefore)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e));let e=r.parallel.filter(admitted);if(e.length===1){let t=e[0];await dispatchToProvider(t,i,n,()=>visibleEvent(t))}else if(e.length>1){let t=(await Promise.allSettled(e.map(e=>dispatchToProvider(e,i,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(t!==void 0)throw t.reason}}finally{for(let e of r.serialAfter)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e))}}finally{releaseTerminalState(i)}};return{capturesContent:l,capturesInputs:s,capturesOutputs:c,forTrace,publish}}let o=!1;return{capturesContent:!1,forTrace,async publish(e){o||(o=!0,log.debug(`instrumentation event published without trace binding`,{eventType:e.type}))}}}function snapshotInstrumentationEvent(e,t,n){let r=t.get(n);if(r!==void 0)return r;let i=snapshotPlainValue(e,t);return t.set(n,i),i}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,t,n,r){let i=t.type.endsWith(`.started`)||t.type===`input.requested`,a=stateOwner(t),o=e.name,s=e.stateNamespace??o;if(isInstrumentationStateAbandoned(s,t.idempotencyKey))return;let c=e.events?.[t.type];if(c===void 0)return;let l=instrumentationStateSlot(s,t.idempotencyKey,a);try{await withTimeout(async()=>{let t=r();await c(e.projectEvent===void 0?t:await e.projectEvent(t),{state:l})},n,()=>{l.revoke(),i&&abandonInstrumentationState(s,t.idempotencyKey,a)})||log.warn(`instrumentation provider timed out`,{boundary:t.type,provider:o,timeoutMs:n})}catch(e){log.warn(`instrumentation provider failed`,{boundary:t.type,error:formatError(e),provider:o})}finally{l.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`||e.type===`memory.operation.started`||e.type===`memory.operation.completed`||e.type===`memory.operation.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`tool.call.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};
1
+ import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#instrumentation/state.js";import{resolveTracePolicy}from"#shared/trace-policy.js";import{withInstrumentationDecision,withoutInstrumentationContent}from"#instrumentation/content.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=[...r.serialBefore,...r.parallel,...r.serialAfter],a=new Set;function forTrace(e){let t=new WeakMap,o=new Map(i.map(t=>[t,resolveTracePolicy(t.tracePolicy,e,e=>{a.has(t)||(a.add(t),log.warn(`instrumentation provider trace policy failed`,{error:formatError(e),provider:t.name}))})])),s=[...o.values()].some(e=>e.action===`record`&&e.recordInputs),c=[...o.values()].some(e=>e.action===`record`&&e.recordOutputs),l=s||c,publish=async e=>{let i=snapshotInstrumentationEvent(withInstrumentationDecision(e,{action:`record`,recordInputs:s,recordOutputs:c}),t,e),a=i.type===`session.completed`||i.type===`session.failed`,l=i.type===`turn.cancelled`||i.type===`turn.failed`;if(a||l){let e=takeInstrumentationActionScopes(i.sessionId,l?i.turnId:void 0),t=terminalActionFailure(i);for(let n of e)await publish({...t,idempotencyKey:n.idempotencyKey,scope:n.scope,type:`tool.call.failed`})}let u=new Map,visibleEvent=e=>{let t=o.get(e);if(t===void 0||t.action===`drop`)return withoutInstrumentationContent(i);if(t.recordInputs&&t.recordOutputs)return i;let n=`${String(t.recordInputs)}:${String(t.recordOutputs)}`,r=u.get(n);return r===void 0&&(r=withInstrumentationDecision(i,t),u.set(n,r)),r},admitted=e=>o.get(e)?.action===`record`;try{try{for(let e of r.serialBefore)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e));let e=r.parallel.filter(admitted);if(e.length===1){let t=e[0];await dispatchToProvider(t,i,n,()=>visibleEvent(t))}else if(e.length>1){let t=(await Promise.allSettled(e.map(e=>dispatchToProvider(e,i,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(t!==void 0)throw t.reason}}finally{for(let e of r.serialAfter)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e))}}finally{releaseTerminalState(i)}};return{capturesContent:l,capturesInputs:s,capturesOutputs:c,forTrace,publish}}let o=!1;return{capturesContent:!1,forTrace,async publish(e){o||(o=!0,log.debug(`instrumentation event published without trace binding`,{eventType:e.type}))}}}function snapshotInstrumentationEvent(e,t,n){let r=t.get(n);if(r!==void 0)return r;let i=snapshotPlainValue(e,t);return t.set(n,i),i}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,t,n,r){let i=t.type.endsWith(`.started`)||t.type===`input.requested`,a=stateOwner(t),o=e.name,s=e.stateNamespace??o;if(isInstrumentationStateAbandoned(s,t.idempotencyKey))return;let c=e.events?.[t.type];if(c===void 0)return;let l=instrumentationStateSlot(s,t.idempotencyKey,a);try{await withTimeout(async()=>{let t=r();await c(e.projectEvent===void 0?t:await e.projectEvent(t),{state:l})},n,()=>{l.revoke(),i&&abandonInstrumentationState(s,t.idempotencyKey,a)})||log.warn(`instrumentation provider timed out`,{boundary:t.type,provider:o,timeoutMs:n})}catch(e){log.warn(`instrumentation provider failed`,{boundary:t.type,error:formatError(e),provider:o})}finally{l.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`||e.type===`memory.operation.started`||e.type===`memory.operation.completed`||e.type===`memory.operation.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`tool.call.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};
@@ -45,10 +45,7 @@ export interface InstrumentationMemoryOperationFailedEvent extends Instrumentati
45
45
  readonly error?: unknown;
46
46
  }
47
47
  export type InstrumentationMemoryOperationTerminalEvent = InstrumentationMemoryOperationCompletedEvent | InstrumentationMemoryOperationFailedEvent;
48
- export interface InstrumentationMemoryExecutionOperation {
49
- readonly idempotencyKey: string;
50
- readonly sessionId: string;
51
- readonly turnId?: string;
48
+ export interface InstrumentationMemoryExecutionOperation extends InstrumentationMemoryOperationEvent {
52
49
  readonly type: "memory.operation";
53
50
  }
54
51
  /** The terminal details a memory operation reports to instrumentation. */
@@ -1 +1 @@
1
- function createMemoryInstrumentation(e){return{async execute(t,n){let{hooks:r,rootSessionId:i,traceSessionId:a}=e.resolveContext(),o={...t,rootSessionId:i,traceSessionId:a,sessionId:e.sessionId};await r.publish({...o,type:`memory.operation.started`});try{let i=await e.runInContext({idempotencyKey:t.idempotencyKey,sessionId:e.sessionId,turnId:t.turnId,type:`memory.operation`},n);return await r.publish({...o,outputRecords:i.outputRecords,recordCount:i.recordCount,type:`memory.operation.completed`}),i.value}catch(e){throw await r.publish({...o,error:e,type:`memory.operation.failed`}),e}}}}async function instrumentMemoryOperation(e,t,n){return e===void 0?(await n()).value:await e.execute(typeof t==`function`?t():t,n)}export{createMemoryInstrumentation,instrumentMemoryOperation};
1
+ function createMemoryInstrumentation(e){return{async execute(t,n){let{hooks:r,rootSessionId:i,traceSessionId:a}=e.resolveContext(),o={...t,rootSessionId:i,traceSessionId:a,sessionId:e.sessionId};await r.publish({...o,type:`memory.operation.started`});try{let t=await e.runInContext({...o,type:`memory.operation`},n);return await r.publish({...o,outputRecords:t.outputRecords,recordCount:t.recordCount,type:`memory.operation.completed`}),t.value}catch(e){throw await r.publish({...o,error:e,type:`memory.operation.failed`}),e}}}}async function instrumentMemoryOperation(e,t,n){return e===void 0?(await n()).value:await e.execute(typeof t==`function`?t():t,n)}export{createMemoryInstrumentation,instrumentMemoryOperation};
@@ -1 +1 @@
1
- import{AuthKey,InitiatorAuthKey}from"#context/keys.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isInstrumentationPrincipalType}from"#instrumentation/lifecycle.js";import{resolveTracePolicyDecision}from"#shared/trace-policy.js";import{boundedPrincipalId}from"#tracing/telemetry-budget.js";function summarizeInstrumentationPrincipal(e,t){if(e===void 0)return;if(e===null)return{type:`none`};let n=isInstrumentationPrincipalType(e.principalType)&&e.principalType!==`none`?e.principalType:`other`,r=shouldCaptureInstrumentationContent(t)?boundedPrincipalId(e.principalId):void 0;return r===void 0?{type:n}:{id:r,type:n}}function applyPrincipalTraceDecision(e,t){if(e!==void 0)return e.type!==`none`&&t?.action===`record`&&t.recordInputs&&t.recordOutputs?e:{type:e.type}}function readInstrumentationPrincipals(e,t,n=resolveTracePolicyDecision(!0,t)){return{currentPrincipal:applyPrincipalTraceDecision(summarizeInstrumentationPrincipal(e.get(AuthKey),t),n),initiatorPrincipal:applyPrincipalTraceDecision(summarizeInstrumentationPrincipal(e.get(InitiatorAuthKey),t),n)}}export{applyPrincipalTraceDecision,readInstrumentationPrincipals,summarizeInstrumentationPrincipal};
1
+ import{AuthKey,InitiatorAuthKey}from"#context/keys.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{resolveTracePolicyDecision}from"#shared/trace-policy.js";import{isInstrumentationPrincipalType}from"#instrumentation/lifecycle.js";import{boundedPrincipalId}from"#compiled/@eve/tracing/otel.js";function summarizeInstrumentationPrincipal(e,t){if(e===void 0)return;if(e===null)return{type:`none`};let n=isInstrumentationPrincipalType(e.principalType)&&e.principalType!==`none`?e.principalType:`other`,r=shouldCaptureInstrumentationContent(t)?boundedPrincipalId(e.principalId):void 0;return r===void 0?{type:n}:{id:r,type:n}}function applyPrincipalTraceDecision(e,t){if(e!==void 0)return e.type!==`none`&&t?.action===`record`&&t.recordInputs&&t.recordOutputs?e:{type:e.type}}function readInstrumentationPrincipals(e,t,n=resolveTracePolicyDecision(!0,t)){return{currentPrincipal:applyPrincipalTraceDecision(summarizeInstrumentationPrincipal(e.get(AuthKey),t),n),initiatorPrincipal:applyPrincipalTraceDecision(summarizeInstrumentationPrincipal(e.get(InitiatorAuthKey),t),n)}}export{applyPrincipalTraceDecision,readInstrumentationPrincipals,summarizeInstrumentationPrincipal};
@@ -1 +1 @@
1
- import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{getInstrumentationRuntime}from"#instrumentation/runtime.js";import{DEVELOPMENT_WORKER_APP_ROOT_ENV}from"#internal/workflow/development-world-protocol.js";import{createInstrumentationSetupContext}from"#instrumentation/setup-context.js";import{agentRuns,localTraces}from"#public/instrumentation/otel.js";import{installInstrumentationRuntime}from"#tracing/install-instrumentation-runtime.js";import{collectOtelPipeline}from"#tracing/otel-declaration.js";import{isInstrumentationDisabled,isInstrumentationProvider}from"#public/instrumentation/provider.js";const INSTRUMENTATION_PROVIDERS_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-providers`),globalContainer=globalThis;function providerRegistry(){let e=globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY];if(e!==void 0)return e;let t=new Map;return globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY]=t,t}function seedInstrumentationProviders(){let e=providerRegistry();(process.env.VERCEL_ENV===`preview`||process.env.VERCEL_ENV===`production`)&&e.set(`agent-runs`,agentRuns()),process.env[DEVELOPMENT_WORKER_APP_ROOT_ENV]!==void 0&&e.set(`local`,localTraces())}async function registerInstrumentationProvider(e){if(isInstrumentationDisabled(e.value)){providerRegistry().delete(e.slot);return}if(!isInstrumentationProvider(e.value))throw Error(`The default export of "instrumentation/${e.slot}" is not an instrumentation provider. Return the result of \`defineInstrumentation\` or \`disableInstrumentation\` from it.`);if(Object.hasOwn(e.value,`capture`))throw Error(`The instrumentation provider "instrumentation/${e.slot}" no longer supports \`capture\`. Use \`tracePolicy\` to configure content capture.`);providerRegistry().set(e.slot,e.value),await e.value.setup?.(createInstrumentationSetupContext(e.agentName))}function getInstrumentationProviders(){return[...providerRegistry()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({provider:t,slot:e}))}function finalizeInstrumentationProviders(e){let t=getInstrumentationProviders(),n=t.map(toProviderDefinition),r=collectOtelPipeline(t.map(e=>e.provider));return installInstrumentationRuntime({collected:r,frameworkVersion:resolveInstalledPackageInfo().version,providers:n,runtimeContextResolvers:r.runtimeContextResolvers,serviceName:e.serviceName})}async function shutdownInstrumentationProviders(){await getInstrumentationRuntime()?.shutdown()}function toProviderDefinition(e){return{events:e.provider.events,flush:e.provider.flush,name:e.slot,shutdown:e.provider.shutdown,stateNamespace:`authored:${e.slot}`,tracePolicy:e.provider.tracePolicy}}export{finalizeInstrumentationProviders,getInstrumentationProviders,registerInstrumentationProvider,seedInstrumentationProviders,shutdownInstrumentationProviders};
1
+ import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{getInstrumentationRuntime}from"#instrumentation/runtime.js";import{DEVELOPMENT_WORKER_APP_ROOT_ENV}from"#internal/workflow/development-world-protocol.js";import{createInstrumentationSetupContext}from"#instrumentation/setup-context.js";import{agentRuns,localTraces}from"#public/instrumentation/otel.js";import{installInstrumentationRuntime}from"#tracing/eve/install-instrumentation-runtime.js";import{collectOtelPipeline}from"#tracing/eve/otel-declaration.js";import{isInstrumentationDisabled,isInstrumentationProvider}from"#public/instrumentation/provider.js";const INSTRUMENTATION_PROVIDERS_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-providers`),globalContainer=globalThis;function providerRegistry(){let e=globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY];if(e!==void 0)return e;let t=new Map;return globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY]=t,t}function seedInstrumentationProviders(){let e=providerRegistry();(process.env.VERCEL_ENV===`preview`||process.env.VERCEL_ENV===`production`)&&e.set(`agent-runs`,agentRuns()),process.env[DEVELOPMENT_WORKER_APP_ROOT_ENV]!==void 0&&e.set(`local`,localTraces())}async function registerInstrumentationProvider(e){if(isInstrumentationDisabled(e.value)){providerRegistry().delete(e.slot);return}if(!isInstrumentationProvider(e.value))throw Error(`The default export of "instrumentation/${e.slot}" is not an instrumentation provider. Return the result of \`defineInstrumentation\` or \`disableInstrumentation\` from it.`);if(Object.hasOwn(e.value,`capture`))throw Error(`The instrumentation provider "instrumentation/${e.slot}" no longer supports \`capture\`. Use \`tracePolicy\` to configure content capture.`);providerRegistry().set(e.slot,e.value),await e.value.setup?.(createInstrumentationSetupContext(e.agentName))}function getInstrumentationProviders(){return[...providerRegistry()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({provider:t,slot:e}))}function finalizeInstrumentationProviders(e){let t=getInstrumentationProviders(),n=t.map(toProviderDefinition),r=collectOtelPipeline(t.map(e=>e.provider));return installInstrumentationRuntime({collected:r,frameworkVersion:resolveInstalledPackageInfo().version,providers:n,runtimeContextResolvers:r.runtimeContextResolvers,serviceName:e.serviceName})}async function shutdownInstrumentationProviders(){await getInstrumentationRuntime()?.shutdown()}function toProviderDefinition(e){return{events:e.provider.events,flush:e.provider.flush,name:e.slot,shutdown:e.provider.shutdown,stateNamespace:`authored:${e.slot}`,tracePolicy:e.provider.tracePolicy}}export{finalizeInstrumentationProviders,getInstrumentationProviders,registerInstrumentationProvider,seedInstrumentationProviders,shutdownInstrumentationProviders};
@@ -3,7 +3,7 @@ import type { ChannelInstrumentationProjection, SessionAuthContext, SessionParen
3
3
  import type { AlsContext } from "#context/container.js";
4
4
  import type { TurnPosition } from "#harness/session-machine/view.js";
5
5
  import type { HarnessSession } from "#harness/types.js";
6
- import type { RuntimeContextResolver } from "#tracing/otel-declaration.js";
6
+ import type { RuntimeContextResolver } from "#tracing/eve/otel-declaration.js";
7
7
  export interface BuildTelemetryRuntimeContextInput {
8
8
  readonly capturesContent: boolean;
9
9
  readonly context?: InstrumentationRuntimeContextSnapshot;
@@ -7,11 +7,11 @@ import type { HandleEventFn } from "#harness/types.js";
7
7
  import { type ChannelDeliveryStartInstrumentation, type ChannelDeliveryTerminalInstrumentation } from "#instrumentation/channel-delivery.js";
8
8
  import { type PrepareTurnTraceContextInput } from "#instrumentation/prepare-trace-context.js";
9
9
  import type { RuntimeTraceContext } from "#protocol/message.js";
10
- import type { OtelHarnessSettings, RuntimeContextResolver } from "#tracing/otel-declaration.js";
11
- import { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
10
+ import type { OtelHarnessSettings, RuntimeContextResolver } from "#tracing/eve/otel-declaration.js";
11
+ import { AgentSpanIdGenerator } from "#compiled/@eve/tracing/index.js";
12
12
  import { type ContextContainer } from "#context/container.js";
13
13
  import { type MemoryInstrumentation } from "#instrumentation/memory.js";
14
- import type { AgentSamplingOperation } from "#tracing/agent-span-contract.js";
14
+ import type { SamplingOperation as AgentSamplingOperation } from "#tracing/eve/otel-registration.js";
15
15
  import { getInstrumentationRuntime, registerInstrumentationRuntime } from "#instrumentation/runtime-global.js";
16
16
  import { initializeSessionInstrumentation } from "#instrumentation/session-init.js";
17
17
  export { getInstrumentationRuntime, registerInstrumentationRuntime };
@@ -22,6 +22,7 @@ interface InstrumentedStepSession {
22
22
  readonly state?: Readonly<Record<string, unknown>>;
23
23
  }
24
24
  export interface InstrumentationStepScope<TSession> {
25
+ readonly gatewayTraceContextHeaders?: () => Record<string, string> | undefined;
25
26
  readonly createHandleEvent: (input: Omit<CreateInstrumentationHandleEventInput, "agentName" | "channelAudience" | "channelKind" | "hooks" | "parentLineage" | "parentTraceContext" | "rootSessionId" | "traceSessionId" | "sessionId">) => HandleEventFn | undefined;
26
27
  readonly prepareAttempt: (input: {
27
28
  readonly isFrameworkTool?: (name: string) => boolean;
@@ -1 +1 @@
1
- import{ensureAiSdkWarningLogger}from"#instrumentation/ai-sdk-warnings.js";import{recordErrorOnSpan}from"#internal/logging.js";import{applyLiveDeliveryAudienceCeiling}from"#shared/forwarded-trace-policy.js";import{contextStorage}from"#context/container.js";import{ConversationIdKey,ParentSessionKey}from"#context/keys.js";import{createMemoryInstrumentation}from"#instrumentation/memory.js";import{readConversationId}from"#shared/conversation-identity.js";import{findInstrumentationActionScopeForCall}from"#instrumentation/state.js";import{readSessionTraceDecision}from"#tracing/agent-trace-context-store.js";import{resolveTraceRootSessionId}from"#shared/trace-root.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{attemptIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{instrumentChannelDelivery}from"#instrumentation/channel-delivery.js";import{buildTelemetryRuntimeContext,snapshotInstrumentationRuntimeContext}from"#instrumentation/runtime-context.js";import{ensureOtelIntegration,getRegisteredTelemetryIntegrations}from"#instrumentation/ai-sdk-telemetry.js";import{createAiSdkHookBridge}from"#instrumentation/ai-sdk-hook-bridge.js";import{createInstrumentationHandleEvent,publishInputResolutions}from"#instrumentation/native-events.js";import{prepareTurnTraceContext}from"#instrumentation/prepare-trace-context.js";import"#tracing/agent-span-id-generator.js";import{withErrorContent}from"#tracing/error-content-context.js";import{readInstrumentationSessionContext}from"#instrumentation/session-context.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime,registerInstrumentationRuntime}from"#instrumentation/runtime-global.js";import{initializeSessionInstrumentation}from"#instrumentation/session-init.js";const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function bindInstrumentationRuntime(e,t,n){let r={...n,traceSessionId:resolveTraceRootSessionId(t,n.sessionId)};if(readConversationId(t.get(ConversationIdKey))===void 0&&t.set(ConversationIdKey,t.get(ParentSessionKey)?.rootSessionId??r.rootSessionId),e===void 0)return;let i=e.hooks,a=r.traceSessionId,readSessionContext=()=>{let e=readInstrumentationSessionContext(contextStorage.getStore()??t);return{...e,rootSessionId:e.parent?.rootSessionId??r.rootSessionId,traceSessionId:a}},bindHooks=e=>i.forTrace?.({agentName:r.agentName,...e.conversation})??i,captureExecutionRuntime=()=>{let t=e.otelSettings,n=e.ownsAgentSpans===!0;return t!==void 0&&!n&&ensureOtelIntegration(),{ownsAgentSpans:n,otelSettings:t,runtimeContextResolvers:e.runtimeContextResolvers,tracer:t===void 0?void 0:trace.getTracer(`eve`)}},preparePreamble=(t,n)=>prepareTurnTraceContext({...t,instrumentation:e,principals:n.principals,session:{agentName:r.agentName,channelAudience:n.conversation.audience,channelKind:n.conversation.channel.kind,channelType:n.instrumentation?.channelType,parentLineage:n.parentLineage,parentTraceContext:n.parentTraceContext,rootSessionId:n.rootSessionId,traceSessionId:n.traceSessionId,scheduleId:n.scheduleId,sessionId:r.sessionId,title:n.title,traceSeed:n.traceSeed}}),o=e.memoryOperations===!0?createMemoryInstrumentation({resolveContext:()=>{let e=readSessionContext();return{hooks:bindHooks(e),rootSessionId:e.rootSessionId,traceSessionId:e.traceSessionId}},runInContext:e.runInContext,sessionId:r.sessionId}):void 0;return{async instrumentTaskToolCall(t){let n=findInstrumentationActionScopeForCall(r.sessionId,t.callId);if(n===void 0)return;let i=bindHooks(readSessionContext()),a=n.scope,o=toolCallIdempotencyKey(a,t.callId,0);await e.runInContext({type:`tool.call`,callId:t.callId,idempotencyKey:o,scope:a,toolName:t.toolName,startedAtMs:t.startedAtMs,frameworkTool:!0,input:i.capturesInputs??i.capturesContent?t.input:void 0,completedAtMs:t.completedAtMs,failed:t.failed},()=>Promise.resolve())},createHandleEvent:e=>{let t=readSessionContext();return createInstrumentationHandleEvent({agentName:r.agentName,channelKind:t.conversation.channel.kind,handleEvent:e.handleEvent,hooks:bindHooks(t),rootSessionId:t.rootSessionId,traceSessionId:t.traceSessionId,parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,scheduleId:t.scheduleId,sessionId:r.sessionId,title:t.title,turnId:e.turnId})},flush:e.forceFlush,instrumentChannelDelivery:e=>{let t=readSessionContext();return`delivery`in e?instrumentChannelDelivery({...e,hooks:i,policyAgentName:r.agentName,traceSessionId:t.traceSessionId}):instrumentChannelDelivery({...e,hooks:i})},memory:o,prepareExecution:()=>{let t=captureExecutionRuntime();return{installAiSdkWarningLogger:ensureAiSdkWarningLogger,runStep:async(n,i)=>{let a=readSessionContext(),o=bindHooks(a),s=t.otelSettings,c=resolveStepInstrumentationDecision(s,r.agentName,a.conversation,a.traceSeed,readSessionTraceDecision(a.context,r.sessionId)),l=t.tracer,u={"eve.environment":n.environment,"eve.session.id":n.session.sessionId,"eve.version":n.eveVersion},d=s?.functionId??r.agentName;d&&(u[`ai.telemetry.functionId`]=d);let f=l!==void 0&&!t.ownsAgentSpans&&c?.action!==`drop`&&n.hasInput?l.startSpan(`ai.eve.turn`,{attributes:u}):void 0,p=f?.spanContext(),m=p===void 0?n.session:{...n.session,state:{...n.session.state,[TURN_TRACE_STATE_KEY]:{spanId:p.spanId,traceFlags:p.traceFlags,traceId:p.traceId}}},h=f===void 0?void 0:trace.setSpan(context.active(),f);if(h===void 0&&l!==void 0){let e=n.session.state?.[TURN_TRACE_STATE_KEY];e!==void 0&&(h=trace.setSpan(context.active(),trace.wrapSpanContext({...e,isRemote:!0})))}let g=readSessionContext(),_=snapshotInstrumentationRuntimeContext(g.context),v=g.conversation,y=v.audience,b=shouldCaptureInstrumentationContent(v),x=c===void 0?c:applyLiveDeliveryAudienceCeiling(c,y,g.forwardedTracePolicy,v.environment),S=x===void 0?b:x.action===`record`&&x.recordInputs,C=c?.action===`drop`,w={recordInputs:!C&&(x?.action===`record`?x.recordInputs:b)&&(s?.recordInputs??!1),recordOutputs:!C&&(x?.action===`record`?x.recordOutputs:b)&&(s?.recordOutputs??!1)},telemetry=e=>{if(s===void 0&&e.bridgeIntegration===void 0)return;let n={};for(let t of Object.keys(e.runtimeContext??{}))n[t]=!0;let i=s!==void 0&&!(w.recordInputs&&w.recordOutputs),integrations=()=>getRegisteredTelemetryIntegrations({...t.ownsAgentSpans?{excludeEveOtelIntegration:!0}:void 0,sanitizeEveOtelErrors:i});return{functionId:s?.functionId??r.agentName,includeRuntimeContext:n,integrations:e.bridgeIntegration===void 0?i?[...integrations()]:void 0:[e.bridgeIntegration,...integrations()],isEnabled:!0,recordInputs:w.recordInputs,recordOutputs:w.recordOutputs}},run=()=>i({createHandleEvent:e=>createInstrumentationHandleEvent({...e,agentName:r.agentName,channelAudience:y,channelKind:v.channel.kind,hooks:o,parentLineage:g.parentLineage,parentTraceContext:g.parentTraceContext,rootSessionId:g.rootSessionId,traceSessionId:g.traceSessionId,scheduleId:g.scheduleId,sessionId:r.sessionId,title:g.title}),prepareAttempt:t=>{let n={attemptId:`${r.sessionId}:${t.turnId}:${t.stepIndex}:${t.attemptIndex}`,attemptIndex:t.attemptIndex,channelAudience:y,functionId:s?.functionId??r.agentName,rootSessionId:g.rootSessionId,traceSessionId:g.traceSessionId,sessionId:r.sessionId,stepIndex:t.stepIndex,turnId:t.turnId},i=createAiSdkHookBridge(n,o,e.runInContext,t.runtimeContext,t.isFrameworkTool);return{complete:()=>o.publish({idempotencyKey:attemptIdempotencyKey(n),scope:n,type:`step.attempt.completed`}),fail:e=>o.publish({error:e,idempotencyKey:attemptIdempotencyKey(n),scope:n,type:`step.attempt.failed`}),scope:n,telemetry:telemetry({bridgeIntegration:i,runtimeContext:t.runtimeContext})}},preparePreamble:e=>preparePreamble(e,g),publishInputResolutions:e=>publishInputResolutions({...e,hooks:o}),recordError:e=>{f!==void 0&&recordErrorOnSpan(f,e)},resolveRuntimeContext:e=>buildTelemetryRuntimeContext({...e,capturesContent:S,context:_,providerResolvers:t.runtimeContextResolvers}),session:m,setTurnId:e=>f?.setAttribute(`eve.turn.id`,e),telemetry:()=>telemetry({}),traceContext:p===void 0||!isValidSpanContext(p)?void 0:{spanId:p.spanId,traceFlags:p.traceFlags,traceId:p.traceId}});try{return await context.with(withErrorContent(h??context.active(),w.recordOutputs),run)}finally{f?.end(),f=void 0}}}},preparePreamble:e=>preparePreamble(e,readSessionContext())}}function bindSessionInstrumentation(e){let t={agentName:e.agentName,rootSessionId:e.rootSessionId,traceSessionId:resolveTraceRootSessionId(e.ctx,e.sessionId),sessionId:e.sessionId};return bindInstrumentationRuntime(getInstrumentationRuntime(),e.ctx,t)}function resolveStepInstrumentationDecision(e,t,n,r,i){if(e!==void 0)return r?.decision===void 0?i===void 0?r===void 0?resolveTracePolicy(e.tracePolicy,{agentName:t,...n}):resolveTracePolicyDecision(isSampledTrace(r),n):i:readInstrumentationDecision(r.decision)}function isValidSpanContext(e){return/^[0-9a-f]{32}$/u.test(e.traceId)&&e.traceId!==`00000000000000000000000000000000`&&/^[0-9a-f]{16}$/u.test(e.spanId)&&e.spanId!==`0000000000000000`}export{bindInstrumentationRuntime,bindSessionInstrumentation,getInstrumentationRuntime,initializeSessionInstrumentation,registerInstrumentationRuntime};
1
+ import{ensureAiSdkWarningLogger}from"#instrumentation/ai-sdk-warnings.js";import{recordErrorOnSpan}from"#internal/logging.js";import{applyLiveDeliveryAudienceCeiling}from"#shared/forwarded-trace-policy.js";import{contextStorage}from"#context/container.js";import{ConversationIdKey,ParentSessionKey}from"#context/keys.js";import{createMemoryInstrumentation}from"#instrumentation/memory.js";import{readConversationId}from"#shared/conversation-identity.js";import{findInstrumentationActionScopeForCall}from"#instrumentation/state.js";import{readSessionTraceDecision}from"#tracing/eve/agent-trace-context-store.js";import{resolveTraceRootSessionId}from"#shared/trace-root.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{attemptIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{instrumentChannelDelivery}from"#instrumentation/channel-delivery.js";import{withCapture}from"#compiled/@eve/tracing/otel.js";import{buildTelemetryRuntimeContext,snapshotInstrumentationRuntimeContext}from"#instrumentation/runtime-context.js";import{ensureOtelIntegration,getRegisteredTelemetryIntegrations}from"#instrumentation/ai-sdk-telemetry.js";import{createAiSdkHookBridge}from"#instrumentation/ai-sdk-hook-bridge.js";import{createInstrumentationHandleEvent,publishInputResolutions}from"#instrumentation/native-events.js";import{prepareTurnTraceContext}from"#instrumentation/prepare-trace-context.js";import"#compiled/@eve/tracing/index.js";import{readInstrumentationSessionContext}from"#instrumentation/session-context.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime,registerInstrumentationRuntime}from"#instrumentation/runtime-global.js";import{initializeSessionInstrumentation}from"#instrumentation/session-init.js";import{createGatewayTraceContextHeaders}from"#tracing/eve/gateway.js";const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function bindInstrumentationRuntime(e,t,n){let r={...n,traceSessionId:resolveTraceRootSessionId(t,n.sessionId)};if(readConversationId(t.get(ConversationIdKey))===void 0&&t.set(ConversationIdKey,t.get(ParentSessionKey)?.rootSessionId??r.rootSessionId),e===void 0)return;let i=e.hooks,a=r.traceSessionId,readSessionContext=()=>{let e=readInstrumentationSessionContext(contextStorage.getStore()??t);return{...e,rootSessionId:e.parent?.rootSessionId??r.rootSessionId,traceSessionId:a}},bindHooks=e=>i.forTrace?.({agentName:r.agentName,...e.conversation})??i,captureExecutionRuntime=()=>{let t=e.otelSettings,n=e.ownsAgentSpans===!0;return t!==void 0&&!n&&ensureOtelIntegration(),{ownsAgentSpans:n,otelSettings:t,runtimeContextResolvers:e.runtimeContextResolvers,tracer:t===void 0?void 0:trace.getTracer(`eve`)}},preparePreamble=(t,n)=>prepareTurnTraceContext({...t,instrumentation:e,principals:n.principals,session:{agentName:r.agentName,channelAudience:n.conversation.audience,channelKind:n.conversation.channel.kind,channelType:n.instrumentation?.channelType,parentLineage:n.parentLineage,parentTraceContext:n.parentTraceContext,rootSessionId:n.rootSessionId,traceSessionId:n.traceSessionId,scheduleId:n.scheduleId,sessionId:r.sessionId,title:n.title,traceSeed:n.traceSeed}}),o=e.memoryOperations===!0?createMemoryInstrumentation({resolveContext:()=>{let e=readSessionContext();return{hooks:bindHooks(e),rootSessionId:e.rootSessionId,traceSessionId:e.traceSessionId}},runInContext:e.runInContext,sessionId:r.sessionId}):void 0;return{async instrumentTaskToolCall(t){let n=findInstrumentationActionScopeForCall(r.sessionId,t.callId);if(n===void 0)return;let i=bindHooks(readSessionContext()),a=n.scope,o=toolCallIdempotencyKey(a,t.callId,0);await e.runInContext({type:`tool.call`,callId:t.callId,idempotencyKey:o,scope:a,toolName:t.toolName,startedAtMs:t.startedAtMs,frameworkTool:!0,input:i.capturesInputs??i.capturesContent?t.input:void 0,completedAtMs:t.completedAtMs,failed:t.failed},()=>Promise.resolve())},createHandleEvent:e=>{let t=readSessionContext();return createInstrumentationHandleEvent({agentName:r.agentName,channelKind:t.conversation.channel.kind,handleEvent:e.handleEvent,hooks:bindHooks(t),rootSessionId:t.rootSessionId,traceSessionId:t.traceSessionId,parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,scheduleId:t.scheduleId,sessionId:r.sessionId,title:t.title,turnId:e.turnId})},flush:e.forceFlush,instrumentChannelDelivery:e=>{let t=readSessionContext();return`delivery`in e?instrumentChannelDelivery({...e,hooks:i,policyAgentName:r.agentName,traceSessionId:t.traceSessionId}):instrumentChannelDelivery({...e,hooks:i})},memory:o,prepareExecution:()=>{let t=captureExecutionRuntime();return{installAiSdkWarningLogger:ensureAiSdkWarningLogger,runStep:async(n,i)=>{let a=readSessionContext(),o=bindHooks(a),s=t.otelSettings,c=resolveStepInstrumentationDecision(s,r.agentName,a.conversation,a.traceSeed,readSessionTraceDecision(a.context,r.sessionId)),l=t.tracer,u={"eve.environment":n.environment,"eve.session.id":n.session.sessionId,"eve.version":n.eveVersion},d=s?.functionId??r.agentName;d&&(u[`ai.telemetry.functionId`]=d);let f=l!==void 0&&!t.ownsAgentSpans&&c?.action!==`drop`&&n.hasInput?l.startSpan(`ai.eve.turn`,{attributes:u}):void 0,p=f?.spanContext(),m=p===void 0?n.session:{...n.session,state:{...n.session.state,[TURN_TRACE_STATE_KEY]:{spanId:p.spanId,traceFlags:p.traceFlags,traceId:p.traceId}}},h=f===void 0?void 0:trace.setSpan(context.active(),f);if(h===void 0&&l!==void 0){let e=n.session.state?.[TURN_TRACE_STATE_KEY];e!==void 0&&(h=trace.setSpan(context.active(),trace.wrapSpanContext({...e,isRemote:!0})))}let g=readSessionContext(),_=snapshotInstrumentationRuntimeContext(g.context),v=g.conversation,y=v.audience,b=shouldCaptureInstrumentationContent(v),x=c===void 0?c:applyLiveDeliveryAudienceCeiling(c,y,g.forwardedTracePolicy,v.environment),S=x===void 0?b:x.action===`record`&&x.recordInputs,C=c?.action===`drop`,w={recordInputs:!C&&(x?.action===`record`?x.recordInputs:b)&&(s?.recordInputs??!1),recordOutputs:!C&&(x?.action===`record`?x.recordOutputs:b)&&(s?.recordOutputs??!1)},telemetry=e=>{if(s===void 0&&e.bridgeIntegration===void 0)return;let n={};for(let t of Object.keys(e.runtimeContext??{}))n[t]=!0;let i=s!==void 0&&!(w.recordInputs&&w.recordOutputs),integrations=()=>getRegisteredTelemetryIntegrations({...t.ownsAgentSpans?{excludeEveOtelIntegration:!0}:void 0,sanitizeEveOtelErrors:i});return{functionId:s?.functionId??r.agentName,includeRuntimeContext:n,integrations:e.bridgeIntegration===void 0?i?[...integrations()]:void 0:[e.bridgeIntegration,...integrations()],isEnabled:!0,recordInputs:w.recordInputs,recordOutputs:w.recordOutputs}},run=()=>i({gatewayTraceContextHeaders:createGatewayTraceContextHeaders,createHandleEvent:e=>createInstrumentationHandleEvent({...e,agentName:r.agentName,channelAudience:y,channelKind:v.channel.kind,hooks:o,parentLineage:g.parentLineage,parentTraceContext:g.parentTraceContext,rootSessionId:g.rootSessionId,traceSessionId:g.traceSessionId,scheduleId:g.scheduleId,sessionId:r.sessionId,title:g.title}),prepareAttempt:t=>{let n={attemptId:`${r.sessionId}:${t.turnId}:${t.stepIndex}:${t.attemptIndex}`,attemptIndex:t.attemptIndex,channelAudience:y,functionId:s?.functionId??r.agentName,rootSessionId:g.rootSessionId,traceSessionId:g.traceSessionId,sessionId:r.sessionId,stepIndex:t.stepIndex,turnId:t.turnId},i=createAiSdkHookBridge(n,o,e.runInContext,t.runtimeContext,t.isFrameworkTool);return{complete:()=>o.publish({idempotencyKey:attemptIdempotencyKey(n),scope:n,type:`step.attempt.completed`}),fail:e=>o.publish({error:e,idempotencyKey:attemptIdempotencyKey(n),scope:n,type:`step.attempt.failed`}),scope:n,telemetry:telemetry({bridgeIntegration:i,runtimeContext:t.runtimeContext})}},preparePreamble:e=>preparePreamble(e,g),publishInputResolutions:e=>publishInputResolutions({...e,hooks:o}),recordError:e=>{f!==void 0&&recordErrorOnSpan(f,e)},resolveRuntimeContext:e=>buildTelemetryRuntimeContext({...e,capturesContent:S,context:_,providerResolvers:t.runtimeContextResolvers}),session:m,setTurnId:e=>f?.setAttribute(`eve.turn.id`,e),telemetry:()=>telemetry({}),traceContext:p===void 0||!isValidSpanContext(p)?void 0:{spanId:p.spanId,traceFlags:p.traceFlags,traceId:p.traceId}});try{return await context.with(withCapture(h??context.active(),{emit:!0,recordInputs:w.recordInputs,recordOutputs:w.recordOutputs}),run)}finally{f?.end(),f=void 0}}}},preparePreamble:e=>preparePreamble(e,readSessionContext())}}function bindSessionInstrumentation(e){let t={agentName:e.agentName,rootSessionId:e.rootSessionId,traceSessionId:resolveTraceRootSessionId(e.ctx,e.sessionId),sessionId:e.sessionId};return bindInstrumentationRuntime(getInstrumentationRuntime(),e.ctx,t)}function resolveStepInstrumentationDecision(e,t,n,r,i){if(e!==void 0)return r?.decision===void 0?i===void 0?r===void 0?resolveTracePolicy(e.tracePolicy,{agentName:t,...n}):resolveTracePolicyDecision(isSampledTrace(r),n):i:readInstrumentationDecision(r.decision)}function isValidSpanContext(e){return/^[0-9a-f]{32}$/u.test(e.traceId)&&e.traceId!==`00000000000000000000000000000000`&&/^[0-9a-f]{16}$/u.test(e.spanId)&&e.spanId!==`0000000000000000`}export{bindInstrumentationRuntime,bindSessionInstrumentation,getInstrumentationRuntime,initializeSessionInstrumentation,registerInstrumentationRuntime};
@@ -1 +1 @@
1
- import{createLogger}from"#internal/logging.js";import{ConversationContextKey,resolveConversationContext}from"#shared/conversation-context.js";import{formatTraceContentCeiling,readForwardedTraceAssertion,traceContentCeilingToDecision}from"#shared/forwarded-trace-policy.js";import{AuthKey,ChannelInstrumentationKey,OtelTraceEnabledKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{AgentSpanIdGenerator}from"#tracing/agent-span-id-generator.js";import{intersectInstrumentationDecisions,readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime}from"#instrumentation/runtime-global.js";const log=createLogger(`instrumentation.session-init`);function initializeSessionInstrumentation(e){let t=getInstrumentationRuntime(),n=e.ctx.get(ParentTraceContextKey),r=readForwardedTraceAssertion(n?.forwardedTracePolicy),i=e.ctx.get(ConversationContextKey),a=resolveConversationContext(i,{channelKind:e.ctx.get(ChannelInstrumentationKey)?.kind,environment:resolveInstrumentationEnvironment(),forwardedTracePolicy:r,principalType:e.ctx.get(AuthKey)?.principalType},{forwardedOverridesStored:!0}),o=allocateSessionTraceSeed({agentName:e.agentName,conversation:a,channelType:e.ctx.get(ChannelInstrumentationKey)?.channelType,forwardedTracePolicy:r,parentTraceContext:n,runtime:t});if(o!==void 0&&(e.ctx.set(SessionTraceSeedKey,o),r!==void 0&&log.info(`resolved forwarded trace policy`,{ceilingEffective:o.decision?.action===`record`?formatTraceContentCeiling(o.decision):`drop`,ceilingIn:formatTraceContentCeiling(r.ceiling),originAudience:r.originAudience}),r!==void 0&&n!==void 0)){let t={...n,decision:o.decision,traceFlags:o.traceFlags};delete t.forwardedTracePolicy,e.ctx.set(ParentTraceContextKey,t)}e.ctx.set(OtelTraceEnabledKey,t?.prepareSessionTrace!==void 0)}function allocateSessionTraceSeed(e){let localDecision=()=>resolveTracePolicy(e.runtime?.otelSettings?.tracePolicy,{agentName:e.agentName,...e.conversation});if(e.parentTraceContext!==void 0){let t=e.forwardedTracePolicy?traceContentCeilingToDecision(e.forwardedTracePolicy.ceiling):void 0,n=readInstrumentationDecision(e.parentTraceContext.decision),r=isSampledTrace(e.parentTraceContext)?t?n===void 0?t:intersectInstrumentationDecisions(t,n):n??resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),e.conversation):{action:`drop`},i=`isRemote`in e.parentTraceContext&&e.parentTraceContext.isRemote===!0,a=e.forwardedTracePolicy||i?intersectInstrumentationDecisions(r,localDecision()):r,o=e.runtime?.idGenerator??new AgentSpanIdGenerator;return{decision:a,...e.forwardedTracePolicy===void 0?void 0:{forwardedTracePolicy:e.forwardedTracePolicy},spanId:o.allocateSpanId(),traceFlags:a.action===`drop`?0:e.parentTraceContext.traceFlags,traceId:i?o.generateTraceId():e.parentTraceContext.traceId}}if(e.runtime?.prepareSessionTrace===void 0||e.runtime.idGenerator===void 0)return;let t=localDecision(),n=e.runtime.idGenerator.generateTraceId(),r=t.action===`record`;return{decision:t,spanId:e.runtime.idGenerator.allocateSpanId(),traceFlags:+!!r,traceId:n}}export{initializeSessionInstrumentation};
1
+ import{createLogger}from"#internal/logging.js";import{ConversationContextKey,resolveConversationContext}from"#shared/conversation-context.js";import{formatTraceContentCeiling,readForwardedTraceAssertion,traceContentCeilingToDecision}from"#shared/forwarded-trace-policy.js";import{AuthKey,ChannelInstrumentationKey,OtelTraceEnabledKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{resolveInstrumentationEnvironment}from"#internal/application/dev-environment.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#shared/trace-policy.js";import{AgentSpanIdGenerator}from"#compiled/@eve/tracing/index.js";import{intersectInstrumentationDecisions,readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{getInstrumentationRuntime}from"#instrumentation/runtime-global.js";const log=createLogger(`instrumentation.session-init`);function initializeSessionInstrumentation(e){let t=getInstrumentationRuntime(),n=e.ctx.get(ParentTraceContextKey),r=readForwardedTraceAssertion(n?.forwardedTracePolicy),i=e.ctx.get(ConversationContextKey),a=resolveConversationContext(i,{channelKind:e.ctx.get(ChannelInstrumentationKey)?.kind,environment:resolveInstrumentationEnvironment(),forwardedTracePolicy:r,principalType:e.ctx.get(AuthKey)?.principalType},{forwardedOverridesStored:!0}),o=allocateSessionTraceSeed({agentName:e.agentName,conversation:a,channelType:e.ctx.get(ChannelInstrumentationKey)?.channelType,forwardedTracePolicy:r,parentTraceContext:n,runtime:t});if(o!==void 0&&(e.ctx.set(SessionTraceSeedKey,o),r!==void 0&&log.info(`resolved forwarded trace policy`,{ceilingEffective:o.decision?.action===`record`?formatTraceContentCeiling(o.decision):`drop`,ceilingIn:formatTraceContentCeiling(r.ceiling),originAudience:r.originAudience}),r!==void 0&&n!==void 0)){let t={...n,decision:o.decision,traceFlags:o.traceFlags};delete t.forwardedTracePolicy,e.ctx.set(ParentTraceContextKey,t)}e.ctx.set(OtelTraceEnabledKey,t?.prepareSessionTrace!==void 0)}function allocateSessionTraceSeed(e){let localDecision=()=>resolveTracePolicy(e.runtime?.otelSettings?.tracePolicy,{agentName:e.agentName,...e.conversation});if(e.parentTraceContext!==void 0){let t=e.forwardedTracePolicy?traceContentCeilingToDecision(e.forwardedTracePolicy.ceiling):void 0,n=readInstrumentationDecision(e.parentTraceContext.decision),r=isSampledTrace(e.parentTraceContext)?t?n===void 0?t:intersectInstrumentationDecisions(t,n):n??resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),e.conversation):{action:`drop`},i=`isRemote`in e.parentTraceContext&&e.parentTraceContext.isRemote===!0,a=e.forwardedTracePolicy||i?intersectInstrumentationDecisions(r,localDecision()):r,o=e.runtime?.idGenerator??new AgentSpanIdGenerator;return{decision:a,...e.forwardedTracePolicy===void 0?void 0:{forwardedTracePolicy:e.forwardedTracePolicy},spanId:o.allocateSpanId(),traceFlags:a.action===`drop`?0:e.parentTraceContext.traceFlags,traceId:i?o.generateTraceId():e.parentTraceContext.traceId}}if(e.runtime?.prepareSessionTrace===void 0||e.runtime.idGenerator===void 0)return;let t=localDecision(),n=e.runtime.idGenerator.generateTraceId(),r=t.action===`record`;return{decision:t,spanId:e.runtime.idGenerator.allocateSpanId(),traceFlags:+!!r,traceId:n}}export{initializeSessionInstrumentation};
@@ -1 +1 @@
1
- const STAMPED_PACKAGE_VERSION=`0.78.0`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
1
+ const STAMPED_PACKAGE_VERSION=`0.79.1`;function readStampedPackageVersion(){return STAMPED_PACKAGE_VERSION.startsWith(`__`)?void 0:STAMPED_PACKAGE_VERSION}export{readStampedPackageVersion};
@@ -1,3 +1,5 @@
1
- import type { Approval } from "#approval/definition.js";
1
+ import type { Approval, ToolApproval } from "#approval/definition.js";
2
2
  /** Validates the function shorthand or explicit request/response approval shape. */
3
3
  export declare function normalizeApproval(value: unknown, message: string): Approval;
4
+ /** Validates a tool approval, including its optional presentation prompt. */
5
+ export declare function normalizeToolApproval(value: unknown, message: string): ToolApproval;
@@ -1 +1 @@
1
- import{expectFunction,expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";function normalizeApproval(e,t){if(typeof e==`function`)return e;let n=expectObjectRecord(e,t);expectOnlyKnownKeys(n,[`request`,`response`],t);let r=expectFunction(n.request,t);return n.response===void 0?{request:r}:{request:r,response:expectFunction(n.response,t)}}export{normalizeApproval};
1
+ import{expectFunction,expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";function normalizeApproval(e,t){if(typeof e==`function`)return e;let n=expectObjectRecord(e,t);return expectOnlyKnownKeys(n,[`request`,`response`],t),{request:expectFunction(n.request,t),response:n.response===void 0?void 0:expectFunction(n.response,t)}}function normalizeToolApproval(e,t){if(typeof e==`function`)return e;let n=expectObjectRecord(e,t);return expectOnlyKnownKeys(n,[`request`,`prompt`,`response`],t),{request:expectFunction(n.request,t),prompt:n.prompt===void 0?void 0:expectFunction(n.prompt,t),response:n.response===void 0?void 0:expectFunction(n.response,t)}}export{normalizeApproval,normalizeToolApproval};