eve 0.78.0 → 0.79.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/src/approval/definition.d.ts +42 -0
  3. package/dist/src/cli/commands/trace-detail.d.ts +2 -2
  4. package/dist/src/cli/commands/trace-detail.js +1 -1
  5. package/dist/src/cli/commands/trace.d.ts +1 -1
  6. package/dist/src/cli/commands/trace.js +1 -1
  7. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
  8. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  9. package/dist/src/cli/dev/tui/traces/trace-store.d.ts +1 -1
  10. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
  11. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +1 -1
  12. package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
  13. package/dist/src/cli/dev/tui/traces/trace-viewer-state.d.ts +1 -1
  14. package/dist/src/compiled/.vendor-stamp.json +3 -1
  15. package/dist/src/compiled/@eve/tracing/adapters/agent-transport.d.ts +8 -0
  16. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-payload.d.ts +15 -0
  17. package/dist/src/compiled/@eve/tracing/adapters/ai-sdk-telemetry.d.ts +14 -0
  18. package/dist/src/{tracing/agent-span-id-generator.d.ts → compiled/@eve/tracing/adapters/otel-ids.d.ts} +1 -1
  19. package/dist/src/compiled/@eve/tracing/adapters/otel.d.ts +33 -0
  20. package/dist/src/{tracing/agent-otel-content.d.ts → compiled/@eve/tracing/adapters/serialization.d.ts} +9 -3
  21. package/dist/src/compiled/@eve/tracing/agent-tracing.d.ts +84 -0
  22. package/dist/src/compiled/@eve/tracing/ai-sdk.d.ts +7 -0
  23. package/dist/src/compiled/@eve/tracing/ai-sdk.js +1 -0
  24. package/dist/src/compiled/@eve/tracing/capture.d.ts +5 -0
  25. package/dist/src/compiled/@eve/tracing/core/activation.d.ts +3 -0
  26. package/dist/src/compiled/@eve/tracing/core/attributes.d.ts +14 -0
  27. package/dist/src/{tracing/content-attributes.d.ts → compiled/@eve/tracing/core/content-policy.d.ts} +1 -1
  28. package/dist/src/compiled/@eve/tracing/core/context.d.ts +3 -0
  29. package/dist/src/compiled/@eve/tracing/core/delegation.d.ts +13 -0
  30. package/dist/src/compiled/@eve/tracing/core/mcp.d.ts +24 -0
  31. package/dist/src/compiled/@eve/tracing/core/scopes.d.ts +59 -0
  32. package/dist/src/compiled/@eve/tracing/core/snapshot.d.ts +7 -0
  33. package/dist/src/compiled/@eve/tracing/core/span-kinds.d.ts +12 -0
  34. package/dist/src/compiled/@eve/tracing/core/types.d.ts +292 -0
  35. package/dist/src/compiled/@eve/tracing/core/writer.d.ts +15 -0
  36. package/dist/src/compiled/@eve/tracing/delegation.d.ts +2 -0
  37. package/dist/src/compiled/@eve/tracing/delegation.js +1 -0
  38. package/dist/src/compiled/@eve/tracing/index.d.ts +6 -0
  39. package/dist/src/compiled/@eve/tracing/index.js +1 -0
  40. package/dist/src/compiled/@eve/tracing/operations.d.ts +96 -0
  41. package/dist/src/compiled/@eve/tracing/otel.d.ts +12 -0
  42. package/dist/src/compiled/@eve/tracing/otel.js +1 -0
  43. package/dist/src/compiled/@opentelemetry/api/index.d.ts +4 -0
  44. package/dist/src/compiled/@workflow/world-vercel/index.js +7 -7
  45. package/dist/src/compiled/_chunks/workflow/delegation-BqhZ398D.js +1 -0
  46. package/dist/src/compiled/_chunks/workflow/mcp-CrGp4EC8.js +5 -0
  47. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  48. package/dist/src/compiler/extension-compatibility.js +1 -1
  49. package/dist/src/context/build-dynamic-tools.js +1 -1
  50. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  51. package/dist/src/evals/assertions/collector.d.ts +4 -1
  52. package/dist/src/evals/assertions/collector.js +1 -1
  53. package/dist/src/evals/context.js +1 -1
  54. package/dist/src/evals/index.d.ts +1 -1
  55. package/dist/src/evals/runner/artifacts.js +1 -1
  56. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +2 -2
  57. package/dist/src/evals/runner/reporters/assertion-scores.d.ts +11 -2
  58. package/dist/src/evals/runner/reporters/assertion-scores.js +1 -1
  59. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  60. package/dist/src/evals/runner/reporters/console.js +1 -1
  61. package/dist/src/evals/runner/reporters/datadog.js +2 -2
  62. package/dist/src/evals/runner/reporters/junit.js +1 -1
  63. package/dist/src/evals/runner/verdict.d.ts +2 -2
  64. package/dist/src/evals/runner/verdict.js +1 -1
  65. package/dist/src/evals/types.d.ts +22 -6
  66. package/dist/src/eve-channel/index.js +1 -1
  67. package/dist/src/eve-channel/stream-headers.d.ts +1 -0
  68. package/dist/src/eve-channel/stream-headers.js +1 -0
  69. package/dist/src/execution/agent-sessions/context.d.ts +1 -1
  70. package/dist/src/execution/agent-sessions/context.js +1 -1
  71. package/dist/src/execution/agent-sessions/remote.js +1 -1
  72. package/dist/src/execution/agent-sessions/steps.js +1 -1
  73. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  74. package/dist/src/execution/catalog/connection-entry.js +1 -1
  75. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  76. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  77. package/dist/src/execution/invoke-tool.d.ts +1 -1
  78. package/dist/src/execution/invoke-tool.js +1 -1
  79. package/dist/src/execution/session/turn-step.js +1 -1
  80. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  81. package/dist/src/execution/workflow-runtime.js +1 -1
  82. package/dist/src/harness/execute-tool.d.ts +2 -2
  83. package/dist/src/harness/input-extraction.js +1 -1
  84. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  85. package/dist/src/instrumentation/dispatch.js +1 -1
  86. package/dist/src/instrumentation/memory.d.ts +1 -4
  87. package/dist/src/instrumentation/memory.js +1 -1
  88. package/dist/src/instrumentation/principal-summary.js +1 -1
  89. package/dist/src/instrumentation/providers.js +1 -1
  90. package/dist/src/instrumentation/runtime-context.d.ts +1 -1
  91. package/dist/src/instrumentation/runtime.d.ts +3 -3
  92. package/dist/src/instrumentation/runtime.js +1 -1
  93. package/dist/src/instrumentation/session-init.js +1 -1
  94. package/dist/src/internal/application/stamped-package-version.js +1 -1
  95. package/dist/src/internal/authored-definition/approval.d.ts +3 -1
  96. package/dist/src/internal/authored-definition/approval.js +1 -1
  97. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  98. package/dist/src/internal/logging.js +1 -1
  99. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  100. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  101. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +10 -31
  102. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  103. package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +1 -1
  104. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  105. package/dist/src/public/channels/slack/hitl.js +1 -1
  106. package/dist/src/public/definitions/approval.d.ts +1 -1
  107. package/dist/src/public/instrumentation/otel.d.ts +2 -2
  108. package/dist/src/public/instrumentation/otel.js +1 -1
  109. package/dist/src/public/tools/approval/index.d.ts +1 -1
  110. package/dist/src/runtime/connections/mcp-tracing.d.ts +10 -18
  111. package/dist/src/runtime/connections/mcp-tracing.js +1 -1
  112. package/dist/src/runtime/resolve-tool.js +1 -1
  113. package/dist/src/runtime/types.d.ts +2 -2
  114. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.d.ts +12 -12
  115. package/dist/src/self-modification/extension/subagents/agent/tools/inspect_trace.js +1 -1
  116. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.d.ts +1 -1
  117. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  118. package/dist/src/self-modification/extension/trace-inspection.d.ts +1 -1
  119. package/dist/src/self-modification/extension/trace-inspection.js +1 -1
  120. package/dist/src/setup/scaffold/create/project.js +1 -1
  121. package/dist/src/shared/trace-policy.d.ts +3 -0
  122. package/dist/src/shared/trace-policy.js +1 -1
  123. package/dist/src/tools/definition.d.ts +3 -3
  124. package/dist/src/tools/durable-callbacks.d.ts +5 -3
  125. package/dist/src/tools/durable-callbacks.js +1 -1
  126. package/dist/src/tools/dynamic.d.ts +2 -2
  127. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  128. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  129. package/dist/src/tools/workflow-definition.d.ts +2 -2
  130. package/dist/src/tracing/eve/agent-approval-instrumentation.d.ts +8 -0
  131. package/dist/src/tracing/eve/agent-approval-instrumentation.js +1 -0
  132. package/dist/src/tracing/{agent-channel-delivery-instrumentation.d.ts → eve/agent-channel-delivery-instrumentation.d.ts} +1 -1
  133. package/dist/src/tracing/{agent-channel-delivery-instrumentation.js → eve/agent-channel-delivery-instrumentation.js} +1 -1
  134. package/dist/src/tracing/eve/agent-invocation-coordinator.js +1 -0
  135. package/dist/src/tracing/eve/agent-memory-instrumentation.d.ts +12 -0
  136. package/dist/src/tracing/eve/agent-memory-instrumentation.js +1 -0
  137. package/dist/src/tracing/{agent-otel-provider.d.ts → eve/agent-otel-provider.d.ts} +6 -8
  138. package/dist/src/tracing/eve/agent-otel-provider.js +1 -0
  139. package/dist/src/tracing/eve/agent-tool-instrumentation.d.ts +44 -0
  140. package/dist/src/tracing/eve/agent-tool-instrumentation.js +1 -0
  141. package/dist/src/tracing/{agent-trace-context-store.d.ts → eve/agent-trace-context-store.d.ts} +8 -16
  142. package/dist/src/tracing/eve/agent-trace-context-store.js +1 -0
  143. package/dist/src/tracing/eve/agent-trace-context.js +1 -0
  144. package/dist/src/tracing/eve/agent-trace-state.d.ts +75 -0
  145. package/dist/src/tracing/{batch-span-processor.d.ts → eve/batch-span-processor.d.ts} +5 -1
  146. package/dist/src/tracing/eve/batch-span-processor.js +1 -0
  147. package/dist/src/tracing/{content-span-processor.d.ts → eve/content-span-processor.d.ts} +1 -1
  148. package/dist/src/tracing/eve/content-span-processor.js +1 -0
  149. package/dist/src/tracing/eve/delegation.d.ts +20 -0
  150. package/dist/src/tracing/eve/delegation.js +1 -0
  151. package/dist/src/tracing/eve/gateway.d.ts +16 -0
  152. package/dist/src/tracing/eve/gateway.js +1 -0
  153. package/dist/src/tracing/{install-instrumentation-runtime.d.ts → eve/install-instrumentation-runtime.d.ts} +1 -1
  154. package/dist/src/tracing/eve/install-instrumentation-runtime.js +1 -0
  155. package/dist/src/tracing/eve/invoke-tool-span.js +1 -0
  156. package/dist/src/tracing/eve/mcp.d.ts +29 -0
  157. package/dist/src/tracing/eve/mcp.js +1 -0
  158. package/dist/src/tracing/eve/metadata.d.ts +7 -0
  159. package/dist/src/tracing/eve/metadata.js +1 -0
  160. package/dist/src/tracing/eve/operation-input.d.ts +30 -0
  161. package/dist/src/tracing/eve/operation-input.js +1 -0
  162. package/dist/src/tracing/eve/otel-configuration.d.ts +70 -0
  163. package/dist/src/tracing/eve/otel-configuration.js +1 -0
  164. package/dist/src/tracing/{otel-declaration.d.ts → eve/otel-declaration.d.ts} +4 -11
  165. package/dist/src/tracing/eve/otel-declaration.js +1 -0
  166. package/dist/src/tracing/{otel-registration.d.ts → eve/otel-registration.d.ts} +12 -5
  167. package/dist/src/tracing/eve/otel-registration.js +1 -0
  168. package/dist/src/tracing/eve/policy.d.ts +15 -0
  169. package/dist/src/tracing/eve/policy.js +1 -0
  170. package/dist/src/tracing/eve/profile.d.ts +7 -0
  171. package/dist/src/tracing/eve/profile.js +1 -0
  172. package/dist/src/tracing/eve/session.d.ts +27 -0
  173. package/dist/src/tracing/eve/session.js +1 -0
  174. package/dist/src/tracing/{vercel-runtime-span-exporter.d.ts → eve/vercel-runtime-span-exporter.d.ts} +1 -1
  175. package/dist/src/tracing/local/agent-trace-span-processor.js +1 -0
  176. package/dist/src/tracing/local/inspection.d.ts +15 -0
  177. package/dist/src/tracing/local/inspection.js +1 -0
  178. package/dist/src/tracing/{local-instrumentation-runtime.d.ts → local/instrumentation-runtime.d.ts} +1 -1
  179. package/dist/src/tracing/local/instrumentation-runtime.js +1 -0
  180. package/dist/src/tracing/{local-trace-analysis.d.ts → local/trace-analysis.d.ts} +2 -2
  181. package/dist/src/tracing/{local-trace-analysis.js → local/trace-analysis.js} +1 -1
  182. package/dist/src/tracing/{local-trace-operations.d.ts → local/trace-operations.d.ts} +1 -1
  183. package/dist/src/tracing/{local-trace-query.d.ts → local/trace-query.d.ts} +1 -1
  184. package/dist/src/tracing/local/trace-reader.js +1 -0
  185. package/dist/src/tracing/{local-trace-retention.js → local/trace-retention.js} +1 -1
  186. package/dist/src/tracing/{local-trace-span-processor.js → local/trace-span-processor.js} +1 -1
  187. package/dist/src/tracing/{local-trace-summary.d.ts → local/trace-summary.d.ts} +1 -1
  188. package/dist/src/tracing/local/trace-summary.js +1 -0
  189. package/dist/src/tracing/{local-traces.d.ts → local/traces.d.ts} +1 -1
  190. package/dist/src/tracing/local/traces.js +1 -0
  191. package/docs/connections/mcp.mdx +22 -1
  192. package/docs/evals/assertions.mdx +50 -3
  193. package/docs/evals/overview.mdx +2 -1
  194. package/docs/evals/reporters.mdx +3 -1
  195. package/docs/tools/human-in-the-loop.md +23 -1
  196. package/package.json +2 -1
  197. package/dist/src/tracing/agent-approval-instrumentation.d.ts +0 -11
  198. package/dist/src/tracing/agent-approval-instrumentation.js +0 -1
  199. package/dist/src/tracing/agent-invocation-coordinator.js +0 -1
  200. package/dist/src/tracing/agent-memory-instrumentation.d.ts +0 -16
  201. package/dist/src/tracing/agent-memory-instrumentation.js +0 -1
  202. package/dist/src/tracing/agent-otel-attributes.d.ts +0 -10
  203. package/dist/src/tracing/agent-otel-attributes.js +0 -1
  204. package/dist/src/tracing/agent-otel-content.js +0 -4
  205. package/dist/src/tracing/agent-otel-provider.js +0 -2
  206. package/dist/src/tracing/agent-otel-runtime-context.d.ts +0 -36
  207. package/dist/src/tracing/agent-otel-runtime-context.js +0 -1
  208. package/dist/src/tracing/agent-otel-session-context.d.ts +0 -22
  209. package/dist/src/tracing/agent-otel-session-context.js +0 -1
  210. package/dist/src/tracing/agent-otel-turn-state.d.ts +0 -6
  211. package/dist/src/tracing/agent-otel-turn-state.js +0 -1
  212. package/dist/src/tracing/agent-otel-usage.d.ts +0 -10
  213. package/dist/src/tracing/agent-otel-usage.js +0 -1
  214. package/dist/src/tracing/agent-span-contract.d.ts +0 -34
  215. package/dist/src/tracing/agent-span-contract.js +0 -1
  216. package/dist/src/tracing/agent-span-error.js +0 -1
  217. package/dist/src/tracing/agent-span-id-generator.js +0 -1
  218. package/dist/src/tracing/agent-span-naming.d.ts +0 -1
  219. package/dist/src/tracing/agent-span-naming.js +0 -1
  220. package/dist/src/tracing/agent-tool-instrumentation.d.ts +0 -40
  221. package/dist/src/tracing/agent-tool-instrumentation.js +0 -1
  222. package/dist/src/tracing/agent-tool-span-context.d.ts +0 -16
  223. package/dist/src/tracing/agent-tool-span-context.js +0 -1
  224. package/dist/src/tracing/agent-trace-context-codec.d.ts +0 -15
  225. package/dist/src/tracing/agent-trace-context-codec.js +0 -1
  226. package/dist/src/tracing/agent-trace-context-store.js +0 -1
  227. package/dist/src/tracing/agent-trace-context.js +0 -1
  228. package/dist/src/tracing/agent-trace-span-processor.js +0 -1
  229. package/dist/src/tracing/agent-trace-state.d.ts +0 -91
  230. package/dist/src/tracing/batch-span-processor.js +0 -1
  231. package/dist/src/tracing/bounded-error.d.ts +0 -1
  232. package/dist/src/tracing/bounded-error.js +0 -1
  233. package/dist/src/tracing/content-attributes.js +0 -1
  234. package/dist/src/tracing/content-span-processor.js +0 -1
  235. package/dist/src/tracing/error-content-context.d.ts +0 -3
  236. package/dist/src/tracing/error-content-context.js +0 -1
  237. package/dist/src/tracing/install-instrumentation-runtime.js +0 -1
  238. package/dist/src/tracing/invoke-tool-span.js +0 -1
  239. package/dist/src/tracing/local-instrumentation-runtime.js +0 -1
  240. package/dist/src/tracing/local-trace-reader.js +0 -1
  241. package/dist/src/tracing/local-trace-summary.js +0 -1
  242. package/dist/src/tracing/local-traces.js +0 -1
  243. package/dist/src/tracing/otel-declaration.js +0 -1
  244. package/dist/src/tracing/otel-registration.js +0 -1
  245. package/dist/src/tracing/sampled-trace.d.ts +0 -4
  246. package/dist/src/tracing/sampled-trace.js +0 -1
  247. package/dist/src/tracing/suppress-tracing.d.ts +0 -2
  248. package/dist/src/tracing/suppress-tracing.js +0 -1
  249. package/dist/src/tracing/telemetry-budget.d.ts +0 -3
  250. package/dist/src/tracing/telemetry-budget.js +0 -1
  251. /package/dist/src/{tracing/agent-span-error.d.ts → compiled/@eve/tracing/adapters/otel-error.d.ts} +0 -0
  252. /package/dist/src/tracing/{agent-invocation-coordinator.d.ts → eve/agent-invocation-coordinator.d.ts} +0 -0
  253. /package/dist/src/tracing/{agent-trace-context.d.ts → eve/agent-trace-context.d.ts} +0 -0
  254. /package/dist/src/tracing/{agent-trace-state.js → eve/agent-trace-state.js} +0 -0
  255. /package/dist/src/tracing/{channel-audience-context.d.ts → eve/channel-audience-context.d.ts} +0 -0
  256. /package/dist/src/tracing/{channel-audience-context.js → eve/channel-audience-context.js} +0 -0
  257. /package/dist/src/tracing/{conversation-context.d.ts → eve/conversation-context.d.ts} +0 -0
  258. /package/dist/src/tracing/{conversation-context.js → eve/conversation-context.js} +0 -0
  259. /package/dist/src/tracing/{invoke-tool-span.d.ts → eve/invoke-tool-span.d.ts} +0 -0
  260. /package/dist/src/tracing/{span-export-policy.d.ts → eve/span-export-policy.d.ts} +0 -0
  261. /package/dist/src/tracing/{span-export-policy.js → eve/span-export-policy.js} +0 -0
  262. /package/dist/src/tracing/{vercel-runtime-span-exporter.js → eve/vercel-runtime-span-exporter.js} +0 -0
  263. /package/dist/src/tracing/{agent-trace-span-processor.d.ts → local/agent-trace-span-processor.d.ts} +0 -0
  264. /package/dist/src/tracing/{local-trace-discovery-index.d.ts → local/trace-discovery-index.d.ts} +0 -0
  265. /package/dist/src/tracing/{local-trace-discovery-index.js → local/trace-discovery-index.js} +0 -0
  266. /package/dist/src/tracing/{local-trace-operations.js → local/trace-operations.js} +0 -0
  267. /package/dist/src/tracing/{local-trace-query.js → local/trace-query.js} +0 -0
  268. /package/dist/src/tracing/{local-trace-reader.d.ts → local/trace-reader.d.ts} +0 -0
  269. /package/dist/src/tracing/{local-trace-retention.d.ts → local/trace-retention.d.ts} +0 -0
  270. /package/dist/src/tracing/{local-trace-span-processor.d.ts → local/trace-span-processor.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # eve
2
2
 
3
+ ## 0.79.0
4
+
5
+ ### Minor Changes
6
+
7
+ - bc2be45: Adds `t.score(evaluation)` for recording a score from 0 to 1, named with `.label(key)` and gated with `.gate()` or `.atLeast()`. `AssertionResult` gains `key`, and `score`, `threshold`, and `passed` are now optional: `score` is absent when the scorer threw, and `threshold` and `passed` are absent when no rule applies, so custom reporters should treat `passed === false` as the failure signal. `eve eval` warns when soft assertions in one eval share a name with different scores.
8
+
9
+ ### Patch Changes
10
+
11
+ - 76f6854: eve's agent spans now come from the shared tracing library, and durable turns recover from one checkpoint per turn. Each tool call is still one `execute_tool` span, a local subagent's first turn still nests under its caller, and trace schema version 4 is unchanged.
12
+ - f5e5183: Connection approval policies now receive `toolAnnotations`, the hints an MCP server declared for the called tool (such as `readOnlyHint` and `destructiveHint`), so a policy can skip approval for read-only tools. It is `undefined` when the server declares none.
13
+ - 302a4d3: Tools can now define `approval.prompt` to show a human-readable, input-aware summary in approval requests. Slack keeps the complete tool input available in a collapsed block below the approval card.
14
+ - 422b628: Extract reusable agent tracing with wrapped execution, model stream completion, remote delegation, and durable turns that save and resume themselves through a checkpointer. Preserve trace schema version 4 while sharing one span lifecycle with eve.
15
+ - 485d0f5: The agent tracing library now writes schema 4's `agent.action.kind`, `agent.action.name`, and `agent.action.outcome` on tool and approval spans itself, so hosts other than eve render correctly in Agent Runs. eve's trace output is unchanged.
16
+
3
17
  ## 0.78.0
4
18
 
5
19
  ### Minor Changes
@@ -4,6 +4,17 @@ import type { ToolAuthOptions, ToolAuthProvider } from "#tools/auth.js";
4
4
  import type { SessionContext } from "#context/session-context.js";
5
5
  import type { TokenResult } from "#shared/connection-types.js";
6
6
  type ApprovalToolInput<TInput> = TInput extends object ? Readonly<TInput> : TInput;
7
+ /** Context passed to an approval prompt callback. */
8
+ export interface ApprovalPromptContext<TInput = Record<string, unknown>> {
9
+ /** Id of the tool call awaiting approval. */
10
+ readonly callId: string;
11
+ /** Validated input proposed for the tool call. */
12
+ readonly input: TInput;
13
+ /** Final runtime name of the tool. */
14
+ readonly toolName: string;
15
+ }
16
+ /** Builds the human-readable prompt shown when a tool call requires approval. */
17
+ export type ApprovalPrompt<TInput = Record<string, unknown>> = (context: ApprovalPromptContext<TInput>) => string;
7
18
  /**
8
19
  * Context passed to an {@link ApprovalPolicy} function.
9
20
  *
@@ -15,9 +26,33 @@ export interface ApprovalContext<TInput = Record<string, unknown>> extends Sessi
15
26
  readonly abortSignal: AbortSignal;
16
27
  readonly approvedTools: ReadonlySet<string>;
17
28
  readonly callId: string;
29
+ /**
30
+ * Behavior hints the connection's server declared for this tool, such as
31
+ * MCP's `readOnlyHint` and `destructiveHint`. Absent for authored tools and
32
+ * for servers that declare none. Hints are only as trustworthy as the server.
33
+ */
34
+ readonly toolAnnotations?: ConnectionToolAnnotations;
18
35
  readonly toolInput?: ApprovalToolInput<TInput>;
19
36
  readonly toolName: string;
20
37
  }
