eve 0.53.1 → 0.54.2

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 (230) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/src/channel/types.d.ts +2 -0
  3. package/dist/src/chunks/{use-eve-agent-BR8EpIOX.js → use-eve-agent-CxPlg0KL.js} +0 -1
  4. package/dist/src/chunks/{use-eve-agent-XnfjQt1Z.js → use-eve-agent-D-KQzzyW.js} +0 -1
  5. package/dist/src/cli/commands/trace-detail.js +1 -1
  6. package/dist/src/cli/commands/trace.d.ts +2 -2
  7. package/dist/src/cli/commands/trace.js +3 -3
  8. package/dist/src/cli/dev/tui/runner.js +1 -1
  9. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  10. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +1 -3
  11. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -2
  12. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +5 -5
  13. package/dist/src/cli/dev/tui/traces/trace-conversation.js +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-session.js +1 -1
  16. package/dist/src/client/agent-info-schema.d.ts +0 -1
  17. package/dist/src/client/agent-info-schema.js +1 -1
  18. package/dist/src/compiled/.vendor-stamp.json +1 -1
  19. package/dist/src/compiled/@opentelemetry/api/index.d.ts +1 -0
  20. package/dist/src/compiler/default-tool-policy.js +1 -1
  21. package/dist/src/compiler/extension-compatibility.d.ts +4 -4
  22. package/dist/src/compiler/extension-compatibility.js +1 -1
  23. package/dist/src/compiler/manifest.js +1 -1
  24. package/dist/src/context/dynamic-instruction-lifecycle.d.ts +2 -1
  25. package/dist/src/context/dynamic-instruction-lifecycle.js +1 -1
  26. package/dist/src/context/keys.d.ts +3 -1
  27. package/dist/src/context/keys.js +1 -1
  28. package/dist/src/context/memory-event-lifecycle.d.ts +2 -0
  29. package/dist/src/context/memory-event-lifecycle.js +1 -1
  30. package/dist/src/context/memory-lifecycle.d.ts +5 -0
  31. package/dist/src/context/memory-lifecycle.js +1 -1
  32. package/dist/src/eve-channel/index.js +1 -1
  33. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  34. package/dist/src/execution/cancelled-turn-message.js +1 -1
  35. package/dist/src/execution/compaction.d.ts +2 -2
  36. package/dist/src/execution/coordination-dispatch-shared.d.ts +0 -1
  37. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  38. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  39. package/dist/src/execution/create-session-step.js +1 -1
  40. package/dist/src/execution/durable-session-store.d.ts +2 -2
  41. package/dist/src/execution/eve-workflow-attributes.d.ts +3 -3
  42. package/dist/src/execution/next-driver-action.d.ts +2 -0
  43. package/dist/src/execution/parked-delivery-wait.js +1 -1
  44. package/dist/src/execution/route-child-delivery.js +1 -1
  45. package/dist/src/execution/runtime-context.js +1 -1
  46. package/dist/src/execution/session.d.ts +0 -2
  47. package/dist/src/execution/session.js +2 -2
  48. package/dist/src/execution/tasks/parent/dispatch.d.ts +1 -12
  49. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  50. package/dist/src/execution/tasks/parent/hitl-proxy-steps.d.ts +5 -1
  51. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  52. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  53. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  54. package/dist/src/execution/tools/subagent/invoke-agent.d.ts +1 -2
  55. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  56. package/dist/src/execution/tools/subagent/invoke-step.d.ts +4 -0
  57. package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
  58. package/dist/src/execution/tools/subagent/start.d.ts +2 -2
  59. package/dist/src/execution/tools/subagent/start.js +1 -1
  60. package/dist/src/execution/tools/subagent/task-agent-requests.js +1 -1
  61. package/dist/src/execution/tools/tasks.d.ts +1 -8
  62. package/dist/src/execution/tools/tasks.js +1 -1
  63. package/dist/src/execution/tools/todo.d.ts +2 -2
  64. package/dist/src/execution/tools/todo.js +2 -2
  65. package/dist/src/execution/turn-workflow.js +1 -1
  66. package/dist/src/execution/workflow-runtime.js +1 -1
  67. package/dist/src/execution/workflow-steps.js +1 -1
  68. package/dist/src/framework/sources/registry.js +1 -1
  69. package/dist/src/harness/compaction.js +1 -1
  70. package/dist/src/harness/coordination.js +1 -1
  71. package/dist/src/harness/current-messages.d.ts +7 -6
  72. package/dist/src/harness/current-messages.js +1 -1
  73. package/dist/src/harness/emission.js +1 -1
  74. package/dist/src/harness/execute-tool.d.ts +2 -4
  75. package/dist/src/harness/messages.d.ts +36 -0
  76. package/dist/src/harness/messages.js +1 -1
  77. package/dist/src/harness/model-call-error.d.ts +5 -0
  78. package/dist/src/harness/model-call-error.js +1 -1
  79. package/dist/src/harness/semantic-errors/rules/model-provider.js +1 -1
  80. package/dist/src/harness/session-limit-enforcement.d.ts +2 -15
  81. package/dist/src/harness/step-hooks.d.ts +2 -1
  82. package/dist/src/harness/step-hooks.js +1 -1
  83. package/dist/src/harness/tool-loop.js +2 -2
  84. package/dist/src/harness/types.d.ts +6 -4
  85. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  86. package/dist/src/instrumentation/background-task-runtime.d.ts +18 -0
  87. package/dist/src/instrumentation/background-task-runtime.js +1 -0
  88. package/dist/src/instrumentation/channel-delivery.js +1 -1
  89. package/dist/src/instrumentation/content.js +1 -1
  90. package/dist/src/instrumentation/dispatch.js +1 -1
  91. package/dist/src/instrumentation/lifecycle.d.ts +19 -2
  92. package/dist/src/instrumentation/lifecycle.js +1 -1
  93. package/dist/src/instrumentation/memory.d.ts +72 -0
  94. package/dist/src/instrumentation/memory.js +1 -0
  95. package/dist/src/instrumentation/native-events.d.ts +7 -0
  96. package/dist/src/instrumentation/native-events.js +1 -1
  97. package/dist/src/instrumentation/parent-lineage.d.ts +2 -2
  98. package/dist/src/instrumentation/parent-lineage.js +1 -1
  99. package/dist/src/instrumentation/prepare-trace-context.d.ts +3 -11
  100. package/dist/src/instrumentation/prepare-trace-context.js +1 -1
  101. package/dist/src/instrumentation/principal-summary.d.ts +11 -0
  102. package/dist/src/instrumentation/principal-summary.js +1 -0
  103. package/dist/src/instrumentation/provider.d.ts +1 -0
  104. package/dist/src/instrumentation/runtime.d.ts +11 -7
  105. package/dist/src/instrumentation/runtime.js +1 -1
  106. package/dist/src/instrumentation/session-context.d.ts +22 -0
  107. package/dist/src/instrumentation/session-context.js +1 -0
  108. package/dist/src/instrumentation/state.d.ts +7 -2
  109. package/dist/src/instrumentation/state.js +1 -1
  110. package/dist/src/internal/application/package.js +1 -1
  111. package/dist/src/internal/logging.js +1 -1
  112. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  113. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +4 -5
  114. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  115. package/dist/src/protocol/baggage.d.ts +15 -2
  116. package/dist/src/protocol/baggage.js +1 -1
  117. package/dist/src/public/instrumentation/index.d.ts +5 -4
  118. package/dist/src/runtime/agent/bootstrap.d.ts +2 -2
  119. package/dist/src/runtime/agent/bootstrap.js +1 -1
  120. package/dist/src/self-modification/agent.js +1 -1
  121. package/dist/src/self-modification/extension/instructions.js +21 -20
  122. package/dist/src/self-modification/extension/tools/edit_file.js +1 -1
  123. package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -1
  124. package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
  125. package/dist/src/setup/integrations/self-modification/setup.js +1 -1
  126. package/dist/src/setup/scaffold/create/project.js +1 -1
  127. package/dist/src/shared/action-types.d.ts +4 -0
  128. package/dist/src/shared/action-types.js +1 -1
  129. package/dist/src/shared/dispatch-action.d.ts +1 -1
  130. package/dist/src/shared/memory-state.js +1 -1
  131. package/dist/src/shared/serialized-observability-state.d.ts +12 -0
  132. package/dist/src/shared/serialized-observability-state.js +1 -0
  133. package/dist/src/subagents/callback-route.js +1 -1
  134. package/dist/src/subagents/callback-step.d.ts +0 -8
  135. package/dist/src/subagents/callback-step.js +1 -1
  136. package/dist/src/subagents/invocation.d.ts +9 -0
  137. package/dist/src/subagents/remote-dispatch.d.ts +3 -3
  138. package/dist/src/subagents/remote-dispatch.js +1 -1
  139. package/dist/src/subagents/start-local.d.ts +2 -6
  140. package/dist/src/subagents/start-local.js +1 -1
  141. package/dist/src/subagents/start-remote.d.ts +2 -8
  142. package/dist/src/subagents/start-remote.js +1 -1
  143. package/dist/src/subagents/tool.d.ts +3 -13
  144. package/dist/src/subagents/tool.js +1 -1
  145. package/dist/src/svelte/index.js +1 -1
  146. package/dist/src/svelte/use-eve-agent.js +1 -1
  147. package/dist/src/tasks/delivery-context.d.ts +12 -3
  148. package/dist/src/tasks/delivery-context.js +2 -2
  149. package/dist/src/tasks/session-index.d.ts +6 -3
  150. package/dist/src/tasks/session-index.js +1 -1
  151. package/dist/src/tasks/session-task-cohorts.d.ts +10 -2
  152. package/dist/src/tasks/session-task-cohorts.js +1 -1
  153. package/dist/src/tools/behavior.d.ts +1 -3
  154. package/dist/src/tools/framework/task-contract.d.ts +0 -4
  155. package/dist/src/tools/framework/task-contract.js +1 -1
  156. package/dist/src/tracing/agent-action-instrumentation.d.ts +3 -2
  157. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  158. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  159. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +1 -6
  160. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  161. package/dist/src/tracing/agent-invocation-coordinator.d.ts +28 -0
  162. package/dist/src/tracing/agent-invocation-coordinator.js +1 -0
  163. package/dist/src/tracing/agent-invocation-terminal.d.ts +18 -0
  164. package/dist/src/tracing/agent-invocation-terminal.js +1 -0
  165. package/dist/src/tracing/agent-memory-instrumentation.d.ts +13 -0
  166. package/dist/src/tracing/agent-memory-instrumentation.js +1 -0
  167. package/dist/src/tracing/agent-otel-attributes.d.ts +4 -0
  168. package/dist/src/tracing/agent-otel-attributes.js +1 -0
  169. package/dist/src/tracing/agent-otel-content.d.ts +4 -12
  170. package/dist/src/tracing/agent-otel-content.js +3 -3
  171. package/dist/src/tracing/agent-otel-provider.d.ts +4 -6
  172. package/dist/src/tracing/agent-otel-provider.js +2 -2
  173. package/dist/src/tracing/agent-otel-runtime-context.d.ts +9 -0
  174. package/dist/src/tracing/agent-otel-runtime-context.js +1 -1
  175. package/dist/src/tracing/agent-otel-session-context.d.ts +4 -3
  176. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  177. package/dist/src/tracing/agent-otel-usage.d.ts +4 -10
  178. package/dist/src/tracing/agent-otel-usage.js +1 -1
  179. package/dist/src/tracing/agent-span-contract.d.ts +26 -0
  180. package/dist/src/tracing/agent-span-contract.js +1 -0
  181. package/dist/src/tracing/agent-span-error.d.ts +3 -0
  182. package/dist/src/tracing/agent-span-error.js +1 -0
  183. package/dist/src/tracing/agent-span-id-generator.d.ts +3 -0
  184. package/dist/src/tracing/agent-span-id-generator.js +1 -1
  185. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  186. package/dist/src/tracing/agent-trace-context-codec.d.ts +12 -0
  187. package/dist/src/tracing/agent-trace-context-codec.js +1 -0
  188. package/dist/src/tracing/agent-trace-context-store.d.ts +35 -8
  189. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  190. package/dist/src/tracing/agent-trace-span-processor.d.ts +5 -7
  191. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  192. package/dist/src/tracing/agent-trace-state.d.ts +43 -3
  193. package/dist/src/tracing/agent-trace-state.js +1 -1
  194. package/dist/src/tracing/bounded-error.d.ts +1 -0
  195. package/dist/src/tracing/bounded-error.js +1 -0
  196. package/dist/src/tracing/content-attributes.js +1 -1
  197. package/dist/src/tracing/content-span-processor.js +1 -1
  198. package/dist/src/tracing/conversation-context.d.ts +4 -0
  199. package/dist/src/tracing/conversation-context.js +1 -0
  200. package/dist/src/tracing/error-content-context.d.ts +3 -0
  201. package/dist/src/tracing/error-content-context.js +1 -0
  202. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  203. package/dist/src/tracing/local-trace-reader.d.ts +6 -6
  204. package/dist/src/tracing/local-trace-reader.js +1 -1
  205. package/dist/src/tracing/local-traces.d.ts +6 -8
  206. package/dist/src/tracing/local-traces.js +1 -1
  207. package/dist/src/tracing/otel-declaration.d.ts +5 -3
  208. package/dist/src/tracing/otel-registration.d.ts +2 -1
  209. package/dist/src/tracing/otel-registration.js +1 -1
  210. package/dist/src/tracing/telemetry-budget.d.ts +4 -0
  211. package/dist/src/tracing/telemetry-budget.js +1 -0
  212. package/dist/src/vue/index.js +1 -1
  213. package/dist/src/vue/use-eve-agent.js +1 -1
  214. package/docs/concepts/built-in-tools.md +0 -20
  215. package/docs/concepts/sessions-runs-and-streaming.md +9 -1
  216. package/docs/guides/frontend/overview.mdx +1 -1
  217. package/docs/guides/instrumentation-providers.md +5 -0
  218. package/docs/guides/instrumentation.md +179 -23
  219. package/docs/guides/remote-agents.md +11 -0
  220. package/docs/reference/cli.md +16 -14
  221. package/docs/subagents/index.mdx +15 -10
  222. package/package.json +1 -6
  223. package/dist/src/execution/tasks/child/update-step.d.ts +0 -6
  224. package/dist/src/execution/tasks/child/update-step.js +0 -1
  225. package/dist/src/execution/tasks/child/update.d.ts +0 -8
  226. package/dist/src/execution/tasks/child/update.js +0 -1
  227. package/dist/src/public/tools/task-update.d.ts +0 -1
  228. package/dist/src/public/tools/task-update.js +0 -1
  229. package/dist/src/tools/framework/task-update.d.ts +0 -5
  230. package/dist/src/tools/framework/task-update.js +0 -1
