eve 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +3 -3
  3. package/dist/src/chunks/{use-eve-agent-BNdcle_M.js → use-eve-agent-COmP-H8R.js} +6 -3
  4. package/dist/src/chunks/{use-eve-agent-FJkEMXYk.js → use-eve-agent-CnppTEFk.js} +6 -3
  5. package/dist/src/cli/commands/info.js +1 -1
  6. package/dist/src/cli/commands/trace-detail.d.ts +3 -2
  7. package/dist/src/cli/commands/trace-detail.js +1 -1
  8. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +4 -6
  9. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -2
  10. package/dist/src/client/agent-info-schema.d.ts +12 -4
  11. package/dist/src/client/agent-info-schema.js +1 -1
  12. package/dist/src/client/index.d.ts +1 -1
  13. package/dist/src/compiled/.vendor-stamp.json +3 -3
  14. package/dist/src/compiled/@chat-adapter/slack/index.js +1 -1
  15. package/dist/src/compiled/@workflow/core/index.js +1 -1
  16. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  17. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  18. package/dist/src/compiled/@workflow/world/env-config.d.ts +1 -0
  19. package/dist/src/compiled/@workflow/world/events.d.ts +92 -35
  20. package/dist/src/compiled/@workflow/world/index.d.ts +3 -2
  21. package/dist/src/compiled/@workflow/world/interfaces.d.ts +25 -23
  22. package/dist/src/compiled/@workflow/world/queue.d.ts +4 -0
  23. package/dist/src/compiled/@workflow/world/runs.d.ts +4 -0
  24. package/dist/src/compiled/@workflow/world/slot-identity.d.ts +53 -0
  25. package/dist/src/compiled/@workflow/world/spec-version.d.ts +36 -1
  26. package/dist/src/compiled/@workflow/world/steps.d.ts +4 -0
  27. package/dist/src/compiled/@workflow/world/ulid.d.ts +6 -0
  28. package/dist/src/compiled/@workflow/world-local/index.js +4 -4
  29. package/dist/src/compiled/@workflow/world-vercel/index.js +13 -17
  30. package/dist/src/compiled/_chunks/workflow/{attribute-changes-6OqdYdi4.js → attribute-changes-BoH7JsWp.js} +3 -3
  31. package/dist/src/compiled/_chunks/workflow/dist-DlFv0aHY.js +40 -0
  32. package/dist/src/compiled/_chunks/workflow/env-config-DxamfI7T.js +1 -0
  33. package/dist/src/compiled/_chunks/workflow/frames-CTpeJYEQ.js +3 -0
  34. package/dist/src/compiled/_chunks/workflow/{functions-CXb61C6h.js → functions-CeeNvKsq.js} +1 -1
  35. package/dist/src/compiled/_chunks/workflow/resume-hook-BPQHjeY5.js +1 -0
  36. package/dist/src/compiled/_chunks/workflow/run-DQ5dOyjm.js +1 -0
  37. package/dist/src/compiled/_chunks/workflow/run-id-BdE0MZz9.js +1 -0
  38. package/dist/src/compiled/_chunks/workflow/sleep-CzdoBiqy.js +1 -0
  39. package/dist/src/compiled/_chunks/workflow/spec-version-DBUVfF_R.js +1 -0
  40. package/dist/src/compiled/_chunks/workflow/undici-CUIybhQ2.js +95 -0
  41. package/dist/src/compiled/_chunks/workflow/wait-until-DK2lnH6U.js +15 -0
  42. package/dist/src/compiled/_chunks/workflow/{wrapper-CDq65xJV.js → wrapper-CMGju7QA.js} +1 -1
  43. package/dist/src/compiled/_chunks/workflow/ws-transport-Csi6Cydc.js +1 -0
  44. package/dist/src/compiler/extension-compatibility.d.ts +10 -10
  45. package/dist/src/compiler/extension-compatibility.js +1 -1
  46. package/dist/src/compiler/manifest.d.ts +8 -8
  47. package/dist/src/compiler/manifest.js +1 -1
  48. package/dist/src/compiler/normalize-extension.d.ts +3 -3
  49. package/dist/src/compiler/normalize-extension.js +1 -1
  50. package/dist/src/compiler/normalize-instructions.d.ts +1 -1
  51. package/dist/src/compiler/normalize-instructions.js +1 -1
  52. package/dist/src/compiler/normalize-manifest.js +1 -3
  53. package/dist/src/context/dynamic-instruction-lifecycle.d.ts +5 -1
  54. package/dist/src/context/dynamic-instruction-lifecycle.js +1 -1
  55. package/dist/src/context/keys.d.ts +6 -2
  56. package/dist/src/context/keys.js +1 -1
  57. package/dist/src/discover/manifest.d.ts +1 -1
  58. package/dist/src/discover/manifest.js +1 -1
  59. package/dist/src/evals/context.js +1 -1
  60. package/dist/src/evals/index.d.ts +2 -2
  61. package/dist/src/evals/reporters/index.d.ts +1 -1
  62. package/dist/src/evals/runner/artifacts.js +1 -1
  63. package/dist/src/evals/runner/execute-eval.d.ts +5 -0
  64. package/dist/src/evals/runner/execute-eval.js +1 -1
  65. package/dist/src/evals/runner/execute-task.d.ts +3 -0
  66. package/dist/src/evals/runner/execute-task.js +1 -1
  67. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  68. package/dist/src/evals/runner/reporters/types.d.ts +28 -2
  69. package/dist/src/evals/runner/run-evals.js +1 -1
  70. package/dist/src/evals/session.d.ts +12 -2
  71. package/dist/src/evals/session.js +1 -1
  72. package/dist/src/evals/target.js +1 -1
  73. package/dist/src/evals/types.d.ts +12 -1
  74. package/dist/src/execution/node-step.js +1 -1
  75. package/dist/src/execution/session.js +1 -1
  76. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  77. package/dist/src/execution/workflow-steps.js +1 -1
  78. package/dist/src/execution/workflow-trace-context.d.ts +11 -0
  79. package/dist/src/execution/workflow-trace-context.js +1 -0
  80. package/dist/src/harness/ai-sdk-hook-bridge.d.ts +1 -1
  81. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  82. package/dist/src/harness/approval-delivery-coordinator.js +1 -1
  83. package/dist/src/harness/channel-delivery-instrumentation.d.ts +1 -1
  84. package/dist/src/harness/channel-delivery-instrumentation.js +1 -1
  85. package/dist/src/harness/emission.d.ts +2 -2
  86. package/dist/src/harness/emission.js +1 -1
  87. package/dist/src/harness/instrumentation/config.js +1 -0
  88. package/dist/src/harness/{instrumentation-content.d.ts → instrumentation/content.d.ts} +1 -1
  89. package/dist/src/harness/{instrumentation-dispatch.d.ts → instrumentation/dispatch.d.ts} +1 -1
  90. package/dist/src/harness/{instrumentation-dispatch.js → instrumentation/dispatch.js} +1 -1
  91. package/dist/src/harness/{instrumentation-lifecycle.d.ts → instrumentation/lifecycle.d.ts} +3 -6
  92. package/dist/src/harness/{instrumentation-lifecycle.js → instrumentation/lifecycle.js} +1 -1
  93. package/dist/src/harness/{instrumentation-native-events.d.ts → instrumentation/native-events.d.ts} +1 -1
  94. package/dist/src/harness/{instrumentation-native-events.js → instrumentation/native-events.js} +1 -1
  95. package/dist/src/harness/{instrumentation-providers.d.ts → instrumentation/providers.d.ts} +1 -1
  96. package/dist/src/harness/{instrumentation-providers.js → instrumentation/providers.js} +1 -1
  97. package/dist/src/harness/{instrumentation-runtime.d.ts → instrumentation/runtime.d.ts} +4 -2
  98. package/dist/src/harness/{instrumentation-state.d.ts → instrumentation/state.d.ts} +1 -1
  99. package/dist/src/harness/parent-lineage.d.ts +1 -1
  100. package/dist/src/harness/prepare-trace-context.d.ts +16 -0
  101. package/dist/src/harness/prepare-trace-context.js +1 -0
  102. package/dist/src/harness/tool-loop.js +2 -2
  103. package/dist/src/harness/types.d.ts +1 -1
  104. package/dist/src/internal/application/compiled-artifacts.js +2 -2
  105. package/dist/src/internal/application/package.js +1 -1
  106. package/dist/src/internal/authored-definition/core.d.ts +3 -3
  107. package/dist/src/internal/authored-definition/core.js +1 -1
  108. package/dist/src/internal/authored-package-boundary.js +1 -1
  109. package/dist/src/internal/helpers/markdown.js +1 -1
  110. package/dist/src/internal/instrumentation.d.ts +1 -1
  111. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  112. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  113. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +4 -3
  114. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  115. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  116. package/dist/src/internal/vercel/project-link.d.ts +1 -1
  117. package/dist/src/internal/vercel/project-link.js +1 -1
  118. package/dist/src/internal/vercel-agent-summary.d.ts +10 -9
  119. package/dist/src/internal/vercel-agent-summary.js +1 -1
  120. package/dist/src/internal/workflow/development-world-client.js +1 -1
  121. package/dist/src/protocol/message.d.ts +15 -1
  122. package/dist/src/protocol/message.js +1 -1
  123. package/dist/src/public/channels/github/auth.d.ts +30 -0
  124. package/dist/src/public/channels/github/auth.js +2 -2
  125. package/dist/src/public/channels/github/defaults.d.ts +4 -4
  126. package/dist/src/public/channels/github/defaults.js +1 -1
  127. package/dist/src/public/channels/github/dispatch.d.ts +3 -2
  128. package/dist/src/public/channels/github/dispatch.js +1 -1
  129. package/dist/src/public/channels/github/githubChannel.d.ts +7 -2
  130. package/dist/src/public/channels/github/githubChannel.js +1 -1
  131. package/dist/src/public/channels/github/index.d.ts +1 -1
  132. package/dist/src/public/definitions/instructions.d.ts +14 -4
  133. package/dist/src/public/definitions/instructions.js +1 -1
  134. package/dist/src/public/definitions/tool.d.ts +5 -8
  135. package/dist/src/public/instructions/index.d.ts +1 -2
  136. package/dist/src/public/instructions/index.js +1 -1
  137. package/dist/src/public/instrumentation/index.d.ts +4 -3
  138. package/dist/src/public/instrumentation/otel.d.ts +5 -4
  139. package/dist/src/public/instrumentation/provider.d.ts +2 -2
  140. package/dist/src/public/nuxt/module.js +1 -1
  141. package/dist/src/public/sveltekit/index.d.ts +6 -20
  142. package/dist/src/public/sveltekit/index.js +1 -1
  143. package/dist/src/public/sveltekit/routing.d.ts +0 -24
  144. package/dist/src/public/sveltekit/routing.js +1 -1
  145. package/dist/src/runtime/agent/bootstrap.d.ts +2 -0
  146. package/dist/src/runtime/agent/bootstrap.js +1 -1
  147. package/dist/src/runtime/prompt/compose.d.ts +1 -1
  148. package/dist/src/runtime/prompt/compose.js +3 -1
  149. package/dist/src/runtime/resolve-agent.js +1 -1
  150. package/dist/src/runtime/types.d.ts +4 -3
  151. package/dist/src/setup/boxes/select-model.d.ts +6 -6
  152. package/dist/src/setup/boxes/select-model.js +1 -1
  153. package/dist/src/setup/project-resolution.d.ts +3 -3
  154. package/dist/src/setup/scaffold/create/project.js +1 -1
  155. package/dist/src/setup/slack-connect-lifecycle.d.ts +0 -9
  156. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  157. package/dist/src/setup/slackbot.d.ts +2 -1
  158. package/dist/src/setup/slackbot.js +1 -1
  159. package/dist/src/shared/default-agent-model.d.ts +1 -1
  160. package/dist/src/shared/default-agent-model.js +1 -1
  161. package/dist/src/shared/dynamic-tool-definition.d.ts +3 -4
  162. package/dist/src/shared/instructions-definition.d.ts +15 -11
  163. package/dist/src/{public/nuxt → shared}/vercel-services.d.ts +18 -19
  164. package/dist/src/shared/vercel-services.js +1 -0
  165. package/dist/src/svelte/index.js +1 -1
  166. package/dist/src/svelte/use-eve-agent.js +1 -1
  167. package/dist/src/tracing/agent-action-instrumentation.d.ts +1 -1
  168. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  169. package/dist/src/tracing/agent-approval-instrumentation.d.ts +1 -1
  170. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +1 -1
  171. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  172. package/dist/src/tracing/agent-otel-provider.d.ts +4 -2
  173. package/dist/src/tracing/agent-otel-provider.js +2 -2
  174. package/dist/src/tracing/agent-otel-session-context.d.ts +17 -0
  175. package/dist/src/tracing/agent-otel-session-context.js +1 -0
  176. package/dist/src/tracing/agent-otel-usage.d.ts +1 -1
  177. package/dist/src/tracing/agent-tool-instrumentation.d.ts +1 -1
  178. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  179. package/dist/src/tracing/agent-trace-state.d.ts +1 -1
  180. package/dist/src/tracing/install-instrumentation-runtime.d.ts +2 -2
  181. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  182. package/dist/src/tracing/local-instrumentation-runtime.d.ts +1 -1
  183. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  184. package/dist/src/tracing/local-traces.d.ts +3 -3
  185. package/dist/src/tracing/local-traces.js +1 -1
  186. package/dist/src/tracing/otel-declaration.d.ts +2 -2
  187. package/dist/src/tracing/otel-declaration.js +1 -1
  188. package/dist/src/vue/index.js +1 -1
  189. package/dist/src/vue/use-eve-agent.js +1 -1
  190. package/docs/README.md +18 -20
  191. package/docs/agent-config.md +9 -6
  192. package/docs/channels/custom.mdx +1 -1
  193. package/docs/channels/eve.mdx +10 -56
  194. package/docs/channels/github.mdx +1 -1
  195. package/docs/channels/meta.json +1 -0
  196. package/docs/concepts/context-control.md +32 -56
  197. package/docs/concepts/default-harness.md +2 -2
  198. package/docs/concepts/execution-model-and-durability.mdx +4 -4
  199. package/docs/concepts/meta.json +3 -1
  200. package/docs/concepts/sessions-runs-and-streaming.md +23 -11
  201. package/docs/{guides → concepts}/state.md +3 -3
  202. package/docs/connections/mcp.mdx +6 -89
  203. package/docs/connections/meta.json +1 -0
  204. package/docs/connections/openapi.mdx +5 -69
  205. package/docs/connections/overview.mdx +29 -3
  206. package/docs/evals/meta.json +1 -0
  207. package/docs/evals/reporters.mdx +14 -4
  208. package/docs/extensions.md +1 -1
  209. package/docs/getting-started.mdx +175 -13
  210. package/docs/guides/auth-and-route-protection.md +3 -18
  211. package/docs/guides/client/messages.mdx +3 -1
  212. package/docs/guides/client/meta.json +2 -1
  213. package/docs/guides/client/output-schema.mdx +2 -2
  214. package/docs/guides/client/overview.mdx +1 -1
  215. package/docs/guides/deployment/meta.json +1 -0
  216. package/docs/guides/deployment/overview.md +1 -1
  217. package/docs/guides/deployment/self-hosting.md +3 -3
  218. package/docs/guides/deployment/vercel.mdx +1 -1
  219. package/docs/guides/dev-tui.md +3 -13
  220. package/docs/guides/dynamic-capabilities.md +64 -4
  221. package/docs/guides/frontend/meta.json +2 -1
  222. package/docs/guides/frontend/nextjs.mdx +1 -10
  223. package/docs/guides/frontend/nuxt.mdx +1 -10
  224. package/docs/guides/frontend/overview.mdx +12 -3
  225. package/docs/guides/frontend/sveltekit.mdx +23 -11
  226. package/docs/guides/frontend/use-eve-agent-svelte.mdx +39 -126
  227. package/docs/guides/frontend/use-eve-agent-vue.mdx +40 -139
  228. package/docs/guides/instrumentation.md +15 -15
  229. package/docs/guides/meta.json +1 -5
  230. package/docs/guides/remote-agents.md +9 -9
  231. package/docs/guides/session-context.md +34 -103
  232. package/docs/install-integrations.mdx +1 -1
  233. package/docs/instructions.mdx +45 -12
  234. package/docs/meta.json +24 -13
  235. package/docs/patterns/dynamic-scheduling.md +1 -1
  236. package/docs/patterns/meta.json +1 -0
  237. package/docs/patterns/multi-tenant-approvals.md +1 -1
  238. package/docs/patterns/multi-tenant-auth.md +1 -1
  239. package/docs/patterns/multi-tenant-memory.md +4 -3
  240. package/docs/{guides → protocols}/acp.md +1 -1
  241. package/docs/protocols/meta.json +5 -0
  242. package/docs/reference/cli.md +39 -39
  243. package/docs/reference/meta.json +1 -1
  244. package/docs/reference/typescript-api.md +4 -2
  245. package/docs/sandbox.mdx +8 -0
  246. package/docs/{subagents.mdx → subagents/index.mdx} +2 -2
  247. package/docs/subagents/meta.json +5 -0
  248. package/docs/{guides/dynamic-workflows.md → subagents/workflow-tool.md} +6 -6
  249. package/docs/tools/human-in-the-loop.md +1 -1
  250. package/docs/tools/meta.json +1 -0
  251. package/docs/tools/overview.mdx +1 -1
  252. package/docs/tutorial/connect-a-warehouse.mdx +1 -1
  253. package/docs/tutorial/meta.json +1 -0
  254. package/docs/tutorial/remember-definitions.mdx +2 -2
  255. package/docs/tutorial/ship-it.mdx +2 -2
  256. package/package.json +4 -4
  257. package/dist/src/compiled/_chunks/workflow/dist-C8PhDW9B.js +0 -1
  258. package/dist/src/compiled/_chunks/workflow/functions-xMPAeWFr.js +0 -1
  259. package/dist/src/compiled/_chunks/workflow/node-Smb57EnG.js +0 -40
  260. package/dist/src/compiled/_chunks/workflow/resume-hook-BrduAuFX.js +0 -1
  261. package/dist/src/compiled/_chunks/workflow/run-CX7_sJnW.js +0 -1
  262. package/dist/src/compiled/_chunks/workflow/sleep-tsb2HjWK.js +0 -1
  263. package/dist/src/compiled/_chunks/workflow/undici-BNc_0O4m.js +0 -95
  264. package/dist/src/compiled/_chunks/workflow/wait-until-BYKVqrwc.js +0 -15
  265. package/dist/src/harness/instrumentation-config.js +0 -1
  266. package/dist/src/public/nuxt/vercel-services.js +0 -1
  267. package/dist/src/public/sveltekit/vercel-json.d.ts +0 -17
  268. package/dist/src/public/sveltekit/vercel-json.js +0 -1
  269. package/docs/installation.mdx +0 -66
  270. package/docs/project-structure.mdx +0 -53
  271. package/docs/reference/project-layout.md +0 -123
  272. /package/dist/src/harness/{instrumentation-config.d.ts → instrumentation/config.d.ts} +0 -0
  273. /package/dist/src/harness/{instrumentation-content.js → instrumentation/content.js} +0 -0
  274. /package/dist/src/harness/{instrumentation-runtime-context.d.ts → instrumentation/runtime-context.d.ts} +0 -0
  275. /package/dist/src/harness/{instrumentation-runtime-context.js → instrumentation/runtime-context.js} +0 -0
  276. /package/dist/src/harness/{instrumentation-runtime.js → instrumentation/runtime.js} +0 -0
  277. /package/dist/src/harness/{instrumentation-setup-context.d.ts → instrumentation/setup-context.d.ts} +0 -0
  278. /package/dist/src/harness/{instrumentation-setup-context.js → instrumentation/setup-context.js} +0 -0
  279. /package/dist/src/harness/{instrumentation-state.js → instrumentation/state.js} +0 -0
  280. /package/docs/{guides → protocols}/ucp.mdx +0 -0
