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
@@ -35,6 +35,8 @@ export declare class ConversationClient<TData = ConversationState> {
35
35
  follow(session: ClientSession, events?: readonly MessageStreamEvent[]): void;
36
36
  /** Follows the root session continuously; operation readers subscribe to this one stream. */
37
37
  stream(session: ClientSession, options: SessionEventStreamOptions): SessionEventStream;
38
+ /** Closes the root stream; the next `stream()` call reopens it from the session cursor. */
39
+ closeStream(): void;
38
40
  stop(): void;
39
41
  reset(): void;
40
42
  }
@@ -1 +1 @@
1
- import{assertAnswerable}from"#client/eve-agent-store-helpers.js";import{AgentStreamFollower}from"#client/agent-stream-follower.js";import{canonicalConversationReducer,conversationReducer}from"#client/conversation-reducer.js";import{EveAgentProjection}from"#client/eve-agent-projection.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{SessionEventStream}from"#client/session-event-stream.js";var ConversationClient=class{projection;#e;#t=new Map;#n=createEventDeduper();#r;#i;#a;#o;constructor(e,t,n){this.projection=e,this.#e=e.reducer===conversationReducer?e:new EveAgentProjection(canonicalConversationReducer,[]),this.#a=t,this.#o=n}get data(){return this.projection.data}get conversation(){return this.#e.data}get projections(){return this.#e===this.projection?[this.projection]:[this.#e,this.projection]}get following(){return this.#r!==void 0}append(e){let t=this.data,n=this.conversation;this.#c(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}projectResponses(e){if(!e?.length)return;let t={data:{createdAt:Date.now(),responses:e},type:`client.input.responded`};return this.append(t),()=>this.#s(t)}replaceResponses(e,t){return e?.(),assertAnswerable(t,this.conversation),this.projectResponses(t.inputResponses)}#s(e){let t=this.data,n=this.conversation;for(let t of this.projections)t.remove(t=>t===e);t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}observe(e,t={}){if(!this.#n.admit(e))return!1;t.onAccepted?.(e);let n=this.data,r=this.conversation;return t.project?t.project(e):this.#c(e),t.notify!==!1&&(n===this.data?r!==this.conversation&&this.#o?.(this.conversation,r):this.#a(this.data,n)),this.#r?.acceptParentEvent(e),this.#r?.reconcile(),!0}hydrate(e){return this.#n.admit(e)?(this.#c(e),!0):!1}follow(e,t=[]){this.#r?.abortAll();let n=new AgentStreamFollower({session:e,cursors:this.#t,getState:()=>this.conversation,onFollowing:e=>this.#l({type:`client.agent.following`,data:{sessionId:e}}),onEvent:(e,t)=>this.#l({type:`client.agent.observed`,data:{sessionId:e,event:t}}),onIdle:e=>this.#l({type:`client.agent.idle`,data:{sessionId:e}}),onUnavailable:e=>this.#l({type:`client.agent.unavailable`,data:{sessionId:e}})});this.#r=n;for(let e of t)n.acceptParentEvent(e);n.reconcile()}#c(e){for(let t of this.projections)t.append(e)}#l(e){let t=this.data,n=this.conversation;this.#e.append(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}stream(e,t){return this.#i!==void 0&&!this.#i.ended?(this.#i.setOptions(t),this.#i):(this.#i=new SessionEventStream(e,t),this.#i)}stop(){this.#r?.abortAll(),this.#r=void 0,this.#i?.close(),this.#i=void 0}reset(){this.stop(),this.#t.clear(),this.#n=createEventDeduper();for(let e of this.projections)e.reset()}};export{ConversationClient};
1
+ import{assertAnswerable}from"#client/eve-agent-store-helpers.js";import{AgentStreamFollower}from"#client/agent-stream-follower.js";import{canonicalConversationReducer,conversationReducer}from"#client/conversation-reducer.js";import{EveAgentProjection}from"#client/eve-agent-projection.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{SessionEventStream}from"#client/session-event-stream.js";var ConversationClient=class{projection;#e;#t=new Map;#n=createEventDeduper();#r;#i;#a;#o;constructor(e,t,n){this.projection=e,this.#e=e.reducer===conversationReducer?e:new EveAgentProjection(canonicalConversationReducer,[]),this.#a=t,this.#o=n}get data(){return this.projection.data}get conversation(){return this.#e.data}get projections(){return this.#e===this.projection?[this.projection]:[this.#e,this.projection]}get following(){return this.#r!==void 0}append(e){let t=this.data,n=this.conversation;this.#c(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}projectResponses(e){if(!e?.length)return;let t={data:{createdAt:Date.now(),responses:e},type:`client.input.responded`};return this.append(t),()=>this.#s(t)}replaceResponses(e,t){return e?.(),assertAnswerable(t,this.conversation),this.projectResponses(t.inputResponses)}#s(e){let t=this.data,n=this.conversation;for(let t of this.projections)t.remove(t=>t===e);t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}observe(e,t={}){if(!this.#n.admit(e))return!1;t.onAccepted?.(e);let n=this.data,r=this.conversation;return t.project?t.project(e):this.#c(e),t.notify!==!1&&(n===this.data?r!==this.conversation&&this.#o?.(this.conversation,r):this.#a(this.data,n)),this.#r?.acceptParentEvent(e),this.#r?.reconcile(),!0}hydrate(e){return this.#n.admit(e)?(this.#c(e),!0):!1}follow(e,t=[]){this.#r?.abortAll();let n=new AgentStreamFollower({session:e,cursors:this.#t,getState:()=>this.conversation,onFollowing:e=>this.#l({type:`client.agent.following`,data:{sessionId:e}}),onEvent:(e,t)=>this.#l({type:`client.agent.observed`,data:{sessionId:e,event:t}}),onIdle:e=>this.#l({type:`client.agent.idle`,data:{sessionId:e}}),onUnavailable:e=>this.#l({type:`client.agent.unavailable`,data:{sessionId:e}})});this.#r=n;for(let e of t)n.acceptParentEvent(e);n.reconcile()}#c(e){for(let t of this.projections)t.append(e)}#l(e){let t=this.data,n=this.conversation;this.#e.append(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}stream(e,t){return this.#i!==void 0&&!this.#i.ended?(this.#i.setOptions(t),this.#i):(this.#i=new SessionEventStream(e,t),this.#i)}closeStream(){this.#i?.close(),this.#i=void 0}stop(){this.#r?.abortAll(),this.#r=void 0,this.closeStream()}reset(){this.stop(),this.#t.clear(),this.#n=createEventDeduper();for(let e of this.projections)e.reset()}};export{ConversationClient};
@@ -60,6 +60,15 @@ export interface EveAgentStoreInit<TData> {
60
60
  * while the store streams its session or a framework binding has it mounted.
61
61
  */
62
62
  readonly followSubagents?: boolean;
63
+ /**
64
+ * Keep the session stream open while the session is idle, so the store sees events that arrive
65
+ * between turns from schedules, channels, or other clients. When false, the store closes the
66
+ * stream once no turn, task, or sign-in is pending, and reopens it from the session cursor on
67
+ * the next send, answer, or resume.
68
+ *
69
+ * @default true
70
+ */
71
+ readonly followIdle?: boolean;
63
72
  readonly reducer: EveAgentReducer<TData>;
64
73
  readonly session?: ClientSession;
65
74
  }