@@ -1,2 +1,2 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{markAgentTraceContext}from"#tracing/agent-trace-context.js";import{attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{readGatewayCost,setAgentInvocationUsage,setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{instrumentationEventForTraceDecision}from"#instrumentation/content-policy.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{runtimeContextAttributes}from"#tracing/agent-otel-runtime-context.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";import{suppressTracing}from"#tracing/suppress-tracing.js";function createAgentOtelInstrumentation(e){let t=e.recordInputs??!1,n=e.recordOutputs??!1,r=new WeakMap,i=new Map,a=new WeakMap,o=new WeakMap,s=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),c=createAgentApprovalInstrumentation({actionContextFor:s.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),l=createAgentToolInstrumentation({actionContextFor:s.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveFallback:e=>{let t=i.get(e.scope.attemptId)??e.scope,n=a.get(t);return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:u,prepareSessionTrace:d,prepareTurnTrace:f}=createAgentOtelSessionContext(e),projectEvent=async r=>{let i=await e.stateStore.getSession(sessionIdForEvent(r)),a=audienceForEvent(r,i?.channelAudience),o=`traceSeed`in r?r.traceSeed:void 0,s=contextStorage.getStore()?.get(SessionTraceSeedKey),c=resolveForwardedTraceSeed(s),l=resolveForwardedTraceSeed(o,c?.forwardedTracePolicy),u=l?.decision??c?.decision??readInstrumentationDecision(i?.decision)??(o===void 0?s===void 0?i===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(i.context),a):resolveTracePolicyDecision(isSampledTrace(s),a):resolveTracePolicyDecision(isSampledTrace(o),a));if(u===void 0)return withoutInstrumentationContent(r);let d=l===void 0||!(`traceSeed`in r)||r.traceSeed===void 0?r:{...r,traceSeed:{...r.traceSeed,decision:l.decision,traceFlags:l.traceFlags}};return instrumentationEventForTraceDecision(d,applyLiveDeliveryAudienceCeiling(u.action===`drop`?u:{action:`record`,recordInputs:t&&u.recordInputs,recordOutputs:n&&u.recordOutputs},a,l?.forwardedTracePolicy??c?.forwardedTracePolicy),a,{applyAudienceCeiling:!1})},onSessionStarted=async e=>{await d(e)},onTurnStarted=async e=>{await f(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let r=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),o=trace.getSpan(context.active())?.spanContext(),s=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...agentSpanNamingAttributes(`agent.step`),...runtimeContextAttributes(t.runtimeContext)},links:o===void 0||o.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},r));s.addEvent(`step.started`);let c=trace.setSpan(r,s);a.set(t.scope,{context:c,span:s}),i.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=i.get(e.scope.attemptId)??e.scope;r.delete(t),drainOpenSpans({...e,scope:t}),l.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await s.failForAttempt(t,e.error),i.delete(e.scope.attemptId);let n=a.get(t);n!==void 0&&(n.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&recordError(n.span,e.error),n.span.end(),a.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await s.deleteForTurn(t.sessionId,t.turnId),await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}}))},onSessionTransition=async t=>{if(t.type===`session.failed`&&t.turnId!==void 0&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:e.terminal??{error:t.error,type:`turn.failed`}})),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);if(isSampledTrace(n.context)){let i=r?.agentName??n.subagentName,a=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(agentSpanName(i),{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":i,"agent.session.id":t.sessionId,"agent.subagent.name":n.subagentName,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence,"gen_ai.agent.name":i,"gen_ai.conversation.id":t.sessionId,"gen_ai.operation.name":`invoke_agent`,...agentSpanNamingAttributes(agentSpanName(i),`invoke_agent`)},kind:SpanKind.INTERNAL,startTime:n.startTimeMs},withChannelAudience(contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId}),r?.channelAudience)));setAgentInvocationUsage(a,n.modelUsage),a.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(a.setAttribute(`agent.turn.outcome`,n.terminal.type===`turn.completed`?`completed`:n.terminal.type===`turn.cancelled`?`cancelled`:`failed`),a.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(a,n.terminal.error)),a.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await s.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let r=a.get(n.scope);if(r===void 0)return;r.span.setAttribute(`agent.model.id`,n.model.modelId),r.span.setAttribute(`agent.model.provider`,n.model.provider);let i=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,...agentSpanNamingAttributes(modelSpanName(n.model.modelId),`chat`),...runtimeContextAttributes(n.runtimeContext)}},r.context);if(t&&n.input!==void 0){let e=messagesContentAttribute(n.input.messages);e!==void 0&&i.setAttribute(`ai.prompt.messages`,e);let t=genAiInputMessagesAttribute(n.input.messages);t!==void 0&&i.setAttribute(`gen_ai.input.messages`,t);let r=systemPromptAttribute(n.input.instructions);r!==void 0&&i.setAttribute(`ai.prompt.system`,r);let a=genAiSystemInstructionsAttribute(n.input.instructions);a!==void 0&&i.setAttribute(`gen_ai.system_instructions`,a)}let s={context:trace.setSpan(r.context,i),span:i};getExecutionContexts(n.scope).set(n.idempotencyKey,s.context),getSpanStates(o,n.scope).set(n.idempotencyKey,s)},onModelCallTerminal=async e=>{r.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(o,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{await recordTurnUsage(e),setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let r=a.get(e.scope);if(r!==void 0&&setAgentUsage(r.span,e.usage),n){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let 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 a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=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(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},recordTurnUsage=async t=>{(t.usage.inputTokens!==void 0||t.usage.outputTokens!==void 0)&&await e.stateStore.updateTurn(t.scope.sessionId,t.scope.turnId,e=>({...e,modelUsage:{inputTokens:t.usage.inputTokens===void 0?e.modelUsage?.inputTokens:(e.modelUsage?.inputTokens??0)+t.usage.inputTokens,outputTokens:t.usage.outputTokens===void 0?e.modelUsage?.outputTokens:(e.modelUsage?.outputTokens??0)+t.usage.outputTokens}}))},p=createAgentChannelDeliveryInstrumentation({ensureSessionContext:u,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=a.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.span.setAttribute(e,r)};return{hook:{events:{...p,"action.completed":s.events[`action.completed`],"action.failed":s.events[`action.failed`],async"action.started"(e,t){await s.events[`action.started`](e,t),await l.actionStarted(e)},...c,"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,...l.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent,tracePolicy:()=>({emit:!0,recordInputs:t,recordOutputs:n})},prepareSessionTrace:d,prepareTurnTrace:f,async runInContext(t,n){let a=i.get(t.scope.attemptId)??t.scope,o=r.get(a),s=t.type===`model.call`?o?.get(t.idempotencyKey):l.contextFor(t.scope.attemptId,t.idempotencyKey);if(s===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(s=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(s=suppressTracing(s)))}return s===void 0?n():context.with(markAgentTraceContext(s),n)}};function getExecutionContexts(e){let t=r.get(e);return t===void 0&&(t=new Map,r.set(e,t)),t}function drainOpenSpans(e){for(let t of o.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();o.delete(e.scope)}}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(e,t){return`delivery`in e?normalizeChannelAudience(e.delivery.channelAudience):`scope`in e&&e.scope.channelAudience!==void 0?normalizeChannelAudience(e.scope.channelAudience):e.type===`session.started`?normalizeChannelAudience(e.channelAudience):normalizeChannelAudience(t)}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 contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function modelSpanName(e){return`chat ${e}`}function agentSpanName(e){return e===void 0?`invoke_agent`:`invoke_agent ${e}`}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{AGENT_SPAN_NAMES,agentInvocationSpanName}from"#tracing/agent-span-contract.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,context,trace}from"#compiled/@opentelemetry/api/index.js";import{markAgentTraceContext}from"#tracing/agent-trace-context.js";import{attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{withErrorContent}from"#tracing/error-content-context.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{agentTraceIdentityAttributes}from"#tracing/agent-otel-attributes.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{readGatewayCost,setAgentInvocationUsage,setAgentUsage,setGenAiUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{recordAgentSpanError}from"#tracing/agent-span-error.js";import{suppressTracing}from"#tracing/suppress-tracing.js";import{instrumentationEventForTraceDecision}from"#instrumentation/content-policy.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*as runtimeAttributes from"#tracing/agent-otel-runtime-context.js";import{createAgentMemoryInstrumentation}from"#tracing/agent-memory-instrumentation.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";function createAgentOtelInstrumentation(e){let t=e.recordInputs??!1,n=e.recordOutputs??!1,r=new WeakMap,i=new Map,a=new WeakMap,o=new WeakMap,s=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),c=createAgentApprovalInstrumentation({actionContextFor:s.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),l=createAgentToolInstrumentation({actionContextFor:s.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveFallback:e=>{let t=i.get(e.scope.attemptId)??e.scope,n=a.get(t);return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),u=createAgentMemoryInstrumentation({recordOutputs:n,stateStore:e.stateStore,tracer:e.tracer}),{ensureSessionContext:d,prepareSessionTrace:f,prepareTurnTrace:p}=createAgentOtelSessionContext(e),projectEvent=async r=>{let i=await e.stateStore.getSession(sessionIdForEvent(r)),a=audienceForEvent(r,i?.channelAudience),o=`traceSeed`in r?r.traceSeed:void 0,s=contextStorage.getStore()?.get(SessionTraceSeedKey),c=resolveForwardedTraceSeed(s),l=resolveForwardedTraceSeed(o,c?.forwardedTracePolicy),u=l?.decision??c?.decision??readInstrumentationDecision(i?.decision)??(o===void 0?s===void 0?i===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(i.context),a):resolveTracePolicyDecision(isSampledTrace(s),a):resolveTracePolicyDecision(isSampledTrace(o),a));if(u===void 0)return withoutInstrumentationContent(r);let d=l===void 0||!(`traceSeed`in r)||r.traceSeed===void 0?r:{...r,traceSeed:{...r.traceSeed,decision:l.decision,traceFlags:l.traceFlags}};return instrumentationEventForTraceDecision(d,applyLiveDeliveryAudienceCeiling(u.action===`drop`?u:{action:`record`,recordInputs:t&&u.recordInputs,recordOutputs:n&&u.recordOutputs},a,l?.forwardedTracePolicy??c?.forwardedTracePolicy),a,{applyAudienceCeiling:!1})},onSessionStarted=async e=>{await f(e)},onTurnStarted=async e=>{await p(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let r=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),o=trace.getSpan(context.active())?.spanContext(),s=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(AGENT_SPAN_NAMES.step,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...agentSpanNamingAttributes(`agent.step`),...agentTraceIdentityAttributes({rootSessionId:t.scope.rootSessionId??t.scope.sessionId,sessionId:t.scope.sessionId}),...runtimeAttributes.runtimeContextAttributes(t.runtimeContext)},links:o===void 0||o.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},r));s.addEvent(`step.started`);let c=trace.setSpan(r,s);a.set(t.scope,{context:c,span:s}),i.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=i.get(e.scope.attemptId)??e.scope;r.delete(t),drainOpenSpans({...e,scope:t}),l.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await s.failForAttempt(t,e.error),i.delete(e.scope.attemptId);let n=a.get(t);n!==void 0&&(n.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&recordAgentSpanError(n.span,e.error),n.span.end(),a.delete(t))},onTurnTerminal=async t=>{await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}}))},onSessionTransition=async t=>{if(await s.flushForSessionTransition(t),t.type===`session.failed`&&t.turnId!==void 0&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:e.terminal??{error:t.error,type:`turn.failed`}})),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);if(isSampledTrace(n.context)){let i=r?.agentName??n.subagentName,a=withChannelAudience(ROOT_CONTEXT,r?.channelAudience),startSpan=()=>e.tracer.startSpan(agentInvocationSpanName(i),{attributes:runtimeAttributes.agentActivationAttributes({agentName:i,frameworkVersion:e.frameworkVersion,sessionId:t.sessionId,turnId:t.turnId,turn:n}),kind:SpanKind.INTERNAL,links:agentActivationLinks(n),root:!0,startTime:n.startTimeMs},a),o=e.idGenerator.withSpanId(n.context.spanId,()=>e.idGenerator.withTraceId(n.context.traceId,startSpan));setAgentInvocationUsage(o,n.modelUsage),o.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(o.setAttribute(`agent.turn.outcome`,n.terminal.type===`turn.completed`?`completed`:n.terminal.type===`turn.cancelled`?`cancelled`:`failed`),o.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordAgentSpanError(o,n.terminal.error)),o.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await s.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let r=a.get(n.scope);if(r===void 0)return;r.span.setAttribute(`agent.model.id`,n.model.modelId),r.span.setAttribute(`agent.model.provider`,n.model.provider);let i=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,...agentSpanNamingAttributes(modelSpanName(n.model.modelId),`chat`),...agentTraceIdentityAttributes({rootSessionId:n.scope.rootSessionId??n.scope.sessionId,sessionId:n.scope.sessionId}),...runtimeAttributes.runtimeContextAttributes(n.runtimeContext)},kind:SpanKind.CLIENT},r.context);if(t&&n.input!==void 0){let e=genAiInputMessagesAttribute(n.input.messages);e!==void 0&&i.setAttribute(`gen_ai.input.messages`,e);let t=systemPromptAttribute(n.input.instructions);t!==void 0&&i.setAttribute(`ai.prompt.system`,t);let r=genAiSystemInstructionsAttribute(n.input.instructions);r!==void 0&&i.setAttribute(`gen_ai.system_instructions`,r)}let s={context:trace.setSpan(r.context,i),span:i};getExecutionContexts(n.scope).set(n.idempotencyKey,s.context),getSpanStates(o,n.scope).set(n.idempotencyKey,s)},onModelCallTerminal=async e=>{r.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(o,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordAgentSpanError(t.span,e.error);else{await recordTurnUsage(e),setGenAiUsage(t.span,e.usage),e.responseId!==void 0&&t.span.setAttribute(`gen_ai.response.id`,e.responseId),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let r=a.get(e.scope);if(r!==void 0&&setAgentUsage(r.span,e.usage),n){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let 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 a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=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(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},recordTurnUsage=async t=>{(t.usage.inputTokens!==void 0||t.usage.outputTokens!==void 0)&&await e.stateStore.updateTurn(t.scope.sessionId,t.scope.turnId,e=>({...e,modelUsage:{inputTokens:t.usage.inputTokens===void 0?e.modelUsage?.inputTokens:(e.modelUsage?.inputTokens??0)+t.usage.inputTokens,outputTokens:t.usage.outputTokens===void 0?e.modelUsage?.outputTokens:(e.modelUsage?.outputTokens??0)+t.usage.outputTokens}}))},m=createAgentChannelDeliveryInstrumentation({ensureSessionContext:d,recordInputs:t,stateStore:e.stateStore}),onStepMetadata=e=>{let t=a.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.span.setAttribute(e,r)};return{hook:{flush:s.flushSettledInvocations,events:{...m,"action.completed":s.events[`action.completed`],"action.failed":s.events[`action.failed`],async"action.started"(e,t){await s.events[`action.started`](e,t),await l.actionStarted(e)},...c,...u.events,"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,...l.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent,tracePolicy:()=>({emit:!0,recordInputs:t,recordOutputs:n})},prepareSessionTrace:f,prepareTurnTrace:p,async runInContext(t,a){if(t.type===`memory.operation`)return u.runInContext(t,a);let o=i.get(t.scope.attemptId)??t.scope,s=r.get(o),c=t.type===`model.call`?s?.get(t.idempotencyKey):l.contextFor(t.scope.attemptId,t.idempotencyKey);if(c===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(c=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(c=suppressTracing(c)))}let d=await e.stateStore.getSession(t.scope.sessionId),f=resolveForwardedTraceSeed(contextStorage.getStore()?.get(SessionTraceSeedKey)),p=f?.decision??d?.decision,m=p===void 0?void 0:applyLiveDeliveryAudienceCeiling(p,normalizeChannelAudience(t.scope.channelAudience),f?.forwardedTracePolicy);return c===void 0?a():context.with(markAgentTraceContext(withErrorContent(c,n&&m?.action===`record`&&m.recordOutputs)),a)}};function getExecutionContexts(e){let t=r.get(e);return t===void 0&&(t=new Map,r.set(e,t)),t}function drainOpenSpans(e){for(let t of o.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordAgentSpanError(t.span,e.error),t.span.end();o.delete(e.scope)}}function agentActivationLinks(e){let t=[];return e.caller!==void 0&&t.push({context:e.caller,attributes:{"eve.link.type":`agent.dispatch`}}),e.channelDelivery?.requestTraceContext!==void 0&&t.push({context:e.channelDelivery.requestTraceContext,attributes:{"eve.link.type":`channel.request`}}),t.length===0?void 0:t}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(e,t){return`delivery`in e?normalizeChannelAudience(e.delivery.channelAudience):`scope`in e&&e.scope.channelAudience!==void 0?normalizeChannelAudience(e.scope.channelAudience):e.type===`session.started`?normalizeChannelAudience(e.channelAudience):normalizeChannelAudience(t)}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 contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function modelSpanName(e){return`chat ${e}`}function errorText(e){return e instanceof Error?e.message:e}export{createAgentOtelInstrumentation};
@@ -1,5 +1,14 @@
1
+ import type { AgentTurnTraceState } from "#tracing/agent-trace-state.js";
1
2
  type SpanAttributePrimitive = string | number | boolean;
2
3
  type SpanAttributeValue = SpanAttributePrimitive | SpanAttributePrimitive[];
4
+ export declare function agentActivationAttributes(input: {
5
+ readonly agentName?: string;
6
+ readonly frameworkVersion: string;
7
+ readonly sessionId: string;
8
+ readonly turnId: string;
9
+ readonly turn: AgentTurnTraceState;
10
+ }): Record<string, string | number | boolean | undefined>;
11
+ export declare function agentPrincipalAttributes(turn: AgentTurnTraceState): Record<string, string>;
3
12
  /** Flattens merged runtime context into AI SDK-compatible span attributes. */
4
13
  export declare function runtimeContextAttributes(runtimeContext: Readonly<Record<string, unknown>> | undefined): Record<string, SpanAttributeValue>;
5
14
  export {};
@@ -1 +1 @@
1
- function runtimeContextAttributes(e){let t={};if(e===void 0)return t;for(let[n,r]of Object.entries(e))flattenContextAttribute(t,`ai.settings.context.${n}`,r);return t}function flattenContextAttribute(e,t,n){if(n!=null){if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`){e[t]=n;return}if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`);if(r.length!==n.length||new Set(r.map(e=>typeof e)).size!==1)return;e[t]=r;return}if(typeof n==`object`)for(let[r,i]of Object.entries(n))flattenContextAttribute(e,`${t}.${r}`,i)}}export{runtimeContextAttributes};
1
+ import{agentInvocationSpanName}from"#tracing/agent-span-contract.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{agentTraceIdentityAttributes}from"#tracing/agent-otel-attributes.js";function agentActivationAttributes(e){return{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":e.agentName,...agentPrincipalAttributes(e.turn),"agent.channel.delivery.id":e.turn.channelDelivery?.deliveryId,"agent.channel.delivery.input":e.turn.channelDelivery?.inputAttribute,"agent.channel.kind":e.turn.channelDelivery?.channelKind,"agent.channel.name":e.turn.channelDelivery?.channelName,"agent.channel.request.id":e.turn.channelDelivery?.requestId,"agent.subagent.name":e.turn.subagentName,"agent.turn.id":e.turnId,"agent.turn.sequence":e.turn.sequence,"gen_ai.agent.name":e.agentName,"gen_ai.operation.name":`invoke_agent`,...agentSpanNamingAttributes(agentInvocationSpanName(e.agentName),`invoke_agent`),...agentTraceIdentityAttributes({rootSessionId:e.turn.rootSessionId,sessionId:e.sessionId})}}function agentPrincipalAttributes(e){let t={};return setOptionalAttribute(t,`agent.principal.current.id`,e.currentPrincipal?.id),setOptionalAttribute(t,`agent.principal.current.type`,e.currentPrincipal?.type),setOptionalAttribute(t,`agent.principal.initiator.id`,e.initiatorPrincipal?.id),setOptionalAttribute(t,`agent.principal.initiator.type`,e.initiatorPrincipal?.type),t}function runtimeContextAttributes(e){let t={};if(e===void 0)return t;for(let[n,r]of Object.entries(e))flattenContextAttribute(t,`ai.settings.context.${n}`,r);return t}function flattenContextAttribute(e,t,n){if(n!=null){if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`){e[t]=n;return}if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`);if(r.length!==n.length||new Set(r.map(e=>typeof e)).size!==1)return;e[t]=r;return}if(typeof n==`object`)for(let[r,i]of Object.entries(n))flattenContextAttribute(e,`${t}.${r}`,i)}}function setOptionalAttribute(e,t,n){n!==void 0&&(e[t]=n)}export{agentActivationAttributes,agentPrincipalAttributes,runtimeContextAttributes};
@@ -1,17 +1,18 @@
1
- import type { Tracer } from "#compiled/@opentelemetry/api/index.js";
2
1
  import { type InstrumentationSessionStartedEvent, type InstrumentationTraceSeed, type InstrumentationTurnStartedEvent } from "#instrumentation/lifecycle.js";