38
+ /**
39
+ * Behavior hints a connection's server declares for one of its tools. The
40
+ * named fields follow MCP's `ToolAnnotations`; other keys pass through as the
41
+ * server sent them.
42
+ */
43
+ export interface ConnectionToolAnnotations {
44
+ /** Human-readable tool title. */
45
+ readonly title?: string;
46
+ /** The tool does not modify its environment. */
47
+ readonly readOnlyHint?: boolean;
48
+ /** The tool may perform destructive updates. Meaningful only when not read-only. */
49
+ readonly destructiveHint?: boolean;
50
+ /** Repeating a call with the same arguments has no additional effect. */
51
+ readonly idempotentHint?: boolean;
52
+ /** The tool may interact with an open world of external entities. */
53
+ readonly openWorldHint?: boolean;
54
+ readonly [key: string]: unknown;
55
+ }
21
56
  /** Request-time approval decision returned by an {@link ApprovalPolicy}. */
22
57
  export type ApprovalStatus = undefined | boolean | "not-applicable" | "approved" | "denied" | "user-approval" | {
23
58
  readonly type: "not-applicable";
@@ -95,6 +130,13 @@ export interface ApprovalConfiguration<TInput = Record<string, unknown>> {
95
130
  }
96
131
  /** Shared approval definition used by authored tools and connections. */
97
132
  export type Approval<TInput = Record<string, unknown>> = ApprovalPolicy<TInput> | ApprovalConfiguration<TInput>;
133
+ /** Approval configuration for a tool, including its optional presentation prompt. */
134
+ export interface ToolApprovalConfiguration<TInput = Record<string, unknown>> extends ApprovalConfiguration<TInput> {
135
+ /** Optional human-readable prompt shown when this tool requires approval. */
136
+ readonly prompt?: ApprovalPrompt<TInput>;
137
+ }
138
+ /** Approval definition used by authored tools. */
139
+ export type ToolApproval<TInput = Record<string, unknown>> = ApprovalPolicy<TInput> | ToolApprovalConfiguration<TInput>;
98
140
  /** Returns the request-time policy from either approval authoring shape. */
99
141
  export declare function resolveApprovalPolicy<TInput>(approval: Approval<TInput>): ApprovalPolicy<TInput>;
100
142
  export {};
@@ -3,8 +3,8 @@
3
3
  * module: the tree renderer stays compact while these helpers answer "what
4
4
  * does this span carry" — inline metric chips and the `--verbose` per-span block.
5
5
  */
6
- import type { LocalTraceSpan } from "#tracing/local-trace-reader.js";
7
- import { type LocalTraceSummary } from "#tracing/local-trace-summary.js";
6
+ import type { LocalTraceSpan } from "#tracing/local/trace-reader.js";
7
+ import { type LocalTraceSummary } from "#tracing/local/trace-summary.js";
8
8
  /**
9
9
  * Compact metrics for one tree row: token chips (`↑1.4K`/`↓213`), cost
10
10
  * (`$0.0031`). Only chips whose attributes the span actually carries — rows
@@ -1 +1 @@
1
- import{sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCompactTokenCount}from"#cli/dev/tui/stream-format.js";import{formatAttributeContent}from"#cli/dev/tui/traces/trace-content.js";import{localTraceSpanCostUsd}from"#tracing/local-trace-summary.js";function spanMetricChips(e){let t=[],n=e.attributes[`gen_ai.operation.name`],r=n===`chat`||n===`invoke_agent`?`gen_ai.usage`:`agent.usage`,i=numberAttribute(e,`${r}.input_tokens`),a=numberAttribute(e,`${r}.output_tokens`);i!==void 0&&t.push(`↑${formatCompactTokenCount(i)}`),a!==void 0&&t.push(`↓${formatCompactTokenCount(a)}`);let o=localTraceSpanCostUsd(e);return o!==void 0&&t.push(formatCostUsd(o)),t}function formatTokenSummary(e){let t=[`↑${formatCompactTokenCount(e.inputTokens)} in`,`↓${formatCompactTokenCount(e.outputTokens)} out`];return e.cacheReadTokens>0&&t.push(`${formatCompactTokenCount(e.cacheReadTokens)} cached`),e.cacheWriteTokens>0&&t.push(`${formatCompactTokenCount(e.cacheWriteTokens)} cache write`),t.join(` · `)}function formatCostUsd(e){return e>=1?`$${e.toFixed(2)}`:`$${e.toFixed(4)}`}function renderSpanDetailTree(e,t){let n=spanDetailEntries(e,t.width-t.margin.length-3),r=[];return n.forEach((e,r)=>{let i=r===n.length-1&&!t.childrenFollow;emit(e,t.margin,i?`└─ `:`├─ `)}),r;function emit(e,n,i){r.push(t.mute(`${n}${i}${e.head}`));let a=`${n}${i===`└─ `?` `:`│ `}`;for(let n of e.lines)r.push(t.mute(`${a} ${n}`));e.entries.forEach((t,n)=>{emit(t,a,n===e.entries.length-1?`└─ `:`├─ `)})}}function spanDetailEntries(e,t){let dim=e=>e,n=Math.max(40,t),r=[],push=(e,t=[],n=[])=>{r.push({entries:n,head:e,lines:t})},i=e.statusCode===2;push(`status: ${i&&e.statusMessage!==void 0?`ERROR — ${sanitizeForTerminal(e.statusMessage)}`:i?`ERROR`:`ok`}`),push(`duration: ${formatElapsed(durationMs(e.startTimeNs,e.endTimeNs))}`),push(`started: ${new Date(Number(e.startTimeNs/1000000n)).toISOString()}`),push(`span: ${e.spanId}`),e.parentSpanId!==void 0&&push(`parent: ${e.parentSpanId}`),e.scope!==void 0&&push(`scope: ${sanitizeForTerminal(e.scope)}`),e.kind!==void 0&&e.kind!==1&&push(`kind: ${spanKind(e.kind)}`);for(let t of Object.keys(e.attributes).sort()){let r=formatAttributeContent(t,e.attributes[t],dim,n-2),i=sanitizeForTerminal(t);r.length===1?push(`${i}: ${r[0]}`):push(`${i}:`,r)}return e.events.length>0&&push(`events:`,[],e.events.map(t=>{let r=Math.max(0,durationMs(e.startTimeNs,t.timeNs)),i=[];for(let e of Object.keys(t.attributes).sort()){let r=formatAttributeContent(e,t.attributes[e],dim,n-6),a=sanitizeForTerminal(e);r.length===1?i.push(`${a}: ${r[0]}`):i.push(`${a}:`,...r.map(e=>` ${e}`))}return{entries:[],head:`${sanitizeForTerminal(t.name)} +${formatElapsed(r)}`,lines:i}})),r}function spanKind(e){switch(e){case 2:return`server`;case 3:return`client`;case 4:return`producer`;case 5:return`consumer`;default:return`unknown (${e})`}}function numberAttribute(e,t){let n=e.attributes[t];if(typeof n==`number`)return n;if(typeof n==`string`&&n!==``){let e=Number(n);return Number.isFinite(e)?e:void 0}}function durationMs(e,t){return Number(t-e)/1e6}export{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips};
1
+ import{sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{formatCompactTokenCount}from"#cli/dev/tui/stream-format.js";import{formatAttributeContent}from"#cli/dev/tui/traces/trace-content.js";import{localTraceSpanCostUsd}from"#tracing/local/trace-summary.js";function spanMetricChips(e){let t=[],n=e.attributes[`gen_ai.operation.name`],r=n===`chat`||n===`invoke_agent`?`gen_ai.usage`:`agent.usage`,i=numberAttribute(e,`${r}.input_tokens`),a=numberAttribute(e,`${r}.output_tokens`);i!==void 0&&t.push(`↑${formatCompactTokenCount(i)}`),a!==void 0&&t.push(`↓${formatCompactTokenCount(a)}`);let o=localTraceSpanCostUsd(e);return o!==void 0&&t.push(formatCostUsd(o)),t}function formatTokenSummary(e){let t=[`↑${formatCompactTokenCount(e.inputTokens)} in`,`↓${formatCompactTokenCount(e.outputTokens)} out`];return e.cacheReadTokens>0&&t.push(`${formatCompactTokenCount(e.cacheReadTokens)} cached`),e.cacheWriteTokens>0&&t.push(`${formatCompactTokenCount(e.cacheWriteTokens)} cache write`),t.join(` · `)}function formatCostUsd(e){return e>=1?`$${e.toFixed(2)}`:`$${e.toFixed(4)}`}function renderSpanDetailTree(e,t){let n=spanDetailEntries(e,t.width-t.margin.length-3),r=[];return n.forEach((e,r)=>{let i=r===n.length-1&&!t.childrenFollow;emit(e,t.margin,i?`└─ `:`├─ `)}),r;function emit(e,n,i){r.push(t.mute(`${n}${i}${e.head}`));let a=`${n}${i===`└─ `?` `:`│ `}`;for(let n of e.lines)r.push(t.mute(`${a} ${n}`));e.entries.forEach((t,n)=>{emit(t,a,n===e.entries.length-1?`└─ `:`├─ `)})}}function spanDetailEntries(e,t){let dim=e=>e,n=Math.max(40,t),r=[],push=(e,t=[],n=[])=>{r.push({entries:n,head:e,lines:t})},i=e.statusCode===2;push(`status: ${i&&e.statusMessage!==void 0?`ERROR — ${sanitizeForTerminal(e.statusMessage)}`:i?`ERROR`:`ok`}`),push(`duration: ${formatElapsed(durationMs(e.startTimeNs,e.endTimeNs))}`),push(`started: ${new Date(Number(e.startTimeNs/1000000n)).toISOString()}`),push(`span: ${e.spanId}`),e.parentSpanId!==void 0&&push(`parent: ${e.parentSpanId}`),e.scope!==void 0&&push(`scope: ${sanitizeForTerminal(e.scope)}`),e.kind!==void 0&&e.kind!==1&&push(`kind: ${spanKind(e.kind)}`);for(let t of Object.keys(e.attributes).sort()){let r=formatAttributeContent(t,e.attributes[t],dim,n-2),i=sanitizeForTerminal(t);r.length===1?push(`${i}: ${r[0]}`):push(`${i}:`,r)}return e.events.length>0&&push(`events:`,[],e.events.map(t=>{let r=Math.max(0,durationMs(e.startTimeNs,t.timeNs)),i=[];for(let e of Object.keys(t.attributes).sort()){let r=formatAttributeContent(e,t.attributes[e],dim,n-6),a=sanitizeForTerminal(e);r.length===1?i.push(`${a}: ${r[0]}`):i.push(`${a}:`,...r.map(e=>` ${e}`))}return{entries:[],head:`${sanitizeForTerminal(t.name)} +${formatElapsed(r)}`,lines:i}})),r}function spanKind(e){switch(e){case 2:return`server`;case 3:return`client`;case 4:return`producer`;case 5:return`consumer`;default:return`unknown (${e})`}}function numberAttribute(e,t){let n=e.attributes[t];if(typeof n==`number`)return n;if(typeof n==`string`&&n!==``){let e=Number(n);return Number.isFinite(e)?e:void 0}}function durationMs(e,t){return Number(t-e)/1e6}export{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips};
@@ -1,4 +1,4 @@
1
- import type { LocalTrace } from "#tracing/local-trace-reader.js";
1
+ import type { LocalTrace } from "#tracing/local/trace-reader.js";
2
2
  interface CliTraceLogger {
3
3
  error(message: string): void;
4
4
  log(message: string): void;
@@ -1,4 +1,4 @@
1
- import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{summarizeLocalTrace}from"#tracing/local-trace-summary.js";import{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,describeLocalTraceSpan,listLocalTraces}from"#tracing/local-trace-reader.js";const TRACE_DISPLAY_DIRECTORY=`.eve/traces/v1`;function resolveLocalTraces(e,t){let n=t.replaceAll(`\\`,`/`),r=basename(n),i=n===r?[n]:[n,r],a=e.find(e=>i.includes(e.traceId));if(a!==void 0)return[a];let o=e.filter(e=>e.conversationIds.some(e=>i.includes(e)));if(o.length>0)return orderWindows(o);let s=e.filter(e=>i.some(t=>e.traceId.startsWith(t)||e.conversationIds.some(e=>e.startsWith(t))));if(s.length===0)throw Error(`No local trace matches "${sanitizeForTerminal(t)}". Run \`eve traces list\` to list traces.`);if(s.length===1)return s;if(new Set(s.map(e=>e.conversationId??e.traceId)).size>1)throw ambiguousTraceError(s,t);return orderWindows(s)}function orderWindows(e){return[...e].sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs<t.startTimeNs?-1:1)}async function runTraceListCommand(e,t,n={}){let r=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(r.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),conversationId:e.conversationId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(r.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let i=r.map(e=>[e.traceId,sanitizeForTerminal(e.conversationId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),a=[`TRACE`,`CONVERSATION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],o=a.map((e,t)=>Math.max(e.length,...i.map(e=>e[t].length)));e.log([a,...i].map(e=>e.map((e,t)=>e.padEnd(o[t])).join(` `).trimEnd()).join(`
1
+ import{basename}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{formatElapsed}from"#cli/format-elapsed.js";import{summarizeLocalTrace}from"#tracing/local/trace-summary.js";import{formatCostUsd,formatTokenSummary,renderSpanDetailTree,spanMetricChips}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,describeLocalTraceSpan,listLocalTraces}from"#tracing/local/trace-reader.js";const TRACE_DISPLAY_DIRECTORY=`.eve/traces/v1`;function resolveLocalTraces(e,t){let n=t.replaceAll(`\\`,`/`),r=basename(n),i=n===r?[n]:[n,r],a=e.find(e=>i.includes(e.traceId));if(a!==void 0)return[a];let o=e.filter(e=>e.conversationIds.some(e=>i.includes(e)));if(o.length>0)return orderWindows(o);let s=e.filter(e=>i.some(t=>e.traceId.startsWith(t)||e.conversationIds.some(e=>e.startsWith(t))));if(s.length===0)throw Error(`No local trace matches "${sanitizeForTerminal(t)}". Run \`eve traces list\` to list traces.`);if(s.length===1)return s;if(new Set(s.map(e=>e.conversationId??e.traceId)).size>1)throw ambiguousTraceError(s,t);return orderWindows(s)}function orderWindows(e){return[...e].sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs<t.startTimeNs?-1:1)}async function runTraceListCommand(e,t,n={}){let r=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(r.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),conversationId:e.conversationId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(r.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let i=r.map(e=>[e.traceId,sanitizeForTerminal(e.conversationId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),a=[`TRACE`,`CONVERSATION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],o=a.map((e,t)=>Math.max(e.length,...i.map(e=>e[t].length)));e.log([a,...i].map(e=>e.map((e,t)=>e.padEnd(o[t])).join(` `).trimEnd()).join(`
2
2
  `))}async function runTraceShowCommand(e,t,n,r={}){let i=await listLocalTraces(t);if(i.length===0){let t=`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`;if(n!==void 0)throw Error(t);e.log(t);return}let a=n===void 0?[i[0]]:resolveLocalTraces(i,n);if(r.json===!0){e.log(JSON.stringify(a.map(serializeTraceForJson),null,2));return}let o=createCliTheme();e.log(a.map(e=>[renderCliSection(o,{rows:traceHeaderRows(e),title:`Trace`}),`${o.accent(`Spans`)}\n${renderSpanTree(e.spans,{dim:o.muted,verbose:r.verbose===!0})}`].join(`
3
3
 
4
4
  `)).join(`
@@ -4,7 +4,7 @@
4
4
  * latency waterfall. Activation and tool spans provide the user and tool
5
5
  * cards directly; model response spans provide assistant cards.
6
6
  */
7
- import type { LocalTrace, LocalTraceSpan } from "#tracing/local-trace-reader.js";
7
+ import type { LocalTrace, LocalTraceSpan } from "#tracing/local/trace-reader.js";
8
8
  import type { Theme } from "../theme.js";
9
9
  import type { TraceViewerSurfaces } from "./trace-surfaces.js";
10
10
  export interface ConversationItem {
@@ -1,3 +1,3 @@
1
- import{formatCompactTokenCount}from"../stream-format.js";import{formatPayloadContent,wrapPlainText}from"./trace-content.js";import{SURFACE_CLOSE}from"./trace-surfaces.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,stripTerminalControls,visibleLength}from"#cli/ui/terminal-text.js";import{localTraceSpanCostUsd}from"#tracing/local-trace-summary.js";import{formatCostUsd}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,isAgentTurnSpan}from"#tracing/local-trace-reader.js";import{agentTurnIdentity}from"#tracing/agent-span-contract.js";import{traceStringAttribute}from"#tracing/local-trace-operations.js";function buildConversationItems(e){let t=new Map(e.spans.map(e=>[e.spanId,e])),n=new Map;for(let r of e.spans){if(!isAgentTurnSpan(r))continue;let e=agentTurnIdentity(r),i=turnSubagent(r,t);e!==void 0&&i!==void 0&&n.set(e,i)}let r=[],i;for(let t of[...e.spans].sort(compareLocalTraceSpans)){let e=isModelSpan(t)?systemInstructionsText(t.attributes):void 0;if(e!==void 0){i={span:t,text:e};break}}i!==void 0&&r.push({item:{kind:`system`,durationMs:0,error:!1,span:i.span,subagent:subagentFor(i.span,n,t),text:i.text},order:0n});for(let i of e.spans){let e=subagentFor(i,n,t),a=stringAttribute(i,`agent.channel.delivery.input`);if(a!==void 0){let t=deliveryText(a);if(t===void 0)continue;r.push({item:{kind:`user`,durationMs:0,error:!1,span:i,subagent:e,text:t},order:i.startTimeNs});continue}if(isModelSpan(i)){let n=stringAttribute(i,`ai.response.text`),a=stringAttribute(i,`ai.response.reasoning`),o=numberAttribute(i,`gen_ai.usage.input_tokens`),s=numberAttribute(i,`gen_ai.usage.output_tokens`),c=o!==void 0||s!==void 0,l=i.attributes[`ai.response.tool_calls`]!==void 0;if((n===void 0||n.trim().length===0)&&(a===void 0||a.trim().length===0)&&!c&&!l&&i.statusCode!==2)continue;r.push({item:{kind:`assistant`,costUsd:stepCostUsd(i,t),durationMs:spanDurationMs(i),error:i.statusCode===2,inputTokens:o,model:stringAttribute(i,`gen_ai.request.model`),outputTokens:s,reasoning:a,span:i,subagent:e,text:n,toolCallNames:l?parseToolCallNames(stringAttribute(i,`ai.response.tool_calls`)):void 0},order:i.startTimeNs});for(let t of parseProviderToolResults(stringAttribute(i,`ai.response.tool_results`)))r.push({item:{kind:`tool`,args:t.args,durationMs:0,error:t.error,name:stripTerminalControls(t.name),result:t.result,span:i,subagent:e},order:i.startTimeNs});continue}(i.attributes[`gen_ai.operation.name`]===`execute_tool`||i.name===`agent.action`)&&r.push({item:{kind:`tool`,args:stringAttribute(i,`gen_ai.tool.call.arguments`),durationMs:spanDurationMs(i),error:i.statusCode===2,name:stripTerminalControls(stringAttribute(i,`gen_ai.tool.name`)??stringAttribute(i,`agent.action.name`)??`tool`),result:unwrapJsonString(stringAttribute(i,`gen_ai.tool.call.result`)),span:i,subagent:e},order:i.startTimeNs})}return r.sort((e,t)=>e.order===t.order?0:e.order<t.order?-1:1).map(e=>e.item)}function systemInstructionsText(e){let t=e[`gen_ai.system_instructions`];if(typeof t==`string`)try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.flatMap(e=>typeof e!=`object`||!e||!(`type`in e)||e.type!==`text`||!(`content`in e)||typeof e.content!=`string`?[]:[e.content]).join(`
1
+ import{formatCompactTokenCount}from"../stream-format.js";import{formatPayloadContent,wrapPlainText}from"./trace-content.js";import{SURFACE_CLOSE}from"./trace-surfaces.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,stripTerminalControls,visibleLength}from"#cli/ui/terminal-text.js";import{localTraceSpanCostUsd}from"#tracing/local/trace-summary.js";import{formatCostUsd}from"#cli/commands/trace-detail.js";import{compareLocalTraceSpans,isAgentTurnSpan}from"#tracing/local/trace-reader.js";import{agentTurnIdentity}from"#tracing/local/inspection.js";import{traceStringAttribute}from"#tracing/local/trace-operations.js";function buildConversationItems(e){let t=new Map(e.spans.map(e=>[e.spanId,e])),n=new Map;for(let r of e.spans){if(!isAgentTurnSpan(r))continue;let e=agentTurnIdentity(r),i=turnSubagent(r,t);e!==void 0&&i!==void 0&&n.set(e,i)}let r=[],i;for(let t of[...e.spans].sort(compareLocalTraceSpans)){let e=isModelSpan(t)?systemInstructionsText(t.attributes):void 0;if(e!==void 0){i={span:t,text:e};break}}i!==void 0&&r.push({item:{kind:`system`,durationMs:0,error:!1,span:i.span,subagent:subagentFor(i.span,n,t),text:i.text},order:0n});for(let i of e.spans){let e=subagentFor(i,n,t),a=stringAttribute(i,`agent.channel.delivery.input`);if(a!==void 0){let t=deliveryText(a);if(t===void 0)continue;r.push({item:{kind:`user`,durationMs:0,error:!1,span:i,subagent:e,text:t},order:i.startTimeNs});continue}if(isModelSpan(i)){let n=stringAttribute(i,`ai.response.text`),a=stringAttribute(i,`ai.response.reasoning`),o=numberAttribute(i,`gen_ai.usage.input_tokens`),s=numberAttribute(i,`gen_ai.usage.output_tokens`),c=o!==void 0||s!==void 0,l=i.attributes[`ai.response.tool_calls`]!==void 0;if((n===void 0||n.trim().length===0)&&(a===void 0||a.trim().length===0)&&!c&&!l&&i.statusCode!==2)continue;r.push({item:{kind:`assistant`,costUsd:stepCostUsd(i,t),durationMs:spanDurationMs(i),error:i.statusCode===2,inputTokens:o,model:stringAttribute(i,`gen_ai.request.model`),outputTokens:s,reasoning:a,span:i,subagent:e,text:n,toolCallNames:l?parseToolCallNames(stringAttribute(i,`ai.response.tool_calls`)):void 0},order:i.startTimeNs});for(let t of parseProviderToolResults(stringAttribute(i,`ai.response.tool_results`)))r.push({item:{kind:`tool`,args:t.args,durationMs:0,error:t.error,name:stripTerminalControls(t.name),result:t.result,span:i,subagent:e},order:i.startTimeNs});continue}(i.attributes[`gen_ai.operation.name`]===`execute_tool`||i.name===`agent.action`)&&r.push({item:{kind:`tool`,args:stringAttribute(i,`gen_ai.tool.call.arguments`),durationMs:spanDurationMs(i),error:i.statusCode===2,name:stripTerminalControls(stringAttribute(i,`gen_ai.tool.name`)??stringAttribute(i,`agent.action.name`)??`tool`),result:unwrapJsonString(stringAttribute(i,`gen_ai.tool.call.result`)),span:i,subagent:e},order:i.startTimeNs})}return r.sort((e,t)=>e.order===t.order?0:e.order<t.order?-1:1).map(e=>e.item)}function systemInstructionsText(e){let t=e[`gen_ai.system_instructions`];if(typeof t==`string`)try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.flatMap(e=>typeof e!=`object`||!e||!(`type`in e)||e.type!==`text`||!(`content`in e)||typeof e.content!=`string`?[]:[e.content]).join(`
2
2
 
3
3
  `);return n.length>0?n:void 0}catch{return}}function subagentFor(e,t,n){let r=e;for(;r!==void 0;){let e=agentTurnIdentity(r);if(e!==void 0)return t.get(e);r=r.parentSpanId===void 0?void 0:n.get(r.parentSpanId)}}function turnSubagent(e,t){let n=stringAttribute(e,`agent.subagent.name`);if(n!==void 0){let t=n??stringAttribute(e,`gen_ai.agent.name`);return{name:t===void 0?void 0:stripTerminalControls(t)}}let r=e.parentSpanId===void 0?void 0:t.get(e.parentSpanId);if(r===void 0)return;let i=stringAttribute(r,`agent.action.kind`);if(i!==`subagent-call`&&i!==`remote-agent-call`)return;let a=stringAttribute(r,`agent.turn.id`);if(a===void 0)return;let o=stringAttribute(r,`agent.action.name`);return{name:o===void 0?void 0:stripTerminalControls(o),parentCallId:traceStringAttribute(r,`gen_ai.tool.call.id`),parentTurnId:a}}function renderConversationItem(e,t,n,r,i,a){let{colors:o,glyph:s}=n,c=Math.max(8,t-8),l=conversationItemExpandable(e,t),u=n.color?a:void 0,d=u?.primaryText??o.white,f,p,m=[];if(e.kind===`tool`){let t=o.bold(d(e.name??`tool`));f=`${foldMarker(i,l,n)}${t}`,p=e.durationMs>0?o.dim(formatElapsed(e.durationMs)):``;let r=e.args===void 0?[]:formatPayloadContent(e.args,c),a=e.result===void 0?[]:formatPayloadContent(e.result,c),s=i?r:capLines(r,c),u=i?a:capLines(a,c);s.length>0&&m.push(``,o.dim(`Input:`),``,...s),u.length>0&&m.push(``,o.dim(`Output:`),``,...u)}else if(e.kind===`system`){f=`${foldMarker(i,l,n)}${o.bold(d(`system`))}`,p=o.dim(`~${formatCompactTokenCount(estimateTokens(e.text??``))} tokens`);let t=wrapPlainText(e.text??``,c);m.push(...i?t:capLines(t,c))}else if(e.kind===`assistant`){f=`${foldMarker(i,l,n)}${o.bold(d(`assistant`))}${e.model===void 0?``:o.dim(` · ${stripTerminalControls(e.model)}`)}`,p=assistantMetrics(e,s,o);let t=e.reasoning===void 0||e.reasoning.trim().length===0?[]:wrapPlainText(e.reasoning,c),r=e.text===void 0||e.text.trim().length===0?[]:wrapPlainText(e.text,c),a=(i?t:capLines(t,c)).map(e=>o.dim(e)),u=i?r:capLines(r,c);if(a.length>0&&(m.push(o.dim(`Thought:`),``,...a),u.length>0&&m.push(``)),m.push(...u),(e.text===void 0||e.text.trim().length===0)&&e.toolCallNames!==void 0&&e.toolCallNames.length>0){a.length>0&&m.push(``);for(let t of e.toolCallNames)m.push(o.dim(`→ ${t}`))}}else{let t=e.kind===`user`&&e.subagent!==void 0?`task`:e.kind;f=`${foldMarker(i,l,n)}${o.bold(d(t))}`,p=``;let r=e.text===void 0||e.text.trim().length===0?[]:wrapPlainText(e.text,c);m.push(...i?r:capLines(r,c))}if(e.subagent!==void 0){let t=e.subagent.name===void 0?`subagent`:`subagent:${e.subagent.name}`;f+=o.dim(` · ${t}`)}e.error&&(f+=` ${o.red(s.error)}`),!i&&l?m.push(`…`,``,o.dim(`Click to expand`)):i&&l&&m.push(``,o.dim(`Click to collapse`));let h=u===void 0?void 0:e.error?u.errorHeader:u.header,g=u===void 0?void 0:e.error?u.errorBody:u.body,_=railCell(n,r,e.error,u);return[cardRow(``,t,n,_,h),cardSplitRow(f,p,t,n,_,h),cardRow(``,t,n,_,h),cardRow(``,t,n,_,g),...m.map(e=>cardRow(e,t,n,_,g)),cardRow(``,t,n,_,g)]}function cardRow(e,t,n,r,i){let a=clipVisible(e,Math.max(1,t-8)),o=` `.repeat(Math.max(0,t-8-visibleLength(a)));return i===void 0||!n.color?` ${r} ${a}${o} `:` ${r}${i} ${a.replaceAll(`\x1B[0m`,`\x1b[0m${i}`)}\x1b[0m${i}${o} ${SURFACE_CLOSE} `}function railCell(e,t,n,r){let{colors:i,glyph:a}=e;if(t){let t=e.unicode?`▌`:a.rule;return r===void 0?i.white(t):r.primaryText(t)}return r===void 0?n?i.red(a.rule):i.dim(a.rule):` `}function cardSplitRow(e,t,n,r,i,a){if(visibleLength(t)===0)return cardRow(e,n,r,i,a);let o=Math.max(1,n-8),s=visibleLength(t),c=Math.max(1,o-s-2),l=clipVisible(e,c);return cardRow(`${l}${` `.repeat(Math.max(2,o-visibleLength(l)-s))}${t}`,n,r,i,a)}function assistantMetrics(e,t,n){let r=[];return e.durationMs>0&&r.push(formatElapsed(e.durationMs)),e.inputTokens!==void 0&&r.push(`${t.arrowUp}${formatCompactTokenCount(e.inputTokens)}`),e.outputTokens!==void 0&&r.push(`${t.arrowDown}${formatCompactTokenCount(e.outputTokens)}`),e.costUsd!==void 0&&r.push(formatCostUsd(e.costUsd)),r.length===0?``:n.dim(r.join(` · `))}function stepCostUsd(e,t){let n=e;for(;n.parentSpanId!==void 0;){if(n=t.get(n.parentSpanId),n===void 0)return;if(n.name===`agent.step`)return localTraceSpanCostUsd(n)}}function foldMarker(e,t,n){return e?`${n.colors.dim(`▾`)} `:t?`${n.colors.dim(`▸`)} `:``}function capLines(e,t){return e.length<=3?[...e]:[...e.slice(0,2),clipVisible(e[2],Math.max(1,t))]}function conversationItemLineCount(e,t,n,r){return renderConversationItem(e,t,n,!1,r).length}function conversationItemExpandable(e,t){let n=Math.max(8,t-8);if(e.kind===`tool`){let t=e.args===void 0?0:formatPayloadContent(e.args,n-2).length,r=e.result===void 0?0:formatPayloadContent(e.result,n-2).length;return t>3||r>3}if(e.kind===`system`)return wrapPlainText(e.text??``,n).length>3;if(e.kind===`user`)return(e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,n).length)>3;let r=e.reasoning===void 0||e.reasoning.trim().length===0?0:wrapPlainText(e.reasoning,n).length,i=e.text===void 0||e.text.trim().length===0?0:wrapPlainText(e.text,n).length;return r>3||i>3}function estimateTokens(e){return Math.ceil(e.length/4)}function deliveryText(e){if(e!==void 0)try{let t=JSON.parse(e);return isRecord(t)&&typeof t.message==`string`?t.message:void 0}catch{return e}}function unwrapJsonString(e){if(e!==void 0)try{let t=JSON.parse(e);return typeof t==`string`?t:e}catch{return e}}function isModelSpan(e){return e.name.startsWith(`ai.`)&&e.name.includes(`do`)||e.attributes[`gen_ai.operation.name`]===`chat`}function parseToolCallNames(e){if(e!==void 0)try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>isRecord(e)&&typeof e.toolName==`string`).map(e=>e.toolName):void 0}catch{return}}function parseProviderToolResults(e){if(e===void 0)return[];try{let t=JSON.parse(e);if(!Array.isArray(t))return[];let asText=e=>typeof e==`string`?e:e===void 0?void 0:JSON.stringify(e);return t.filter(isRecord).map(e=>{let t=`error`in e;return{args:asText(e.input),error:t,name:typeof e.toolName==`string`?e.toolName:`tool`,result:asText(t?e.error:e.output)}})}catch{return[]}}function stringAttribute(e,t){let n=e.attributes[t];return typeof n==`string`?n:void 0}function numberAttribute(e,t){let n=e.attributes[t];return typeof n==`number`?n:void 0}function spanDurationMs(e){return Math.max(0,Number(e.endTimeNs-e.startTimeNs)/1e6)}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{buildConversationItems,conversationItemExpandable,conversationItemLineCount,renderConversationItem};
@@ -6,7 +6,7 @@
6
6
  * files that appeared since the last poll. Listing stats directories instead
7
7
  * of parsing spans, keeping a 1s poll cheap even with a large spool.
8
8
  */
9
- import type { LocalTrace } from "#tracing/local-trace-reader.js";
9
+ import type { LocalTrace } from "#tracing/local/trace-reader.js";
10
10
  export interface TraceStoreEntry {
11
11
  readonly traceId: string;
12
12
  /** Mtime of the trace's segments directory — the instant it last received a span. */
@@ -1 +1 @@
1
- import{assembleLocalTrace,listLocalTraceIds,listLocalTraceSegments,readLocalTraceActivityMs,readLocalTraceSegment}from"#tracing/local-trace-reader.js";function createTraceStore(e){let t=new Map;return{async list(){let t=[];for(let n of await listLocalTraceIds(e.appRoot)){let r=await readLocalTraceActivityMs(e.appRoot,n);r!==void 0&&t.push({traceId:n,lastActivityMs:r})}return t.sort((e,t)=>t.lastActivityMs===e.lastActivityMs?e.traceId.localeCompare(t.traceId):t.lastActivityMs-e.lastActivityMs)},async read(n){let r=await listLocalTraceSegments(e.appRoot,n);if(r===void 0){t.delete(n);return}let i=t.get(n);i===void 0&&(i={seen:new Set,spans:new Map},t.set(n,i));let a=!1;for(let t of r)if(!i.seen.has(t)){i.seen.add(t);for(let r of await readLocalTraceSegment(e.appRoot,n,t))i.spans.has(r.spanId)||(i.spans.set(r.spanId,r),a=!0)}if(i.spans.size!==0)return(a||i.assembled===void 0)&&(i.assembled=assembleLocalTrace(n,[...i.spans.values()])),i.assembled}}}export{createTraceStore};
1
+ import{assembleLocalTrace,listLocalTraceIds,listLocalTraceSegments,readLocalTraceActivityMs,readLocalTraceSegment}from"#tracing/local/trace-reader.js";function createTraceStore(e){let t=new Map;return{async list(){let t=[];for(let n of await listLocalTraceIds(e.appRoot)){let r=await readLocalTraceActivityMs(e.appRoot,n);r!==void 0&&t.push({traceId:n,lastActivityMs:r})}return t.sort((e,t)=>t.lastActivityMs===e.lastActivityMs?e.traceId.localeCompare(t.traceId):t.lastActivityMs-e.lastActivityMs)},async read(n){let r=await listLocalTraceSegments(e.appRoot,n);if(r===void 0){t.delete(n);return}let i=t.get(n);i===void 0&&(i={seen:new Set,spans:new Map},t.set(n,i));let a=!1;for(let t of r)if(!i.seen.has(t)){i.seen.add(t);for(let r of await readLocalTraceSegment(e.appRoot,n,t))i.spans.has(r.spanId)||(i.spans.set(r.spanId,r),a=!0)}if(i.spans.size!==0)return(a||i.assembled===void 0)&&(i.assembled=assembleLocalTrace(n,[...i.spans.values()])),i.assembled}}}export{createTraceStore};
@@ -5,7 +5,7 @@
5
5
  * footer (key hints + position/notice). Every row is clipped to the
6
6
  * terminal width so the alt-screen painter can write rows verbatim.
7
7
  */
8
- import type { LocalTraceSpan } from "#tracing/local-trace-reader.js";
8
+ import type { LocalTraceSpan } from "#tracing/local/trace-reader.js";
9
9
  import type { Theme } from "../theme.js";
10
10
  import type { TraceViewerSurfaces } from "./trace-surfaces.js";
11
11
  import type { TextSelectionRange, TraceViewerState } from "./trace-viewer-state.js";
@@ -1,2 +1,2 @@
1
- import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local-trace-reader.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,c=r.color?i:void 0,l=c===void 0?``:c.body,u=c?.primaryText??r.colors.white,d=r.color?`\x1B[0m`:``,f=[`${l}${u(s)}${` `.repeat(o)}${d}`,`${l}${u(s)}${u(a)}${d}`,`${l}${u(s)}${` `.repeat(o)}${d}`];for(let[t,r]of f.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e),o=a<i?e+` `.repeat(i-a):e;return`${sliceVisible(o,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`gen_ai.input.messages`,`gen_ai.system_instructions`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(e,t,n,r){let{colors:i}=n,{muted:a,primary:o}=chromeStyles(n,r?.surfaces),s=[],c=stripTerminalControls(e.name);s.push(...wrapVisibleLine(i.bold(o(c)),t));let l=describeLocalTraceSpan(e).map(stripTerminalControls);l.length>0&&s.push(a(l.join(`, `))),s.push(``);let fact=(e,t)=>`${a(e.padEnd(10))}${t}`,u=e.statusCode===2;s.push(fact(`status`,u?i.red(`ERROR`):i.green(`ok`))),s.push(fact(`duration`,formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)))),s.push(fact(`started`,clockTime(e.startTimeNs))),s.push(fact(`span`,e.spanId)),e.parentSpanId!==void 0&&s.push(fact(`parent`,e.parentSpanId)),e.scope!==void 0&&s.push(fact(`scope`,stripTerminalControls(e.scope))),s.push(``);let d=Object.keys(e.attributes).filter(e=>r?.excludeKeys?.has(e)!==!0).sort();if(d.length===0)s.push(a(`no attributes`));else{s.push(a(`attributes (${d.length})`));for(let n of d){let r=formatAttributeContent(n,e.attributes[n],i.dim,t-2),o=stripTerminalControls(n);if(r.length===1)s.push(...wrapVisibleLine(`${a(o)} ${r[0]}`,t));else{s.push(a(o));for(let e of r)s.push(` ${e}`)}}}return s.map(e=>clipVisible(e,t))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:i,glyph:a}=n,{muted:o,primary:s}=chromeStyles(n,t.surfaces),c=[];if(e.trace?.agentName!==void 0&&c.push(stripTerminalControls(e.trace.agentName)),e.trace?.conversationId!==void 0&&c.push(`conversation ${stripTerminalControls(e.trace.conversationId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;c.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let l=`${i.bold(s(`${a.brand} traces`))}${c.length===0?``:o(` · ${c.join(` · `)}`)}`,u=e.traces.length===0?``:o(`[${e.traceIndex+1}/${e.traces.length}]`),d=[t.activeWindowEndNs===void 0?``:i.green(`● live`),u].filter(e=>e.length>0).join(` `),f=joinRight(` ${clipVisible(l,Math.max(0,r-visibleLength(d)-2))}`,d,r);return[``,clipVisible(f,r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace; its export policy may have redacted it.`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,t,n,r){let i=[];for(let a=0;a<e.conversationItems.length;a+=1)i.push(...renderConversationItem(e.conversationItems[a],t,n,a===e.selectedRow,e.expandedItems.has(a),r),``);return i}function panelDetailLines(e,t,n,r){let i=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||i===void 0?[]:[``,...renderSpanDetail(i,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:r}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:n,end:r}=orderedTextSelection(t),i=[];for(let t=Math.max(0,n.line);t<=r.line&&t<e.length;t+=1){let a=stripAnsi(e[t]),o=t===n.line?n.column:0,s=t===r.line?r.column+1:1/0,c=s===1/0?a:sliceVisible(a,s),l=sliceVisible(a,o).length;i.push(c.slice(l).trimEnd())}return i.join(`
1
+ import{formatAttributeContent}from"./trace-content.js";import{renderConversationItem}from"./trace-conversation.js";import{orderedTextSelection,selectedTraceViewerSpan}from"./trace-viewer-state.js";import{formatElapsed}from"#cli/format-elapsed.js";import{clipVisible,sliceVisible,stripAnsi,stripTerminalControls,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{describeLocalTraceSpan}from"#tracing/local/trace-reader.js";function renderTraceViewer(e,t){let{width:n,height:r,theme:i}=t,a=chromeStyles(i,t.surfaces),o=Math.max(1,r-3-3),s=e.panelOpen?panelWidthFor(n):0,c=Math.max(20,n-(s===0?0:s+1)),l=panelDetailLines(e,s,i,t.surfaces),u=o,d=[];if(d.push(...renderHeader(e,t)),e.traces.length===0)d.push(...renderEmptyState(t,i,o));else if(e.trace===void 0)d.push(...center(o,a.muted(`Loading trace…`)));else{let r=renderConversation(e,t,c,o);for(let t=0;t<o;t+=1){let i=r[t]??``;if(s===0){d.push(i);continue}let a=l[e.panelScroll+t]??``;e.textSelection!==void 0&&e.textSelection.region===`panel`&&(a=highlightSelection(a,e.panelScroll+t,e.textSelection,s)),d.push(joinPanels(i,c,a,n))}}return d.push(...renderFooter(e,n,i,t.surfaces)),t.toast!==void 0&&overlayToast(d,t.toast,n,i,t.surfaces),{rows:d,panelTotalRows:l.length,timelineViewportRows:o,panelViewportRows:u,contentWidth:c}}function chromeStyles(e,t){let n=e.color?t:void 0;return{muted:n?.mutedText??e.colors.dim,primary:n?.primaryText??(e=>e)}}function overlayToast(e,t,n,r,i){let a=` ${stripTerminalControls(t)} `,o=visibleLength(a),s=r.unicode?`▌`:r.glyph.rule,c=r.color?i:void 0,l=c===void 0?``:c.body,u=c?.primaryText??r.colors.white,d=r.color?`\x1B[0m`:``,f=[`${l}${u(s)}${` `.repeat(o)}${d}`,`${l}${u(s)}${u(a)}${d}`,`${l}${u(s)}${` `.repeat(o)}${d}`];for(let[t,r]of f.entries()){let i=2+t;if(i>=e.length)break;e[i]=overlayRight(e[i],r,n,1)}}function overlayRight(e,t,n,r){let i=Math.max(0,n-r-visibleLength(t)),a=visibleLength(e),o=a<i?e+` `.repeat(i-a):e;return`${sliceVisible(o,i)}\x1b[0m${t}`}const CONVERSATION_CONTENT_KEYS=new Set([`gen_ai.input.messages`,`gen_ai.system_instructions`,`ai.response.reasoning`,`ai.response.text`,`ai.response.tool_calls`,`ai.response.tool_results`,`gen_ai.tool.call.arguments`,`gen_ai.tool.call.result`]);function renderSpanDetail(e,t,n,r){let{colors:i}=n,{muted:a,primary:o}=chromeStyles(n,r?.surfaces),s=[],c=stripTerminalControls(e.name);s.push(...wrapVisibleLine(i.bold(o(c)),t));let l=describeLocalTraceSpan(e).map(stripTerminalControls);l.length>0&&s.push(a(l.join(`, `))),s.push(``);let fact=(e,t)=>`${a(e.padEnd(10))}${t}`,u=e.statusCode===2;s.push(fact(`status`,u?i.red(`ERROR`):i.green(`ok`))),s.push(fact(`duration`,formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)))),s.push(fact(`started`,clockTime(e.startTimeNs))),s.push(fact(`span`,e.spanId)),e.parentSpanId!==void 0&&s.push(fact(`parent`,e.parentSpanId)),e.scope!==void 0&&s.push(fact(`scope`,stripTerminalControls(e.scope))),s.push(``);let d=Object.keys(e.attributes).filter(e=>r?.excludeKeys?.has(e)!==!0).sort();if(d.length===0)s.push(a(`no attributes`));else{s.push(a(`attributes (${d.length})`));for(let n of d){let r=formatAttributeContent(n,e.attributes[n],i.dim,t-2),o=stripTerminalControls(n);if(r.length===1)s.push(...wrapVisibleLine(`${a(o)} ${r[0]}`,t));else{s.push(a(o));for(let e of r)s.push(` ${e}`)}}}return s.map(e=>clipVisible(e,t))}function renderHeader(e,t){let{theme:n,width:r}=t,{colors:i,glyph:a}=n,{muted:o,primary:s}=chromeStyles(n,t.surfaces),c=[];if(e.trace?.agentName!==void 0&&c.push(stripTerminalControls(e.trace.agentName)),e.trace?.conversationId!==void 0&&c.push(`conversation ${stripTerminalControls(e.trace.conversationId)}`),e.trace!==void 0){let n=t.activeWindowEndNs!==void 0&&t.activeWindowEndNs>e.trace.endTimeNs?t.activeWindowEndNs:e.trace.endTimeNs;c.push(clockTime(e.trace.startTimeNs),`${e.trace.spans.length} span${e.trace.spans.length===1?``:`s`}`,formatElapsed(durationMs(e.trace.startTimeNs,n)))}let l=`${i.bold(s(`${a.brand} traces`))}${c.length===0?``:o(` · ${c.join(` · `)}`)}`,u=e.traces.length===0?``:o(`[${e.traceIndex+1}/${e.traces.length}]`),d=[t.activeWindowEndNs===void 0?``:i.green(`● live`),u].filter(e=>e.length>0).join(` `),f=joinRight(` ${clipVisible(l,Math.max(0,r-visibleLength(d)-2))}`,d,r);return[``,clipVisible(f,r),``]}function renderConversation(e,t,n,r){let{theme:i}=t;if(e.conversationItems.length===0)return[chromeStyles(i,t.surfaces).muted(` No conversation content in this trace; its export policy may have redacted it.`)];let a=conversationLines(e,n,i,t.surfaces).slice(e.scrollRow,e.scrollRow+r);return e.textSelection===void 0||e.textSelection.region!==`conversation`?a:a.map((t,r)=>highlightSelection(t,e.scrollRow+r,e.textSelection,n))}function conversationLines(e,t,n,r){let i=[];for(let a=0;a<e.conversationItems.length;a+=1)i.push(...renderConversationItem(e.conversationItems[a],t,n,a===e.selectedRow,e.expandedItems.has(a),r),``);return i}function panelDetailLines(e,t,n,r){let i=selectedTraceViewerSpan(e);return!e.panelOpen||t<=0||i===void 0?[]:[``,...renderSpanDetail(i,Math.max(16,t-3),n,{excludeKeys:CONVERSATION_CONTENT_KEYS,surfaces:r}).map(e=>` ${e}`)]}function conversationSelectionText(e,t,n,r,i){return selectionText(conversationLines(e,t,n,i),r)}function panelSelectionText(e,t,n,r){return selectionText(panelDetailLines(e,e.panelOpen?panelWidthFor(t):0,n),r)}function selectionText(e,t){let{start:n,end:r}=orderedTextSelection(t),i=[];for(let t=Math.max(0,n.line);t<=r.line&&t<e.length;t+=1){let a=stripAnsi(e[t]),o=t===n.line?n.column:0,s=t===r.line?r.column+1:1/0,c=s===1/0?a:sliceVisible(a,s),l=sliceVisible(a,o).length;i.push(c.slice(l).trimEnd())}return i.join(`
2
2
  `)}function highlightSelection(e,t,n,r){let{start:i,end:a}=orderedTextSelection(n);if(t<i.line||t>a.line)return e;let o=t===i.line?i.column:0,s=t===a.line?a.column+1:r,c=visibleLength(e),l=c<s?e+` `.repeat(s-c):e,u=sliceVisible(l,o),d=sliceVisible(l,s),f=d.slice(u.length),p=l.slice(d.length);return f.length===0?e:`${u}\x1b[7m${f.replaceAll(`\x1B[0m`,`\x1B[0m\x1B[7m`)}\x1b[27m${p}`}function renderFooter(e,t,n,r){let{colors:i}=n,{muted:a}=chromeStyles(n,r),[o,s]=n.unicode?[`↑↓`,`←→`]:[`^/v`,`</>`],c=e.panelFocus?`${o} scroll · tab cards · esc back`:`${o} select · ${s} expand · enter attrs · tab focus · [ ] traces · q close`,l=e.conversationItems.length,u=l===0?``:a(`item ${e.selectedRow+1}/${l}`),d=[e.notice===void 0?``:i.yellow(e.notice),u].filter(e=>e.length>0).join(a(` · `));return[``,clipVisible(` ${a(c)}`,t),clipVisible(d.length===0?``:` ${d}`,t)]}function renderEmptyState(e,t,n){let{muted:r,primary:i}=chromeStyles(t,e.surfaces),[a,o]=e.tracingDisabled===!0?[`Tracing is disabled (EVE_TRACES=off).`,`Re-enable it and spans stream in live.`]:[`No local traces yet.`,`Chat with your agent — spans stream in live.`];return center(n,t.colors.bold(i(a)),r(o))}function center(e,...t){let n=Array.from({length:e},()=>``),r=Math.max(0,Math.floor(e/2)-1);return t.forEach((t,i)=>{r+i<e&&(n[r+i]=t)}),n}function joinPanels(e,t,n,r){let i=Math.max(0,r-t-1);return`${padTo(e,t)} ${clipVisible(n,i)}`}function joinRight(e,t,n){if(t.length===0)return e;let r=Math.max(1,n-visibleLength(e)-visibleLength(t));return`${e}${` `.repeat(r)}${t}`}function padTo(e,t){let n=visibleLength(e);return n>=t?clipVisible(e,t):e+` `.repeat(t-n)}function panelWidthFor(e){return e<42?0:Math.min(64,Math.max(20,Math.floor(e*.42)),e-20-1)}function durationMs(e,t){return Math.max(0,Number(t-e)/1e6)}function clockTime(e){let t=new Date(Number(e/1000000n)),pad=(e,t=2)=>String(e).padStart(t,`0`);return`${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}.${pad(t.getMilliseconds(),3)}`}export{conversationSelectionText,panelSelectionText,renderSpanDetail,renderTraceViewer};
@@ -6,7 +6,7 @@
6
6
  * {@link applyLoadedTrace} so a live trace can grow underneath an open
7
7
  * viewer without losing the user's selection.
8
8
  */
9
- import type { LocalTrace, LocalTraceSpan } from "#tracing/local-trace-reader.js";
9
+ import type { LocalTrace, LocalTraceSpan } from "#tracing/local/trace-reader.js";
10
10
  import type { ConversationItem } from "#cli/dev/tui/traces/trace-conversation.js";
11
11
  import type { TraceStoreEntry } from "#cli/dev/tui/traces/trace-store.js";
12
12
  import type { TerminalKey } from "#cli/dev/tui/stream-format.js";
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "moduleFingerprints": {
3
3
  "@eve/catalog": "d5babf703f0f589f123ee2043b72bcb4823ccccbe5034315c3b70fbae7cd76a0",
4
+ "@eve/tracing": "a528cd9d20e2f2549eb986fdf03ba3352014d69aec709f9758482bc8d08bb5aa",
4
5
  "just-secrets": "1ce67d437d0bb06df02e4e99180a3c5f5edf0010314010226e97b96d462bba5d",
5
6
  "@workflow/world-local": "a10e78551f65fc607cf75261a569d852c40bc9cfac13a7fb6e15c88bf1ccf429"
6
7
  },
@@ -19,6 +20,7 @@
19
20
  "eventsource-parser": "3.1.0",
20
21
  "env-runner": "0.1.16",
21
22
  "@eve/catalog": "0.0.1",
23
+ "@eve/tracing": "0.0.0",
22
24
  "@ai-sdk/google": "4.0.93",
23
25
  "jose": "6.2.3",
24
26
  "js-yaml": "4.3.2",
@@ -59,7 +61,7 @@
59
61
  "zod": "4.5.4",
60
62
  "zod-validation-error": "5.0.0"
61
63
  },
62
- "scriptHash": "f296c8787cbb975a01596e49048f5c4b1a1480c03754134647da5eff762b98ca",
64
+ "scriptHash": "3a19e7f59d4cf18dd0aec4272f4eba4e8a23cfe1682db5801421af4da6d37069",
63
65
  "toolVersions": {
64
66
  "rolldown": "1.2.9",
65
67
  "typescript": "7.0.2"
@@ -0,0 +1,8 @@
1
+ import { type AgentHandoff } from "../core/delegation.js";
2
+ /** Host boundary for durable dispatch and authenticated remote transport. */
3
+ export declare function createAgentDelegationTransport(fetcher?: typeof fetch): {
4
+ fetch: typeof fetch;
5
+ transport: (fetcher: typeof fetch) => typeof fetch;
6
+ receive<T>(headers: Headers, trusted: (handoff: AgentHandoff) => boolean, execute: (handoff?: AgentHandoff) => T): T;
7
+ resume<T>(stored: AgentHandoff, execute: (handoff: AgentHandoff) => T): T;
8
+ };
@@ -0,0 +1,15 @@
1
+ import type { ContentPart, Usage } from "../core/types.js";
2
+ interface Result {
3
+ usage: {
4
+ inputTokens?: number;
5
+ outputTokens?: number;
6
+ inputTokenDetails?: {
7
+ cacheReadTokens?: number;
8
+ cacheWriteTokens?: number;
9
+ };
10
+ };
11
+ content: readonly unknown[];
12
+ }
13
+ export declare function modelUsage(usage: Result["usage"]): Usage;
14
+ export declare function modelContent(content: Result["content"]): readonly ContentPart[];
15
+ export {};
@@ -0,0 +1,14 @@
1
+ import type { Telemetry } from "ai";
2
+ import type { AgentTracing, TurnInput } from "../agent-tracing.js";
3
+ export interface AiSdkTelemetryOptions {
4
+ /** The turn a generation records. Called once per AI SDK call. */
5
+ readonly turn: TurnInput | ((call: {
6
+ readonly callId: string;
7
+ }) => TurnInput);
8
+ }
9
+ /**
10
+ * An AI SDK telemetry integration that records each generation as a turn.
11
+ * Pass it to `telemetry.integrations` of `generateText`, `streamText`, or an
12
+ * agent such as `HarnessAgent`.
13
+ */
14
+ export declare function aiSdkTelemetry(tracing: AgentTracing, options: AiSdkTelemetryOptions): Telemetry;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Id generator shared by `registerOTel` and the agent OTel provider. A span
2
+ * ID generator installed by the host OTel provider for reserved-ID emission. A span
3
3
  * whose lifetime crosses durable worker boundaries (`invoke_agent`) is emitted
4
4
  * at its terminal; priming the next span id lets that span carry the
5
5
  * pre-allocated id its descendants already parented to.
@@ -0,0 +1,33 @@
1
+ import { type Context as OtelContext, type TracerProvider } from "#compiled/@opentelemetry/api/index.js";
2
+ import { AgentSpanIdGenerator } from "./otel-ids.js";
3
+ import type { Attributes, AgentTelemetry, OutputMapping, ActiveOperation } from "../core/types.js";
4
+ type Context = OtelContext;
5
+ export declare function withErrorContent<T extends {
6
+ setValue(key: symbol, value: unknown): T;
7
+ }>(context: T, allowed: boolean): T;
8
+ export declare function activeTraceOperation(host?: Pick<Context, "getValue">): ActiveOperation | undefined;
9
+ export interface OtelTelemetryOptions {
10
+ /** Defaults to the global tracer provider. */
11
+ readonly provider?: TracerProvider;
12
+ /**
13
+ * Generator installed on `provider`. Required for durable tracing so a span
14
+ * started in a later process carries the ID its children already reference.
15
+ */
16
+ readonly idGenerator?: AgentSpanIdGenerator;
17
+ /** Defaults to recording every trace. */
18
+ readonly samplesTrace?: (traceId: string, operation: {
19
+ name: string;
20
+ attributes: Attributes;
21
+ }) => boolean;
22
+ /** Replaces the default mapping, which adds `vercel.session_id` on Vercel. */
23
+ readonly mapping?: OutputMapping;
24
+ readonly tracerName?: string;
25
+ /** Recorded as the spans' instrumentation scope version. */
26
+ readonly tracerVersion?: string;
27
+ /** Override the provider's lifecycle, for example to flush metric readers too. */
28
+ readonly forceFlush?: () => Promise<void>;
29
+ readonly shutdown?: () => Promise<void>;
30
+ }
31
+ /** OpenTelemetry implementation of {@link AgentTelemetry}. */
32
+ export declare function otelTelemetry(options?: OtelTelemetryOptions): AgentTelemetry;
33
+ export {};
@@ -7,14 +7,18 @@
7
7
  */
8
8
  /** Content attributes are capped so a giant payload cannot bloat a span segment. */
9
9
  export declare const CONTENT_ATTRIBUTE_LIMIT: number;
10
+ import type { ContentSerializer } from "../core/types.js";
11
+ export declare const aiSdkContentSerializer: ContentSerializer;
12
+ export declare function telemetryByteLength(text: string): number;
13
+ export declare function truncateTelemetryText(text: string, maxBytes: number): string;
14
+ export declare function boundedPrincipalId(value: unknown): string | undefined;
15
+ export declare function boundedTraceError(value: Error): Error;
10
16
  /** Serializes one payload value as capped JSON. */
11
17
  export declare function contentAttribute(value: unknown): string | undefined;
12
18
  /** Serializes model messages using the OpenTelemetry GenAI message schema. */
13
- export declare function genAiInputMessagesAttribute(messages: unknown): string | undefined;
19
+ export declare function genAiInputMessagesAttribute(messages: unknown, messageKind?: (value: unknown) => string | undefined): string | undefined;
14
20
  /** Serializes the system prompt using the OpenTelemetry GenAI instruction schema. */
15
21
  export declare function genAiSystemInstructionsAttribute(instructions: unknown): string | undefined;
16
- /** Serializes tool definitions, dropping trailing entries to keep the JSON whole. */
17
- export declare function genAiToolDefinitionsAttribute(tools: unknown): string | undefined;
18
22
  /** Serializes one model response using the OpenTelemetry GenAI message schema. */
19
23
  export declare function genAiOutputMessagesAttribute(content: readonly unknown[], finishReason: string): string | undefined;
20
24
  /** Serializes memory records using the OpenTelemetry GenAI memory-records schema. */
@@ -26,5 +30,7 @@ export declare function genAiMemoryRecordsAttribute(records: readonly unknown[])
26
30
  * instead of cutting the JSON mid-string.
27
31
  */
28
32
  export declare function toolResultsContentAttribute(results: readonly Record<string, unknown>[]): string | undefined;
33
+ /** Serializes tool definitions, dropping trailing entries to keep the JSON whole. */
34
+ export declare function genAiToolDefinitionsAttribute(tools: unknown): string | undefined;
29
35
  /** Caps plain text, marking the cut. */
30
36
  export declare function textContentAttribute(text: string): string | undefined;
@@ -0,0 +1,84 @@
1
+ import { type TurnOperation } from "./operations.js";
2
+ import type { AgentTelemetry, Attributes, CaptureDecision, ContentSerializer, ExecutionContext, FrameworkIdentity, RunIdentity, TraceCheckpointer, TraceErrorHandler, TraceLink, TraceReference } from "./core/types.js";
3
+ export interface AgentTracingOptions {
4
+ /** Span output and context propagation. Defaults to the global OpenTelemetry provider. */
5
+ readonly telemetry?: AgentTelemetry;
6
+ /**
7
+ * Makes turns durable. Each in-flight turn is saved under a library-chosen
8
+ * key and removed when the turn and its open tool calls complete. Calling
9
+ * `turn()` again with the same identity, in this or a later process,
10
+ * continues the saved turn.
11
+ */
12
+ readonly checkpointer?: TraceCheckpointer;
13
+ /** Defaults to the AI SDK content serializer. */
14
+ readonly serializer?: ContentSerializer;
15
+ readonly onError?: TraceErrorHandler;
16
+ }
17
+ export interface TurnInput {
18
+ readonly identity: RunIdentity;
19
+ /** Names the invocation span. Omit for an anonymous agent. */
20
+ readonly agentName?: string;
21
+ readonly sequence: number;
22
+ readonly framework?: FrameworkIdentity;
23
+ readonly capture?: CaptureDecision;
24
+ readonly attributes?: Attributes;
25
+ /**
26
+ * Adopts a trace and span ID reserved before the turn started, such as one
27
+ * already returned to a caller. Requires telemetry with stable `ids`.
28
+ */
29
+ readonly reference?: TraceReference;
30
+ /**
31
+ * Nests the turn under a caller's span in the caller's trace. A local
32
+ * handoff sets this for the first turn; remote callees start their own trace.
33
+ */
34
+ readonly parent?: TraceReference;
35
+ readonly links?: readonly TraceLink[];
36
+ readonly startTimeMs?: number;
37
+ /** Delegation lineage recorded by the host, when it is not carried by a handoff. */
38
+ readonly lineage?: {
39
+ readonly parentRunId?: string;
40
+ readonly parentCallId?: string;
41
+ readonly agentName?: string;
42
+ };
43
+ readonly channel?: {
44
+ readonly kind?: string;
45
+ readonly origin?: string;
46
+ };
47
+ /** Host context for spans this process starts, such as OpenTelemetry baggage. */
48
+ readonly context?: ExecutionContext;
49
+ }
50
+ export interface ResumeInput {
51
+ readonly identity: RunIdentity;
52
+ readonly context?: ExecutionContext;
53
+ }
54
+ interface MemoryInput<T> {
55
+ identity: RunIdentity;
56
+ storeId: string;
57
+ slot: string;
58
+ phase: string;
59
+ capture?: CaptureDecision;
60
+ /** Defaults to the active operation. */
61
+ parent?: TraceReference;
62
+ context?: ExecutionContext;
63
+ describe?: (value: T) => {
64
+ recordCount?: number;
65
+ records?: readonly {
66
+ id?: string;
67
+ content: string;
68
+ }[];
69
+ };
70
+ }
71
+ export interface AgentTracing {
72
+ turn: import("./operations.js").WrappedOperation<TurnInput, TurnOperation>;
73
+ /** Returns a saved durable turn, without starting one. */
74
+ resume(input: ResumeInput): Promise<TurnOperation | undefined>;
75
+ memory: AgentMemoryTracing;
76
+ forceFlush(): Promise<void>;
77
+ shutdown(): Promise<void>;
78
+ }
79
+ export interface AgentMemoryTracing {
80
+ search<T>(data: MemoryInput<T>, execute: () => T | PromiseLike<T>): Promise<T>;
81
+ write<T>(data: MemoryInput<T>, execute: () => T | PromiseLike<T>): Promise<T>;
82
+ }
83
+ export declare function createAgentTracing(input: AgentTracingOptions): AgentTracing;
84
+ export {};
@@ -0,0 +1,7 @@
1
+ /**
2
+ * AI SDK integration. `aiSdkTelemetry` records `generateText`, `streamText`,
3
+ * and AI SDK agents as turns; `modelUsage` and `modelContent` convert AI SDK
4
+ * payloads for hosts that record model calls themselves.
5
+ */
6
+ export { aiSdkTelemetry, type AiSdkTelemetryOptions } from "./adapters/ai-sdk-telemetry.js";
7
+ export { modelUsage, modelContent } from "./adapters/ai-sdk-payload.js";
@@ -0,0 +1 @@
1
+ function e(e){return Object.freeze({inputTokens:e.inputTokens,outputTokens:e.outputTokens,inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens})})}function t(e){return e.flatMap(e=>{if(typeof e!=`object`||!e||!(`type`in e))return[];let t=e;if((t.type===`text`||t.type===`reasoning`)&&typeof t.text==`string`)return[{type:t.type,text:t.text}];if(typeof t.toolCallId!=`string`||typeof t.toolName!=`string`)return[];let n={callId:t.toolCallId,toolName:t.toolName,input:t.input};return t.type===`tool-call`?[{type:t.type,...n}]:t.type===`tool-result`?[{type:t.type,...n,output:t.output}]:t.type===`tool-error`?[{type:t.type,...n,error:t.error}]:[]})}const n={outcome:`abandoned`};function r(r,i){let a=new Map;function o(e){let t=a.get(e);return t===void 0&&(t={startTimeMs:Date.now(),tools:new Map},a.set(e,t)),t}async function s(e,t){let r=t===void 0?n:{outcome:`abandoned`,failed:!0,error:t};await(await e.model)?.complete(r);for(let t of e.tools.values())await(await t).complete(r);e.model=void 0,e.tools.clear();let i=await e.attempt;e.attempt=void 0,t===void 0?await i?.complete():await i?.fail(t)}async function c(e,t,n){let r=a.get(e);if(a.delete(e),r===void 0)return;await s(r,n);let i=await r.turn;i!==void 0&&await t(i)}return{onStart(e){o(e.callId)},async onStepStart(e){let t=o(e.callId);await s(t),t.turn??=r.turn({startTimeMs:t.startTimeMs,...typeof i.turn==`function`?i.turn({callId:e.callId}):i.turn}),t.attempt=(await t.turn).attempt({stepIndex:e.stepNumber,attempt:0})},async onLanguageModelCallStart(e){let t=await a.get(e.callId)?.attempt;t!==void 0&&(a.get(e.callId).model=t.modelCall({provider:e.provider,modelId:e.modelId,messages:e.messages,instructions:e.instructions,tools:e.tools}))},async executeLanguageModelCall({callId:e,execute:t}){let n=await a.get(e)?.model;if(n===void 0||n.finished)return t();try{return await n.run(t)}catch(e){throw await n.fail(e),e}},async onLanguageModelCallEnd(n){let r=a.get(n.callId),i=await r?.model;r!==void 0&&i!==void 0&&(r.model=void 0,await i.complete({outcome:`completed`,result:{finishReason:n.finishReason,usage:e(n.usage),responseId:n.responseId,responseModelId:n.modelId,content:t(n.content)}}))},async onToolExecutionStart(e){let t=a.get(e.callId),n=await t?.attempt;if(t===void 0||n===void 0)return;let r=e.toolCall;t.tools.set(r.toolCallId,n.tool({callId:r.toolCallId,name:r.toolName,arguments:r.input}))},async executeTool({callId:e,toolCallId:t,execute:n}){let r=await a.get(e)?.tools.get(t);return r===void 0||r.finished?n():r.run(n)},async onToolExecutionEnd(e){let t=a.get(e.callId),n=await t?.tools.get(e.toolCall.toolCallId);if(t===void 0||n===void 0)return;t.tools.delete(e.toolCall.toolCallId);let r=e.toolOutput,i=r.type===`tool-error`?{outcome:`failed`,errorType:r.error instanceof Error?r.error.name:`tool_error`,error:r.error}:{outcome:`completed`,output:`output`in r?r.output:void 0};await n.complete(i)},async onStepEnd(e){let t=a.get(e.callId);t!==void 0&&await s(t)},async onEnd(t){await c(t.callId,n=>n.complete({outcome:`completed`,usage:`totalUsage`in t?e(t.totalUsage):void 0}))},async onAbort(e){await c(e.callId,e=>e.complete({outcome:`cancelled`}))},async onError(e){let{callId:t,error:n}=typeof e==`object`&&e&&`callId`in e&&`error`in e?e:{callId:void 0,error:e};for(let e of t===void 0?[...a.keys()]:[t])await c(e,e=>e.fail(n),n)}}}export{r as aiSdkTelemetry,t as modelContent,e as modelUsage};
@@ -0,0 +1,5 @@
1
+ import type { CaptureDecision } from "./core/types.js";
2
+ export declare function currentCapture(): CaptureDecision | undefined;
3
+ export declare function withCapture<T extends {
4
+ setValue(key: symbol, value: unknown): T;
5
+ }>(host: T, capture: CaptureDecision): T;
@@ -0,0 +1,3 @@
1
+ import type { ActiveOperation, CaptureDecision } from "./types.js";
2
+ export declare function intersectCapture(capture: CaptureDecision, ceiling?: CaptureDecision): CaptureDecision;
3
+ export declare function activeOperation(operation: ActiveOperation, capture: CaptureDecision): ActiveOperation;
@@ -0,0 +1,14 @@
1
+ import type { Attributes, FrameworkIdentity, RunIdentity, Usage } from "./types.js";
2
+ export declare const USAGE_FIELDS: {
3
+ readonly costUsd: "agent.usage.cost_usd";
4
+ readonly inputTokens: "agent.usage.input_tokens";
5
+ readonly outputTokens: "agent.usage.output_tokens";
6
+ readonly cacheReadTokens: "agent.usage.cache_read_tokens";
7
+ readonly cacheWriteTokens: "agent.usage.cache_write_tokens";
8
+ };
9
+ export declare function identityAttributes(identity: Pick<RunIdentity, "runId" | "conversationId">): Attributes;
10
+ export declare function namingAttributes(name: string, operation?: string): Attributes;
11
+ export declare function frameworkAttributes(framework?: FrameworkIdentity): Attributes;
12
+ /** Invocation and model spans use GenAI token counts; structural spans use eve's. */
13
+ export declare function usageAttributes(usage: Usage, genAi?: boolean): Attributes;
14
+ export declare function runtimeContextAttributes(input: Readonly<Record<string, unknown>> | undefined): Attributes;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Which span attributes carry conversation content, and in which direction.
3
3
  *
4
- * Two vocabularies land on the same spans: the ones eve sets on its own
4
+ * Two vocabularies land on the same spans: the ones the library sets on its own
5
5
  * `agent.*` spans, and the ones the AI SDK's OpenTelemetry integration sets on
6
6
  * the model-call spans beneath them. A destination that declined content has to
7
7
  * be rid of both, so both are listed here rather than in the module that writes
@@ -0,0 +1,3 @@
1
+ import type { ActiveOperation, AgentTelemetry, ExecutionContext } from "./types.js";
2
+ /** Runs `execute` exactly once, even when the telemetry cannot enter the context. */
3
+ export declare function runTraceContext<T>(telemetry: Pick<AgentTelemetry, "run" | "suppressed">, operation: ActiveOperation, execute: () => T, host?: ExecutionContext): T;
@@ -0,0 +1,13 @@
1
+ import type { CaptureDecision, TraceReference } from "./types.js";
2
+ export interface AgentHandoff {
3
+ readonly caller: TraceReference;
4
+ readonly conversationId: string;
5
+ readonly parentRunId: string;
6
+ readonly parentCallId: string;
7
+ readonly agentName: string;
8
+ readonly capture: CaptureDecision;
9
+ /** Set when the handoff crossed a process boundary; the callee then starts its own trace. */
10
+ readonly remote?: boolean;
11
+ }
12
+ export declare const currentAgentHandoff: () => AgentHandoff | undefined;
13
+ export declare function withAgentHandoff<T>(handoff: AgentHandoff, execute: () => T): T;
@@ -0,0 +1,24 @@
1
+ import type { Attributes } from "./types.js";
2
+ import type { ContentSerializer } from "./types.js";
3
+ export interface McpUpdate {
4
+ readonly connectionName?: string;
5
+ readonly method?: string;
6
+ readonly toolName?: string;
7
+ readonly protocolVersion?: string;
8
+ readonly requestId?: string;
9
+ readonly sessionId?: string;
10
+ readonly statusCode?: string | number;
11
+ }
12
+ export interface McpLifecycle {
13
+ update(input: McpUpdate): void;
14
+ error(error?: unknown, type?: string): void;
15
+ arguments(value: unknown): void;
16
+ result(value: unknown): void;
17
+ }
18
+ export declare function mcpLifecycle(input: {
19
+ readonly write: (attributes: Attributes) => void;
20
+ readonly error: (error?: unknown, type?: string) => void;
21
+ readonly serializer: ContentSerializer;
22
+ readonly recordInputs: boolean;
23
+ readonly recordOutputs: boolean;
24
+ }): McpLifecycle;