@@ -1 +1 @@
1
- import{toError}from"#shared/errors.js";import{activeTurnForOptimisticFollowUp,assertAnswerable,assertExclusiveTurnInput,assertInFlightFollowUp,countFollowUpDeliveries,createAbortSignal,createActiveTurn,followSteeredTurns,isAbortError,isResponseBoundary,isSettledSessionTail,settledStatus,toTerminalStreamFailureError,validateFollowUp,waitWithSignal}from"#client/eve-agent-store-helpers.js";import{EveAgentProjection}from"#client/eve-agent-projection.js";import{Client}from"#client/client.js";import{consumeMessageResponse,getMessageResponseDeliveryId}from"#client/message-response.js";import{OptimisticMessageSubmissions}from"#client/optimistic-message-submissions.js";import{ConversationClient}from"#client/conversation-client.js";import{dispatchSessionTurn}from"#client/session-turn-dispatch.js";const detachStore=Symbol(`detachEveAgentStore`),attachStore=Symbol(`attachEveAgentStore`);var EveAgentStore=class{#e;#t;#n=!1;#r;#i;#a;#o=new Set;#s;#c={};#l;#u;#d;#f=0;#p;#m;#h;#g;#_;#v=`ready`;constructor(e){this.#t=e.prewarm??!1,this.#i=e.followSubagents??!1,this.#a=e.session!==void 0,this.#e=this.#a?void 0:e.client??new Client({auth:e.auth,headers:e.headers,host:e.host??``}),this.#r=new ConversationClient(new EveAgentProjection(e.reducer,[]),()=>this.#F(),()=>this.#F()),this.#u=(e.initialEvents??[]).filter(e=>this.#r.hydrate(e)),this.#d=new OptimisticMessageSubmissions(this.#r.projections,e.optimistic??!0),this.#g=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex})),this.#_=this.#P()}get snapshot(){return this.#_}setCallbacks(e){this.#c=e}subscribe(e){return this.#o.add(e),()=>void this.#o.delete(e)}prewarm(){if(this.#p!==void 0)return this.#p;if(this.#g!==void 0||this.#a)return Promise.resolve();if(this.#s!==void 0)return this.#s.response.then(e=>{if(e===void 0)throw this.#l??new DOMException(`Session creation was aborted.`,`AbortError`)});let e=this.#e;if(e===void 0)return Promise.reject(Error(`This eve agent store does not own a session client.`));let t=this.#f,n=new AbortController;this.#m=n;let r=(async()=>{try{let r=await e.sessions.create({signal:n.signal});if(t!==this.#f)return;this.#l=void 0,this.#v===`error`&&(this.#v=`ready`),this.#w(r.session),this.#C()}catch(e){throw t===this.#f&&this.#s===void 0&&this.#l===void 0&&this.#T(e),e}})();this.#p=r;let clear=()=>{this.#p===r&&(this.#p=void 0,this.#m=void 0)};return r.then(clear,clear),r}async send(e){return await this.#y(e,this.#c.prepareSend)}async#y(e,t){if(assertAnswerable(e,this.#r.conversation),this.#s!==void 0){if(this.#v===`resuming`)throw Error(`eve session is resuming.`);return await this.#x(this.#s,e,t)}let n=createActiveTurn(e=>e.acceptedFollowUps>0&&this.#g!==void 0?this.#g.cancel():e.response.then(e=>e===void 0?{status:`no_active_turn`}:e.cancel()));this.#s=n,this.#l=void 0,this.#v=`submitted`;let r,i,a;try{assertExclusiveTurnInput(e),i=this.#d.submit(e,this.#u.length),a=this.#r.projectResponses(e.inputResponses),this.#F();let o=await(t===void 0?e:waitWithSignal(Promise.resolve(t(e)),createAbortSignal(e.signal,n.abortController.signal)));if(assertExclusiveTurnInput(o),!this.#k(n))return;o!==e&&(i=this.#d.resubmit(i,o),a=this.#r.replaceResponses(a,o),this.#F());let s={...o,signal:createAbortSignal(o.signal,n.abortController.signal)},c=await this.#S(s);a=void 0;let l=c.response;if(r=c.reader,!this.#k(n))return;n.resolveResponse(l),this.#j(i,l);for await(let e of consumeMessageResponse(l,r)){if(!this.#k(n))return;n.receivedFollowUps+=n.receivedFollowUpEvents.get(e)??0,n.receivedFollowUpEvents.delete(e)}if(!this.#k(n)||(await followSteeredTurns(n,r,()=>this.#k(n)),!this.#k(n)))return;this.#v=settledStatus(this.#l,this.#r.conversation)}catch(e){if(!this.#k(n))return;if(a?.(),isAbortError(e))this.#v=`ready`,this.#d.fail(toError(e),i);else{let t=this.#l!==void 0;this.#l??=toError(e),this.#v=`error`,this.#d.fail(this.#l,i),t||this.#c.onError?.(this.#l)}}finally{r?.[Symbol.dispose](),this.#O(n)}}resume(){if(this.#h!==void 0)return this.#h;let e=this.#b();this.#h=e;let clear=()=>{this.#h===e&&(this.#h=void 0)};return e.then(clear,clear),e}async#b(){if(this.#v!==`ready`&&this.#v!==`error`)throw Error(`eve session is already processing a turn.`);if(this.#g===void 0)throw Error(`An eve session is required before resuming.`);let e=this.#g,t=createActiveTurn(()=>e.cancel());this.#s=t,t.resolveResponse(void 0),this.#l=void 0,this.#v=`resuming`,this.#F();let n;try{let r=this.#C({catchUp:!0,startIndex:this.#u.length===e.state.streamIndex?e.state.streamIndex:0});if(n=r.subscribe(t.abortController.signal),await r.caughtUp,!this.#k(t))return;n.discard();let i=this.#u.at(-1);if(i!==void 0&&this.#N(i),i&&!this.#l&&!isSettledSessionTail(this.#u,this.#r.conversation)){this.#v=`streaming`,this.#F();for await(let e of n){if(!this.#k(t))return;if(t.receivedFollowUps+=t.receivedFollowUpEvents.get(e)??0,t.receivedFollowUpEvents.delete(e),isResponseBoundary(e,this.#r.conversation))break}}await followSteeredTurns(t,n,()=>this.#k(t)),this.#k(t)&&(this.#v=settledStatus(this.#l,this.#r.conversation))}catch(e){if(!this.#k(t))return;isAbortError(e)?this.#v=`ready`:(this.#l=toError(e),this.#v=`error`,this.#c.onError?.(this.#l))}finally{n?.[Symbol.dispose](),this.#O(t)}}cancel(){let e=this.#s;return e===void 0?this.#v===`streaming`&&this.#g!==void 0?this.#g.cancel():Promise.resolve({status:`no_active_turn`}):e.cancel()}async compact(){return await this.#g?.compact()??{status:`no_active_session`}}async clear(){return await this.#g?.clear()??{status:`no_active_session`}}async retire(){if(this.#a)throw Error(`retire() needs a store-owned session. Call reset() on the session you supplied, then create a new store for the next session.`);let e=await this.#g?.reset()??{status:`no_active_session`};return this.reset(),e}[attachStore](){this.#n=!0,this.#i&&!this.#r.following&&this.#E(),this.#t&&this.#g===void 0&&this.prewarm().catch(()=>{})}[detachStore](){this.#n=!1,this.#r.stop(),this.#s?.abortController.abort(),this.#D(),this.#h=void 0}reset(){this.#r.stop();let e=this.#s;this.#s=void 0,e?.resolveResponse(void 0),e?.resolveCompletion(),e?.abortController.abort(),this.#D(),this.#h=void 0,this.#a||(this.#g=void 0),this.#u=[],this.#r.reset(),this.#d.reset(),this.#i&&this.#n&&this.#E(),this.#l=void 0,this.#v=`ready`,this.#c.onSessionChange?.(this.#g?.state),this.#F(),this.#t&&this.#n&&this.prewarm().catch(()=>{})}async#x(e,t,n){assertInFlightFollowUp(t);let r=this.#f,i=createAbortSignal(t.signal,e.abortController.signal),a=this.#r.projectResponses(t.inputResponses),o=await waitWithSignal(Promise.resolve(n?.(t)),i).then(e=>{let n=validateFollowUp(e??t);return n===t||(a=this.#r.replaceResponses(a,n)),n}).catch(e=>{throw a?.(),e});if(r!==this.#f)return;if(!this.#k(e))return a?.(),await this.#y(o);let s=this.#d.submit(o,this.#u.length,activeTurnForOptimisticFollowUp(this.#u));s!==void 0&&e.followUpSubmissionIds.add(s),this.#F();let c;c=(async()=>{try{let t=createAbortSignal(o.signal,e.abortController.signal);if(await waitWithSignal(e.response,t),!this.#k(e)||this.#g===void 0)throw Error(`The active eve turn ended before the follow-up could be sent.`);this.#C({headers:o.headers,streamReconnectPolicy:o.streamReconnectPolicy});let n=(await dispatchSessionTurn({session:this.#g,turn:{...o,signal:t}})).response;if(a=void 0,o.message===void 0)return;e.acceptedFollowUps+=1,this.#j(s,n)}catch(t){throw this.#k(e)&&(this.#d.fail(toError(t),s),a?.(),this.#F()),t}finally{e.followUpDispatches.delete(c)}})(),e.followUpDispatches.add(c),await c,await e.completion}async#S(e){let t={headers:e.headers,streamReconnectPolicy:e.streamReconnectPolicy};this.#p!==void 0&&(await waitWithSignal(this.#p.catch(e=>{if(this.#g!==void 0)throw e}),e.signal),e.signal?.throwIfAborted());let n=this.#g,r;try{let i=await dispatchSessionTurn({client:this.#e,session:n,turn:e,beforeSend:()=>{r=this.#C(t).subscribe(e.signal)}});return i.created&&(this.#w(i.session),r=this.#C(t).subscribe(e.signal)),{response:i.response,reader:r}}catch(e){throw r?.[Symbol.dispose](),e}}#C(e={}){if(this.#g===void 0)throw Error(`A session is required before opening its stream.`);let t=this.#f;return this.#i&&!this.#r.following&&this.#E(),this.#r.stream(this.#g,{...e,onEvent:e=>{t===this.#f&&this.#A(e)},onError:e=>{t===this.#f&&this.#s===void 0&&this.#T(e)}})}#w(e){this.#g=e,this.#i&&this.#n&&this.#E(),this.#c.onSessionChange?.(e.state),this.#F()}#T(e){this.#l=toError(e),this.#v=`error`,this.#c.onError?.(this.#l),this.#F()}#E(){this.#g&&this.#r.follow(this.#g,this.#u)}#D(){this.#f+=1,this.#m?.abort(),this.#m=void 0,this.#p=void 0}#O(e){if(this.#k(e)){e.resolveResponse(void 0),this.#s=void 0;try{this.#c.onSessionChange?.(this.#g?.state),this.#F(),this.#c.onFinish?.(this.#_)}finally{e.resolveCompletion()}}}#k(e){return this.#s===e}#A(e){let t=this.#v===`streaming`;if(!this.#r.observe(e,{onAccepted:()=>{this.#u=[...this.#u,e]},project:e=>{this.#M(this.#d.apply(e))},notify:!1}))return!1;this.#c.onEvent?.(e),this.#N(e);let{conversation:n}=this.#r,r=isSettledSessionTail(this.#u,n)&&n.activeTurnId===void 0;return this.#v!==`resuming`&&this.#l===void 0&&(`data`in e&&e.data!==void 0&&`turnId`in e.data&&(this.#v=`streaming`),this.#s===void 0&&r&&(this.#v=`ready`)),this.#c.onSessionChange?.(this.#g?.state),this.#v!==`resuming`&&this.#F(),this.#s===void 0&&t&&r&&this.#c.onFinish?.(this.#_),!0}#j(e,t){let n=getMessageResponseDeliveryId(t),r=this.#d.correlate(e,n,this.#u);this.#M(r)&&this.#F()}#M(e){return e!==void 0&&(this.#s!==void 0&&countFollowUpDeliveries(this.#s,e),!0)}#N(e){let t=toTerminalStreamFailureError(e);t!==void 0&&(this.#v=`error`,this.#d.failAll(t),this.#l===void 0&&(this.#l=t,this.#c.onError?.(t)))}#P(){return{data:this.#r.data,conversation:this.#r.conversation,error:this.#l,events:this.#u,session:this.#g?.state,status:this.#v}}#F(){this.#_=this.#P();for(let e of this.#o)e()}};function detachEveAgentStore(e){e[detachStore]()}function attachEveAgentStore(e){e[attachStore]()}export{EveAgentStore,attachEveAgentStore,detachEveAgentStore};
1
+ import{toError}from"#shared/errors.js";import{activeTurnForOptimisticFollowUp,assertAnswerable,assertExclusiveTurnInput,assertInFlightFollowUp,countFollowUpDeliveries,createAbortSignal,createActiveTurn,followSteeredTurns,isAbortError,isResponseBoundary,isSettledSessionTail,settledStatus,toTerminalStreamFailureError,validateFollowUp,waitWithSignal}from"#client/eve-agent-store-helpers.js";import{EveAgentProjection}from"#client/eve-agent-projection.js";import{throwIfAborted}from"#client/abort-signal.js";import{Client}from"#client/client.js";import{consumeMessageResponse,getMessageResponseDeliveryId}from"#client/message-response.js";import{OptimisticMessageSubmissions}from"#client/optimistic-message-submissions.js";import{ConversationClient}from"#client/conversation-client.js";import{dispatchSessionTurn}from"#client/session-turn-dispatch.js";const detachStore=Symbol(`detachEveAgentStore`),attachStore=Symbol(`attachEveAgentStore`);var EveAgentStore=class{#e;#t;#n=!1;#r;#i;#a;#o;#s=new Set;#c;#l={};#u;#d;#f;#p=0;#m;#h;#g;#_;#v;#y=`ready`;constructor(e){this.#t=e.prewarm??!1,this.#i=e.followSubagents??!1,this.#a=e.followIdle??!0,this.#o=e.session!==void 0,this.#e=this.#o?void 0:e.client??new Client({auth:e.auth,headers:e.headers,host:e.host??``}),this.#r=new ConversationClient(new EveAgentProjection(e.reducer,[]),()=>this.#L(),()=>this.#L()),this.#d=(e.initialEvents??[]).filter(e=>this.#r.hydrate(e)),this.#f=new OptimisticMessageSubmissions(this.#r.projections,e.optimistic??!0),this.#_=e.session??(e.initialSession===void 0?void 0:this.#e?.sessions.attach(e.initialSession.sessionId,{streamIndex:e.initialSession.streamIndex})),this.#v=this.#I()}get snapshot(){return this.#v}setCallbacks(e){this.#l=e}subscribe(e){return this.#s.add(e),()=>void this.#s.delete(e)}prewarm(){if(this.#m!==void 0)return this.#m;if(this.#_!==void 0||this.#o)return Promise.resolve();if(this.#c!==void 0)return this.#c.response.then(e=>{if(e===void 0)throw this.#u??new DOMException(`Session creation was aborted.`,`AbortError`)});let e=this.#e;if(e===void 0)return Promise.reject(Error(`This eve agent store does not own a session client.`));let t=this.#p,n=new AbortController;this.#h=n;let r=(async()=>{try{let r=await e.sessions.create({signal:n.signal});if(t!==this.#p)return;this.#u=void 0,this.#y===`error`&&(this.#y=`ready`),this.#T(r.session),this.#a&&this.#w()}catch(e){throw t===this.#p&&this.#c===void 0&&this.#u===void 0&&this.#E(e),e}})();this.#m=r;let clear=()=>{this.#m===r&&(this.#m=void 0,this.#h=void 0)};return r.then(clear,clear),r}async send(e){return await this.#b(e,this.#l.prepareSend)}async#b(e,t){if(assertAnswerable(e,this.#r.conversation),this.#c!==void 0){if(this.#y===`resuming`)throw Error(`eve session is resuming.`);return await this.#S(this.#c,e,t)}let n=createActiveTurn(e=>e.acceptedFollowUps>0&&this.#_!==void 0?this.#_.cancel():e.response.then(e=>e===void 0?{status:`no_active_turn`}:e.cancel()));this.#c=n,this.#u=void 0,this.#y=`submitted`;let r,i,a;try{assertExclusiveTurnInput(e),i=this.#f.submit(e,this.#d.length),a=this.#r.projectResponses(e.inputResponses),this.#L();let o=await(t===void 0?e:waitWithSignal(Promise.resolve(t(e)),createAbortSignal(e.signal,n.abortController.signal)));if(assertExclusiveTurnInput(o),!this.#A(n))return;o!==e&&(i=this.#f.resubmit(i,o),a=this.#r.replaceResponses(a,o),this.#L());let s={...o,signal:createAbortSignal(o.signal,n.abortController.signal)},c=await this.#C(s);a=void 0;let l=c.response;if(r=c.reader,!this.#A(n))return;n.resolveResponse(l),this.#N(i,l);for await(let e of consumeMessageResponse(l,r)){if(!this.#A(n))return;n.receivedFollowUps+=n.receivedFollowUpEvents.get(e)??0,n.receivedFollowUpEvents.delete(e)}if(!this.#A(n)||(await followSteeredTurns(n,r,()=>this.#A(n)),!this.#A(n)))return;this.#y=settledStatus(this.#u,this.#r.conversation)}catch(e){if(!this.#A(n))return;if(a?.(),isAbortError(e))this.#y=`ready`,this.#f.fail(toError(e),i);else{let t=this.#u!==void 0;this.#u??=toError(e),this.#y=`error`,this.#f.fail(this.#u,i),t||this.#l.onError?.(this.#u)}}finally{r?.[Symbol.dispose](),this.#k(n)}}resume(){if(this.#g!==void 0)return this.#g;let e=this.#x();this.#g=e;let clear=()=>{this.#g===e&&(this.#g=void 0)};return e.then(clear,clear),e}async#x(){if(this.#y!==`ready`&&this.#y!==`error`)throw Error(`eve session is already processing a turn.`);if(this.#_===void 0)throw Error(`An eve session is required before resuming.`);let e=this.#_,t=createActiveTurn(()=>e.cancel());this.#c=t,t.resolveResponse(void 0),this.#u=void 0,this.#y=`resuming`,this.#L();let n;try{let r=this.#w({catchUp:!0,startIndex:this.#d.length===e.state.streamIndex?e.state.streamIndex:0});if(n=r.subscribe(t.abortController.signal),await r.caughtUp,!this.#A(t))return;n.discard();let i=this.#d.at(-1);if(i!==void 0&&this.#F(i),i&&!this.#u&&!isSettledSessionTail(this.#d,this.#r.conversation)){this.#y=`streaming`,this.#L();for await(let e of n){if(!this.#A(t))return;if(t.receivedFollowUps+=t.receivedFollowUpEvents.get(e)??0,t.receivedFollowUpEvents.delete(e),isResponseBoundary(e,this.#r.conversation))break}}await followSteeredTurns(t,n,()=>this.#A(t)),this.#A(t)&&(this.#y=settledStatus(this.#u,this.#r.conversation))}catch(e){if(!this.#A(t))return;isAbortError(e)?this.#y=`ready`:(this.#u=toError(e),this.#y=`error`,this.#l.onError?.(this.#u))}finally{n?.[Symbol.dispose](),this.#k(t)}}cancel(){let e=this.#c;return e===void 0?this.#y===`streaming`&&this.#_!==void 0?this.#_.cancel():Promise.resolve({status:`no_active_turn`}):e.cancel()}async compact(){return await this.#_?.compact()??{status:`no_active_session`}}async clear(){return await this.#_?.clear()??{status:`no_active_session`}}async retire(){if(this.#o)throw Error(`retire() needs a store-owned session. Call reset() on the session you supplied, then create a new store for the next session.`);let e=await this.#_?.reset()??{status:`no_active_session`};return this.reset(),e}[attachStore](){this.#n=!0,this.#i&&!this.#r.following&&this.#D(),this.#t&&this.#_===void 0&&this.prewarm().catch(()=>{})}[detachStore](){this.#n=!1,this.#r.stop(),this.#c?.abortController.abort(),this.#O(),this.#g=void 0}reset(){this.#r.stop();let e=this.#c;this.#c=void 0,e?.resolveResponse(void 0),e?.resolveCompletion(),e?.abortController.abort(),this.#O(),this.#g=void 0,this.#o||(this.#_=void 0),this.#d=[],this.#r.reset(),this.#f.reset(),this.#i&&this.#n&&this.#D(),this.#u=void 0,this.#y=`ready`,this.#l.onSessionChange?.(this.#_?.state),this.#L(),this.#t&&this.#n&&this.prewarm().catch(()=>{})}async#S(e,t,n){assertInFlightFollowUp(t);let r=this.#p,i=createAbortSignal(t.signal,e.abortController.signal),a=this.#r.projectResponses(t.inputResponses),o=await waitWithSignal(Promise.resolve(n?.(t)),i).then(e=>{let n=validateFollowUp(e??t);return n===t||(a=this.#r.replaceResponses(a,n)),n}).catch(e=>{throw a?.(),e});if(r!==this.#p)return;if(!this.#A(e))return a?.(),await this.#b(o);let s=this.#f.submit(o,this.#d.length,activeTurnForOptimisticFollowUp(this.#d));s!==void 0&&e.followUpSubmissionIds.add(s),this.#L();let c;c=(async()=>{try{let t=createAbortSignal(o.signal,e.abortController.signal);if(await waitWithSignal(e.response,t),!this.#A(e)||this.#_===void 0)throw Error(`The active eve turn ended before the follow-up could be sent.`);this.#w({headers:o.headers,streamReconnectPolicy:o.streamReconnectPolicy});let n=(await dispatchSessionTurn({session:this.#_,turn:{...o,signal:t}})).response;if(a=void 0,o.message===void 0)return;e.acceptedFollowUps+=1,this.#N(s,n)}catch(t){throw this.#A(e)&&(this.#f.fail(toError(t),s),a?.(),this.#L()),t}finally{e.followUpDispatches.delete(c)}})(),e.followUpDispatches.add(c),await c,await e.completion}async#C(e){let t={headers:e.headers,streamReconnectPolicy:e.streamReconnectPolicy};this.#m!==void 0&&(await waitWithSignal(this.#m.catch(e=>{if(this.#_!==void 0)throw e}),e.signal),throwIfAborted(e.signal));let n=this.#_,r;try{let i=await dispatchSessionTurn({client:this.#e,session:n,turn:e,beforeSend:()=>{r=this.#w(t).subscribe(e.signal)}});return i.created&&(this.#T(i.session),r=this.#w(t).subscribe(e.signal)),{response:i.response,reader:r}}catch(e){throw r?.[Symbol.dispose](),e}}#w(e={}){if(this.#_===void 0)throw Error(`A session is required before opening its stream.`);let t=this.#p;return this.#i&&!this.#r.following&&this.#D(),this.#r.stream(this.#_,{...e,onEvent:e=>{t===this.#p&&this.#j(e)},onError:e=>{t===this.#p&&this.#c===void 0&&this.#E(e)}})}#T(e){this.#_=e,this.#i&&this.#n&&this.#D(),this.#l.onSessionChange?.(e.state),this.#L()}#E(e){this.#u=toError(e),this.#y=`error`,this.#l.onError?.(this.#u),this.#L()}#D(){this.#_&&this.#r.follow(this.#_,this.#d)}#O(){this.#p+=1,this.#h?.abort(),this.#h=void 0,this.#m=void 0}#k(e){if(this.#A(e)){e.resolveResponse(void 0),this.#c=void 0,this.#M();try{this.#l.onSessionChange?.(this.#_?.state),this.#L(),this.#l.onFinish?.(this.#v)}finally{e.resolveCompletion()}}}#A(e){return this.#c===e}#j(e){let t=this.#y===`streaming`;if(!this.#r.observe(e,{onAccepted:()=>{this.#d=[...this.#d,e]},project:e=>{this.#P(this.#f.apply(e))},notify:!1}))return!1;this.#l.onEvent?.(e),this.#F(e);let{conversation:n}=this.#r,r=isSettledSessionTail(this.#d,n)&&n.activeTurnId===void 0;return this.#y!==`resuming`&&this.#u===void 0&&(`data`in e&&e.data!==void 0&&`turnId`in e.data&&(this.#y=`streaming`),this.#c===void 0&&r&&(this.#y=`ready`)),this.#l.onSessionChange?.(this.#_?.state),this.#y!==`resuming`&&this.#L(),this.#c===void 0&&t&&r&&this.#l.onFinish?.(this.#v),this.#c===void 0&&this.#M(),!0}#M(){if(this.#a)return;let{conversation:e}=this.#r;e.activeTurnId!==void 0||this.#d.length>0&&!isSettledSessionTail(this.#d,e)||Object.values(e.tasks).some(e=>Object.values(e.calls).some(e=>e.status===`working`))||this.#r.closeStream()}#N(e,t){let n=getMessageResponseDeliveryId(t),r=this.#f.correlate(e,n,this.#d);this.#P(r)&&this.#L()}#P(e){return e!==void 0&&(this.#c!==void 0&&countFollowUpDeliveries(this.#c,e),!0)}#F(e){let t=toTerminalStreamFailureError(e);t!==void 0&&(this.#y=`error`,this.#f.failAll(t),this.#u===void 0&&(this.#u=t,this.#l.onError?.(t)))}#I(){return{data:this.#r.data,conversation:this.#r.conversation,error:this.#u,events:this.#d,session:this.#_?.state,status:this.#y}}#L(){this.#v=this.#I();for(let e of this.#s)e()}};function detachEveAgentStore(e){e[detachStore]()}function attachEveAgentStore(e){e[attachStore]()}export{EveAgentStore,attachEveAgentStore,detachEveAgentStore};
@@ -1,3 +1,3 @@
1
- import{EVE_STREAM_LEASE_ENDED_CONTROL}from"#protocol/message.js";import{normalizeMessageStreamEvent}from"#protocol/message-version.js";function isStreamDisconnectError(e){if(e instanceof DOMException)return e.name===`AbortError`;if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return e.name===`AbortError`||e.message===`terminated`||t===`UND_ERR_SOCKET`||e instanceof TypeError&&/^(?:failed to fetch|fetch failed|load failed|networkerror when attempting to fetch resource\.)$/i.test(e.message)||/abort|cancel|disconnect|premature close|socket|terminated/i.test(e.message)}async function*readNdjsonStream(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=!1,abort=()=>{n.cancel().catch(()=>{})};t.signal?.addEventListener(`abort`,abort,{once:!0});try{for(;;){t.signal?.throwIfAborted();let e=await readWithIdleTimeout(n,t?.idleTimeoutMs);if(t.signal?.throwIfAborted(),e.done){a=!0,i+=r.decode();break}e.value&&(i+=r.decode(e.value,{stream:!0}));let o=i.indexOf(`
1
+ import{EVE_STREAM_LEASE_ENDED_CONTROL}from"#protocol/message.js";import{throwIfAborted}from"#client/abort-signal.js";import{normalizeMessageStreamEvent}from"#protocol/message-version.js";function isStreamDisconnectError(e){if(e instanceof DOMException)return e.name===`AbortError`;if(!(e instanceof Error))return!1;let t=`code`in e&&typeof e.code==`string`?e.code:void 0;return e.name===`AbortError`||e.message===`terminated`||t===`UND_ERR_SOCKET`||e instanceof TypeError&&/^(?:failed to fetch|fetch failed|load failed|networkerror when attempting to fetch resource\.)$/i.test(e.message)||/abort|cancel|disconnect|premature close|socket|terminated/i.test(e.message)}async function*readNdjsonStream(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=!1,abort=()=>{n.cancel().catch(()=>{})};t.signal?.addEventListener(`abort`,abort,{once:!0});try{for(;;){throwIfAborted(t.signal);let e=await readWithIdleTimeout(n,t?.idleTimeoutMs);if(throwIfAborted(t.signal),e.done){a=!0,i+=r.decode();break}e.value&&(i+=r.decode(e.value,{stream:!0}));let o=i.indexOf(`
2
2
  `);for(;o!==-1;){let e=i.slice(0,o).trim();if(i=i.slice(o+1),e.length>0){let n=JSON.parse(e);t.controlVersion===`1`&&isLeaseEndedControl(n)?t.onLeaseEnded?.():yield parseMessageStreamEvent(n,t.streamVersion)}o=i.indexOf(`
3
3
  `)}}let e=i.trim();if(e.length>0){let n=JSON.parse(e);t.controlVersion===`1`&&isLeaseEndedControl(n)?t.onLeaseEnded?.():yield parseMessageStreamEvent(n,t.streamVersion)}}finally{t.signal?.removeEventListener(`abort`,abort),a||n.cancel().catch(()=>{}),n.releaseLock()}}function isLeaseEndedControl(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.$eve===EVE_STREAM_LEASE_ENDED_CONTROL.$eve&&t.version===EVE_STREAM_LEASE_ENDED_CONTROL.version}function parseMessageStreamEvent(e,t){return normalizeMessageStreamEvent(t,e)}async function readWithIdleTimeout(e,t){let n;try{return t===void 0?await e.read():await Promise.race([e.read(),new Promise((e,r)=>{n=setTimeout(()=>r(new DOMException(`Session stream was idle.`,`AbortError`)),t)})])}catch(e){throw e instanceof TypeError?Error(`Session stream disconnected.`,{cause:e}):e}finally{n!==void 0&&clearTimeout(n)}}export{isStreamDisconnectError,readNdjsonStream};
@@ -1 +1 @@
1
- import{ClientError,ClientSessionStrandedError,createClientError}from"#client/client-error.js";import{EVE_STREAM_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_TAIL_INDEX_HEADER}from"#protocol/message.js";import{createClientUrl}from"#client/url.js";import{isStreamDisconnectError,readNdjsonStream}from"#client/ndjson.js";import{readMessageStreamVersion}from"#client/stream-version.js";const DEFAULT_STREAM_RECONNECT_POLICY={retryableErrorStatuses:new Set([404,409,425,500,502,503,504]),streamIdleReconnectPolicy:{baseDelayMs:250,maxAttempts:5,maxDelayMs:4e3},streamOpenReconnectPolicy:{baseDelayMs:250,maxAttempts:12,maxDelayMs:5e3}},NO_STREAM_RECONNECT_POLICY={...DEFAULT_STREAM_RECONNECT_POLICY,streamIdleReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy,maxAttempts:0},streamOpenReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy,maxAttempts:1}};function resolveRetryPolicy(e,t){return{...t,...e}}function resolveStreamReconnectPolicy(e,t=!1){if(e&&`reconnect`in e&&e.reconnect===!1)return NO_STREAM_RECONNECT_POLICY;let n=e;return{retryableErrorStatuses:n?.retryableErrorStatuses?new Set(n.retryableErrorStatuses):DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses,streamIdleReconnectPolicy:resolveRetryPolicy(n?.streamIdleReconnectPolicy,{...DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy,maxAttempts:t?1/0:DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy.maxAttempts}),streamOpenReconnectPolicy:resolveRetryPolicy(n?.streamOpenReconnectPolicy,DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy)}}async function*followStreamIterable(e){if(e.follow===!1&&e.startIndex<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);let resolvePolicy=()=>resolveStreamReconnectPolicy(e.resolveReconnectPolicy===void 0?e.streamReconnectPolicy:e.resolveReconnectPolicy(),e.keepAlive),t=resolvePolicy(),n=t.streamIdleReconnectPolicy,r=e.startIndex,i=n.baseDelayMs,a=0,o=!0,s,c=!1;for(;;){t=resolvePolicy(),n=t.streamIdleReconnectPolicy;let l;try{l=await openStreamBody({...e,retryPolicy:t,startIndex:r,requestTailIndex:(e.follow===!1||e.onCaughtUp!==void 0)&&s===void 0})}catch(t){if(e.signal?.aborted)return;throw t}if((e.follow===!1||e.onCaughtUp!==void 0)&&s===void 0&&(s=l.tailIndex,s===void 0))throw l.close(),Error(`stream({ follow: false }) requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);if(!c&&s!==void 0&&r>s&&(c=!0,e.onCaughtUp?.()),e.follow===!1&&s!==void 0&&r>s){l.close();return}let u=!1,d=!1;try{for await(let t of readNdjsonStream(l.body,{signal:e.signal,controlVersion:l.controlVersion,idleTimeoutMs:e.streamReadIdleTimeoutMs??15e3,onLeaseEnded:()=>{d=!0},streamVersion:l.streamVersion}))if(r+=1,u=!0,i=n.baseDelayMs,a=0,yield t,!c&&s!==void 0&&r>s&&(c=!0,e.onCaughtUp?.()),t.type===`session.failed`||t.type===`session.completed`||e.follow===!1&&s!==void 0&&r>s)return}catch(e){if(!isStreamDisconnectError(e))throw e}finally{l.close()}if(n=resolvePolicy().streamIdleReconnectPolicy,e.signal?.aborted||e.startIndex<0||n.maxAttempts===0)return;if(!d){if(!u&&!o&&(a+=1)>=n.maxAttempts||(o=!1,await sleep(i,e.signal),e.signal?.aborted))return;i=Math.min(i*2,n.maxDelayMs)}}}async function openStreamBody(e){let t=e.retryPolicy??resolveStreamReconnectPolicy(e.streamReconnectPolicy,e.keepAlive),n=t.streamOpenReconnectPolicy,r,i,a,o=n.baseDelayMs,s=e.startIndex>=0&&t.streamIdleReconnectPolicy.maxAttempts>0?EVE_STREAM_CONTROL_VERSION:void 0,c={};s!==void 0&&(c[EVE_STREAM_CONTROL_VERSION_QUERY]=s),e.startIndex!==0&&(c.startIndex=String(e.startIndex)),e.requestTailIndex===!0&&(c.includeTailIndex=`1`),e.follow===!1&&(c.follow=`false`);for(let l=0;l<n.maxAttempts;l+=1){e.signal?.throwIfAborted();let u=createClientUrl(e.host,e.path,Object.keys(c).length>0?c:void 0),d=await e.resolveHeaders();e.signal?.throwIfAborted();let f=new AbortController,p=e.signal?AbortSignal.any([e.signal,f.signal]):f.signal,m;try{m=await fetch(u,{cache:`no-store`,headers:d,redirect:e.redirect,signal:p})}catch(t){if(e.signal?.aborted||!isStreamDisconnectError(t)||l===n.maxAttempts-1)throw t;await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs);continue}if(m.ok){if(!m.body)throw new ClientError(m.status,`Response body is null.`,m.headers);let e=!1;return{body:m.body,close:()=>{e||(e=!0,m.body?.cancel().catch(()=>{}),f.abort())},controlVersion:s,streamVersion:readMessageStreamVersion(m.headers),tailIndex:parseTailIndexHeader(m.headers)}}r=m.status,i=await m.text(),a=m.headers;let h=createClientError(m.status,i,m.headers);if(h instanceof ClientSessionStrandedError||!t.retryableErrorStatuses.has(m.status))throw h;l<n.maxAttempts-1&&(await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs))}throw new ClientError(r??0,i??`Failed to open message stream.`,a)}function parseTailIndexHeader(e){let t=e.get(EVE_STREAM_TAIL_INDEX_HEADER);if(t===null||!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isSafeInteger(n)?n:void 0}async function sleep(e,t){t?.aborted||await new Promise(n=>{let onAbort=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t?.removeEventListener(`abort`,onAbort),n()},e);t?.addEventListener(`abort`,onAbort,{once:!0})})}export{followStreamIterable,openStreamBody,sleep};
1
+ import{ClientError,ClientSessionStrandedError,createClientError}from"#client/client-error.js";import{EVE_STREAM_CONTROL_VERSION,EVE_STREAM_CONTROL_VERSION_QUERY,EVE_STREAM_TAIL_INDEX_HEADER}from"#protocol/message.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{isStreamDisconnectError,readNdjsonStream}from"#client/ndjson.js";import{readMessageStreamVersion}from"#client/stream-version.js";const DEFAULT_STREAM_RECONNECT_POLICY={retryableErrorStatuses:new Set([404,409,425,500,502,503,504]),streamIdleReconnectPolicy:{baseDelayMs:250,maxAttempts:5,maxDelayMs:4e3},streamOpenReconnectPolicy:{baseDelayMs:250,maxAttempts:12,maxDelayMs:5e3}},NO_STREAM_RECONNECT_POLICY={...DEFAULT_STREAM_RECONNECT_POLICY,streamIdleReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy,maxAttempts:0},streamOpenReconnectPolicy:{...DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy,maxAttempts:1}};function resolveRetryPolicy(e,t){return{...t,...e}}function resolveStreamReconnectPolicy(e,t=!1){if(e&&`reconnect`in e&&e.reconnect===!1)return NO_STREAM_RECONNECT_POLICY;let n=e;return{retryableErrorStatuses:n?.retryableErrorStatuses?new Set(n.retryableErrorStatuses):DEFAULT_STREAM_RECONNECT_POLICY.retryableErrorStatuses,streamIdleReconnectPolicy:resolveRetryPolicy(n?.streamIdleReconnectPolicy,{...DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy,maxAttempts:t?1/0:DEFAULT_STREAM_RECONNECT_POLICY.streamIdleReconnectPolicy.maxAttempts}),streamOpenReconnectPolicy:resolveRetryPolicy(n?.streamOpenReconnectPolicy,DEFAULT_STREAM_RECONNECT_POLICY.streamOpenReconnectPolicy)}}async function*followStreamIterable(e){if(e.follow===!1&&e.startIndex<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);let resolvePolicy=()=>resolveStreamReconnectPolicy(e.resolveReconnectPolicy===void 0?e.streamReconnectPolicy:e.resolveReconnectPolicy(),e.keepAlive),t=resolvePolicy(),n=t.streamIdleReconnectPolicy,r=e.startIndex,i=n.baseDelayMs,a=0,o=!0,s,c=!1;for(;;){t=resolvePolicy(),n=t.streamIdleReconnectPolicy;let l;try{l=await openStreamBody({...e,retryPolicy:t,startIndex:r,requestTailIndex:(e.follow===!1||e.onCaughtUp!==void 0)&&s===void 0})}catch(t){if(e.signal?.aborted)return;throw t}if((e.follow===!1||e.onCaughtUp!==void 0)&&s===void 0&&(s=l.tailIndex,s===void 0))throw l.close(),Error(`stream({ follow: false }) requires the server to report the ${EVE_STREAM_TAIL_INDEX_HEADER} header. The agent may be running an older eve version.`);if(!c&&s!==void 0&&r>s&&(c=!0,e.onCaughtUp?.()),e.follow===!1&&s!==void 0&&r>s){l.close();return}let u=!1,d=!1;try{for await(let t of readNdjsonStream(l.body,{signal:e.signal,controlVersion:l.controlVersion,idleTimeoutMs:e.streamReadIdleTimeoutMs??15e3,onLeaseEnded:()=>{d=!0},streamVersion:l.streamVersion}))if(r+=1,u=!0,i=n.baseDelayMs,a=0,yield t,!c&&s!==void 0&&r>s&&(c=!0,e.onCaughtUp?.()),t.type===`session.failed`||t.type===`session.completed`||e.follow===!1&&s!==void 0&&r>s)return}catch(e){if(!isStreamDisconnectError(e))throw e}finally{l.close()}if(n=resolvePolicy().streamIdleReconnectPolicy,e.signal?.aborted||e.startIndex<0||n.maxAttempts===0)return;if(!d){if(!u&&!o&&(a+=1)>=n.maxAttempts||(o=!1,await sleep(i,e.signal),e.signal?.aborted))return;i=Math.min(i*2,n.maxDelayMs)}}}async function openStreamBody(e){let t=e.retryPolicy??resolveStreamReconnectPolicy(e.streamReconnectPolicy,e.keepAlive),n=t.streamOpenReconnectPolicy,r,i,a,o=n.baseDelayMs,s=e.startIndex>=0&&t.streamIdleReconnectPolicy.maxAttempts>0?EVE_STREAM_CONTROL_VERSION:void 0,c={};s!==void 0&&(c[EVE_STREAM_CONTROL_VERSION_QUERY]=s),e.startIndex!==0&&(c.startIndex=String(e.startIndex)),e.requestTailIndex===!0&&(c.includeTailIndex=`1`),e.follow===!1&&(c.follow=`false`);for(let l=0;l<n.maxAttempts;l+=1){throwIfAborted(e.signal);let u=createClientUrl(e.host,e.path,Object.keys(c).length>0?c:void 0),d=await e.resolveHeaders();throwIfAborted(e.signal);let f=new AbortController,p=e.signal?AbortSignal.any([e.signal,f.signal]):f.signal,m;try{m=await fetch(u,{cache:`no-store`,headers:d,redirect:e.redirect,signal:p})}catch(t){if(e.signal?.aborted||!isStreamDisconnectError(t)||l===n.maxAttempts-1)throw t;await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs);continue}if(m.ok){if(!m.body)throw new ClientError(m.status,`Response body is null.`,m.headers);let e=!1;return{body:m.body,close:()=>{e||(e=!0,m.body?.cancel().catch(()=>{}),f.abort())},controlVersion:s,streamVersion:readMessageStreamVersion(m.headers),tailIndex:parseTailIndexHeader(m.headers)}}r=m.status,i=await m.text(),a=m.headers;let h=createClientError(m.status,i,m.headers);if(h instanceof ClientSessionStrandedError||!t.retryableErrorStatuses.has(m.status))throw h;l<n.maxAttempts-1&&(await sleep(o,e.signal),o=Math.min(o*2,n.maxDelayMs))}throw new ClientError(r??0,i??`Failed to open message stream.`,a)}function parseTailIndexHeader(e){let t=e.get(EVE_STREAM_TAIL_INDEX_HEADER);if(t===null||!/^-?\d+$/.test(t))return;let n=Number(t);return Number.isSafeInteger(n)?n:void 0}async function sleep(e,t){t?.aborted||await new Promise(n=>{let onAbort=()=>{clearTimeout(r),n()},r=setTimeout(()=>{t?.removeEventListener(`abort`,onAbort),n()},e);t?.addEventListener(`abort`,onAbort,{once:!0})})}export{followStreamIterable,openStreamBody,sleep};
@@ -1 +1 @@
1
- async function dispatchSessionTurn(e){let{client:t,session:n,turn:r,beforeSend:i}=e;if(n===void 0){if(t===void 0)throw Error(`An external eve session is required before sending.`);if(r.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await t.sessions.create({...r,message:r.message});return r.signal?.throwIfAborted(),{...e,created:!0}}if(i?.(),r.inputResponses===void 0){let{message:e,...t}=r;return{session:n,response:await n.send(e,t),created:!1}}let{inputResponses:a,...o}=r;return{session:n,response:await n.respond(a,o),created:!1}}export{dispatchSessionTurn};
1
+ import{throwIfAborted}from"#client/abort-signal.js";async function dispatchSessionTurn(e){let{client:t,session:n,turn:r,beforeSend:i}=e;if(n===void 0){if(t===void 0)throw Error(`An external eve session is required before sending.`);if(r.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await t.sessions.create({...r,message:r.message});return throwIfAborted(r.signal),{...e,created:!0}}if(i?.(),r.inputResponses===void 0){let{message:e,...t}=r;return{session:n,response:await n.send(e,t),created:!1}}let{inputResponses:a,...o}=r;return{session:n,response:await n.respond(a,o),created:!1}}export{dispatchSessionTurn};
@@ -1 +1 @@
1
- import{foldSession,initialSessionProjection,openInputs,openSignIns}from"#protocol/session-projection.js";import{isCurrentTurnBoundaryEvent,isTurnFailureEvent}from"#protocol/message.js";function summarizeTurnEvents(e){let t=new TurnSegment,n,r,i;for(let a of e)t.observe(a)&&(n=a),isTurnFailureEvent(a)&&(r=a),isFinalMessageCompleted(a)&&(i=a.data.message??void 0),a.type===`turn.waiting`&&(i=void 0);return{boundary:n,failure:r,inputRequests:t.inputRequests,message:i,pendingAuthorizations:t.pendingAuthorizations,status:summarizeBoundaryStatus(n)}}function summarizeBoundaryStatus(e){return e?.type===`session.waiting`||e?.type===`turn.waiting`?`waiting`:e?.type===`session.failed`?`failed`:`completed`}async function collectTurnEvents(e){let t=[],n=new TurnSegment;for await(let r of e)if(t.push(r),n.observe(r))break;return t}function endsTurnSegment(e,t){return e.type===`turn.waiting`?t.requests||e.data.on===`input`&&!t.callbacks:isCurrentTurnBoundaryEvent(e)&&(e.type!==`session.waiting`||!t.callbacks)}var TurnSegment=class{#e=initialSessionProjection();#t=new Map;#n;constructor(e={}){this.#n=e.followCallbacks===!0}get inputRequests(){return openInputs(this.#e).map(e=>e.request)}get pendingAuthorizations(){return openSignIns(this.#e).flatMap(e=>this.#t.get(e.attemptId)??[])}observe(e){return this.#e=foldSession(this.#e,e),e.type===`authorization.required`&&this.#t.set(e.data.attemptId??e.data.name,e.data),endsTurnSegment(e,{callbacks:this.#n&&openSignIns(this.#e).some(e=>e.awaitsCallback===!0),requests:openInputs(this.#e).length>0})}};function isFinalMessageCompleted(e){return e.type===`message.completed`&&e.data.finishReason!==`tool-calls`}function authorizationKey(e){return e.attemptId===void 0?`name:${e.name}`:`attempt:${e.attemptId}`}export{TurnSegment,authorizationKey,collectTurnEvents,endsTurnSegment,summarizeTurnEvents};
1
+ import{foldSession,initialSessionProjection,openInputs,openSignIns}from"#protocol/session-projection.js";import{isCurrentTurnBoundaryEvent,isTurnFailureEvent}from"#protocol/message.js";function summarizeTurnEvents(e){let t=new TurnSegment,n,r,i;for(let a of e)t.observe(a)&&(n=a),isTurnFailureEvent(a)&&(r=a),isFinalMessageCompleted(a)&&(i=a.data.message??void 0);return{boundary:n,failure:r,inputRequests:t.inputRequests,message:i,pendingAuthorizations:t.pendingAuthorizations,status:summarizeBoundaryStatus(n)}}function summarizeBoundaryStatus(e){return e?.type===`session.waiting`||e?.type===`turn.waiting`?`waiting`:e?.type===`session.failed`?`failed`:`completed`}async function collectTurnEvents(e){let t=[],n=new TurnSegment;for await(let r of e)if(t.push(r),n.observe(r))break;return t}function endsTurnSegment(e,t){return e.type===`turn.waiting`?t.requests||e.data.on===`input`&&!t.callbacks:isCurrentTurnBoundaryEvent(e)&&(e.type!==`session.waiting`||!t.callbacks)}var TurnSegment=class{#e=initialSessionProjection();#t=new Map;#n;constructor(e={}){this.#n=e.followCallbacks===!0}get inputRequests(){return openInputs(this.#e).map(e=>e.request)}get pendingAuthorizations(){return openSignIns(this.#e).flatMap(e=>this.#t.get(e.attemptId)??[])}observe(e){return this.#e=foldSession(this.#e,e),e.type===`authorization.required`&&this.#t.set(e.data.attemptId??e.data.name,e.data),endsTurnSegment(e,{callbacks:this.#n&&openSignIns(this.#e).some(e=>e.awaitsCallback===!0),requests:openInputs(this.#e).length>0})}};function isFinalMessageCompleted(e){return e.type===`message.completed`&&e.data.finishReason!==`tool-calls`}function authorizationKey(e){return e.attemptId===void 0?`name:${e.name}`:`attempt:${e.attemptId}`}export{TurnSegment,authorizationKey,collectTurnEvents,endsTurnSegment,summarizeTurnEvents};
@@ -1 +1 @@
1
- import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath,createEveSessionStreamRoutePath}from"#protocol/routes.js";import{ClientError,createClientError}from"#client/client-error.js";import{TurnSegment}from"#client/session-utils.js";import{EVE_SESSION_ID_HEADER}from"#protocol/message.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{ClientAgentSession}from"#client/agent-session.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";const followSession=Symbol(`followClientSession`);var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0,t.stubs),{sessionId:r}=await readAcceptedMessage(n),i=new ClientSession(e,{sessionId:r,streamIndex:0});return{response:i.#r(n,t,0),session:i}}static async prewarm(e,t={}){let{sessionId:n}=await readAcceptedMessage(await postCreateSession(e,t));return new ClientSession(e,{sessionId:n,streamIndex:0})}get state(){return this.#t}async snapshot(e){e?.signal?.throwIfAborted();let t=[];for await(let n of this.#s({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return e?.signal?.throwIfAborted(),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),i=t?await postSessionSend(this.#e,r,e):await postTurn(this.#e,r,e,!1),{sessionId:a,deliveryId:o}=await readAcceptedMessage(i,this.#t.sessionId);if(a!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);if(e.message!==void 0&&o===void 0)throw Error(`Message route did not return a delivery id. Update the server before sending with this client.`);return this.#r(i,e,n,e.message===void 0?void 0:o)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}agent(e){return new ClientAgentSession(this.#e,e)}[followSession](e){return this.#a({...e,keepAlive:!0})}#r(e,t,n,r){return e.body?.cancel().catch(()=>{}),new MessageResponse({cancelTurn:async e=>await this.cancel({turnId:e}),createStream:e=>this.#i(n,t,r,e),deliveryId:r,resumesTurn:t.inputResponses!==void 0,sessionId:this.#t.sessionId})}async*#i(e,t,n,r){let i=0,a=n===void 0,o=!1,s=new TurnSegment({followCallbacks:!0});try{for await(let c of r??this.#s({headers:t.headers,keepAlive:!0,signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy})){if(i+=1,n!==void 0){let e=c.meta?.deliveryIds?.includes(n)===!0,t=c.type===`session.failed`||c.type===`session.completed`;if(!e&&t&&(!a||c.type===`session.completed`))throw Error(`The session ended before the accepted message reached its turn boundary.`);if(!a&&!e)continue;let r=c.meta?.deliveryIds!==void 0;if(!t&&r&&!e)continue;a=!0}if(o=s.observe(c),yield c,o)break}if(n!==void 0&&!o&&!t.signal?.aborted)throw Error(`The response stream ended before the accepted message reached its turn boundary.`)}finally{this.#o(e+i)}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;for await(let r of this.#s({follow:e?.follow,headers:e?.headers,keepAlive:e?.keepAlive,onCaughtUp:e?.onCaughtUp,resolveHeaders:e?.resolveHeaders,resolveReconnectPolicy:e?.resolveReconnectPolicy,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,t>=0&&this.#o(t+n),yield r}#o(e){this.#t={sessionId:this.#t.sessionId,streamIndex:Math.max(this.#t.streamIndex,e)}}#s(e){return followStreamIterable({onCaughtUp:e.onCaughtUp,follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.resolveHeaders?.()??e.headers),path:createEveSessionStreamRoutePath(this.#t.sessionId),redirect:this.#e.redirect,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy,resolveReconnectPolicy:e.resolveReconnectPolicy})}};function followClientSession(e,t){return e[followSession](t)}async function postSessionSend(e,t,n){let r=Date.now()+2e4,i=250;for(;;){try{return await postTurn(e,t,n,!1)}catch(e){if(!isSessionNotReady(e))throw e;let t=r-Date.now();if(t<=0)throw e;await sleep(Math.min(i,t),n.signal)}n.signal?.throwIfAborted(),i=Math.min(i*2,2e3)}}async function postCreateSession(e,t){let n=await e.resolveHeaders(t.headers),r=t.stubs===void 0?void 0:JSON.stringify({stubs:t.stubs});r!==void 0&&n.set(`content-type`,`application/json`);let i=await fetch(createClientUrl(e.host,EVE_SESSION_ROUTE_PATH),{body:r,headers:n,method:`POST`,redirect:e.redirect,signal:t.signal??null});if(!i.ok){let e=await i.text();throw new ClientError(i.status,e,i.headers)}return i}function isSessionNotReady(e){return e instanceof ClientError&&e.status===409&&e.code===`session_not_ready`}async function postTurn(e,t,n,r,i){let a=createMessageBody(n,r);if(a===null)throw Error(r?`Creating a session requires a non-empty message.`:`A session turn requires a non-empty message or inputResponses.`);i!==void 0&&(a.stubs=i);let o=await e.resolveHeaders(n.headers);o.set(`content-type`,`application/json`);let s=await fetch(createClientUrl(e.host,t),{body:JSON.stringify(a),headers:o,method:`POST`,redirect:e.redirect,signal:n.signal??null});if(!s.ok){let e=await s.text();throw createClientError(s.status,e,s.headers)}return s}async function readAcceptedMessage(e,t){let n=await e.json(),r=(typeof n.sessionId==`string`?n.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!r)throw Error(`Message route did not return a session id.`);return{sessionId:r,deliveryId:typeof n.deliveryId==`string`&&n.deliveryId.length>0?n.deliveryId:void 0}}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!t&&e.message!==void 0&&e.turnPolicy!==void 0&&(n.turnPolicy=e.turnPolicy),e.clientContext!==void 0&&(n.clientContext=e.clientContext);let r=serializeOutputSchema(e.outputSchema);return r!==void 0&&(n.outputSchema=r),t&&n.message===void 0||n.message===void 0&&n.inputResponses===void 0?null:n}export{ClientSession,followClientSession};
1
+ import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath,createEveSessionStreamRoutePath}from"#protocol/routes.js";import{ClientError,createClientError}from"#client/client-error.js";import{TurnSegment}from"#client/session-utils.js";import{EVE_SESSION_ID_HEADER}from"#protocol/message.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{createClientUrl}from"#client/url.js";import{throwIfAborted}from"#client/abort-signal.js";import{MessageResponse}from"#client/message-response.js";import{ClientAgentSession}from"#client/agent-session.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";const followSession=Symbol(`followClientSession`);var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0,t.stubs),{sessionId:r}=await readAcceptedMessage(n),i=new ClientSession(e,{sessionId:r,streamIndex:0});return{response:i.#r(n,t,0),session:i}}static async prewarm(e,t={}){let{sessionId:n}=await readAcceptedMessage(await postCreateSession(e,t));return new ClientSession(e,{sessionId:n,streamIndex:0})}get state(){return this.#t}async snapshot(e){throwIfAborted(e?.signal);let t=[];for await(let n of this.#s({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return throwIfAborted(e?.signal),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),i=t?await postSessionSend(this.#e,r,e):await postTurn(this.#e,r,e,!1),{sessionId:a,deliveryId:o}=await readAcceptedMessage(i,this.#t.sessionId);if(a!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);if(e.message!==void 0&&o===void 0)throw Error(`Message route did not return a delivery id. Update the server before sending with this client.`);return this.#r(i,e,n,e.message===void 0?void 0:o)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}agent(e){return new ClientAgentSession(this.#e,e)}[followSession](e){return this.#a({...e,keepAlive:!0})}#r(e,t,n,r){return e.body?.cancel().catch(()=>{}),new MessageResponse({cancelTurn:async e=>await this.cancel({turnId:e}),createStream:e=>this.#i(n,t,r,e),deliveryId:r,resumesTurn:t.inputResponses!==void 0,sessionId:this.#t.sessionId})}async*#i(e,t,n,r){let i=0,a=n===void 0,o=!1,s=new TurnSegment({followCallbacks:!0});try{for await(let c of r??this.#s({headers:t.headers,keepAlive:!0,signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy})){if(i+=1,n!==void 0){let e=c.meta?.deliveryIds?.includes(n)===!0,t=c.type===`session.failed`||c.type===`session.completed`;if(!e&&t&&(!a||c.type===`session.completed`))throw Error(`The session ended before the accepted message reached its turn boundary.`);if(!a&&!e)continue;let r=c.meta?.deliveryIds!==void 0;if(!t&&r&&!e)continue;a=!0}if(o=s.observe(c),yield c,o)break}if(n!==void 0&&!o&&!t.signal?.aborted)throw Error(`The response stream ended before the accepted message reached its turn boundary.`)}finally{this.#o(e+i)}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;for await(let r of this.#s({follow:e?.follow,headers:e?.headers,keepAlive:e?.keepAlive,onCaughtUp:e?.onCaughtUp,resolveHeaders:e?.resolveHeaders,resolveReconnectPolicy:e?.resolveReconnectPolicy,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,t>=0&&this.#o(t+n),yield r}#o(e){this.#t={sessionId:this.#t.sessionId,streamIndex:Math.max(this.#t.streamIndex,e)}}#s(e){return followStreamIterable({onCaughtUp:e.onCaughtUp,follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.resolveHeaders?.()??e.headers),path:createEveSessionStreamRoutePath(this.#t.sessionId),redirect:this.#e.redirect,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy,resolveReconnectPolicy:e.resolveReconnectPolicy})}};function followClientSession(e,t){return e[followSession](t)}async function postSessionSend(e,t,n){let r=Date.now()+2e4,i=250;for(;;){try{return await postTurn(e,t,n,!1)}catch(e){if(!isSessionNotReady(e))throw e;let t=r-Date.now();if(t<=0)throw e;await sleep(Math.min(i,t),n.signal)}throwIfAborted(n.signal),i=Math.min(i*2,2e3)}}async function postCreateSession(e,t){let n=await e.resolveHeaders(t.headers),r=t.stubs===void 0?void 0:JSON.stringify({stubs:t.stubs});r!==void 0&&n.set(`content-type`,`application/json`);let i=await fetch(createClientUrl(e.host,EVE_SESSION_ROUTE_PATH),{body:r,headers:n,method:`POST`,redirect:e.redirect,signal:t.signal??null});if(!i.ok){let e=await i.text();throw new ClientError(i.status,e,i.headers)}return i}function isSessionNotReady(e){return e instanceof ClientError&&e.status===409&&e.code===`session_not_ready`}async function postTurn(e,t,n,r,i){let a=createMessageBody(n,r);if(a===null)throw Error(r?`Creating a session requires a non-empty message.`:`A session turn requires a non-empty message or inputResponses.`);i!==void 0&&(a.stubs=i);let o=await e.resolveHeaders(n.headers);o.set(`content-type`,`application/json`);let s=await fetch(createClientUrl(e.host,t),{body:JSON.stringify(a),headers:o,method:`POST`,redirect:e.redirect,signal:n.signal??null});if(!s.ok){let e=await s.text();throw createClientError(s.status,e,s.headers)}return s}async function readAcceptedMessage(e,t){let n=await e.json(),r=(typeof n.sessionId==`string`?n.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!r)throw Error(`Message route did not return a session id.`);return{sessionId:r,deliveryId:typeof n.deliveryId==`string`&&n.deliveryId.length>0?n.deliveryId:void 0}}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!t&&e.message!==void 0&&e.turnPolicy!==void 0&&(n.turnPolicy=e.turnPolicy),e.clientContext!==void 0&&(n.clientContext=e.clientContext);let r=serializeOutputSchema(e.outputSchema);return r!==void 0&&(n.outputSchema=r),t&&n.message===void 0||n.message===void 0&&n.inputResponses===void 0?null:n}export{ClientSession,followClientSession};
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "moduleFingerprints": {
3
3
  "@eve/catalog": "d5babf703f0f589f123ee2043b72bcb4823ccccbe5034315c3b70fbae7cd76a0",
4
+ "@eve/tracing": "db045e46c45dfa0c1d045789bb04cfbe21999a0c35a848844b25e011ed332004",
4
5
  "just-secrets": "1ce67d437d0bb06df02e4e99180a3c5f5edf0010314010226e97b96d462bba5d",
5
6
  "@workflow/world-local": "a10e78551f65fc607cf75261a569d852c40bc9cfac13a7fb6e15c88bf1ccf429"
6
7
  },
@@ -19,6 +20,7 @@
19
20
  "eventsource-parser": "3.1.0",
20
21
  "env-runner": "0.1.16",
21
22
  "@eve/catalog": "0.0.1",
23
+ "@eve/tracing": "0.0.0",
22
24
  "@ai-sdk/google": "4.0.93",
23
25
  "jose": "6.2.3",
24
26
  "js-yaml": "4.3.2",
@@ -59,7 +61,7 @@
59
61
  "zod": "4.5.4",
60
62
  "zod-validation-error": "5.0.0"
61
63
  },
62
- "scriptHash": "f296c8787cbb975a01596e49048f5c4b1a1480c03754134647da5eff762b98ca",
64
+ "scriptHash": "ad76180bc219ba33360a00db361000cab844f139baecb30faf54c133084f24b4",
63
65
  "toolVersions": {
64
66
  "rolldown": "1.2.9",
65
67
  "typescript": "7.0.2"
@@ -0,0 +1,8 @@
1
+ import { type AgentHandoff } from "../core/delegation.js";
2
+ /** Host boundary for durable dispatch and authenticated remote transport. */
3
+ export declare function createAgentDelegationTransport(fetcher?: typeof fetch): {
4
+ fetch: typeof fetch;
5
+ transport: (fetcher: typeof fetch) => typeof fetch;
6
+ receive<T>(headers: Headers, trusted: (handoff: AgentHandoff) => boolean, execute: (handoff?: AgentHandoff) => T): T;
7
+ resume<T>(stored: AgentHandoff, execute: (handoff: AgentHandoff) => T): T;
8
+ };
@@ -0,0 +1,15 @@
1
+ import type { ContentPart, Usage } from "../core/types.js";
2
+ interface Result {
3
+ usage: {
4
+ inputTokens?: number;
5
+ outputTokens?: number;
6
+ inputTokenDetails?: {
7
+ cacheReadTokens?: number;
8
+ cacheWriteTokens?: number;
9
+ };
10
+ };
11
+ content: readonly unknown[];
12
+ }
13
+ export declare function modelUsage(usage: Result["usage"]): Usage;
14
+ export declare function modelContent(content: Result["content"]): readonly ContentPart[];
15
+ export {};
@@ -0,0 +1,14 @@
1
+ import type { Telemetry } from "ai";
2
+ import type { AgentTracing, TurnInput } from "../agent-tracing.js";
3
+ export interface AiSdkTelemetryOptions {
4
+ /** The turn a generation records. Called once per AI SDK call. */
5
+ readonly turn: TurnInput | ((call: {
6
+ readonly callId: string;
7
+ }) => TurnInput);
8
+ }
9
+ /**
10
+ * An AI SDK telemetry integration that records each generation as a turn.
11
+ * Pass it to `telemetry.integrations` of `generateText`, `streamText`, or an
12
+ * agent such as `HarnessAgent`.
13
+ */
14
+ export declare function aiSdkTelemetry(tracing: AgentTracing, options: AiSdkTelemetryOptions): Telemetry;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Id generator shared by `registerOTel` and the agent OTel provider. A span
2
+ * ID generator installed by the host OTel provider for reserved-ID emission. A span
3
3
  * whose lifetime crosses durable worker boundaries (`invoke_agent`) is emitted
4
4
  * at its terminal; priming the next span id lets that span carry the
5
5
  * pre-allocated id its descendants already parented to.
@@ -0,0 +1,33 @@
1
+ import { type Context as OtelContext, type TracerProvider } from "#compiled/@opentelemetry/api/index.js";
2
+ import { AgentSpanIdGenerator } from "./otel-ids.js";
3
+ import type { Attributes, AgentTelemetry, OutputMapping, ActiveOperation } from "../core/types.js";
4
+ type Context = OtelContext;
5
+ export declare function withErrorContent<T extends {
6
+ setValue(key: symbol, value: unknown): T;
7
+ }>(context: T, allowed: boolean): T;
8
+ export declare function activeTraceOperation(host?: Pick<Context, "getValue">): ActiveOperation | undefined;
9
+ export interface OtelTelemetryOptions {
10
+ /** Defaults to the global tracer provider. */
11
+ readonly provider?: TracerProvider;
12
+ /**
13
+ * Generator installed on `provider`. Required for durable tracing so a span
14
+ * started in a later process carries the ID its children already reference.
15
+ */
16
+ readonly idGenerator?: AgentSpanIdGenerator;
17
+ /** Defaults to recording every trace. */
18
+ readonly samplesTrace?: (traceId: string, operation: {
19
+ name: string;
20
+ attributes: Attributes;
21
+ }) => boolean;
22
+ /** Replaces the default mapping, which adds `vercel.session_id` on Vercel. */
23
+ readonly mapping?: OutputMapping;
24
+ readonly tracerName?: string;
25
+ /** Recorded as the spans' instrumentation scope version. */
26
+ readonly tracerVersion?: string;
27
+ /** Override the provider's lifecycle, for example to flush metric readers too. */
28
+ readonly forceFlush?: () => Promise<void>;
29
+ readonly shutdown?: () => Promise<void>;
30
+ }
31
+ /** OpenTelemetry implementation of {@link AgentTelemetry}. */
32
+ export declare function otelTelemetry(options?: OtelTelemetryOptions): AgentTelemetry;
33
+ export {};
@@ -7,14 +7,18 @@
7
7
  */
8
8
  /** Content attributes are capped so a giant payload cannot bloat a span segment. */
9
9
  export declare const CONTENT_ATTRIBUTE_LIMIT: number;
10
+ import type { ContentSerializer, InputMessagesContent } from "../core/types.js";
11
+ export declare const aiSdkContentSerializer: ContentSerializer;
12
+ export declare function telemetryByteLength(text: string): number;
13
+ export declare function truncateTelemetryText(text: string, maxBytes: number): string;
14
+ export declare function boundedPrincipalId(value: unknown): string | undefined;
15
+ export declare function boundedTraceError(value: Error): Error;
10
16
  /** Serializes one payload value as capped JSON. */
11
17
  export declare function contentAttribute(value: unknown): string | undefined;
12
18
  /** Serializes model messages using the OpenTelemetry GenAI message schema. */
13
- export declare function genAiInputMessagesAttribute(messages: unknown): string | undefined;
19
+ export declare function genAiInputMessagesAttribute(messages: unknown, messageKind?: (value: unknown) => string | undefined): InputMessagesContent | undefined;
14
20
  /** Serializes the system prompt using the OpenTelemetry GenAI instruction schema. */
15
21
  export declare function genAiSystemInstructionsAttribute(instructions: unknown): string | undefined;
16
- /** Serializes tool definitions, dropping trailing entries to keep the JSON whole. */
17
- export declare function genAiToolDefinitionsAttribute(tools: unknown): string | undefined;
18
22
  /** Serializes one model response using the OpenTelemetry GenAI message schema. */
19
23
  export declare function genAiOutputMessagesAttribute(content: readonly unknown[], finishReason: string): string | undefined;
20
24
  /** Serializes memory records using the OpenTelemetry GenAI memory-records schema. */
@@ -26,5 +30,7 @@ export declare function genAiMemoryRecordsAttribute(records: readonly unknown[])
26
30
  * instead of cutting the JSON mid-string.
27
31
  */
28
32
  export declare function toolResultsContentAttribute(results: readonly Record<string, unknown>[]): string | undefined;
33
+ /** Serializes tool definitions, dropping trailing entries to keep the JSON whole. */
34
+ export declare function genAiToolDefinitionsAttribute(tools: unknown): string | undefined;
29
35
  /** Caps plain text, marking the cut. */
30
36
  export declare function textContentAttribute(text: string): string | undefined;
@@ -0,0 +1,84 @@
1
+ import { type TurnOperation } from "./operations.js";
2
+ import type { AgentTelemetry, Attributes, CaptureDecision, ContentSerializer, ExecutionContext, FrameworkIdentity, RunIdentity, TraceCheckpointer, TraceErrorHandler, TraceLink, TraceReference } from "./core/types.js";
3
+ export interface AgentTracingOptions {
4
+ /** Span output and context propagation. Defaults to the global OpenTelemetry provider. */
5
+ readonly telemetry?: AgentTelemetry;
6
+ /**
7
+ * Makes turns durable. Each in-flight turn is saved under a library-chosen
8
+ * key and removed when the turn and its open tool calls complete. Calling
9
+ * `turn()` again with the same identity, in this or a later process,
10
+ * continues the saved turn.
11
+ */
12
+ readonly checkpointer?: TraceCheckpointer;
13
+ /** Defaults to the AI SDK content serializer. */
14
+ readonly serializer?: ContentSerializer;
15
+ readonly onError?: TraceErrorHandler;
16
+ }
17
+ export interface TurnInput {
18
+ readonly identity: RunIdentity;
19
+ /** Names the invocation span. Omit for an anonymous agent. */
20
+ readonly agentName?: string;
21
+ readonly sequence: number;
22
+ readonly framework?: FrameworkIdentity;
23
+ readonly capture?: CaptureDecision;
24
+ readonly attributes?: Attributes;
25
+ /**
26
+ * Adopts a trace and span ID reserved before the turn started, such as one
27
+ * already returned to a caller. Requires telemetry with stable `ids`.
28
+ */
29
+ readonly reference?: TraceReference;
30
+ /**
31
+ * Nests the turn under a caller's span in the caller's trace. A local
32
+ * handoff sets this for the first turn; remote callees start their own trace.
33
+ */
34
+ readonly parent?: TraceReference;
35
+ readonly links?: readonly TraceLink[];
36
+ readonly startTimeMs?: number;
37
+ /** Delegation lineage recorded by the host, when it is not carried by a handoff. */
38
+ readonly lineage?: {
39
+ readonly parentRunId?: string;
40
+ readonly parentCallId?: string;
41
+ readonly agentName?: string;
42
+ };
43
+ readonly channel?: {
44
+ readonly kind?: string;
45
+ readonly origin?: string;
46
+ };
47
+ /** Host context for spans this process starts, such as OpenTelemetry baggage. */
48
+ readonly context?: ExecutionContext;
49
+ }
50
+ export interface ResumeInput {
51
+ readonly identity: RunIdentity;
52
+ readonly context?: ExecutionContext;
53
+ }
54
+ interface MemoryInput<T> {
55
+ identity: RunIdentity;
56
+ storeId: string;
57
+ slot: string;
58
+ phase: string;
59
+ capture?: CaptureDecision;
60
+ /** Defaults to the active operation. */
61
+ parent?: TraceReference;
62
+ context?: ExecutionContext;
63
+ describe?: (value: T) => {
64
+ recordCount?: number;
65
+ records?: readonly {
66
+ id?: string;
67
+ content: string;
68
+ }[];
69
+ };
70
+ }
71
+ export interface AgentTracing {
72
+ turn: import("./operations.js").WrappedOperation<TurnInput, TurnOperation>;
73
+ /** Returns a saved durable turn, without starting one. */
74
+ resume(input: ResumeInput): Promise<TurnOperation | undefined>;
75
+ memory: AgentMemoryTracing;
76
+ forceFlush(): Promise<void>;
77
+ shutdown(): Promise<void>;
78
+ }
79
+ export interface AgentMemoryTracing {
80
+ search<T>(data: MemoryInput<T>, execute: () => T | PromiseLike<T>): Promise<T>;
81
+ write<T>(data: MemoryInput<T>, execute: () => T | PromiseLike<T>): Promise<T>;
82
+ }
83
+ export declare function createAgentTracing(input: AgentTracingOptions): AgentTracing;
84
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * AI SDK integration. `aiSdkTelemetry` records `generateText`, `streamText`,
3
+ * and AI SDK agents as turns; `modelUsage` and `modelContent` convert AI SDK
4
+ * payloads for hosts that record model calls themselves.
5
+ */
6
+ export { aiSdkTelemetry, type AiSdkTelemetryOptions } from "./adapters/ai-sdk-telemetry.js";
7
+ export { modelUsage, modelContent } from "./adapters/ai-sdk-payload.js";
@@ -0,0 +1 @@
1
+ function e(e){return Object.freeze({inputTokens:e.inputTokens,outputTokens:e.outputTokens,inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens})})}function t(e){return e.flatMap(e=>{if(typeof e!=`object`||!e||!(`type`in e))return[];let t=e;if((t.type===`text`||t.type===`reasoning`)&&typeof t.text==`string`)return[{type:t.type,text:t.text}];if(typeof t.toolCallId!=`string`||typeof t.toolName!=`string`)return[];let n={callId:t.toolCallId,toolName:t.toolName,input:t.input};return t.type===`tool-call`?[{type:t.type,...n}]:t.type===`tool-result`?[{type:t.type,...n,output:t.output}]:t.type===`tool-error`?[{type:t.type,...n,error:t.error}]:[]})}const n={outcome:`abandoned`};function r(r,i){let a=new Map;function o(e){let t=a.get(e);return t===void 0&&(t={startTimeMs:Date.now(),tools:new Map},a.set(e,t)),t}async function s(e,t){let r=t===void 0?n:{outcome:`abandoned`,failed:!0,error:t};await(await e.model)?.complete(r);for(let t of e.tools.values())await(await t).complete(r);e.model=void 0,e.tools.clear();let i=await e.attempt;e.attempt=void 0,t===void 0?await i?.complete():await i?.fail(t)}async function c(e,t,n){let r=a.get(e);if(a.delete(e),r===void 0)return;await s(r,n);let i=await r.turn;i!==void 0&&await t(i)}return{onStart(e){o(e.callId)},async onStepStart(e){let t=o(e.callId);await s(t),t.turn??=r.turn({startTimeMs:t.startTimeMs,...typeof i.turn==`function`?i.turn({callId:e.callId}):i.turn}),t.attempt=(await t.turn).attempt({stepIndex:e.stepNumber,attempt:0})},async onLanguageModelCallStart(e){let t=await a.get(e.callId)?.attempt;t!==void 0&&(a.get(e.callId).model=t.modelCall({provider:e.provider,modelId:e.modelId,messages:e.messages,instructions:e.instructions,tools:e.tools}))},async executeLanguageModelCall({callId:e,execute:t}){let n=await a.get(e)?.model;if(n===void 0||n.finished)return t();try{return await n.run(t)}catch(e){throw await n.fail(e),e}},async onLanguageModelCallEnd(n){let r=a.get(n.callId),i=await r?.model;r!==void 0&&i!==void 0&&(r.model=void 0,await i.complete({outcome:`completed`,result:{finishReason:n.finishReason,usage:e(n.usage),responseId:n.responseId,responseModelId:n.modelId,content:t(n.content)}}))},async onToolExecutionStart(e){let t=a.get(e.callId),n=await t?.attempt;if(t===void 0||n===void 0)return;let r=e.toolCall;t.tools.set(r.toolCallId,n.tool({callId:r.toolCallId,name:r.toolName,arguments:r.input}))},async executeTool({callId:e,toolCallId:t,execute:n}){let r=await a.get(e)?.tools.get(t);return r===void 0||r.finished?n():r.run(n)},async onToolExecutionEnd(e){let t=a.get(e.callId),n=await t?.tools.get(e.toolCall.toolCallId);if(t===void 0||n===void 0)return;t.tools.delete(e.toolCall.toolCallId);let r=e.toolOutput,i=r.type===`tool-error`?{outcome:`failed`,errorType:r.error instanceof Error?r.error.name:`tool_error`,error:r.error}:{outcome:`completed`,output:`output`in r?r.output:void 0};await n.complete(i)},async onStepEnd(e){let t=a.get(e.callId);t!==void 0&&await s(t)},async onEnd(t){await c(t.callId,n=>n.complete({outcome:`completed`,usage:`totalUsage`in t?e(t.totalUsage):void 0}))},async onAbort(e){await c(e.callId,e=>e.complete({outcome:`cancelled`}))},async onError(e){let{callId:t,error:n}=typeof e==`object`&&e&&`callId`in e&&`error`in e?e:{callId:void 0,error:e};for(let e of t===void 0?[...a.keys()]:[t])await c(e,e=>e.fail(n),n)}}}export{r as aiSdkTelemetry,t as modelContent,e as modelUsage};
@@ -0,0 +1,5 @@
1
+ import type { CaptureDecision } from "./core/types.js";
2
+ export declare function currentCapture(): CaptureDecision | undefined;
3
+ export declare function withCapture<T extends {
4
+ setValue(key: symbol, value: unknown): T;
5
+ }>(host: T, capture: CaptureDecision): T;
@@ -0,0 +1,3 @@
1
+ import type { ActiveOperation, CaptureDecision } from "./types.js";
2
+ export declare function intersectCapture(capture: CaptureDecision, ceiling?: CaptureDecision): CaptureDecision;
3
+ export declare function activeOperation(operation: ActiveOperation, capture: CaptureDecision): ActiveOperation;
@@ -0,0 +1,14 @@
1
+ import type { Attributes, FrameworkIdentity, RunIdentity, Usage } from "./types.js";
2
+ export declare const USAGE_FIELDS: {
3
+ readonly costUsd: "agent.usage.cost_usd";
4
+ readonly inputTokens: "agent.usage.input_tokens";
5
+ readonly outputTokens: "agent.usage.output_tokens";
6
+ readonly cacheReadTokens: "agent.usage.cache_read_tokens";
7
+ readonly cacheWriteTokens: "agent.usage.cache_write_tokens";
8
+ };
9
+ export declare function identityAttributes(identity: Pick<RunIdentity, "runId" | "conversationId">): Attributes;
10
+ export declare function namingAttributes(name: string, operation?: string): Attributes;
11
+ export declare function frameworkAttributes(framework?: FrameworkIdentity): Attributes;
12
+ /** Invocation and model spans use GenAI token counts; structural spans use eve's. */
13
+ export declare function usageAttributes(usage: Usage, genAi?: boolean): Attributes;
14
+ export declare function runtimeContextAttributes(input: Readonly<Record<string, unknown>> | undefined): Attributes;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Which span attributes carry conversation content, and in which direction.
3
3
  *