3
2
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
3
  import type { TraceCapturePolicy } from "#tracing/otel-declaration.js";
5
4
  import type { AgentSessionTraceState, AgentTraceStateStore } from "#tracing/agent-trace-state.js";
5
+ import { type AgentSamplingOperation } from "#tracing/agent-span-contract.js";
6
6
  interface AgentOtelSessionContextInput {
7
7
  readonly frameworkVersion: string;
8
8
  readonly idGenerator: AgentSpanIdGenerator;
9
+ readonly samplesTrace?: (traceId: string, operation?: AgentSamplingOperation) => boolean;
9
10
  readonly stateStore: AgentTraceStateStore;
10
- readonly tracer: Tracer;
11
11
  readonly tracePolicy?: TraceCapturePolicy;
12
12
  }
13
+ type SessionMetadata = Omit<InstrumentationSessionStartedEvent, "idempotencyKey" | "type">;
13
14
  interface AgentOtelSessionContext {
14
- readonly ensureSessionContext: (event: InstrumentationSessionStartedEvent) => Promise<AgentSessionTraceState>;
15
+ readonly ensureSessionContext: (event: SessionMetadata) => Promise<AgentSessionTraceState>;
15
16
  readonly prepareSessionTrace: (event: InstrumentationSessionStartedEvent) => Promise<InstrumentationTraceSeed>;
16
17
  readonly prepareTurnTrace: (event: InstrumentationTurnStartedEvent) => Promise<InstrumentationTraceSeed>;
17
18
  }
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{sessionIdempotencyKey}from"#instrumentation/lifecycle.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";function createAgentOtelSessionContext(e){let openSessionTrace=t=>{if(t.traceSeed!==void 0){if(t.traceDecision.action===`drop`||!isSampledTrace(t.traceSeed))return{isRemote:!1,spanId:t.traceSeed.spanId,traceFlags:0,traceId:t.traceSeed.traceId};let startSpan=()=>e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3,...agentSpanNamingAttributes(`agent.session`)},root:!0}),n=e.idGenerator.withSpanId(t.traceSeed.spanId,()=>e.idGenerator.withTraceId(t.traceSeed.traceId,startSpan));return n.addEvent(`session.started`),n.end(),n.spanContext()}if(t.traceDecision.action===`drop`)return{isRemote:!1,spanId:e.idGenerator.deriveSpanId(`session:${t.sessionId}`),traceFlags:0,traceId:e.idGenerator.generateTraceId()};let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3,...agentSpanNamingAttributes(`agent.session`)},root:!0});return n.addEvent(`session.started`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);if(n===void 0){let r=normalizeChannelAudience(t.channelAudience),i=resolveSessionTraceDecision(t,r,e.tracePolicy);n={agentName:t.agentName,channelAudience:r,channelKind:t.channelKind,decision:i,context:t.parentTraceContext===void 0?openSessionTrace({agentName:t.agentName,channelAudience:r,channelType:t.channelType,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceDecision:i,traceSeed:t.traceSeed}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId},await e.stateStore.setSession(t.sessionId,n)}return n};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0)return{decision:(await e.stateStore.getSession(t.sessionId))?.decision,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId};let r=await ensureSessionContext({agentName:t.agentName,channelAudience:`unknown`,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`}),i={isRemote:!1,spanId:e.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:r.context.traceFlags,traceId:r.context.traceId};return await e.stateStore.setTurn(t.sessionId,t.turnId,{context:i,parentIsRemote:r.context.isRemote,parentSpanId:r.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now(),subagentName:t.parentLineage?.subagentName}),portableSpanContext(r.context,r.decision)}}}function portableSpanContext(e,t){return{decision:t,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}}function resolveSessionTraceDecision(e,t,n){return e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?n===void 0?resolveTracePolicyDecision(!0,t):{action:`drop`}:resolveTracePolicy(n,{agentName:e.agentName,audience:t,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),t):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),t):readInstrumentationDecision(e.traceSeed.decision)??{action:`drop`}}export{createAgentOtelSessionContext};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{agentInvocationSpanName}from"#tracing/agent-span-contract.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import"#instrumentation/lifecycle.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{applyPrincipalTraceDecision}from"#instrumentation/principal-summary.js";import{agentActivationAttributes}from"#tracing/agent-otel-runtime-context.js";function createAgentOtelSessionContext(e){let ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);if(n===void 0){let r=normalizeChannelAudience(t.channelAudience),i=resolveSessionTraceDecision(t,r,e.tracePolicy);n={agentName:t.agentName,channelAudience:r,channelKind:t.channelKind,decision:i,context:initialSessionContext(e,t,i),rootSessionId:t.rootSessionId,parentLineage:t.parentLineage},await e.stateStore.setSession(t.sessionId,n)}return n};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId);return portableSpanContext(n.context,r?.decision)}let r=await ensureSessionContext(t),i=t.sequence===0,a=i?t.parentTraceContext:void 0,o=i?{...r.context,isRemote:!1}:freshTurnContext(e,t.idempotencyKey,r.decision),s={caller:a===void 0?void 0:adoptedSpanContext(a),context:o,currentPrincipal:applyPrincipalTraceDecision(t.currentPrincipal,r.decision),initiatorPrincipal:applyPrincipalTraceDecision(t.initiatorPrincipal,r.decision),parentLineage:t.parentLineage??r.parentLineage,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now(),subagentName:(t.parentLineage??r.parentLineage)?.subagentName};if(isSampledTrace(s.context)){let n=r.agentName??s.subagentName,i=e.samplesTrace?.(s.context.traceId,{name:agentInvocationSpanName(n),attributes:agentActivationAttributes({agentName:n,frameworkVersion:e.frameworkVersion,sessionId:t.sessionId,turnId:t.turnId,turn:s})})??!0;o={...o,traceFlags:+!!i}}return await e.stateStore.setTurn(t.sessionId,t.turnId,{...s,context:o}),portableSpanContext(o,r.decision)}}}function portableSpanContext(e,t){return{decision:t,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}}function initialSessionContext(e,t,n){let r=t.traceSeed;if(r!==void 0)return{...adoptedSpanContext(r),traceFlags:n.action===`drop`?0:r.traceFlags};let i=e.idGenerator.deriveTraceId(`session:${t.sessionId}`),a=n.action===`record`;return{isRemote:!1,spanId:e.idGenerator.deriveSpanId(`session:${t.sessionId}`),traceFlags:+!!a,traceId:i}}function freshTurnContext(e,t,n){let r=e.idGenerator.deriveTraceId(`turn:${t}`),i=n?.action===`record`;return{isRemote:!1,spanId:e.idGenerator.deriveSpanId(`turn:${t}`),traceFlags:+!!i,traceId:r}}function resolveSessionTraceDecision(e,t,n){return e.parentTraceContext!==void 0&&!isSampledTrace(e.parentTraceContext)?{action:`drop`}:e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?n===void 0?resolveTracePolicyDecision(!0,t):{action:`drop`}:resolveTracePolicy(n,{agentName:e.agentName,audience:t,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),t):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),t):readInstrumentationDecision(e.traceSeed.decision)??{action:`drop`}}export{createAgentOtelSessionContext};
@@ -2,15 +2,9 @@ import type { Span } from "#compiled/@opentelemetry/api/index.js";
2
2
  import type { InstrumentationUsage } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentTurnTraceState } from "#tracing/agent-trace-state.js";
4
4
  /** Applies eve's structural token usage attributes to an agent span. */
5
- export declare function setAgentUsage(span: Span, usage: InstrumentationUsage, options?: {
6
- readonly includeGenAiDetails?: boolean;
7
- }): void;
5
+ export declare function setAgentUsage(span: Span, usage: InstrumentationUsage): void;
6
+ /** Applies standard GenAI token usage while retaining eve's compatibility attributes. */
7
+ export declare function setGenAiUsage(span: Span, usage: InstrumentationUsage): void;
8
8
  export declare function setAgentInvocationUsage(span: Span, modelUsage: AgentTurnTraceState["modelUsage"]): void;
9
- /**
10
- * Extracts cost data from a step result's provider metadata. Only Vercel AI
11
- * Gateway reports it (`providerMetadata.gateway`): raw inference cost, the
12
- * gateway's surcharged total, the input/output split, and the generation id
13
- * for dashboard reconciliation. Values arrive as USD strings; anything
14
- * missing or non-numeric is skipped, so non-gateway providers get nothing.
15
- */
9
+ /** Projects Vercel AI Gateway cost metadata onto GenAI span attributes. */
16
10
  export declare function readGatewayCost(providerMetadata: Readonly<Record<string, unknown>>): Record<string, string | number> | undefined;
@@ -1 +1 @@
1
- function setAgentUsage(e,t,n={}){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let r=t.inputTokenDetails;r?.cacheReadTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_read_tokens`,r.cacheReadTokens):e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,r.cacheReadTokens)),r?.cacheWriteTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_write_tokens`,r.cacheWriteTokens):e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,r.cacheWriteTokens))}function setAgentInvocationUsage(e,t){t!==void 0&&(t.inputTokens!==void 0&&e.setAttribute(`gen_ai.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`gen_ai.usage.output_tokens`,t.outputTokens))}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)}export{readGatewayCost,setAgentInvocationUsage,setAgentUsage};
1
+ import{AGENT_USAGE_ATTRIBUTES}from"#tracing/agent-span-contract.js";function setAgentUsage(e,t){t.inputTokens!==void 0&&e.setAttribute(AGENT_USAGE_ATTRIBUTES.inputTokens,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(AGENT_USAGE_ATTRIBUTES.outputTokens,t.outputTokens);let n=t.inputTokenDetails;n?.cacheReadTokens!==void 0&&e.setAttribute(AGENT_USAGE_ATTRIBUTES.cacheReadTokens,n.cacheReadTokens),n?.cacheWriteTokens!==void 0&&e.setAttribute(AGENT_USAGE_ATTRIBUTES.cacheWriteTokens,n.cacheWriteTokens)}function setGenAiUsage(e,t){setAgentUsage(e,t),t.inputTokens!==void 0&&e.setAttribute(`gen_ai.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`gen_ai.usage.output_tokens`,t.outputTokens);let n=t.inputTokenDetails;n?.cacheReadTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,n.cacheReadTokens),n?.cacheWriteTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,n.cacheWriteTokens)}function setAgentInvocationUsage(e,t){t!==void 0&&setGenAiUsage(e,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)}export{readGatewayCost,setAgentInvocationUsage,setAgentUsage,setGenAiUsage};
@@ -0,0 +1,26 @@
1
+ export declare const AGENT_TRACE_SCHEMA_VERSION = 4;
2
+ export declare const AGENT_SPAN_NAMES: {
3
+ readonly action: "agent.action";
4
+ readonly approval: "agent.approval";
5
+ readonly channelRequest: "agent.channel.request";
6
+ readonly step: "agent.step";
7
+ };
8
+ export declare const AGENT_USAGE_ATTRIBUTES: {
9
+ readonly inputTokens: "agent.usage.input_tokens";
10
+ readonly outputTokens: "agent.usage.output_tokens";
11
+ readonly cacheReadTokens: "agent.usage.cache_read_tokens";
12
+ readonly cacheWriteTokens: "agent.usage.cache_write_tokens";
13
+ };
14
+ export declare function agentInvocationSpanName(agentName: string | undefined): string;
15
+ export declare function workflowInvocationSpanName(workflowName: string): string;
16
+ export interface AgentSamplingOperation {
17
+ readonly name: string;
18
+ readonly attributes?: Readonly<Record<string, string | number | boolean | undefined>>;
19
+ }
20
+ interface AgentSpanRecord {
21
+ readonly name: string;
22
+ readonly attributes: Readonly<Record<string, unknown>>;
23
+ }
24
+ export declare function isAgentActivationSpan(span: AgentSpanRecord): boolean;
25
+ export declare function agentTurnIdentity(span: AgentSpanRecord): string | undefined;
26
+ export {};
@@ -0,0 +1 @@
1
+ const AGENT_TRACE_SCHEMA_VERSION=4,AGENT_SPAN_NAMES={action:`agent.action`,approval:`agent.approval`,channelRequest:`agent.channel.request`,step:`agent.step`},AGENT_USAGE_ATTRIBUTES={inputTokens:`agent.usage.input_tokens`,outputTokens:`agent.usage.output_tokens`,cacheReadTokens:`agent.usage.cache_read_tokens`,cacheWriteTokens:`agent.usage.cache_write_tokens`};function agentInvocationSpanName(e){return e===void 0?`invoke_agent`:`invoke_agent ${e}`}function workflowInvocationSpanName(e){return`invoke_workflow ${e}`}function isAgentActivationSpan(e){return e.name===`agent.turn`||e.attributes[`gen_ai.operation.name`]===`invoke_agent`&&e.attributes[`agent.invocation.role`]!==`caller`&&typeof e.attributes[`agent.turn.id`]==`string`}function agentTurnIdentity(e){let t=e.attributes[`gen_ai.conversation.id`],n=e.attributes[`agent.turn.id`];return typeof n==`string`?`${typeof t==`string`?t:``}\0${n}`:void 0}export{AGENT_SPAN_NAMES,AGENT_TRACE_SCHEMA_VERSION,AGENT_USAGE_ATTRIBUTES,agentInvocationSpanName,agentTurnIdentity,isAgentActivationSpan,workflowInvocationSpanName};
@@ -0,0 +1,3 @@
1
+ import { type Span } from "#compiled/@opentelemetry/api/index.js";
2
+ /** Call with policy-projected errors; undefined retains failure status without content. */
3
+ export declare function recordAgentSpanError(span: Span, error: unknown, errorType?: string): void;
@@ -0,0 +1 @@
1
+ import{SpanStatusCode}from"#compiled/@opentelemetry/api/index.js";import{truncateTelemetryText}from"#tracing/telemetry-budget.js";import{boundedTraceError}from"#tracing/bounded-error.js";function recordAgentSpanError(e,t,n){if(e.setAttribute(`error.type`,truncateTelemetryText(n??(t instanceof Error?t.name||`Error`:`_OTHER`),128)),t instanceof Error){let n=boundedTraceError(t);e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})}else e.setStatus({code:SpanStatusCode.ERROR})}export{recordAgentSpanError};
@@ -10,9 +10,12 @@ export declare class AgentSpanIdGenerator {
10
10
  allocateSpanId(): string;
11
11
  /** Derives one span id for a replay-stable instrumentation event. */
12
12
  deriveSpanId(key: string): string;
13
+ deriveTraceId(key: string): string;
13
14
  generateSpanId(): string;
14
15
  generateTraceId(): string;
15
16
  /** Runs `startSpan` so the next span started carries `spanId`. */
16
17
  withSpanId<T>(spanId: string, startSpan: () => T): T;
17
18
  withTraceId<T>(traceId: string, startSpan: () => T): T;
18
19
  }
20
+ export declare function deriveAgentSpanId(key: string): string;
21
+ export declare function deriveAgentActionSpanId(sessionId: string, turnId: string, callId: string): string;
@@ -1 +1 @@
1
- import{createHash}from"node:crypto";var AgentSpanIdGenerator=class{#e;#t;allocateSpanId(){return randomHexId(16)}deriveSpanId(e){let t=createHash(`sha256`).update(e).digest(`hex`).slice(0,16);return/^0+$/u.test(t)?`0000000000000001`:t}generateSpanId(){let e=this.#e;return e===void 0?randomHexId(16):(this.#e=void 0,e)}generateTraceId(){let e=this.#t;return e===void 0?randomHexId(32):(this.#t=void 0,e)}withSpanId(e,t){this.#e=e;try{return t()}finally{this.#e=void 0}}withTraceId(e,t){this.#t=e;try{return t()}finally{this.#t=void 0}}};function randomHexId(e){let t;do{t=``;for(let n=0;n<e;n+=1)t+=`0123456789abcdef`[Math.trunc(Math.random()*16)]}while(!/[1-9a-f]/u.test(t));return t}export{AgentSpanIdGenerator};
1
+ import{createHash}from"node:crypto";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";var AgentSpanIdGenerator=class{#e;#t;allocateSpanId(){return randomHexId(16)}deriveSpanId(e){return deriveAgentSpanId(e)}deriveTraceId(e){let t=createHash(`sha256`).update(e).digest(`hex`).slice(0,32);return/^0+$/u.test(t)?`00000000000000000000000000000001`:t}generateSpanId(){let e=this.#e;return e===void 0?randomHexId(16):(this.#e=void 0,e)}generateTraceId(){let e=this.#t;return e===void 0?randomHexId(32):(this.#t=void 0,e)}withSpanId(e,t){this.#e=e;try{return t()}finally{this.#e=void 0}}withTraceId(e,t){this.#t=e;try{return t()}finally{this.#t=void 0}}};function deriveAgentSpanId(e){let t=createHash(`sha256`).update(e).digest(`hex`).slice(0,16);return/^0+$/u.test(t)?`0000000000000001`:t}function deriveAgentActionSpanId(e,t,n){return deriveAgentSpanId(`action:${actionIdempotencyKey(e,t,n)}`)}function randomHexId(e){let t;do{t=``;for(let n=0;n<e;n+=1)t+=`0123456789abcdef`[Math.trunc(Math.random()*16)]}while(!/[1-9a-f]/u.test(t));return t}export{AgentSpanIdGenerator,deriveAgentActionSpanId,deriveAgentSpanId};
@@ -1 +1 @@
1
- import{ROOT_CONTEXT,SpanKind,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.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),r=e.resolveFallback(t),i=r===void 0?void 0:reserve(t,n,r),a=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(i===void 0){if(a===void 0)return;i=reserve(t,n,a)}a!==void 0&&startSpan(i,a.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:withChannelAudience(contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),n.scope.channelAudience),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(`execute_tool ${t.event.toolName}`,{attributes:toolAttributes(t.event),kind:SpanKind.INTERNAL,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,i){let a=r.span;if(a===void 0||r.finished===!0)return;r.finished=!0;let o=r.terminal;if(i!==void 0)recordError(a,i.error);else if(o?.type===`tool.call.failed`)recordError(a,o.error);else if(o?.output.type===`error`)recordError(a,o.output.error);else if(o!==void 0&&e.recordOutputs){let e=contentAttribute(o.output.output,!1);e!==void 0&&a.setAttribute(`gen_ai.tool.call.result`,e)}a.end(),t.delete(r.actionKey);let s=n.get(r.attemptId);s?.delete(r.idempotencyKey),s?.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,"gen_ai.tool.type":`function`,...agentSpanNamingAttributes(`execute_tool ${e.toolName}`,`execute_tool`)}}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
1
+ import{ROOT_CONTEXT,SpanKind,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{agentTraceIdentityAttributes}from"#tracing/agent-otel-attributes.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{recordAgentSpanError}from"#tracing/agent-span-error.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),r=e.resolveFallback(t),i=r===void 0?void 0:reserve(t,n,r),a=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(i===void 0){if(a===void 0)return;i=reserve(t,n,a)}a!==void 0&&startSpan(i,a.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:withChannelAudience(contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),n.scope.channelAudience),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(`execute_tool ${t.event.toolName}`,{attributes:toolAttributes(t.event),kind:SpanKind.INTERNAL,startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input);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,i){let a=r.span;if(a===void 0||r.finished===!0)return;r.finished=!0;let o=r.terminal;if(i!==void 0)recordAgentSpanError(a,i.error);else if(o?.type===`tool.call.failed`)recordAgentSpanError(a,o.error);else if(o?.output.type===`error`)recordAgentSpanError(a,o.output.error);else if(o!==void 0&&e.recordOutputs){let e=contentAttribute(o.output.output);e!==void 0&&a.setAttribute(`gen_ai.tool.call.result`,e)}a.end(),t.delete(r.actionKey);let s=n.get(r.attemptId);s?.delete(r.idempotencyKey),s?.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,"gen_ai.tool.type":`function`,...agentSpanNamingAttributes(`execute_tool ${e.toolName}`,`execute_tool`),...agentTraceIdentityAttributes({rootSessionId:e.scope.rootSessionId??e.scope.sessionId,sessionId:e.scope.sessionId})}}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}export{createAgentToolInstrumentation};
@@ -0,0 +1,12 @@
1
+ import type { AgentActionTraceState, AgentInvocationTraceState, AgentSessionTraceState, AgentTurnTraceState } from "#tracing/agent-trace-state.js";
2
+ export declare const AGENT_TRACE_CONTEXT_KEY = "eve.harness.agentTrace";
3
+ export interface AgentTraceContextState {
4
+ readonly actionAnchors: Readonly<Record<string, AgentActionTraceState>>;
5
+ readonly actions: Readonly<Record<string, AgentActionTraceState>>;
6
+ readonly invocations: Readonly<Record<string, AgentInvocationTraceState>>;
7
+ readonly sessions: Readonly<Record<string, AgentSessionTraceState>>;
8
+ readonly turns: Readonly<Record<string, AgentTurnTraceState>>;
9
+ }
10
+ export declare function emptyAgentTraceContextState(): AgentTraceContextState;
11
+ export declare function serializeAgentTraceContextState(state: AgentTraceContextState): unknown;
12
+ export declare function deserializeAgentTraceContextState(data: unknown): AgentTraceContextState;
@@ -0,0 +1 @@
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isInstrumentationPrincipalType}from"#instrumentation/lifecycle.js";import{boundedPrincipalId}from"#tracing/telemetry-budget.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{boundedTraceError}from"#tracing/bounded-error.js";const AGENT_TRACE_CONTEXT_KEY=`eve.harness.agentTrace`;function emptyAgentTraceContextState(){return{actionAnchors:{},actions:{},invocations:{},sessions:{},turns:{}}}function serializeAgentTraceContextState(e){return{actionAnchors:e.actionAnchors,actions:e.actions,invocations:Object.fromEntries(Object.entries(e.invocations).map(([e,t])=>[e,{...t,terminal:t.terminal===void 0?void 0:{...t.terminal,error:t.recordOutputs===!0?serializeError(t.terminal.error):void 0}}])),sessions:Object.fromEntries(Object.entries(e.sessions).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context)}])),turns:Object.fromEntries(Object.entries(e.turns).map(([e,t])=>[e,{...t,caller:t.caller===void 0?void 0:serializeSpanContext(t.caller),channelDelivery:t.channelDelivery===void 0?void 0:{...t.channelDelivery,requestTraceContext:t.channelDelivery.requestTraceContext===void 0?void 0:serializeSpanContext(t.channelDelivery.requestTraceContext)},context:serializeSpanContext(t.context),terminal:t.terminal===void 0?void 0:t.terminal.type===`turn.failed`?{error:serializeError(t.terminal.error),type:t.terminal.type}:{type:t.terminal.type}}]))}}function deserializeAgentTraceContextState(e){return isRecord(e)?{actionAnchors:deserializeRecord(e.actionAnchors,deserializeAction),actions:deserializeRecord(e.actions,deserializeAction),invocations:deserializeRecord(e.invocations,deserializeInvocation),sessions:deserializeRecord(e.sessions,deserializeSession),turns:deserializeRecord(e.turns,deserializeTurn)}:emptyAgentTraceContextState()}function deserializeSession(e){if(isRecord(e)&&isSpanContext(e.context))return{agentName:typeof e.agentName==`string`?e.agentName:void 0,channelAudience:normalizeChannelAudience(e.channelAudience),channelKind:typeof e.channelKind==`string`?e.channelKind:void 0,context:e.context,decision:readInstrumentationDecision(e.decision),parentLineage:deserializeParentLineage(e.parentLineage),rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``}}function deserializeTurn(e){if(isRecord(e)&&isSpanContext(e.context)&&typeof e.startTimeMs==`number`)return{caller:isSpanContext(e.caller)?e.caller:void 0,channelDelivery:deserializeTurnChannelDelivery(e.channelDelivery),context:e.context,currentPrincipal:deserializePrincipalSummary(e.currentPrincipal),initiatorPrincipal:deserializePrincipalSummary(e.initiatorPrincipal),modelUsage:deserializeModelUsage(e.modelUsage),parentLineage:deserializeParentLineage(e.parentLineage),rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,sequence:typeof e.sequence==`number`?e.sequence:0,startTimeMs:e.startTimeMs,subagentName:typeof e.subagentName==`string`?e.subagentName:void 0,terminal:deserializeTurnTerminal(e.terminal)}}function deserializeTurnChannelDelivery(e){if(isRecord(e)&&typeof e.channelKind==`string`&&typeof e.channelName==`string`&&typeof e.deliveryId==`string`)return{channelKind:e.channelKind,channelName:e.channelName,deliveryId:e.deliveryId,inputAttribute:typeof e.inputAttribute==`string`?e.inputAttribute:void 0,requestId:typeof e.requestId==`string`?e.requestId:void 0,requestTraceContext:isSpanContext(e.requestTraceContext)?e.requestTraceContext:void 0}}function deserializePrincipalSummary(e){if(!isRecord(e)||!isInstrumentationPrincipalType(e.type))return;let t=e.type===`none`?void 0:boundedPrincipalId(e.id);return t===void 0?{type:e.type}:{id:t,type:e.type}}function deserializeAction(e){if(isRecord(e)&&typeof e.attemptIndex==`number`&&typeof e.callId==`string`&&isActionKind(e.kind)&&typeof e.name==`string`&&isSpanContext(e.parent)&&typeof e.rootSessionId==`string`&&typeof e.sessionId==`string`&&typeof e.spanId==`string`&&typeof e.startTimeMs==`number`&&typeof e.stepIndex==`number`&&typeof e.turnId==`string`)return{attemptIndex:e.attemptIndex,callId:e.callId,channelAudience:normalizeChannelAudience(e.channelAudience),inputAttribute:typeof e.inputAttribute==`string`?e.inputAttribute:void 0,isWorkflowTool:e.isWorkflowTool===!0||void 0,kind:e.kind,name:e.name,parent:e.parent,rootSessionId:e.rootSessionId,sessionId:e.sessionId,spanId:e.spanId,startTimeMs:e.startTimeMs,stepIndex:e.stepIndex,turnId:e.turnId,workflowName:typeof e.workflowName==`string`?e.workflowName:void 0}}function deserializeInvocation(e){let t=deserializeAction(e);if(!(t===void 0||t.kind!==`subagent-call`&&t.kind!==`remote-agent-call`||!isRecord(e)||typeof e.parentActionCallId!=`string`))return{attemptIndex:t.attemptIndex,callId:t.callId,channelAudience:t.channelAudience,kind:t.kind,name:t.name,parent:t.parent,parentActionCallId:e.parentActionCallId,recordOutputs:e.recordOutputs===!0,rootSessionId:t.rootSessionId,sessionId:t.sessionId,spanId:t.spanId,startTimeMs:t.startTimeMs,stepIndex:t.stepIndex,terminal:deserializeActionTerminal(e.terminal),turnId:t.turnId}}function deserializeActionTerminal(e){if(isRecord(e)&&isActionOutcome(e.outcome))return{acceptedAtMs:typeof e.acceptedAtMs==`number`?e.acceptedAtMs:void 0,error:deserializeError(e.error),outcome:e.outcome,usage:isRecord(e.usage)?e.usage:void 0}}function deserializeModelUsage(e){if(!isRecord(e))return;let t=typeof e.inputTokens==`number`?e.inputTokens:void 0,n=typeof e.outputTokens==`number`?e.outputTokens:void 0;return t===void 0&&n===void 0?void 0:{inputTokens:t,outputTokens:n}}function deserializeParentLineage(e){if(isRecord(e)&&typeof e.callId==`string`&&typeof e.sessionId==`string`&&typeof e.turnId==`string`)return{callId:e.callId,sessionId:e.sessionId,subagentName:typeof e.subagentName==`string`?e.subagentName:void 0,turnId:e.turnId}}function deserializeTurnTerminal(e){if(isRecord(e)&&isTurnTerminalType(e.type))return e.type===`turn.failed`?{error:deserializeError(e.error),type:e.type}:{type:e.type}}function deserializeRecord(e,t){if(!isRecord(e))return{};let n={};for(let[r,i]of Object.entries(e)){let e=t(i);e!==void 0&&(n[r]=e)}return n}function serializeSpanContext(e){return{isRemote:e.isRemote,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function serializeError(e){if(!(e instanceof Error))return;let t=boundedTraceError(e);return{message:t.message,name:t.name,stack:t.stack}}function deserializeError(e){if(!isRecord(e)||typeof e.message!=`string`)return;let t=Error(e.message);return typeof e.name==`string`&&(t.name=e.name),typeof e.stack==`string`&&(t.stack=e.stack),t}function isActionKind(e){return e===`load-skill`||e===`remote-agent-call`||e===`subagent-call`||e===`tool-call`}function isActionOutcome(e){return e===`abandoned`||e===`cancelled`||e===`completed`||e===`failed`||e===`rejected`}function isTurnTerminalType(e){return e===`turn.cancelled`||e===`turn.completed`||e===`turn.failed`}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{AGENT_TRACE_CONTEXT_KEY,deserializeAgentTraceContextState,emptyAgentTraceContextState,serializeAgentTraceContextState};
@@ -1,31 +1,58 @@
1
1
  import type { SessionTraceContext } from "#channel/types.js";
2
2
  import type { ContextAccessor } from "#context/key.js";
3
- import type { AgentActionTraceState, AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#tracing/agent-trace-state.js";
4
- import { type InstrumentationDecision } from "#shared/instrumentation-decision.js";
3
+ import type { AgentActionTraceState, AgentInvocationTraceState, AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#tracing/agent-trace-state.js";
4
+ import type { SessionStateMap } from "#harness/types.js";
5
+ import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
6
+ /** Run after task-provider commits, so a returned background receipt keeps its anchor. */
7
+ export declare function pruneAgentTraceState(context: ContextAccessor, sessionId: string, sessionState: SessionStateMap | undefined): void;
5
8
  /** Reads the decision already bound to a session in the current worker context. */
6
9
  export declare function readCurrentSessionTraceDecision(sessionId: string): InstrumentationDecision | undefined;
7
10
  export declare function readSessionTraceDecision(context: ContextAccessor, sessionId: string): InstrumentationDecision | undefined;
8
11
  /** Keeps only framework trace state from an interrupted step's context changes. */
9
12
  export declare function preserveSerializedAgentTraceState(original: Record<string, unknown>, interrupted: Record<string, unknown>): Record<string, unknown>;
10
- /**
11
- * Reads a named session's trace context straight out of a serialized context,
12
- * which {@link ContextAgentTraceStateStore} cannot do — its reads are scoped
13
- * to the ambient session.
14
- */
15
- export declare function readSessionTraceContext(serializedContext: Readonly<Record<string, unknown>>, sessionId: string): SessionTraceContext | undefined;
13
+ /** Reads the active turn context straight out of a serialized Workflow context. */
14
+ export declare function readTurnTraceContext(serializedContext: Readonly<Record<string, unknown>>, sessionId: string, turnId: string): SessionTraceContext | undefined;
16
15
  /** Reads the durable action span that should parent a dispatched child agent. */
17
16
  export declare function readActionTraceContext(serializedContext: Readonly<Record<string, unknown>>, sessionId: string, turnId: string, callId: string): SessionTraceContext | undefined;
17
+ /** Task IDs already bind the originating call and turn, including after that turn ends. */
18
+ export declare function readTaskActionTrace(serializedContext: Readonly<Record<string, unknown>>, sessionId: string, taskId: string): AgentActionTraceState | undefined;
19
+ export declare function recordNestedAgentInvocation(input: {
20
+ readonly callId: string;
21
+ readonly kind: "remote-agent-call" | "subagent-call";
22
+ readonly name: string;
23
+ readonly outerCallId: string;
24
+ readonly recordOutputs?: boolean;
25
+ readonly serializedContext: Record<string, unknown>;
26
+ readonly sessionId: string;
27
+ readonly spanId: string;
28
+ readonly startTimeMs: number;
29
+ readonly turnId: string;
30
+ }): Record<string, unknown>;
31
+ export declare function recordActionInvocationKind(input: {
32
+ readonly callId: string;
33
+ readonly kind: "remote-agent-call" | "subagent-call";
34
+ readonly serializedContext: Record<string, unknown>;
35
+ readonly sessionId: string;
36
+ readonly turnId: string;
37
+ }): Record<string, unknown>;
18
38
  /** Durable trace state backed by eve's serialized Workflow context. */
19
39
  export declare class ContextAgentTraceStateStore implements AgentTraceStateStore {
20
40
  deleteAction(idempotencyKey: string): void;
41
+ deleteActionAnchors(sessionId: string): void;
21
42
  deleteActions(sessionId: string, turnId?: string): void;
43
+ deleteInvocation(idempotencyKey: string): void;
44
+ deleteInvocations(sessionId: string, turnId?: string): void;
22
45
  deleteSession(sessionId: string): void;
23
46
  deleteTurn(sessionId: string, turnId: string): void;
24
47
  findAction(sessionId: string, callId: string): AgentActionTraceState | undefined;
48
+ findActionAnchor(sessionId: string, turnId: string, callId: string): AgentActionTraceState | undefined;
49
+ findInvocations(sessionId?: string, turnId?: string, parentActionCallId?: string): readonly AgentInvocationTraceState[];
25
50
  getAction(idempotencyKey: string): AgentActionTraceState | undefined;
26
51
  getSession(sessionId: string): AgentSessionTraceState | undefined;
27
52
  getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
28
53
  setAction(idempotencyKey: string, value: AgentActionTraceState): void;
54
+ setActionAnchor(idempotencyKey: string, value: AgentActionTraceState): void;
55
+ setInvocation(idempotencyKey: string, value: AgentInvocationTraceState): void;
29
56
  setSession(sessionId: string, value: AgentSessionTraceState): void;
30
57
  setTurn(sessionId: string, turnId: string, value: AgentTurnTraceState): void;
31
58
  updateTurn(sessionId: string, turnId: string, update: (state: AgentTurnTraceState) => AgentTurnTraceState): void;
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage,loadContext}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{decisionToTraceContentCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";const AgentTraceContextKey=new ContextKey(`eve.harness.agentTrace`,{codec:{deserialize:deserializeState,serialize:serializeState}});function readCurrentSessionTraceDecision(e){let t=contextStorage.getStore();return t===void 0?void 0:readSessionTraceDecision(t,e)}function readSessionTraceDecision(e,t){return e.get(AgentTraceContextKey)?.sessions[t]?.decision}function preserveSerializedAgentTraceState(e,t){let n=t[AgentTraceContextKey.name];return n===void 0?e:{...e,[AgentTraceContextKey.name]:n}}function readSessionTraceContext(e,t){let n=e[AgentTraceContextKey.name];if(n===void 0)return;let r=deserializeState(n).sessions[t];return r===void 0?void 0:withTraceDecision(e,r.context,r.decision)}function readActionTraceContext(e,t,n,r){let i=e[AgentTraceContextKey.name];if(i===void 0)return;let a=deserializeState(i),o=Object.values(a.actions).find(e=>e.sessionId===t&&e.turnId===n&&e.callId===r);if(o!==void 0)return withTraceDecision(e,{isRemote:!1,spanId:o.spanId,traceFlags:o.parent.traceFlags,traceId:o.parent.traceId},a.sessions[o.sessionId]?.decision)}function withTraceDecision(e,t,n){let r=e[SessionTraceSeedKey.name],i=resolveForwardedTraceSeed({decision:n??r?.decision,forwardedTracePolicy:r?.forwardedTracePolicy,traceFlags:t.traceFlags}),a=i.decision,o=i.forwardedTracePolicy,s=decisionToTraceContentCeiling(a),c={...t,traceFlags:i.traceFlags};if(o===void 0)return a===void 0?c:{...c,decision:a};let l=s===void 0?o:{...o,ceiling:s};return a===void 0?{...c,forwardedTracePolicy:l}:{...c,decision:a,forwardedTracePolicy:l}}var ContextAgentTraceStateStore=class{deleteAction(e){updateState(t=>{let n={...t.actions};return delete n[e],{...t,actions:n}})}deleteActions(e,t){updateState(n=>{let r={...n.actions};for(let[n,i]of Object.entries(r))i.sessionId===e&&(t===void 0||i.turnId===t)&&delete r[n];return{...n,actions:r}})}deleteSession(e){updateState(t=>{let n={...t.sessions};return delete n[e],{...t,sessions:n}})}deleteTurn(e,t){updateState(n=>{let r={...n.turns};return delete r[turnKey(e,t)],{...n,turns:r}})}findAction(e,t){return Object.values(contextStorage.getStore()?.get(AgentTraceContextKey)?.actions??{}).find(n=>n.sessionId===e&&n.callId===t)}getAction(e){return contextStorage.getStore()?.get(AgentTraceContextKey)?.actions[e]}getSession(e){return contextStorage.getStore()?.get(AgentTraceContextKey)?.sessions[e]}getTurn(e,t){return contextStorage.getStore()?.get(AgentTraceContextKey)?.turns[turnKey(e,t)]}setAction(e,t){updateState(n=>({...n,actions:{...n.actions,[e]:t}}))}setSession(e,t){updateState(n=>({...n,sessions:{...n.sessions,[e]:t}}))}setTurn(e,t,n){updateState(r=>({...r,turns:{...r.turns,[turnKey(e,t)]:n}}))}updateTurn(e,t,n){updateState(r=>{let i=turnKey(e,t),a=r.turns[i];return a===void 0?r:{...r,turns:{...r.turns,[i]:n(a)}}})}};function updateState(e){loadContext().set(AgentTraceContextKey,t=>e(t??{actions:{},sessions:{},turns:{}}))}function turnKey(e,t){return`${e}\0${t}`}function serializeState(e){return{actions:e.actions,sessions:Object.fromEntries(Object.entries(e.sessions).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context)}])),turns:Object.fromEntries(Object.entries(e.turns).map(([e,t])=>[e,{...t,context:serializeSpanContext(t.context),terminal:t.terminal===void 0?void 0:t.terminal.type===`turn.failed`?{error:serializeError(t.terminal.error),type:t.terminal.type}:{type:t.terminal.type}}]))}}function deserializeState(e){return isRecord(e)?{actions:deserializeRecord(e.actions,deserializeAction),sessions:deserializeRecord(e.sessions,e=>{if(isRecord(e)&&isSpanContext(e.context))return{agentName:typeof e.agentName==`string`?e.agentName:void 0,channelAudience:normalizeChannelAudience(e.channelAudience),channelKind:typeof e.channelKind==`string`?e.channelKind:void 0,context:e.context,decision:readInstrumentationDecision(e.decision),rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``}}),turns:deserializeRecord(e.turns,e=>{if(isRecord(e)&&isSpanContext(e.context)&&typeof e.parentSpanId==`string`&&typeof e.startTimeMs==`number`)return{context:e.context,modelUsage:deserializeModelUsage(e.modelUsage),parentIsRemote:typeof e.parentIsRemote==`boolean`?e.parentIsRemote:void 0,parentSpanId:e.parentSpanId,rootSessionId:typeof e.rootSessionId==`string`?e.rootSessionId:``,sequence:typeof e.sequence==`number`?e.sequence:0,startTimeMs:e.startTimeMs,subagentName:typeof e.subagentName==`string`?e.subagentName:void 0,terminal:deserializeTerminal(e.terminal)}})}:{actions:{},sessions:{},turns:{}}}function deserializeModelUsage(e){if(!isRecord(e))return;let t=typeof e.inputTokens==`number`?e.inputTokens:void 0,n=typeof e.outputTokens==`number`?e.outputTokens:void 0;return t===void 0&&n===void 0?void 0:{inputTokens:t,outputTokens:n}}function deserializeAction(e){if(isRecord(e)&&typeof e.attemptIndex==`number`&&typeof e.callId==`string`&&isActionKind(e.kind)&&typeof e.name==`string`&&isSpanContext(e.parent)&&typeof e.rootSessionId==`string`&&typeof e.sessionId==`string`&&typeof e.spanId==`string`&&typeof e.startTimeMs==`number`&&typeof e.stepIndex==`number`&&typeof e.turnId==`string`)return{attemptIndex:e.attemptIndex,callId:e.callId,channelAudience:normalizeChannelAudience(e.channelAudience),inputAttribute:typeof e.inputAttribute==`string`?e.inputAttribute:void 0,kind:e.kind,name:e.name,parent:e.parent,rootSessionId:e.rootSessionId,sessionId:e.sessionId,spanId:e.spanId,startTimeMs:e.startTimeMs,stepIndex:e.stepIndex,turnId:e.turnId}}function isActionKind(e){return e===`load-skill`||e===`remote-agent-call`||e===`subagent-call`||e===`tool-call`}function deserializeRecord(e,t){if(!isRecord(e))return{};let n={};for(let[r,i]of Object.entries(e)){let e=t(i);e!==void 0&&(n[r]=e)}return n}function deserializeTerminal(e){if(!isRecord(e)||typeof e.type!=`string`)return;let t=e.type;if(isTurnTerminalType(t))return t===`turn.failed`?{error:deserializeError(e.error),type:t}:{type:t}}function serializeSpanContext(e){return{isRemote:e.isRemote,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function serializeError(e){return e instanceof Error?{message:e.message,name:e.name,stack:e.stack}:void 0}function deserializeError(e){if(!isRecord(e)||typeof e.message!=`string`)return;let t=Error(e.message);return typeof e.name==`string`&&(t.name=e.name),typeof e.stack==`string`&&(t.stack=e.stack),t}function isTurnTerminalType(e){return e===`turn.cancelled`||e===`turn.completed`||e===`turn.failed`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{ContextAgentTraceStateStore,preserveSerializedAgentTraceState,readActionTraceContext,readCurrentSessionTraceDecision,readSessionTraceContext,readSessionTraceDecision};
1
+ import{createLogger}from"#internal/logging.js";import{contextStorage,loadContext}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{decisionToTraceContentCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{getWorkflowToolRuns}from"#harness/workflow-tool-runs.js";import{getSessionTaskIndex}from"#tasks/session-index.js";import{deriveTaskId}from"#tasks/task-id.js";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";import{AGENT_TRACE_CONTEXT_KEY,deserializeAgentTraceContextState,emptyAgentTraceContextState,serializeAgentTraceContextState}from"#tracing/agent-trace-context-codec.js";const AgentTraceContextKey=new ContextKey(AGENT_TRACE_CONTEXT_KEY,{codec:{deserialize:deserializeAgentTraceContextState,serialize:serializeAgentTraceContextState}});function pruneAgentTraceState(e,t,n){try{pruneTraceOwnership(e,t,n)}catch(e){createLogger(`tracing.retention`).warn(`could not reconcile trace ownership; preserving trace state`,{error:e})}}function pruneTraceOwnership(e,t,n){let r=e.get(AgentTraceContextKey);if(r===void 0)return;let i=new Set(getWorkflowToolRuns(n).map(e=>e.callId)),a=new Set(getSessionTaskIndex(n).filter(e=>e.terminalView===void 0).map(e=>e.taskId)),o=Object.fromEntries(Object.entries(r.actionAnchors).filter(([e,n])=>n.sessionId!==t||r.actions[e]!==void 0||i.has(n.callId)||a.has(deriveTaskId({callId:n.callId,parentSessionId:t,parentTurnId:n.turnId})))),s=new Set(Object.values(o).filter(e=>e.sessionId===t).map(e=>e.callId)),c=Object.fromEntries(Object.entries(r.invocations).filter(([,e])=>e.sessionId!==t||e.terminal!==void 0||s.has(e.parentActionCallId)));e.set(AgentTraceContextKey,{...r,actionAnchors:o,invocations:c})}function readCurrentSessionTraceDecision(e){let t=contextStorage.getStore();return t===void 0?void 0:readSessionTraceDecision(t,e)}function readSessionTraceDecision(e,t){return e.get(AgentTraceContextKey)?.sessions[t]?.decision}function preserveSerializedAgentTraceState(e,t){let n=t[AgentTraceContextKey.name];return n===void 0?e:{...e,[AgentTraceContextKey.name]:n}}function readTurnTraceContext(e,t,n){let r=e[AgentTraceContextKey.name];if(r===void 0)return;let i=deserializeAgentTraceContextState(r),a=i.turns[turnKey(t,n)];return a===void 0?void 0:withTraceDecision(e,a.context,i.sessions[t]?.decision)}function readActionTraceContext(e,t,n,r){let i=e[AgentTraceContextKey.name];if(i===void 0)return;let a=deserializeAgentTraceContextState(i),o=actionIdempotencyKey(t,n,r),s=a.invocations[o]??a.actions[o]??a.actionAnchors[o];if(s!==void 0)return withTraceDecision(e,{isRemote:!1,spanId:s.spanId,traceFlags:s.parent.traceFlags,traceId:s.parent.traceId},a.sessions[s.sessionId]?.decision)}function readTaskActionTrace(e,t,n){let r=deserializeAgentTraceContextState(e[AgentTraceContextKey.name]);return Object.values(r.actionAnchors).find(e=>e.sessionId===t&&deriveTaskId({callId:e.callId,parentSessionId:t,parentTurnId:e.turnId})===n)}function recordNestedAgentInvocation(e){let t=e.serializedContext[AgentTraceContextKey.name];if(t===void 0)return e.serializedContext;let n=deserializeAgentTraceContextState(t),r=actionIdempotencyKey(e.sessionId,e.turnId,e.outerCallId),i=n.actions[r]??n.actionAnchors[r];if(i===void 0)return e.serializedContext;let a=actionIdempotencyKey(e.sessionId,e.turnId,e.callId),promote=e=>e.isWorkflowTool===!0&&e.kind===`tool-call`?{...e,workflowName:e.name}:e,o=n.actions[r]===void 0?n.actions:{...n.actions,[r]:promote(n.actions[r])},s=n.actionAnchors[r]===void 0?n.actionAnchors:{...n.actionAnchors,[r]:promote(n.actionAnchors[r])};if(n.invocations[a]!==void 0)return{...e.serializedContext,[AgentTraceContextKey.name]:serializeAgentTraceContextState({...n,actionAnchors:s,actions:o})};let c={attemptIndex:i.attemptIndex,callId:e.callId,channelAudience:i.channelAudience,kind:e.kind,name:e.name,parent:{spanId:i.spanId,traceFlags:i.parent.traceFlags,traceId:i.parent.traceId},parentActionCallId:e.outerCallId,recordOutputs:e.recordOutputs===!0,rootSessionId:i.rootSessionId,sessionId:i.sessionId,spanId:e.spanId,startTimeMs:e.startTimeMs,stepIndex:i.stepIndex,turnId:i.turnId};return{...e.serializedContext,[AgentTraceContextKey.name]:serializeAgentTraceContextState({...n,actionAnchors:s,actions:o,invocations:{...n.invocations,[a]:c}})}}function recordActionInvocationKind(e){let t=e.serializedContext[AgentTraceContextKey.name];if(t===void 0)return e.serializedContext;let n=deserializeAgentTraceContextState(t),update=t=>t.sessionId===e.sessionId&&t.turnId===e.turnId&&t.callId===e.callId?{...t,isWorkflowTool:void 0,kind:e.kind,workflowName:void 0}:t;return{...e.serializedContext,[AgentTraceContextKey.name]:serializeAgentTraceContextState({...n,actionAnchors:Object.fromEntries(Object.entries(n.actionAnchors).map(([e,t])=>[e,update(t)])),actions:Object.fromEntries(Object.entries(n.actions).map(([e,t])=>[e,update(t)]))})}}function withTraceDecision(e,t,n){let r=e[SessionTraceSeedKey.name],i=resolveForwardedTraceSeed({decision:n??r?.decision,forwardedTracePolicy:r?.forwardedTracePolicy,traceFlags:t.traceFlags}),a=i.decision,o=i.forwardedTracePolicy,s=decisionToTraceContentCeiling(a),c={...t,traceFlags:i.traceFlags};if(o===void 0)return a===void 0?c:{...c,decision:a};let l=s===void 0?o:{...o,ceiling:s};return a===void 0?{...c,forwardedTracePolicy:l}:{...c,decision:a,forwardedTracePolicy:l}}var ContextAgentTraceStateStore=class{deleteAction(e){updateState(t=>{let n={...t.actions};return delete n[e],{...t,actions:n}})}deleteActionAnchors(e){updateState(t=>({...t,actionAnchors:Object.fromEntries(Object.entries(t.actionAnchors).filter(([,t])=>t.sessionId!==e))}))}deleteActions(e,t){updateState(n=>{let r={...n.actions};for(let[n,i]of Object.entries(r))i.sessionId===e&&(t===void 0||i.turnId===t)&&delete r[n];return{...n,actions:r}})}deleteInvocation(e){updateState(t=>{let n={...t.invocations};return delete n[e],{...t,invocations:n}})}deleteInvocations(e,t){updateState(n=>({...n,invocations:Object.fromEntries(Object.entries(n.invocations).filter(([,n])=>n.sessionId!==e||t!==void 0&&n.turnId!==t))}))}deleteSession(e){updateState(t=>{let n={...t.sessions};return delete n[e],{...t,sessions:n}})}deleteTurn(e,t){updateState(n=>{let r={...n.turns};return delete r[turnKey(e,t)],{...n,turns:r}})}findAction(e,t){return Object.values(contextStorage.getStore()?.get(AgentTraceContextKey)?.actions??{}).find(n=>n.sessionId===e&&n.callId===t)}findActionAnchor(e,t,n){return Object.values(contextStorage.getStore()?.get(AgentTraceContextKey)?.actionAnchors??{}).find(r=>r.sessionId===e&&r.turnId===t&&r.callId===n)}findInvocations(e,t,n){return Object.values(contextStorage.getStore()?.get(AgentTraceContextKey)?.invocations??{}).filter(r=>(e===void 0||r.sessionId===e)&&(t===void 0||r.turnId===t)&&(n===void 0||r.parentActionCallId===n))}getAction(e){return contextStorage.getStore()?.get(AgentTraceContextKey)?.actions[e]}getSession(e){return contextStorage.getStore()?.get(AgentTraceContextKey)?.sessions[e]}getTurn(e,t){return contextStorage.getStore()?.get(AgentTraceContextKey)?.turns[turnKey(e,t)]}setAction(e,t){updateState(n=>({...n,actions:{...n.actions,[e]:t}}))}setActionAnchor(e,t){updateState(n=>({...n,actionAnchors:{...n.actionAnchors,[e]:t}}))}setInvocation(e,t){updateState(n=>({...n,invocations:{...n.invocations,[e]:t}}))}setSession(e,t){updateState(n=>({...n,sessions:{...n.sessions,[e]:t}}))}setTurn(e,t,n){updateState(r=>({...r,turns:{...r.turns,[turnKey(e,t)]:n}}))}updateTurn(e,t,n){updateState(r=>{let i=turnKey(e,t),a=r.turns[i];return a===void 0?r:{...r,turns:{...r.turns,[i]:n(a)}}})}};function updateState(e){loadContext().set(AgentTraceContextKey,t=>e(t??emptyAgentTraceContextState()))}function turnKey(e,t){return`${e}\0${t}`}export{ContextAgentTraceStateStore,preserveSerializedAgentTraceState,pruneAgentTraceState,readActionTraceContext,readCurrentSessionTraceDecision,readSessionTraceDecision,readTaskActionTrace,readTurnTraceContext,recordActionInvocationKind,recordNestedAgentInvocation};
@@ -6,13 +6,11 @@ export declare class AgentTraceSpanProcessor implements SpanProcessor {
6
6
  forceFlush(): Promise<void>;
7
7
  onStart(span: unknown, parentContext: unknown): void;
8
8
  onEnd(span: unknown): void;
9
- /** Trace ids whose session is still open, so retention never evicts them. */
9
+ /** Trace IDs protected by an unfinished activation or pending final writes. */
10
10
  activeTraceIds(): ReadonlySet<string>;
11
- /**
12
- * Forgets every trace one root session owned, reporting whether it owned any.
13
- * A subagent child owns none, so releasing one reports `false` and leaves the
14
- * shared trace pinned until its root finishes.
15
- */
16
- releaseSession(sessionId: string): boolean;
11
+ /** Called only after writes drain; recently completed IDs still accept late descendants. */
12
+ releaseCompletedTraces(): boolean;
13
+ /** Releases only traces owned by this conversation. */
14
+ releaseConversation(conversationId: string): boolean;
17
15
  shutdown(): Promise<void>;
18
16
  }
@@ -1 +1 @@
1
- var AgentTraceSpanProcessor=class{#e;#t=new Set;#n=new Map;#r=new Map;constructor(e){this.#e=e}async forceFlush(){await Promise.all(this.#e.map(e=>e.forceFlush()))}onStart(e,t){if(!isSpanLike(e))return;let n=e.attributes[`agent.session.id`];if(typeof n==`string`){let t=e.spanContext().traceId;if(this.#t.add(t),!this.#r.has(t)){this.#r.set(t,n);let e=this.#n.get(n)??new Set;e.add(t),this.#n.set(n,e)}}if(this.#i(e))for(let n of this.#e)n.onStart(e,t)}onEnd(e){if(isSpanLike(e)&&this.#i(e))for(let t of this.#e)t.onEnd(e)}activeTraceIds(){return this.#t}releaseSession(e){let t=this.#n.get(e);if(t===void 0)return!1;for(let e of t)this.#t.delete(e),this.#r.delete(e);return this.#n.delete(e),!0}async shutdown(){await Promise.all(this.#e.map(e=>e.shutdown()))}#i(e){return e.instrumentationScope?.name!==`workflow`&&this.#t.has(e.spanContext().traceId)}};function isSpanLike(e){return typeof e==`object`&&!!e&&`attributes`in e&&`spanContext`in e&&typeof e.spanContext==`function`}export{AgentTraceSpanProcessor};
1
+ import{isAgentActivationSpan}from"#tracing/agent-span-contract.js";var AgentTraceSpanProcessor=class{#e;#t=new Set;#n=new Set;#r=new Set;#i=new Map;constructor(e){this.#e=e}async forceFlush(){await Promise.all(this.#e.map(e=>e.forceFlush()))}onStart(e,t){if(!isSpanLike(e))return;let n=e.attributes[`gen_ai.conversation.id`];if(typeof n==`string`){let t=e.spanContext().traceId;this.#t.has(t)||this.#r.has(t)||(this.#t.add(t),this.#i.set(t,n))}if(this.#a(e))for(let n of this.#e)n.onStart(e,t)}onEnd(e){if(!isSpanLike(e)||!this.#a(e))return;for(let t of this.#e)t.onEnd(e);let t=e.spanContext().traceId;isAgentActivationSpan({name:e.name??``,attributes:e.attributes})&&this.#i.get(t)===e.attributes[`gen_ai.conversation.id`]&&this.#n.add(t)}activeTraceIds(){return this.#t}releaseCompletedTraces(){if(this.#n.size===0)return!1;for(let e of this.#n)this.#t.delete(e),this.#i.delete(e),this.#r.add(e);for(this.#n.clear();this.#r.size>2048;){let e=this.#r.values().next().value;this.#r.delete(e)}return!0}releaseConversation(e){let t=!1;for(let[n,r]of this.#i)r===e&&(t=!0,this.#t.delete(n),this.#n.delete(n),this.#i.delete(n));return t}async shutdown(){await Promise.all(this.#e.map(e=>e.shutdown()))}#a(e){return e.instrumentationScope?.name!==`workflow`&&(this.#t.has(e.spanContext().traceId)||this.#r.has(e.spanContext().traceId))}};function isSpanLike(e){return typeof e==`object`&&!!e&&`attributes`in e&&`spanContext`in e&&typeof e.spanContext==`function`}export{AgentTraceSpanProcessor};
@@ -1,5 +1,5 @@
1
1
  import type { SpanContext } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationActionKind, InstrumentationTraceContext, InstrumentationTurnFailedEvent, InstrumentationTurnSettledEvent } from "#instrumentation/lifecycle.js";
2
+ import type { InstrumentationActionKind, InstrumentationActionOutcome, InstrumentationParentLineage, InstrumentationPrincipalSummary, InstrumentationTraceContext, InstrumentationTurnFailedEvent, InstrumentationTurnSettledEvent, InstrumentationUsage } from "#instrumentation/lifecycle.js";
3
3
  import type { ChannelAudience } from "#shared/channel-audience.js";
4
4
  import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
5
5
  export interface AgentSessionTraceState {
@@ -8,16 +8,20 @@ export interface AgentSessionTraceState {
8
8
  readonly channelKind?: string;
9
9
  readonly context: SpanContext;
10
10
  readonly decision?: InstrumentationDecision;
11
+ readonly parentLineage?: InstrumentationParentLineage;
11
12
  readonly rootSessionId: string;
12
13
  }
13
14
  export interface AgentTurnTraceState {
15
+ readonly caller?: SpanContext;
16
+ readonly channelDelivery?: AgentTurnChannelDeliveryTraceState;
14
17
  readonly context: SpanContext;
18
+ readonly currentPrincipal?: InstrumentationPrincipalSummary;
19
+ readonly initiatorPrincipal?: InstrumentationPrincipalSummary;
20
+ readonly parentLineage?: InstrumentationParentLineage;
15
21
  readonly modelUsage?: {
16
22
  readonly inputTokens?: number;
17
23
  readonly outputTokens?: number;
18
24
  };
19
- readonly parentIsRemote?: boolean;
20
- readonly parentSpanId: string;
21
25
  readonly rootSessionId: string;
22
26
  readonly sequence: number;
23
27
  readonly startTimeMs: number;
@@ -29,11 +33,20 @@ export interface AgentTurnTraceState {
29
33
  readonly type: InstrumentationTurnSettledEvent["type"];
30
34
  };
31
35
  }
36
+ export interface AgentTurnChannelDeliveryTraceState {
37
+ readonly channelKind: string;
38
+ readonly channelName: string;
39
+ readonly deliveryId: string;
40
+ readonly inputAttribute?: string;
41
+ readonly requestId?: string;
42
+ readonly requestTraceContext?: SpanContext;
43
+ }
32
44
  export interface AgentActionTraceState {
33
45
  readonly attemptIndex: number;
34
46
  readonly callId: string;
35
47
  readonly channelAudience?: ChannelAudience;
36
48
  readonly inputAttribute?: string;
49
+ readonly isWorkflowTool?: boolean;
37
50
  readonly kind: InstrumentationActionKind;
38
51
  readonly name: string;
39
52
  readonly parent: InstrumentationTraceContext;
@@ -43,18 +56,38 @@ export interface AgentActionTraceState {
43
56
  readonly startTimeMs: number;
44
57
  readonly stepIndex: number;
45
58
  readonly turnId: string;
59
+ readonly workflowName?: string;
60
+ }
61
+ export interface AgentInvocationTraceState extends Omit<AgentActionTraceState, "inputAttribute" | "isWorkflowTool" | "kind" | "workflowName"> {
62
+ readonly kind: "remote-agent-call" | "subagent-call";
63
+ readonly parentActionCallId: string;
64
+ readonly recordOutputs?: boolean;
65
+ readonly terminal?: AgentActionTraceTerminalState;
66
+ }
67
+ export interface AgentActionTraceTerminalState {
68
+ readonly acceptedAtMs?: number;
69
+ readonly error?: unknown;
70
+ readonly outcome: InstrumentationActionOutcome;
71
+ readonly usage?: InstrumentationUsage;
46
72
  }
47
73
  /** Provider-owned serializable storage for durable agent trace state. */
48
74
  export interface AgentTraceStateStore {
49
75
  deleteAction(idempotencyKey: string): void | PromiseLike<void>;
76
+ deleteActionAnchors(sessionId: string): void | PromiseLike<void>;
50
77
  deleteActions(sessionId: string, turnId?: string): void | PromiseLike<void>;
78
+ deleteInvocation(idempotencyKey: string): void | PromiseLike<void>;
79
+ deleteInvocations(sessionId: string, turnId?: string): void | PromiseLike<void>;
51
80
  deleteSession(sessionId: string): void | PromiseLike<void>;
52
81
  deleteTurn(sessionId: string, turnId: string): void | PromiseLike<void>;
53
82
  findAction(sessionId: string, callId: string): AgentActionTraceState | undefined | PromiseLike<AgentActionTraceState | undefined>;
83
+ findActionAnchor(sessionId: string, turnId: string, callId: string): AgentActionTraceState | undefined | PromiseLike<AgentActionTraceState | undefined>;
84
+ findInvocations(sessionId?: string, turnId?: string, parentActionCallId?: string): readonly AgentInvocationTraceState[] | PromiseLike<readonly AgentInvocationTraceState[]>;
54
85
  getAction(idempotencyKey: string): AgentActionTraceState | undefined | PromiseLike<AgentActionTraceState | undefined>;
55
86
  getSession(sessionId: string): AgentSessionTraceState | undefined | PromiseLike<AgentSessionTraceState | undefined>;
56
87
  getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined | PromiseLike<AgentTurnTraceState | undefined>;
57
88
  setAction(idempotencyKey: string, state: AgentActionTraceState): void | PromiseLike<void>;
89
+ setActionAnchor(idempotencyKey: string, state: AgentActionTraceState): void | PromiseLike<void>;
90
+ setInvocation(idempotencyKey: string, state: AgentInvocationTraceState): void | PromiseLike<void>;
58
91
  setSession(sessionId: string, state: AgentSessionTraceState): void | PromiseLike<void>;
59
92
  setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void | PromiseLike<void>;
60
93
  /** Atomically updates an existing turn and does nothing after that turn is deleted. */
@@ -64,14 +97,21 @@ export interface AgentTraceStateStore {
64
97
  export declare class InMemoryAgentTraceStateStore implements AgentTraceStateStore {
65
98
  #private;
66
99
  deleteAction(idempotencyKey: string): void;
100
+ deleteActionAnchors(sessionId: string): void;
67
101
  deleteActions(sessionId: string, turnId?: string): void;
102
+ deleteInvocation(idempotencyKey: string): void;
103
+ deleteInvocations(sessionId: string, turnId?: string): void;
68
104
  deleteSession(sessionId: string): void;
69
105
  deleteTurn(sessionId: string, turnId: string): void;
70
106
  findAction(sessionId: string, callId: string): AgentActionTraceState | undefined;
107
+ findActionAnchor(sessionId: string, turnId: string, callId: string): AgentActionTraceState | undefined;
108
+ findInvocations(sessionId?: string, turnId?: string, parentActionCallId?: string): readonly AgentInvocationTraceState[];
71
109
  getAction(idempotencyKey: string): AgentActionTraceState | undefined;
72
110
  getSession(sessionId: string): AgentSessionTraceState | undefined;
73
111
  getTurn(sessionId: string, turnId: string): AgentTurnTraceState | undefined;
74
112
  setAction(idempotencyKey: string, state: AgentActionTraceState): void;
113
+ setActionAnchor(idempotencyKey: string, state: AgentActionTraceState): void;
114
+ setInvocation(idempotencyKey: string, state: AgentInvocationTraceState): void;
75
115
  setSession(sessionId: string, state: AgentSessionTraceState): void;
76
116
  setTurn(sessionId: string, turnId: string, state: AgentTurnTraceState): void;
77
117
  updateTurn(sessionId: string, turnId: string, update: (state: AgentTurnTraceState) => AgentTurnTraceState): void;
@@ -1 +1 @@
1
- var InMemoryAgentTraceStateStore=class{#e=new Map;#t=new Map;#n=new Map;deleteAction(e){this.#e.delete(e)}deleteActions(e,t){for(let[n,r]of this.#e)r.sessionId===e&&(t===void 0||r.turnId===t)&&this.#e.delete(n)}deleteSession(e){this.#t.delete(e)}deleteTurn(e,t){this.#n.delete(turnKey(e,t))}findAction(e,t){return[...this.#e.values()].find(n=>n.sessionId===e&&n.callId===t)}getAction(e){return this.#e.get(e)}getSession(e){return this.#t.get(e)}getTurn(e,t){return this.#n.get(turnKey(e,t))}setAction(e,t){this.#e.set(e,t)}setSession(e,t){this.#t.set(e,t)}setTurn(e,t,n){this.#n.set(turnKey(e,t),n)}updateTurn(e,t,n){let r=turnKey(e,t),i=this.#n.get(r);i!==void 0&&this.#n.set(r,n(i))}};function turnKey(e,t){return`${e}:${t}`}export{InMemoryAgentTraceStateStore,turnKey};
1
+ var InMemoryAgentTraceStateStore=class{#e=new Map;#t=new Map;#n=new Map;#r=new Map;#i=new Map;deleteAction(e){this.#t.delete(e)}deleteActionAnchors(e){for(let[t,n]of this.#e)n.sessionId===e&&this.#e.delete(t)}deleteActions(e,t){for(let[n,r]of this.#t)r.sessionId===e&&(t===void 0||r.turnId===t)&&this.#t.delete(n)}deleteInvocation(e){this.#n.delete(e)}deleteInvocations(e,t){for(let[n,r]of this.#n)r.sessionId===e&&(t===void 0||r.turnId===t)&&this.#n.delete(n)}deleteSession(e){this.#r.delete(e)}deleteTurn(e,t){this.#i.delete(turnKey(e,t))}findAction(e,t){return[...this.#t.values()].find(n=>n.sessionId===e&&n.callId===t)}findActionAnchor(e,t,n){return[...this.#e.values()].find(r=>r.sessionId===e&&r.turnId===t&&r.callId===n)}findInvocations(e,t,n){return[...this.#n.values()].filter(r=>(e===void 0||r.sessionId===e)&&(t===void 0||r.turnId===t)&&(n===void 0||r.parentActionCallId===n))}getAction(e){return this.#t.get(e)}getSession(e){return this.#r.get(e)}getTurn(e,t){return this.#i.get(turnKey(e,t))}setAction(e,t){this.#t.set(e,t)}setActionAnchor(e,t){this.#e.set(e,t)}setInvocation(e,t){this.#n.set(e,t)}setSession(e,t){this.#r.set(e,t)}setTurn(e,t,n){this.#i.set(turnKey(e,t),n)}updateTurn(e,t,n){let r=turnKey(e,t),i=this.#i.get(r);i!==void 0&&this.#i.set(r,n(i))}};function turnKey(e,t){return`${e}:${t}`}export{InMemoryAgentTraceStateStore,turnKey};
@@ -0,0 +1 @@
1
+ export declare function boundedTraceError(value: Error): Error;
@@ -0,0 +1 @@
1
+ import{truncateTelemetryText}from"#tracing/telemetry-budget.js";function boundedTraceError(e){let t=Error(truncateTelemetryText(e.message,4096));return t.name=truncateTelemetryText(e.name,128),t.stack=e.stack===void 0?void 0:truncateTelemetryText(e.stack,8192),t}export{boundedTraceError};
@@ -1 +1 @@
1
- const INPUT_CONTENT_ATTRIBUTES=new Set([`agent.channel.delivery.input`,`agent.approval.request`,`ai.documents`,`ai.prompt`,`ai.prompt.messages`,`ai.prompt.system`,`ai.prompt.toolChoice`,`ai.prompt.tools`,`ai.value`,`ai.values`,`gen_ai.input.messages`,`gen_ai.system_instructions`,`gen_ai.tool.call.arguments`,`gen_ai.tool.definitions`]),OUTPUT_CONTENT_ATTRIBUTES=new Set([`agent.approval.response`,`ai.embedding`,`ai.embeddings`,`ai.ranking`,`ai.response.files`,`ai.response.object`,`ai.response.reasoning`,`ai.response.text`,`ai.response.toolCalls`,`ai.response.tool_calls`,`ai.response.tool_results`,`ai.toolCall.args`,`ai.toolCall.result`,`gen_ai.output.messages`,`gen_ai.tool.call.result`]);function isDeclined(e,t){return!t.recordInputs&&INPUT_CONTENT_ATTRIBUTES.has(e)?!0:!t.recordOutputs&&OUTPUT_CONTENT_ATTRIBUTES.has(e)}function withoutDeclinedContent(e,t){let n=Object.keys(e);if(!n.some(e=>isDeclined(e,t)))return;let r={};for(let i of n)isDeclined(i,t)||(r[i]=e[i]);return r}export{withoutDeclinedContent};
1
+ const INPUT_CONTENT_ATTRIBUTES=new Set([`agent.channel.delivery.input`,`agent.approval.request`,`ai.documents`,`ai.prompt`,`ai.prompt.system`,`ai.prompt.toolChoice`,`ai.prompt.tools`,`ai.value`,`ai.values`,`gen_ai.input.messages`,`gen_ai.memory.records`,`gen_ai.system_instructions`,`gen_ai.tool.call.arguments`,`gen_ai.tool.definitions`]),OUTPUT_CONTENT_ATTRIBUTES=new Set([`agent.approval.response`,`ai.embedding`,`ai.embeddings`,`ai.ranking`,`ai.response.files`,`ai.response.object`,`ai.response.reasoning`,`ai.response.text`,`ai.response.toolCalls`,`ai.response.tool_calls`,`ai.response.tool_results`,`ai.toolCall.args`,`ai.toolCall.result`,`gen_ai.output.messages`,`gen_ai.tool.call.result`]);function isDeclined(e,t){return!t.recordInputs&&INPUT_CONTENT_ATTRIBUTES.has(e)?!0:!t.recordOutputs&&OUTPUT_CONTENT_ATTRIBUTES.has(e)}function withoutDeclinedContent(e,t){let n=Object.keys(e);if(!n.some(e=>isDeclined(e,t)))return;let r={};for(let i of n)isDeclined(i,t)||(r[i]=e[i]);return r}export{withoutDeclinedContent};