@@ -1,2 +1,2 @@
1
- import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{sessionIdempotencyKey}from"#harness/instrumentation-lifecycle.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{SESSION_WINDOW_TURN_LIMIT}from"#tracing/agent-trace-state.js";import{createAgentActionInstrumentation}from"#tracing/agent-action-instrumentation.js";import{createAgentApprovalInstrumentation}from"#tracing/agent-approval-instrumentation.js";import{createAgentChannelDeliveryInstrumentation}from"#tracing/agent-channel-delivery-instrumentation.js";import{createAgentToolInstrumentation}from"#tracing/agent-tool-instrumentation.js";function createAgentOtelInstrumentation(e){let t=e.recordInputs??!0,d=e.recordOutputs??!0,f=new WeakMap,p=new Map,m=new WeakMap,h=new WeakMap,g=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,resolveParent:async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);return n===void 0?void 0:{context:contextFromSpanContext(n.context),spanContext:n.context}},stateStore:e.stateStore,tracer:e.tracer}),_=createAgentApprovalInstrumentation({actionContextFor:g.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,tracer:e.tracer}),v=createAgentToolInstrumentation({actionContextFor:g.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,resolveFallback:e=>{let t=p.get(e.scope.attemptId)??e.scope,n=m.get(t)?.step;return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),onSessionStarted=async e=>{await ensureSessionContext(e)},onTurnStarted=async t=>{let n=advanceSessionWindow(t.sessionId,await ensureSessionContext({agentName:void 0,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`})),r={isRemote:!1,spanId:e.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:n.context.traceFlags,traceId:n.context.traceId};await e.stateStore.setSession(t.sessionId,{...n,turnsInWindow:n.turnsInWindow+1}),await e.stateStore.setTurn(t.sessionId,t.turnId,{context:r,lineage:t.parentLineage,parentIsRemote:n.context.isRemote,parentSpanId:n.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now()})},onStepStarted=async t=>{let i=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(i===void 0)return;let a=contextFromSpanContext(i.context),o=trace.getSpan(context.active())?.spanContext(),s=e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId},links:o===void 0||o.traceId===i.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},a);s.addEvent(`step.started`);let c=trace.setSpan(a,s),l=t.operation.operationId,u=e.tracer.startSpan(l,{attributes:{"ai.operation.name":l,"ai.provider.name":t.operation.provider,"ai.request.model":t.operation.modelId}},c);m.set(t.scope,{operation:{context:trace.setSpan(c,u),name:l,span:u},step:{context:c,span:s}}),p.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=p.get(e.scope.attemptId)??e.scope;f.delete(t),drainOpenSpans({...e,scope:t}),v.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await g.failForAttempt(t,e.error),p.delete(e.scope.attemptId);let n=m.get(t);n!==void 0&&(n.step.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&(recordError(n.operation.span,e.error),recordError(n.step.span,e.error)),n.operation.span.end(),n.step.span.end(),m.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await g.deleteForTurn(t.sessionId,t.turnId);let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId),i=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":r?.agentName,...parentLineageAttributes(n.lineage),"agent.root.session.id":n.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":r?.window,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence},startTime:n.startTimeMs},contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId})));i.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(i.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(i,n.terminal.error)),i.end(),await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await g.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let i=m.get(n.scope);if(i===void 0)return;i.step.span.setAttribute(`agent.model.id`,n.model.modelId),i.step.span.setAttribute(`agent.model.provider`,n.model.provider);let a=e.tracer.startSpan(modelSpanName(n.model.modelId),{attributes:{"gen_ai.agent.name":n.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":n.model.provider,"gen_ai.request.model":n.model.modelId}},i.operation.context);if(t&&n.input!==void 0){let e=messagesContentAttribute(n.input.messages);e!==void 0&&a.setAttribute(`ai.prompt.messages`,e);let t=genAiInputMessagesAttribute(n.input.messages);t!==void 0&&a.setAttribute(`gen_ai.input.messages`,t);let r=systemPromptAttribute(n.input.instructions);r!==void 0&&a.setAttribute(`ai.prompt.system`,r);let i=genAiSystemInstructionsAttribute(n.input.instructions);i!==void 0&&a.setAttribute(`gen_ai.system_instructions`,i)}let s={context:trace.setSpan(i.operation.context,a),span:a};getExecutionContexts(n.scope).set(n.idempotencyKey,s.context),getSpanStates(h,n.scope).set(n.idempotencyKey,s)},onModelCallTerminal=e=>{f.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(h,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let n=m.get(e.scope);if(n!==void 0&&setAgentUsage(n.step.span,e.usage),d){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content??[],r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let i=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
- `));i!==void 0&&t.span.setAttribute(`ai.response.reasoning`,i);let o=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));o!==void 0&&t.span.setAttribute(`ai.response.text`,o);let c=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(c.length>0){let e=contentAttribute(c,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let l=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(l.length>0){let e=toolResultsContentAttribute(l);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},openSessionWindow=t=>{let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":t.agentName,"agent.root.session.id":t.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":t.index,"agent.trace.schema.version":1,...t.previousTraceId===void 0?{}:{"agent.session.window.previous.trace.id":t.previousTraceId}},root:!0});return n.addEvent(t.index===0?`session.started`:`session.window.opened`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);return n===void 0&&(n={agentName:t.agentName,channelKind:t.channelKind,context:t.parentTraceContext===void 0?openSessionWindow({agentName:t.agentName,index:0,rootSessionId:t.rootSessionId,sessionId:t.sessionId}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId,turnsInWindow:0,window:0},await e.stateStore.setSession(t.sessionId,n)),n},y=createAgentChannelDeliveryInstrumentation({ensureSessionContext,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,stateStore:e.stateStore,tracer:e.tracer}),advanceSessionWindow=(e,t)=>{if(t.turnsInWindow<SESSION_WINDOW_TURN_LIMIT)return t;let n=t.window+1;return{...t,context:openSessionWindow({agentName:t.agentName,index:n,previousTraceId:t.context.traceId,rootSessionId:t.rootSessionId,sessionId:e}),turnsInWindow:0,window:n}},onStepMetadata=e=>{let t=m.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.step.span.setAttribute(e,r)};return{hook:{capture:t||d?`content`:`metadata`,events:{...y,"action.completed":g.events[`action.completed`],"action.failed":g.events[`action.failed`],async"action.started"(e,t){await g.events[`action.started`](e,t),await v.actionStarted(e)},..._,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...v.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`},runInContext(e,t){let r=p.get(e.scope.attemptId)??e.scope,i=f.get(r),a=e.type===`model.call`?i?.get(e.idempotencyKey):v.contextFor(e.scope.attemptId,e.idempotencyKey);return a===void 0?t():context.with(a,t)}};function getExecutionContexts(e){let t=f.get(e);return t===void 0&&(t=new Map,f.set(e,t)),t}function drainOpenSpans(e){for(let t of h.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();h.delete(e.scope)}}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function parentLineageAttributes(e){if(e===void 0)return{};let t={"agent.parent.call_id":e.callId,"agent.parent.session.id":e.sessionId,"agent.parent.turn.id":e.turnId};return e.subagentName!==void 0&&(t[`agent.subagent.name`]=e.subagentName),t}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return`chat ${e}`}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
1
+ import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{createAgentActionInstrumentation}from"#tracing/agent-action-instrumentation.js";import{createAgentApprovalInstrumentation}from"#tracing/agent-approval-instrumentation.js";import{createAgentChannelDeliveryInstrumentation}from"#tracing/agent-channel-delivery-instrumentation.js";import{createAgentToolInstrumentation}from"#tracing/agent-tool-instrumentation.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";function createAgentOtelInstrumentation(e){let t=e.recordInputs??!1,d=e.recordOutputs??!1,f=new WeakMap,p=new Map,m=new WeakMap,h=new WeakMap,g=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,resolveParent:async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);return n===void 0?void 0:{context:contextFromSpanContext(n.context),spanContext:n.context}},stateStore:e.stateStore,tracer:e.tracer}),_=createAgentApprovalInstrumentation({actionContextFor:g.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,tracer:e.tracer}),v=createAgentToolInstrumentation({actionContextFor:g.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:d,resolveFallback:e=>{let t=p.get(e.scope.attemptId)??e.scope,n=m.get(t)?.step;return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:y,prepareSessionTrace:b,prepareTurnTrace:x}=createAgentOtelSessionContext(e),onSessionStarted=async e=>{await b(e)},onTurnStarted=async e=>{await x(e)},onStepStarted=async t=>{let i=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(i===void 0)return;let a=contextFromSpanContext(i.context),o=trace.getSpan(context.active())?.spanContext(),s=e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.root.session.id":t.scope.rootSessionId??t.scope.sessionId,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId},links:o===void 0||o.traceId===i.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},a);s.addEvent(`step.started`);let c=trace.setSpan(a,s),l=t.operation.operationId,u=e.tracer.startSpan(l,{attributes:{"ai.operation.name":l,"ai.provider.name":t.operation.provider,"ai.request.model":t.operation.modelId}},c);m.set(t.scope,{operation:{context:trace.setSpan(c,u),name:l,span:u},step:{context:c,span:s}}),p.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=p.get(e.scope.attemptId)??e.scope;f.delete(t),drainOpenSpans({...e,scope:t}),v.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await g.failForAttempt(t,e.error),p.delete(e.scope.attemptId);let n=m.get(t);n!==void 0&&(n.step.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&(recordError(n.operation.span,e.error),recordError(n.step.span,e.error)),n.operation.span.end(),n.step.span.end(),m.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await g.deleteForTurn(t.sessionId,t.turnId);let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId),i=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":r?.agentName,...parentLineageAttributes(n.lineage),"agent.root.session.id":n.rootSessionId,"agent.session.id":t.sessionId,"agent.session.window":r?.window,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence},startTime:n.startTimeMs},contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId})));i.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(i.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(i,n.terminal.error)),i.end(),await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await g.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let i=m.get(n.scope);if(i===void 0)return;i.step.span.setAttribute(`agent.model.id`,n.model.modelId),i.step.span.setAttribute(`agent.model.provider`,n.model.provider);let o=e.tracer.startSpan(modelSpanName(n.model.modelId),{attributes:{"gen_ai.agent.name":n.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":n.model.provider,"gen_ai.request.model":n.model.modelId}},i.operation.context);if(t&&n.input!==void 0){let e=messagesContentAttribute(n.input.messages);e!==void 0&&o.setAttribute(`ai.prompt.messages`,e);let t=genAiInputMessagesAttribute(n.input.messages);t!==void 0&&o.setAttribute(`gen_ai.input.messages`,t);let r=systemPromptAttribute(n.input.instructions);r!==void 0&&o.setAttribute(`ai.prompt.system`,r);let i=genAiSystemInstructionsAttribute(n.input.instructions);i!==void 0&&o.setAttribute(`gen_ai.system_instructions`,i)}let u={context:trace.setSpan(i.operation.context,o),span:o};getExecutionContexts(n.scope).set(n.idempotencyKey,u.context),getSpanStates(h,n.scope).set(n.idempotencyKey,u)},onModelCallTerminal=e=>{f.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(h,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let n=m.get(e.scope);if(n!==void 0&&setAgentUsage(n.step.span,e.usage),d){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content??[],r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let a=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
+ `));a!==void 0&&t.span.setAttribute(`ai.response.reasoning`,a);let s=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));s!==void 0&&t.span.setAttribute(`ai.response.text`,s);let c=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(c.length>0){let e=contentAttribute(c,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let l=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(l.length>0){let e=toolResultsContentAttribute(l);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},S=createAgentChannelDeliveryInstrumentation({ensureSessionContext:y,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=m.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.step.span.setAttribute(e,r)};return{hook:{capture:t||d?`content`:`metadata`,events:{...S,"action.completed":g.events[`action.completed`],"action.failed":g.events[`action.failed`],async"action.started"(e,t){await g.events[`action.started`](e,t),await v.actionStarted(e)},..._,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...v.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`},prepareSessionTrace:b,prepareTurnTrace:x,runInContext(e,t){let r=p.get(e.scope.attemptId)??e.scope,i=f.get(r),a=e.type===`model.call`?i?.get(e.idempotencyKey):v.contextFor(e.scope.attemptId,e.idempotencyKey);return a===void 0?t():context.with(a,t)}};function getExecutionContexts(e){let t=f.get(e);return t===void 0&&(t=new Map,f.set(e,t)),t}function drainOpenSpans(e){for(let t of h.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();h.delete(e.scope)}}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function parentLineageAttributes(e){if(e===void 0)return{};let t={"agent.parent.call_id":e.callId,"agent.parent.session.id":e.sessionId,"agent.parent.turn.id":e.turnId};return e.subagentName!==void 0&&(t[`agent.subagent.name`]=e.subagentName),t}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return`chat ${e}`}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
@@ -0,0 +1,17 @@
1
+ import type { Tracer } from "#compiled/@opentelemetry/api/index.js";
2
+ import { type InstrumentationSessionStartedEvent, type InstrumentationTraceContext, type InstrumentationTurnStartedEvent } from "#harness/instrumentation/lifecycle.js";
3
+ import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
+ import { type AgentSessionTraceState, type AgentTraceStateStore } from "#tracing/agent-trace-state.js";
5
+ interface AgentOtelSessionContextInput {
6
+ readonly frameworkVersion: string;
7
+ readonly idGenerator: AgentSpanIdGenerator;
8
+ readonly stateStore: AgentTraceStateStore;
9
+ readonly tracer: Tracer;
10
+ }
11
+ interface AgentOtelSessionContext {
12
+ readonly ensureSessionContext: (event: InstrumentationSessionStartedEvent) => Promise<AgentSessionTraceState>;
13
+ readonly prepareSessionTrace: (event: InstrumentationSessionStartedEvent) => Promise<InstrumentationTraceContext>;
14
+ readonly prepareTurnTrace: (event: InstrumentationTurnStartedEvent) => Promise<InstrumentationTraceContext>;
15
+ }
16
+ export declare function createAgentOtelSessionContext(input: AgentOtelSessionContextInput): AgentOtelSessionContext;
17
+ export {};
@@ -0,0 +1 @@
1
+ import{sessionIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{SESSION_WINDOW_TURN_LIMIT}from"#tracing/agent-trace-state.js";function createAgentOtelSessionContext(n){let openSessionWindow=e=>{let t=n.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.name":e.agentName,"agent.root.session.id":e.rootSessionId,"agent.session.id":e.sessionId,"agent.session.window":e.index,"agent.trace.schema.version":1,...e.previousTraceId===void 0?{}:{"agent.session.window.previous.trace.id":e.previousTraceId}},root:!0});return t.addEvent(e.index===0?`session.started`:`session.window.opened`),t.end(),t.spanContext()},ensureSessionContext=async e=>{let t=await n.stateStore.getSession(e.sessionId);return t===void 0&&(t={agentName:e.agentName,channelKind:e.channelKind,context:e.parentTraceContext===void 0?openSessionWindow({agentName:e.agentName,index:0,rootSessionId:e.rootSessionId,sessionId:e.sessionId}):adoptedSpanContext(e.parentTraceContext),rootSessionId:e.rootSessionId,turnsInWindow:0,window:0},await n.stateStore.setSession(e.sessionId,t)),t},advanceSessionWindow=(e,n)=>{if(n.turnsInWindow<SESSION_WINDOW_TURN_LIMIT)return n;let r=n.window+1;return{...n,context:openSessionWindow({agentName:n.agentName,index:r,previousTraceId:n.context.traceId,rootSessionId:n.rootSessionId,sessionId:e}),turnsInWindow:0,window:r}};return{ensureSessionContext,prepareSessionTrace:async e=>portableSpanContext((await ensureSessionContext(e)).context),prepareTurnTrace:async t=>{let r=await n.stateStore.getTurn(t.sessionId,t.turnId);if(r!==void 0)return{spanId:r.parentSpanId,traceFlags:r.context.traceFlags,traceId:r.context.traceId};let i=advanceSessionWindow(t.sessionId,await ensureSessionContext({agentName:void 0,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`})),a={isRemote:!1,spanId:n.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:i.context.traceFlags,traceId:i.context.traceId};return await n.stateStore.setSession(t.sessionId,{...i,turnsInWindow:i.turnsInWindow+1}),await n.stateStore.setTurn(t.sessionId,t.turnId,{context:a,lineage:t.parentLineage,parentIsRemote:i.context.isRemote,parentSpanId:i.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now()}),portableSpanContext(i.context)}}}function portableSpanContext(e){return{spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}export{createAgentOtelSessionContext};
@@ -1,4 +1,4 @@
1
1
  import type { Span } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationUsage } from "#harness/instrumentation-lifecycle.js";
2
+ import type { InstrumentationUsage } from "#harness/instrumentation/lifecycle.js";
3
3
  /** Applies eve's structural token usage attributes to an agent span. */
4
4
  export declare function setAgentUsage(span: Span, usage: InstrumentationUsage): void;
@@ -1,5 +1,5 @@
1
1
  import { type Context, type SpanContext, type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationActionStartedEvent, InstrumentationToolCallStartedEvent, InstrumentationToolCallTerminalEvent } from "#harness/instrumentation-lifecycle.js";
2
+ import type { InstrumentationActionStartedEvent, InstrumentationToolCallStartedEvent, InstrumentationToolCallTerminalEvent } from "#harness/instrumentation/lifecycle.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { AgentActionContext } from "#tracing/agent-action-instrumentation.js";
5
5
  export interface AgentToolInstrumentation {
@@ -1 +1 @@
1
- import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#harness/instrumentation-lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentToolInstrumentation(e){let t=new Map,n=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),i=e.resolveFallback(t),a=i===void 0?void 0:reserve(t,n,i),o=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(a===void 0){if(o===void 0)return;a=reserve(t,n,o)}o!==void 0&&startSpan(a,o.context)},onTerminal=async t=>{let r=n.get(t.scope.attemptId)?.get(t.idempotencyKey);if(r!==void 0){if(r.terminal=t,r.span===void 0){let t=await e.actionContextFor(r.event.scope.sessionId,r.event.scope.turnId,r.event.callId);t!==void 0&&startSpan(r,t.context)}finishIfReady(r)}};return{async actionStarted(n){let r=t.get(n.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(n.scope.sessionId,n.scope.turnId,n.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>n.get(e)?.get(t)?.context,drain(e,t){let r=n.get(e);if(r!==void 0){for(let e of r.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));n.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function reserve(n,r,i){let a=e.idGenerator.deriveSpanId(`tool:${n.idempotencyKey}`),o={actionKey:r,attemptId:n.scope.attemptId,context:contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),event:n,fallbackParent:i.context,idempotencyKey:n.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(n.scope.attemptId).set(n.idempotencyKey,o),t.set(r,o),o}function startSpan(t,n){if(!(t.span!==void 0||t.finished===!0)&&(t.span=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`ai.toolCall`,{attributes:toolAttributes(t.event),startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input,!1);e!==void 0&&t.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span===void 0||e.terminal===void 0||finish(e)}function finish(r,a){let o=r.span;if(o===void 0||r.finished===!0)return;r.finished=!0;let s=r.terminal;if(a!==void 0)recordError(o,a.error);else if(s?.type===`tool.call.failed`)recordError(o,s.error);else if(s?.output.type===`error`)recordError(o,s.output.error);else if(s!==void 0&&e.recordOutputs){let e=contentAttribute(s.output.output,!1);e!==void 0&&o.setAttribute(`gen_ai.tool.call.result`,e)}o.end(),t.delete(r.actionKey);let c=n.get(r.attemptId);c?.delete(r.idempotencyKey),c?.size===0&&n.delete(r.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
1
+ import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentToolInstrumentation(e){let t=new Map,n=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),i=e.resolveFallback(t),a=i===void 0?void 0:reserve(t,n,i),o=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(a===void 0){if(o===void 0)return;a=reserve(t,n,o)}o!==void 0&&startSpan(a,o.context)},onTerminal=async t=>{let r=n.get(t.scope.attemptId)?.get(t.idempotencyKey);if(r!==void 0){if(r.terminal=t,r.span===void 0){let t=await e.actionContextFor(r.event.scope.sessionId,r.event.scope.turnId,r.event.callId);t!==void 0&&startSpan(r,t.context)}finishIfReady(r)}};return{async actionStarted(n){let r=t.get(n.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(n.scope.sessionId,n.scope.turnId,n.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>n.get(e)?.get(t)?.context,drain(e,t){let r=n.get(e);if(r!==void 0){for(let e of r.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));n.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function reserve(n,r,i){let a=e.idGenerator.deriveSpanId(`tool:${n.idempotencyKey}`),o={actionKey:r,attemptId:n.scope.attemptId,context:contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),event:n,fallbackParent:i.context,idempotencyKey:n.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(n.scope.attemptId).set(n.idempotencyKey,o),t.set(r,o),o}function startSpan(t,n){if(!(t.span!==void 0||t.finished===!0)&&(t.span=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`ai.toolCall`,{attributes:toolAttributes(t.event),startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input,!1);e!==void 0&&t.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span===void 0||e.terminal===void 0||finish(e)}function finish(r,a){let o=r.span;if(o===void 0||r.finished===!0)return;r.finished=!0;let s=r.terminal;if(a!==void 0)recordError(o,a.error);else if(s?.type===`tool.call.failed`)recordError(o,s.error);else if(s?.output.type===`error`)recordError(o,s.output.error);else if(s!==void 0&&e.recordOutputs){let e=contentAttribute(s.output.output,!1);e!==void 0&&o.setAttribute(`gen_ai.tool.call.result`,e)}o.end(),t.delete(r.actionKey);let c=n.get(r.attemptId);c?.delete(r.idempotencyKey),c?.size===0&&n.delete(r.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
@@ -1,5 +1,5 @@
1
1
  import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationActionKind, InstrumentationParentLineage, InstrumentationTraceContext, InstrumentationTurnFailedEvent, InstrumentationTurnSettledEvent } from "#harness/instrumentation-lifecycle.js";
2
+ import type { InstrumentationActionKind, InstrumentationParentLineage, InstrumentationTraceContext, InstrumentationTurnFailedEvent, InstrumentationTurnSettledEvent } from "#harness/instrumentation/lifecycle.js";
3
3
  /** Sized so an ordinary session stays one trace and only an outsized one rolls. */
4
4
  export declare const SESSION_WINDOW_TURN_LIMIT = 200;
5
5
  export interface AgentSessionTraceState {
@@ -1,5 +1,5 @@
1
- import { type InstrumentationProviderDefinition } from "#harness/instrumentation-lifecycle.js";
2
- import { type InstrumentationRuntime } from "#harness/instrumentation-runtime.js";
1
+ import { type InstrumentationProviderDefinition } from "#harness/instrumentation/lifecycle.js";
2
+ import { type InstrumentationRuntime } from "#harness/instrumentation/runtime.js";
3
3
  import type { CollectedOtel } from "#tracing/otel-declaration.js";
4
4
  /**
5
5
  * Installs the process instrumentation runtime around a collected pipeline.
@@ -1 +1 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{ContextAgentTraceStateStore}from"#tracing/agent-trace-context-store.js";import{registerInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{trace}from"#compiled/@opentelemetry/api/index.js";import{createInstrumentationHooks}from"#harness/instrumentation-lifecycle.js";import{hasSessionRelease}from"#tracing/local-traces.js";import{createAgentOtelInstrumentation}from"#tracing/agent-otel-provider.js";import{registerOtelPipeline}from"#tracing/otel-registration.js";const log=createLogger(`tracing.install-instrumentation-runtime`);function installInstrumentationRuntime(e){let t=[],a=[],o,runInContext=(e,t)=>t();if(e.collected.declared){o=registerOtelPipeline({pipeline:e.collected.pipeline,serviceName:e.serviceName});let r=createAgentOtelInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:o.idGenerator,recordInputs:e.collected.settings.recordInputs,recordOutputs:e.collected.settings.recordOutputs,stateStore:new ContextAgentTraceStateStore,tracer:trace.getTracer(`eve.agent`,e.frameworkVersion)});t.push({...r.hook,stateNamespace:`internal:otel`}),runInContext=r.runInContext;let i=e.collected.pipeline.spanProcessors.filter(isSpanProcessor).filter(hasSessionRelease);i.length>0&&a.push(sessionReleaseProvider(i))}let s=[...t,...e.providers,...a],c;return registerInstrumentationRuntime({forceFlush:()=>settleAll([...o===void 0?[]:[o.forceFlush],...s.map(e=>()=>e.flush?.())]),hooks:createInstrumentationHooks({parallel:e.providers,serialAfter:a,serialBefore:t}),otelSettings:e.collected.declared?e.collected.settings:void 0,runInContext,shutdown:()=>(c??=settleAll([...o===void 0?[]:[o.shutdown],...s.map(e=>()=>e.shutdown?.())]),c)})}function isSpanProcessor(e){return e!==`auto`}function sessionReleaseProvider(e){let release=async t=>{await Promise.all(e.map(e=>e.releaseSession(t.sessionId)))};return{events:{"session.completed":release,"session.failed":release},name:`eve.session-release`,stateNamespace:`internal:session-release`}}async function settleAll(e){let n=await Promise.allSettled(e.map(async e=>e()));for(let e of n)e.status===`rejected`&&log.warn(`instrumentation drain failed`,{error:formatError(e.reason)})}export{installInstrumentationRuntime};
1
+ import{createLogger,formatError}from"#internal/logging.js";import{ContextAgentTraceStateStore}from"#tracing/agent-trace-context-store.js";import{registerInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{trace}from"#compiled/@opentelemetry/api/index.js";import{createInstrumentationHooks}from"#harness/instrumentation/lifecycle.js";import{hasSessionRelease}from"#tracing/local-traces.js";import{createAgentOtelInstrumentation}from"#tracing/agent-otel-provider.js";import{registerOtelPipeline}from"#tracing/otel-registration.js";const log=createLogger(`tracing.install-instrumentation-runtime`);function installInstrumentationRuntime(e){let t=[],a=[],o,s,c,runInContext=(e,t)=>t();if(e.collected.declared){o=registerOtelPipeline({pipeline:e.collected.pipeline,serviceName:e.serviceName});let r=createAgentOtelInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:o.idGenerator,recordInputs:e.collected.settings.recordInputs,recordOutputs:e.collected.settings.recordOutputs,stateStore:new ContextAgentTraceStateStore,tracer:trace.getTracer(`eve.agent`,e.frameworkVersion)});t.push({...r.hook,stateNamespace:`internal:otel`}),s=r.prepareSessionTrace,c=r.prepareTurnTrace,runInContext=r.runInContext;let i=e.collected.pipeline.spanProcessors.filter(isSpanProcessor).filter(hasSessionRelease);i.length>0&&a.push(sessionReleaseProvider(i))}let l=[...t,...e.providers,...a],u;return registerInstrumentationRuntime({forceFlush:()=>settleAll([...o===void 0?[]:[o.forceFlush],...l.map(e=>()=>e.flush?.())]),hooks:createInstrumentationHooks({parallel:e.providers,serialAfter:a,serialBefore:t}),otelSettings:e.collected.declared?e.collected.settings:void 0,prepareSessionTrace:s,prepareTurnTrace:c,runInContext,shutdown:()=>(u??=settleAll([...o===void 0?[]:[o.shutdown],...l.map(e=>()=>e.shutdown?.())]),u)})}function isSpanProcessor(e){return e!==`auto`}function sessionReleaseProvider(e){let release=async t=>{await Promise.all(e.map(e=>e.releaseSession(t.sessionId)))};return{events:{"session.completed":release,"session.failed":release},name:`eve.session-release`,stateNamespace:`internal:session-release`}}async function settleAll(e){let n=await Promise.allSettled(e.map(async e=>e()));for(let e of n)e.status===`rejected`&&log.warn(`instrumentation drain failed`,{error:formatError(e.reason)})}export{installInstrumentationRuntime};
@@ -1,4 +1,4 @@
1
- import { type InstrumentationRuntime } from "#harness/instrumentation-runtime.js";
1
+ import { type InstrumentationRuntime } from "#harness/instrumentation/runtime.js";
2
2
  /** Installs the zero-config local OTel runtime once in an `eve dev` worker. */
3
3
  export declare function installLocalInstrumentationRuntime(input: {
4
4
  readonly appRoot: string;
@@ -1 +1 @@
1
- import{getInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{installInstrumentationRuntime}from"#tracing/install-instrumentation-runtime.js";import{collectOtelPipeline,otel,otelIntegration}from"#tracing/otel-declaration.js";import{createLocalTracesProcessor,resolveLocalTracesContent}from"#tracing/local-traces.js";function installLocalInstrumentationRuntime(e){let t=getInstrumentationRuntime();if(t!==void 0)return t;let n=createLocalTracesProcessor({appRoot:e.appRoot});return installInstrumentationRuntime({collected:collectOtelPipeline([otel(),otelIntegration({...resolveLocalTracesContent(),spanProcessors:[n]})]),frameworkVersion:e.frameworkVersion,providers:[],serviceName:e.serviceName})}export{installLocalInstrumentationRuntime};
1
+ import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{installInstrumentationRuntime}from"#tracing/install-instrumentation-runtime.js";import{collectOtelPipeline,otel,otelIntegration}from"#tracing/otel-declaration.js";import{createLocalTracesProcessor,resolveLocalTracesContent}from"#tracing/local-traces.js";function installLocalInstrumentationRuntime(e){let t=getInstrumentationRuntime();if(t!==void 0)return t;let n=createLocalTracesProcessor({appRoot:e.appRoot});return installInstrumentationRuntime({collected:collectOtelPipeline([otel(),otelIntegration({...resolveLocalTracesContent(),spanProcessors:[n]})]),frameworkVersion:e.frameworkVersion,providers:[],serviceName:e.serviceName})}export{installLocalInstrumentationRuntime};
@@ -41,9 +41,9 @@ export declare function createLocalTracesProcessor(input?: {
41
41
  * The local spool's content policy: its options, intersected with
42
42
  * `EVE_TRACES_CONTENT`.
43
43
  *
44
- * The variable used to be the process-wide switch. It now applies to this one
45
- * destination, and only ever narrows — `off` still wins where it applies, but
46
- * it no longer decides what a hosted backend beside it receives.
44
+ * The variable applies to this destination only. `on` opts the zero-config
45
+ * spool into content, while `off` overrides authored local options without
46
+ * changing what a hosted backend beside it receives.
47
47
  *
48
48
  * @internal
49
49
  */
@@ -1 +1 @@
1
- import{LocalTraceSpanProcessor}from"#tracing/local-trace-span-processor.js";import{AgentTraceSpanProcessor}from"#tracing/agent-trace-span-processor.js";import{requestLocalTraceStorePrune,resolveLocalTraceRetentionSettings}from"#tracing/local-trace-retention.js";function hasSessionRelease(e){return typeof e.releaseSession==`function`}function createLocalTracesProcessor(n={}){let r=n.appRoot??process.env.EVE_DEV_WORKER_APP_ROOT;if(r===void 0)return inertLocalTracesProcessor();let i=resolveLocalTraceRetentionSettings(),a=new AgentTraceSpanProcessor(i.enabled?[new LocalTraceSpanProcessor(r)]:[]),requestPrune=()=>{i.enabled&&requestLocalTraceStorePrune({activeTraceIds:a.activeTraceIds(),appRoot:r,maxAgeMs:i.maxAgeMs,maxTotalBytes:i.maxTotalBytes,retainCount:i.retainCount})};return requestPrune(),{forceFlush:()=>a.forceFlush(),onEnd:e=>a.onEnd(e),onStart:(e,t)=>a.onStart(e,t),async releaseSession(e){return await a.forceFlush(),a.releaseSession(e)?(requestPrune(),!0):!1},shutdown:()=>a.shutdown()}}function resolveLocalTracesContent(e={}){let t=process.env.EVE_TRACES_CONTENT!==`off`;return{recordInputs:t&&e.recordInputs!==!1,recordOutputs:t&&e.recordOutputs!==!1}}function inertLocalTracesProcessor(){return{forceFlush:async()=>void 0,onEnd:()=>void 0,onStart:()=>void 0,releaseSession:async()=>!1,shutdown:async()=>void 0}}export{createLocalTracesProcessor,hasSessionRelease,resolveLocalTracesContent};
1
+ import{LocalTraceSpanProcessor}from"#tracing/local-trace-span-processor.js";import{AgentTraceSpanProcessor}from"#tracing/agent-trace-span-processor.js";import{requestLocalTraceStorePrune,resolveLocalTraceRetentionSettings}from"#tracing/local-trace-retention.js";function hasSessionRelease(e){return typeof e.releaseSession==`function`}function createLocalTracesProcessor(r={}){let i=r.appRoot??process.env.EVE_DEV_WORKER_APP_ROOT;if(i===void 0)return inertLocalTracesProcessor();let a=resolveLocalTraceRetentionSettings(),o=new AgentTraceSpanProcessor(a.enabled?[new LocalTraceSpanProcessor(i)]:[]),requestPrune=()=>{a.enabled&&requestLocalTraceStorePrune({activeTraceIds:o.activeTraceIds(),appRoot:i,maxAgeMs:a.maxAgeMs,maxTotalBytes:a.maxTotalBytes,retainCount:a.retainCount})};return requestPrune(),{forceFlush:()=>o.forceFlush(),onEnd:e=>o.onEnd(e),onStart:(e,t)=>o.onStart(e,t),async releaseSession(e){return await o.forceFlush(),o.releaseSession(e)?(requestPrune(),!0):!1},shutdown:()=>o.shutdown()}}function resolveLocalTracesContent(e={}){let t=process.env.EVE_TRACES_CONTENT===`on`,n=process.env.EVE_TRACES_CONTENT!==`off`;return{recordInputs:n&&(e.recordInputs??t),recordOutputs:n&&(e.recordOutputs??t)}}function inertLocalTracesProcessor(){return{forceFlush:async()=>void 0,onEnd:()=>void 0,onStart:()=>void 0,releaseSession:async()=>!1,shutdown:async()=>void 0}}export{createLocalTracesProcessor,hasSessionRelease,resolveLocalTracesContent};
@@ -49,9 +49,9 @@ export interface OtelOptions {
49
49
  * longer have to agree.
50
50
  */
51
51
  export interface ContentOptions {
52
- /** Record model prompts and tool call inputs. Defaults to `true`. */
52
+ /** Record model prompts and tool call inputs. Defaults to `false`. */
53
53
  readonly recordInputs?: boolean;
54
- /** Record model responses and tool call outputs. Defaults to `true`. */
54
+ /** Record model responses and tool call outputs. Defaults to `false`. */
55
55
  readonly recordOutputs?: boolean;
56
56
  }
57
57
  /** Where one `otelIntegration()` sends spans, and what it records. */
@@ -1 +1 @@
1
- import{PROVIDER}from"#public/instrumentation/provider.js";import{batchSpanProcessor}from"#tracing/batch-span-processor.js";import{contentFilteringProcessor}from"#tracing/content-span-processor.js";import{vercelRuntimeSpanProcessor}from"#tracing/vercel-runtime-span-exporter.js";const OTEL_DECLARATION=Symbol.for(`eve.instrumentation.otel`),OTEL_INTEGRATION=Symbol.for(`eve.instrumentation.otel-integration`);function otel(t={}){return{[OTEL_DECLARATION]:!0,[PROVIDER]:!0,options:t}}function otelIntegration(r={}){let i={recordInputs:r.recordInputs!==!1,recordOutputs:r.recordOutputs!==!1},o=r.spanProcessors??[],s=r.traceExporter===void 0?o:[...o,batchSpanProcessor(r.traceExporter)];return{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,content:i,spanProcessors:i.recordInputs&&i.recordOutputs?s:s.map(e=>contentFilteringProcessor(e,i))}}function agentRunsIntegration(t={}){let i=resolveContentOptions(t);return{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,content:i,spanProcessors:i.recordInputs&&i.recordOutputs?[`auto`]:[contentFilteringProcessor(vercelRuntimeSpanProcessor(),i)]}}function resolveContentOptions(e){return{recordInputs:e.recordInputs!==!1,recordOutputs:e.recordOutputs!==!1}}function isOtelDeclaration(e){return typeof e==`object`&&!!e&&e[OTEL_DECLARATION]===!0}function isOtelIntegration(e){return typeof e==`object`&&!!e&&e[OTEL_INTEGRATION]===!0}function collectOtelPipeline(e){let t=[],n,r=!1,i=!1,a=!1;for(let o of e){if(isOtelIntegration(o)){r=!0,i||=o.content.recordInputs,a||=o.content.recordOutputs,t.push(...o.spanProcessors);continue}if(isOtelDeclaration(o)){if(n!==void 0)throw Error("Instrumentation declares `otel()` more than once. One process has one OpenTelemetry tracer provider, so it has one resource, one sampler, and one propagator set — declare them in a single `otel()`.");r=!0,n=o}}let o=n?.options??{};return{declared:r,pipeline:{propagators:o.propagators,resource:o.resource,sampler:o.sampler,spanProcessors:t},settings:{functionId:o.functionId,recordInputs:i,recordOutputs:a,traceChannelRequests:o.traceChannelRequests===!0}}}export{agentRunsIntegration,collectOtelPipeline,isOtelDeclaration,isOtelIntegration,otel,otelIntegration,resolveContentOptions};
1
+ import{PROVIDER}from"#public/instrumentation/provider.js";import{batchSpanProcessor}from"#tracing/batch-span-processor.js";import{contentFilteringProcessor}from"#tracing/content-span-processor.js";import{vercelRuntimeSpanProcessor}from"#tracing/vercel-runtime-span-exporter.js";const OTEL_DECLARATION=Symbol.for(`eve.instrumentation.otel`),OTEL_INTEGRATION=Symbol.for(`eve.instrumentation.otel-integration`);function otel(t={}){return{[OTEL_DECLARATION]:!0,[PROVIDER]:!0,options:t}}function otelIntegration(r={}){let i={recordInputs:r.recordInputs===!0,recordOutputs:r.recordOutputs===!0},o=r.spanProcessors??[],s=r.traceExporter===void 0?o:[...o,batchSpanProcessor(r.traceExporter)];return{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,content:i,spanProcessors:i.recordInputs&&i.recordOutputs?s:s.map(e=>contentFilteringProcessor(e,i))}}function agentRunsIntegration(t={}){let i=resolveContentOptions(t);return{[OTEL_INTEGRATION]:!0,[PROVIDER]:!0,content:i,spanProcessors:i.recordInputs&&i.recordOutputs?[`auto`]:[contentFilteringProcessor(vercelRuntimeSpanProcessor(),i)]}}function resolveContentOptions(e){return{recordInputs:e.recordInputs===!0,recordOutputs:e.recordOutputs===!0}}function isOtelDeclaration(e){return typeof e==`object`&&!!e&&e[OTEL_DECLARATION]===!0}function isOtelIntegration(e){return typeof e==`object`&&!!e&&e[OTEL_INTEGRATION]===!0}function collectOtelPipeline(e){let t=[],n,r=!1,i=!1,a=!1;for(let o of e){if(isOtelIntegration(o)){r=!0,i||=o.content.recordInputs,a||=o.content.recordOutputs,t.push(...o.spanProcessors);continue}if(isOtelDeclaration(o)){if(n!==void 0)throw Error("Instrumentation declares `otel()` more than once. One process has one OpenTelemetry tracer provider, so it has one resource, one sampler, and one propagator set — declare them in a single `otel()`.");r=!0,n=o}}let o=n?.options??{};return{declared:r,pipeline:{propagators:o.propagators,resource:o.resource,sampler:o.sampler,spanProcessors:t},settings:{functionId:o.functionId,recordInputs:i,recordOutputs:a,traceChannelRequests:o.traceChannelRequests===!0}}}export{agentRunsIntegration,collectOtelPipeline,isOtelDeclaration,isOtelIntegration,otel,otelIntegration,resolveContentOptions};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-FJkEMXYk.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-CnppTEFk.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-FJkEMXYk.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-CnppTEFk.js";
2
2
 
3
3
  export { useEveAgent };
package/docs/README.md CHANGED
@@ -34,26 +34,24 @@ Casing convention:
34
34
  Read in this order:
35
35
 
36
36
  1. [Getting Started](./getting-started.mdx)
37
- 2. [Installation](./installation.mdx)
38
- 3. [Project Structure](./project-structure.mdx)
39
- 4. [Project Layout](./reference/project-layout.md)
40
- 5. [`agent.ts`](./agent-config.md)
41
- 6. [TypeScript API](./reference/typescript-api.md)
42
- 7. [Context Control](./concepts/context-control.md)
43
- 8. [Skills](./skills.mdx)
44
- 9. [Tools](./tools/overview.mdx)
45
- 10. [Connections](./connections/overview.mdx)
46
- 11. [Sandboxes](./sandbox.mdx)
47
- 12. [Channels](./channels/overview.mdx)
48
- 13. [Session Context](./reference/typescript-api.md)
49
- 14. [Sessions And Streaming](./concepts/sessions-runs-and-streaming.md)
50
- 15. [TypeScript SDK](./guides/client/overview.mdx)
51
- 16. [Subagents](./subagents.mdx)
52
- 17. [Schedules](./schedules.mdx)
53
- 18. [Evals](./evals/overview.mdx)
54
- 19. [Auth And Route Protection](./guides/auth-and-route-protection.md)
55
- 20. [Vercel Deployment](./guides/deployment/overview.md)
56
- 21. [CLI, Build, And Debugging](./reference/cli.md)
37
+ 2. [Tutorial](./tutorial/first-agent.mdx)
38
+ 3. [Agents](./agent-config.md)
39
+ 4. [TypeScript API Reference](./reference/typescript-api.md)
40
+ 5. [Context Control](./concepts/context-control.md)
41
+ 6. [Skills](./skills.mdx)
42
+ 7. [Tools](./tools/overview.mdx)
43
+ 8. [Connections](./connections/overview.mdx)
44
+ 9. [Sandboxes](./sandbox.mdx)
45
+ 10. [Channels](./channels/overview.mdx)
46
+ 11. [Session Context](./guides/session-context.md)
47
+ 12. [Sessions and Streaming](./concepts/sessions-runs-and-streaming.md)
48
+ 13. [Client SDK](./guides/client/overview.mdx)
49
+ 14. [Subagents](./subagents/index.mdx)
50
+ 15. [Schedules](./schedules.mdx)
51
+ 16. [Evals](./evals/overview.mdx)
52
+ 17. [Authentication](./guides/auth-and-route-protection.md)
53
+ 18. [Deployment](./guides/deployment/overview.md)
54
+ 19. [CLI](./reference/cli.md)
57
55
 
58
56
  ## The public mental model
59
57
 
@@ -1,9 +1,9 @@
1
1
  ---
2
- title: "agent.ts"
3
- description: "Set the agent's runtime config in agent.ts with defineAgent, including the model, reasoning effort, and compaction."
2
+ title: "Agents"
3
+ description: "Configure an eve agent's model, reasoning effort, compaction, limits, and runtime behavior in agent.ts."
4
4
  ---
5
5
 
6
- An agent's `agent.ts` calls `defineAgent` (from `eve`) to set its runtime config.
6
+ An eve app has one root agent assembled from the files under `agent/`. Its optional `agent.ts` calls `defineAgent` (from `eve`) when you need to configure the model or other runtime behavior. Declared [subagents](./subagents) have their own `agent.ts` and capabilities; this page covers the configuration shared by root agents and subagents.
7
7
 
8
8
  ## Set the model
9
9
 
@@ -22,7 +22,10 @@ project root with `eve set --model anthropic/claude-opus-4.8` or from the local
22
22
  dev TUI with `/model anthropic/claude-opus-4.8`.
23
23
 
24
24
  The root `agent.ts` can be omitted when no runtime config is needed. In that case, eve defaults
25
- to `anthropic/claude-sonnet-5`. When `agent.ts` is present, `model` is required.
25
+ to `zai/glm-5.2`. GLM 5.2 does not support image input; choose a
26
+ vision-capable model or [route image inputs to Gemini
27
+ Flash](./guides/dynamic-capabilities#route-image-inputs-to-a-vision-model).
28
+ When `agent.ts` is present, `model` is required.
26
29
 
27
30
  `model` accepts a gateway model id string, which routes through the [Vercel AI Gateway](https://vercel.com/docs/ai-gateway). To call a provider directly and configure the model in code, pass a provider-authored `LanguageModel`.
28
31
 
@@ -229,7 +232,7 @@ installed package must stay external in hosted output, list it in
229
232
 
230
233
  ## Other defineAgent fields
231
234
 
232
- `defineAgent` takes a few more fields, all optional. For the exported types, see the [TypeScript API](./reference/typescript-api).
235
+ `defineAgent` takes a few more fields, all optional. For the exported types, see the [TypeScript API Reference](./reference/typescript-api).
233
236
 
234
237
  | Field | Type | Default | Description |
235
238
  | -------------- | --------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -257,5 +260,5 @@ During `eve dev`, ordinary dependencies are bundled into each retained runtime g
257
260
  ## What to read next
258
261
 
259
262
  - [Default harness](./concepts/default-harness) for the loop and built-in tools this config drives
260
- - [TypeScript API](./reference/typescript-api) for every `defineAgent` field and type
263
+ - [TypeScript API Reference](./reference/typescript-api) for every `defineAgent` field and type
261
264
  - [Subagents](./subagents) for the `description` requirement and child-agent config
@@ -388,7 +388,7 @@ defineChannel({
388
388
 
389
389
  The `URL` object survives the queue boundary as a string and is reconstituted inside the workflow step. The staging pipeline calls `fetchFile` with the URL serialized as a string (the URL's `href`), which is why the example matches on `url.startsWith(...)`. Return bytes to stage the file to the sandbox, or `null` to let the URL pass through to the model provider.
390
390
 
391
- The framework handles staging bytes to the sandbox, enforcing upload policy, hydrating files for the model call, and reconstituting `URL` objects after queue serialization.
391
+ The framework handles staging bytes to the sandbox, enforcing upload policy, hydrating files for the model call, and reconstituting `URL` objects after queue serialization. See [Inbound attachments](../sandbox#inbound-attachments) for the shared storage, size, and provider-input behavior.
392
392
 
393
393
  ## What to read next
394
394
 
@@ -36,15 +36,13 @@ The session routes use only durable session IDs. Create a session explicitly, th
36
36
 
37
37
  ### Start and continue a session
38
38
 
39
+ Start a session with an initial message, then use the returned `sessionId` for every follow-up and control operation:
40
+
39
41
  ```bash
40
42
  curl -X POST https://<deployment>/eve/v1/session \
41
43
  -H "Content-Type: application/json" \
42
44
  -d '{"message":"What is the weather in Paris?"}'
43
45
  # {"ok":true,"sessionId":"wrun_A","status":"accepted"}
44
-
45
- curl -X POST https://<deployment>/eve/v1/session/wrun_A \
46
- -H "Content-Type: application/json" \
47
- -d '{"message":"How about tomorrow?"}'
48
46
  ```
49
47
 
50
48
  The first request requires `message`. A follow-up request accepts exactly one of
@@ -65,69 +63,25 @@ creates or follows a replacement session.
65
63
 
66
64
  ### Stream events
67
65
 
68
- Stream responses are newline-delimited JSON (`application/x-ndjson; charset=utf-8`), one event object per line:
69
-
70
- ```bash
71
- curl -N https://<deployment>/eve/v1/session/wrun_A/stream
72
- # {"type":"turn.started",...}
73
- # {"type":"message.appended","data":{"messageDelta":"It is ",...}}
74
- # {"type":"message.completed",...}
75
- ```
66
+ Stream a session as newline-delimited JSON from `GET /eve/v1/session/:sessionId/stream`. The [session protocol](../concepts/sessions-runs-and-streaming#stream-a-session) defines the event set, envelopes, cursors, and reconnection behavior.
76
67
 
77
68
  ### Cancel a turn
78
69
 
79
- Cancel a session's in-flight turn with an empty body, or scope the cancel to the turn you observed by passing the `turnId` stamped on that turn's stream events:
70
+ Post to `/eve/v1/session/:sessionId/cancel` to request cancellation of the active turn. You can include the observed `turnId` to keep a late request from cancelling a newer turn. Cancellation is asynchronous; confirm it on the stream as `turn.cancelled` followed by `session.waiting`.
80
71
 
81
- ```bash
82
- curl -X POST https://<deployment>/eve/v1/session/wrun_A/cancel
83
- # {"ok":true,"sessionId":"wrun_A","status":"accepted"}
84
- ```
85
-
86
- Cancellation is asynchronous: `"accepted"` means the live session durably queued the request. Confirm an actual cancellation on the stream as `turn.cancelled` followed by `session.waiting`—never as a failure. Active local and remote subagents are cancelled recursively before the parent settles. Content emitted before cancellation stays on the event stream, while durable model history keeps only content that had already settled. The session accepts the next message normally.
87
-
88
- An accepted cancellation returns HTTP `202` with `sessionId`. An inactive target
89
- returns HTTP `200` with `{"ok":true,"status":"no_active_turn"}`.
90
-
91
- A live session also returns `"accepted"` when it is already parked; the driver consumes that late or duplicate cancel as a no-op. An unknown or terminal session returns `"no_active_turn"`. A `turnId` naming any other turn is likewise accepted and consumed as a no-op, so a guarded cancel racing a turn boundary cannot stop a turn the caller never saw.
72
+ See [Cancel the in-flight turn](../concepts/sessions-runs-and-streaming#cancel-the-in-flight-turn) for response statuses, HTTP status codes, subagent cancellation, and race behavior.
92
73
 
93
74
  ### Clear context
94
75
 
95
- Clear one session's model-message history without replacing the session:
96
-
97
- ```bash
98
- curl -X POST https://<deployment>/eve/v1/session/wrun_A/clear
99
- # {"ok":true,"sessionId":"wrun_A","status":"accepted"}
100
- ```
101
-
102
- An accepted clear emits `context.cleared` followed by `session.waiting`. The next message uses the same session without prior model messages; the system prompt, tools, skills, durable state, limits, and session-scoped sandbox remain.
76
+ Post to `/eve/v1/session/:sessionId/clear` to remove model-message history while preserving the session ID, system prompt, tools, skills, durable state, limits, and sandbox. See [Compact, clear, and reset](../concepts/sessions-runs-and-streaming#compact-clear-and-reset).
103
77
 
104
78
  ### Compact context
105
79
 
106
- Compact one session's context without sending a message:
107
-
108
- ```bash
109
- curl -X POST https://<deployment>/eve/v1/session/wrun_A/compact
110
- # {"ok":true,"sessionId":"wrun_A","status":"accepted"}
111
- ```
112
-
113
- Compaction is asynchronous. A successful operation emits `compaction.requested` and `compaction.completed`, then returns through `session.waiting`. When a turn is active, compaction waits for it to settle. If summarization fails, the session still returns to `session.waiting` with its previous history.
80
+ Post to `/eve/v1/session/:sessionId/compact` to summarize context without sending a user message. The operation waits for an active turn to settle and reports its result on the stream. See [Compact, clear, and reset](../concepts/sessions-runs-and-streaming#compact-clear-and-reset).
114
81
 
115
82
  ### Reset a session
116
83
 
117
- Reset terminally retires the exact session ID:
118
-
119
- ```bash
120
- curl -X POST https://<deployment>/eve/v1/session/wrun_A/reset \
121
- -H "Content-Type: application/json" \
122
- -d '{"reason":"Start over"}'
123
- # {"ok":true,"previousSessionId":"wrun_A","status":"reset"}
124
- ```
125
-
126
- After reset, the old ID cannot accept another message. Start a replacement explicitly with `POST /eve/v1/session`.
127
-
128
- The control routes never create sessions. `compact`, `clear`, and `reset` return `"no_active_session"` when the ID is already inactive. Session message and control request/response bodies do not accept or return continuation tokens. For compatibility, the streamed `session.waiting` event retains `data.continuationToken`: it is the channel-local token for a channel-addressed session and the immutable session ID for an ID-only session. New clients should continue through their fixed session handle instead of reading this field.
129
-
130
- See [Sessions, runs & streaming](../concepts/sessions-runs-and-streaming) for the complete event set, operation results, and cursor behavior.
84
+ Post to `/eve/v1/session/:sessionId/reset` to terminally retire that session. Reset never replaces the ID automatically; create a new session explicitly for a fresh conversation. See [Compact, clear, and reset](../concepts/sessions-runs-and-streaming#compact-clear-and-reset).
131
85
 
132
86
  ## CORS
133
87
 
@@ -199,11 +153,11 @@ always dispatches and therefore always produces or continues a session.
199
153
 
200
154
  The browser side of this API lives in the [Frontend](../guides/frontend/overview) docs, where `useEveAgent` drives the eve channel from React UI.
201
155
 
202
- For scripts, server-to-server calls, evals, tests, and custom clients, use the [TypeScript SDK](../guides/client/overview). It wraps the ID-addressed session routes, stream cursor, and reconnect loop.
156
+ For scripts, server-to-server calls, evals, tests, and custom clients, use the [Client SDK](../guides/client/overview). It wraps the ID-addressed session routes, stream cursor, and reconnect loop.
203
157
 
204
158
  ## What to read next
205
159
 
206
160
  - [Frontend](../guides/frontend/overview): drive the eve channel from browser UI with `useEveAgent`
207
- - [TypeScript SDK](../guides/client/overview): call the eve channel from TypeScript
161
+ - [Client SDK](../guides/client/overview): call the eve channel from TypeScript
208
162
  - [Auth & route protection](../guides/auth-and-route-protection): the route auth policy
209
163
  - [Sessions, runs & streaming](../concepts/sessions-runs-and-streaming): the routes this channel exposes
@@ -58,7 +58,7 @@ GITHUB_WEBHOOK_SECRET=... # verifies the webhook signature
58
58
  GITHUB_APP_SLUG=... # supplies botName when it is not set in config
59
59
  ```
60
60
 
61
- `appId`/`privateKey`/`webhookSecret` also take a lazy resolver function if you'd rather fetch them on demand.
61
+ `appId`/`privateKey`/`webhookSecret` also take a lazy resolver function if you'd rather fetch them on demand, and so does `botName`: it resolves on first use inside request handling, caches on success, and retries on the next event after a failure, so a resolver that depends on request-scoped credentials works in production. When `botName` is not configured, the channel falls back to the credentials' `appSlug`, then to `GITHUB_APP_SLUG`.
62
62
 
63
63
  Point the GitHub App webhook URL at `https://<deployment>/eve/v1/github`. For comment-invoked turns, subscribe to `issue_comment` and `pull_request_review_comment`; add `issues`, `pull_request`, `check_suite`, `check_run`, or `workflow_run` if you wire up their opt-in hooks. After installing the App for the repository, a new comment that includes `@botName` starts a turn. This is a text invocation token, not a GitHub-native mention: GitHub may display the App as `botName[bot]`, but it may not autocomplete or link `@botName`.
64
64
 
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "title": "Channels",
3
+ "defaultOpen": false,
3
4
  "pages": [
4
5
  "overview",
5
6
  "eve",