4
- * Two vocabularies land on the same spans: the ones eve sets on its own
4
+ * Two vocabularies land on the same spans: the ones the library sets on its own
5
5
  * `agent.*` spans, and the ones the AI SDK's OpenTelemetry integration sets on
6
6
  * the model-call spans beneath them. A destination that declined content has to
7
7
  * be rid of both, so both are listed here rather than in the module that writes
@@ -0,0 +1,3 @@
1
+ import type { ActiveOperation, AgentTelemetry, ExecutionContext } from "./types.js";
2
+ /** Runs `execute` exactly once, even when the telemetry cannot enter the context. */
3
+ export declare function runTraceContext<T>(telemetry: Pick<AgentTelemetry, "run" | "suppressed">, operation: ActiveOperation, execute: () => T, host?: ExecutionContext): T;
@@ -0,0 +1,13 @@
1
+ import type { CaptureDecision, TraceReference } from "./types.js";
2
+ export interface AgentHandoff {
3
+ readonly caller: TraceReference;
4
+ readonly conversationId: string;
5
+ readonly parentRunId: string;
6
+ readonly parentCallId: string;
7
+ readonly agentName: string;
8
+ readonly capture: CaptureDecision;
9
+ /** Set when the handoff crossed a process boundary; the callee then starts its own trace. */
10
+ readonly remote?: boolean;
11
+ }
12
+ export declare const currentAgentHandoff: () => AgentHandoff | undefined;
13
+ export declare function withAgentHandoff<T>(handoff: AgentHandoff, execute: () => T): T;
@@ -0,0 +1,24 @@
1
+ import type { Attributes } from "./types.js";
2
+ import type { ContentSerializer } from "./types.js";
3
+ export interface McpUpdate {
4
+ readonly connectionName?: string;
5
+ readonly method?: string;
6
+ readonly toolName?: string;
7
+ readonly protocolVersion?: string;
8
+ readonly requestId?: string;
9
+ readonly sessionId?: string;
10
+ readonly statusCode?: string | number;
11
+ }
12
+ export interface McpLifecycle {
13
+ update(input: McpUpdate): void;
14
+ error(error?: unknown, type?: string): void;
15
+ arguments(value: unknown): void;
16
+ result(value: unknown): void;
17
+ }
18
+ export declare function mcpLifecycle(input: {
19
+ readonly write: (attributes: Attributes) => void;
20
+ readonly error: (error?: unknown, type?: string) => void;
21
+ readonly serializer: ContentSerializer;
22
+ readonly recordInputs: boolean;
23
+ readonly recordOutputs: boolean;
24
+ }): McpLifecycle;
@@ -0,0 +1,59 @@
1
+ import { type McpLifecycle } from "./mcp.js";
2
+ import type { AgentTelemetry, CaptureDecision, ContentSerializer, ExecutionContext, Operation, ScopeData, ScopeIdentity, ScopeRecord, ScopeTerminal, TraceErrorHandler, TraceLink, TraceReference, Usage } from "./types.js";
3
+ export interface ChildOptions {
4
+ readonly links?: readonly TraceLink[];
5
+ readonly startTimeMs?: number;
6
+ }
7
+ export interface LiveOperation extends Operation {
8
+ child(data: ScopeData, key?: string, options?: ChildOptions): Promise<LiveOperation>;
9
+ /** Returns an unsettled child with this identity, without starting one. */
10
+ find(data: ScopeData): LiveOperation | undefined;
11
+ /** Unsettled children, in start order. */
12
+ readonly children: readonly LiveOperation[];
13
+ usage(usage: Usage, key?: string): Promise<void>;
14
+ /** Carries a model call's messages up to its turn: the first input and the latest output. */
15
+ turnContent(content: {
16
+ readonly input?: string;
17
+ readonly output?: string;
18
+ }): void;
19
+ error(error?: unknown, type?: string): void;
20
+ /** Replaces the host context for this operation and its descendants. */
21
+ useContext(context: ExecutionContext): void;
22
+ /** Fills in a deferred operation's details from a later call with the same identity. */
23
+ refine(data: ScopeData, startTimeMs?: number): void;
24
+ /** Lowers capture for this operation and its children, and drops retained content it no longer allows. */
25
+ narrow(capture: CaptureDecision): void;
26
+ /** Completes this operation, or closes the open descendants of a finished one. */
27
+ release(result: ScopeTerminal): Promise<void>;
28
+ /** Finished, with no unfinished descendants. */
29
+ readonly settled: boolean;
30
+ readonly callId?: string;
31
+ readonly mcp: McpLifecycle;
32
+ record(): ScopeRecord;
33
+ }
34
+ export declare function createScopes(input: {
35
+ readonly telemetry: AgentTelemetry;
36
+ readonly serializer: ContentSerializer;
37
+ readonly durable: boolean;
38
+ readonly onError?: TraceErrorHandler;
39
+ }): {
40
+ /** Starts a turn tree. Durable turns reserve their IDs from `key`. */
41
+ start(facts: {
42
+ identity: ScopeIdentity;
43
+ key: string;
44
+ capture: CaptureDecision;
45
+ data: ScopeData;
46
+ parent?: TraceReference;
47
+ reference?: TraceReference;
48
+ startTimeMs?: number;
49
+ links?: readonly TraceLink[];
50
+ context?: ExecutionContext;
51
+ onChange?: () => Promise<void>;
52
+ }): Promise<LiveOperation>;
53
+ /** Rebuilds a tree from a checkpoint, or returns `undefined` for an unusable one. */
54
+ restore(snapshot: unknown, options?: {
55
+ capture?: CaptureDecision;
56
+ context?: ExecutionContext;
57
+ onChange?: () => Promise<void>;
58
+ }): Promise<LiveOperation | undefined>;
59
+ };
@@ -0,0 +1,7 @@
1
+ import type { ScopeRecord } from "./types.js";
2
+ import type { ContentSerializer } from "./types.js";
3
+ import type { TraceSnapshot } from "./types.js";
4
+ export declare function boundedSerializer(serializer: ContentSerializer, onError?: import("./types.js").TraceErrorHandler): ContentSerializer;
5
+ export declare function traceSnapshot(value: unknown): TraceSnapshot;
6
+ export declare function validSnapshot(value: unknown, maxBytes?: number, depth?: number): value is ScopeRecord;
7
+ export declare function snapshotRecord(record: ScopeRecord, serializer: ContentSerializer): ScopeRecord;
@@ -0,0 +1,12 @@
1
+ export declare const invocationName: (name?: string) => string;
2
+ export declare function applyAttributes(span: {
3
+ setAttribute(key: string, value: Exclude<Attributes[string], undefined>): unknown;
4
+ }, attributes: Attributes): void;
5
+ import type { ContentSerializer } from "./types.js";
6
+ import type { ScopeData, ScopeRecord, ScopeTerminal } from "./types.js";
7
+ import type { Attributes, CaptureDecision, PreparedSpan } from "./types.js";
8
+ import type { TraceOperation } from "./writer.js";
9
+ export declare function parentKinds(data: ScopeData): readonly ScopeData["type"][];
10
+ export declare function prepareScope(record: Omit<ScopeRecord, "reference">, serializer: ContentSerializer): PreparedSpan;
11
+ export declare function completeScope(span: TraceOperation, data: ScopeData, result: ScopeTerminal, capture: CaptureDecision, startTimeMs: number, serializer: ContentSerializer): void;
12
+ export declare function capturedScopeData(data: ScopeData, capture: CaptureDecision): ScopeData;