eve 0.47.3 → 0.47.5

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 (178) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/bin/eve.js +4 -0
  3. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  4. package/dist/src/compiled/.vendor-stamp.json +1 -1
  5. package/dist/src/compiled/@opentelemetry/api/index.d.ts +37 -0
  6. package/dist/src/compiled/@vercel/otel/index.d.ts +11 -0
  7. package/dist/src/compiler/extension-compatibility.d.ts +7 -5
  8. package/dist/src/compiler/extension-compatibility.js +1 -1
  9. package/dist/src/compiler/manifest.d.ts +14 -2
  10. package/dist/src/compiler/manifest.js +1 -1
  11. package/dist/src/compiler/normalize-connection.d.ts +9 -2
  12. package/dist/src/compiler/normalize-connection.js +1 -1
  13. package/dist/src/compiler/normalize-manifest.js +1 -1
  14. package/dist/src/compiler/validate-artifact.js +1 -1
  15. package/dist/src/context/dynamic-connection-lifecycle.d.ts +9 -0
  16. package/dist/src/context/dynamic-connection-lifecycle.js +1 -0
  17. package/dist/src/context/keys.d.ts +3 -1
  18. package/dist/src/context/memory-tools.js +1 -1
  19. package/dist/src/context/providers/connection.js +1 -1
  20. package/dist/src/dynamic/definition.d.ts +6 -3
  21. package/dist/src/dynamic/definition.js +1 -1
  22. package/dist/src/execution/authorization-callback-match.js +1 -1
  23. package/dist/src/execution/cancelled-turn-message.d.ts +2 -0
  24. package/dist/src/execution/cancelled-turn-message.js +1 -0
  25. package/dist/src/execution/dynamic-connections.d.ts +9 -0
  26. package/dist/src/execution/dynamic-connections.js +1 -0
  27. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  28. package/dist/src/execution/node-step.d.ts +2 -0
  29. package/dist/src/execution/node-step.js +1 -1
  30. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  31. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  32. package/dist/src/execution/tools/connection-search.js +2 -2
  33. package/dist/src/execution/tools/load-skill.js +1 -1
  34. package/dist/src/execution/tools/subagent/local.js +1 -1
  35. package/dist/src/execution/turn-workflow.js +1 -1
  36. package/dist/src/execution/workflow-runtime.js +1 -1
  37. package/dist/src/execution/workflow-steps.js +1 -1
  38. package/dist/src/execution/workflow-trace-context.d.ts +3 -6
  39. package/dist/src/execution/workflow-trace-context.js +1 -1
  40. package/dist/src/harness/authorization.d.ts +11 -4
  41. package/dist/src/harness/authorization.js +1 -1
  42. package/dist/src/harness/inline-tool-authorization.d.ts +13 -1
  43. package/dist/src/harness/inline-tool-authorization.js +1 -1
  44. package/dist/src/harness/model-call-error.js +1 -1
  45. package/dist/src/harness/semantic-errors/rule.d.ts +5 -2
  46. package/dist/src/harness/semantic-errors/rules/gateway.js +1 -1
  47. package/dist/src/harness/tool-loop.js +2 -2
  48. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  49. package/dist/src/harness/types.d.ts +2 -2
  50. package/dist/src/{harness → instrumentation}/ai-sdk-hook-bridge.d.ts +1 -1
  51. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -0
  52. package/dist/src/{harness/channel-delivery-instrumentation.d.ts → instrumentation/channel-delivery.d.ts} +5 -7
  53. package/dist/src/instrumentation/channel-delivery.js +1 -0
  54. package/dist/src/{harness/instrumentation → instrumentation}/config.d.ts +0 -10
  55. package/dist/src/instrumentation/config.js +1 -0
  56. package/dist/src/{harness/instrumentation → instrumentation}/content-policy.d.ts +1 -1
  57. package/dist/src/instrumentation/content-policy.js +1 -0
  58. package/dist/src/{harness/instrumentation → instrumentation}/content.d.ts +1 -1
  59. package/dist/src/{harness/instrumentation → instrumentation}/dispatch.d.ts +1 -1
  60. package/dist/src/instrumentation/dispatch.js +1 -0
  61. package/dist/src/{harness/instrumentation → instrumentation}/lifecycle.d.ts +26 -33
  62. package/dist/src/instrumentation/lifecycle.js +1 -0
  63. package/dist/src/{harness/instrumentation → instrumentation}/native-events.d.ts +1 -1
  64. package/dist/src/instrumentation/native-events.js +1 -0
  65. package/dist/src/{harness → instrumentation}/parent-lineage.d.ts +1 -1
  66. package/dist/src/{harness → instrumentation}/prepare-trace-context.d.ts +8 -5
  67. package/dist/src/instrumentation/prepare-trace-context.js +1 -0
  68. package/dist/src/instrumentation/provider.d.ts +13 -9
  69. package/dist/src/{harness/instrumentation → instrumentation}/providers.d.ts +1 -1
  70. package/dist/src/instrumentation/providers.js +1 -0
  71. package/dist/src/{harness/instrumentation → instrumentation}/runtime-context.d.ts +13 -2
  72. package/dist/src/instrumentation/runtime-context.js +1 -0
  73. package/dist/src/instrumentation/runtime.d.ts +100 -0
  74. package/dist/src/instrumentation/runtime.js +1 -0
  75. package/dist/src/{harness/instrumentation → instrumentation}/state.d.ts +2 -11
  76. package/dist/src/internal/application/compiled-artifacts.js +3 -3
  77. package/dist/src/internal/application/package.js +1 -1
  78. package/dist/src/internal/authored-definition/connection.js +1 -1
  79. package/dist/src/internal/instrumentation.d.ts +1 -1
  80. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +4 -6
  81. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  82. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  83. package/dist/src/public/channels/slack/defaults.js +6 -3
  84. package/dist/src/public/channels/slack/index.d.ts +1 -1
  85. package/dist/src/public/channels/slack/interactions.d.ts +8 -5
  86. package/dist/src/public/channels/slack/interactions.js +1 -1
  87. package/dist/src/public/channels/slack/slackChannel.d.ts +66 -1
  88. package/dist/src/public/channels/slack/slash-command.d.ts +9 -0
  89. package/dist/src/public/channels/slack/slash-command.js +1 -0
  90. package/dist/src/public/connections/index.d.ts +2 -0
  91. package/dist/src/public/connections/index.js +1 -1
  92. package/dist/src/public/definitions/connections/dynamic.d.ts +23 -0
  93. package/dist/src/public/definitions/connections/dynamic.js +1 -0
  94. package/dist/src/public/definitions/connections/mcp.d.ts +8 -0
  95. package/dist/src/public/definitions/connections/openapi.d.ts +8 -0
  96. package/dist/src/public/definitions/connections/protocol.d.ts +6 -0
  97. package/dist/src/public/definitions/connections/protocol.js +1 -1
  98. package/dist/src/runtime/connections/authorization-tokens.d.ts +11 -10
  99. package/dist/src/runtime/connections/instance-identity.d.ts +12 -0
  100. package/dist/src/runtime/connections/instance-identity.js +1 -0
  101. package/dist/src/runtime/connections/mcp-client.js +1 -1
  102. package/dist/src/runtime/connections/registry.d.ts +2 -0
  103. package/dist/src/runtime/connections/registry.js +1 -1
  104. package/dist/src/runtime/connections/scoped-authorization.d.ts +10 -6
  105. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  106. package/dist/src/runtime/resolve-agent.js +1 -1
  107. package/dist/src/runtime/resolve-connection.d.ts +5 -0
  108. package/dist/src/runtime/resolve-connection.js +1 -1
  109. package/dist/src/runtime/resolve-dynamic-connection.d.ts +5 -0
  110. package/dist/src/runtime/resolve-dynamic-connection.js +1 -0
  111. package/dist/src/runtime/types.d.ts +11 -0
  112. package/dist/src/setup/flows/registry.js +1 -1
  113. package/dist/src/setup/scaffold/create/project.js +1 -1
  114. package/dist/src/shared/trace-policy.d.ts +20 -0
  115. package/dist/src/shared/trace-policy.js +1 -0
  116. package/dist/src/tracing/agent-action-instrumentation.d.ts +1 -1
  117. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  118. package/dist/src/tracing/agent-approval-instrumentation.d.ts +1 -1
  119. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +1 -1
  120. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  121. package/dist/src/tracing/agent-otel-provider.d.ts +2 -2
  122. package/dist/src/tracing/agent-otel-provider.js +2 -2
  123. package/dist/src/tracing/agent-otel-runtime-context.d.ts +5 -0
  124. package/dist/src/tracing/agent-otel-runtime-context.js +1 -0
  125. package/dist/src/tracing/agent-otel-session-context.d.ts +1 -1
  126. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  127. package/dist/src/tracing/agent-otel-usage.d.ts +4 -2
  128. package/dist/src/tracing/agent-otel-usage.js +1 -1
  129. package/dist/src/tracing/agent-span-id-generator.d.ts +1 -1
  130. package/dist/src/tracing/agent-tool-instrumentation.d.ts +1 -1
  131. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  132. package/dist/src/tracing/agent-trace-context-store.d.ts +3 -0
  133. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  134. package/dist/src/tracing/agent-trace-context.d.ts +3 -0
  135. package/dist/src/tracing/agent-trace-context.js +1 -0
  136. package/dist/src/tracing/agent-trace-state.d.ts +8 -1
  137. package/dist/src/tracing/agent-trace-state.js +1 -1
  138. package/dist/src/tracing/install-instrumentation-runtime.d.ts +3 -2
  139. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  140. package/dist/src/tracing/local-instrumentation-runtime.d.ts +1 -1
  141. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  142. package/dist/src/tracing/local-trace-reader.d.ts +1 -0
  143. package/dist/src/tracing/local-trace-reader.js +1 -1
  144. package/dist/src/tracing/otel-declaration.d.ts +13 -16
  145. package/dist/src/tracing/otel-declaration.js +1 -1
  146. package/dist/src/tracing/otel-registration.js +1 -1
  147. package/dist/src/tracing/sampled-trace.d.ts +1 -14
  148. package/dist/src/tracing/sampled-trace.js +1 -1
  149. package/docs/channels/slack.mdx +25 -5
  150. package/docs/connections/overview.mdx +46 -2
  151. package/docs/extensions.md +2 -2
  152. package/docs/getting-started.mdx +1 -1
  153. package/docs/guides/dynamic-capabilities.md +91 -5
  154. package/docs/memory.md +7 -4
  155. package/docs/reference/cli.md +4 -4
  156. package/docs/reference/typescript-api.md +32 -23
  157. package/package.json +1 -1
  158. package/dist/src/execution/subagent-usage-span.d.ts +0 -9
  159. package/dist/src/execution/subagent-usage-span.js +0 -1
  160. package/dist/src/harness/ai-sdk-hook-bridge.js +0 -1
  161. package/dist/src/harness/channel-delivery-instrumentation.js +0 -1
  162. package/dist/src/harness/instrumentation/config.js +0 -1
  163. package/dist/src/harness/instrumentation/content-policy.js +0 -1
  164. package/dist/src/harness/instrumentation/dispatch.js +0 -1
  165. package/dist/src/harness/instrumentation/lifecycle.js +0 -1
  166. package/dist/src/harness/instrumentation/native-events.js +0 -1
  167. package/dist/src/harness/instrumentation/providers.js +0 -1
  168. package/dist/src/harness/instrumentation/runtime-context.js +0 -1
  169. package/dist/src/harness/instrumentation/runtime.d.ts +0 -21
  170. package/dist/src/harness/instrumentation/runtime.js +0 -1
  171. package/dist/src/harness/prepare-trace-context.js +0 -1
  172. /package/dist/src/{harness → instrumentation}/ai-sdk-telemetry.d.ts +0 -0
  173. /package/dist/src/{harness → instrumentation}/ai-sdk-telemetry.js +0 -0
  174. /package/dist/src/{harness/instrumentation → instrumentation}/content.js +0 -0
  175. /package/dist/src/{harness → instrumentation}/parent-lineage.js +0 -0
  176. /package/dist/src/{harness/instrumentation → instrumentation}/setup-context.d.ts +0 -0
  177. /package/dist/src/{harness/instrumentation → instrumentation}/setup-context.js +0 -0
  178. /package/dist/src/{harness/instrumentation → instrumentation}/state.js +0 -0
package/docs/memory.md CHANGED
@@ -29,12 +29,15 @@ recall and maintain memory:
29
29
  | Provider | Status | Use it for |
30
30
  | --------------- | -------------- | ------------------------------------------------------------------------- |
31
31
  | `fileMemory()` | Built into eve | A bounded, model-maintained list of durable facts and preferences |
32
- | Supermemory | Coming soon | The first third-party implementation of the eve provider contract |
32
+ | Supermemory | Third-party | Semantic recall, automatic capture, source extraction, and memory tools |
33
33
  | Custom provider | Supported | Application-specific retrieval, capture, retention, or model-facing tools |
34
34
 
35
- Supermemory is building the first third-party provider for eve. It is not
36
- available yet; until it is released, use `fileMemory()` or implement the
37
- provider contract described below.
35
+ [Supermemory](https://github.com/supermemoryai/eve-supermemory#readme) is a
36
+ third-party provider that recalls relevant context before each turn, captures
37
+ completed turns, and supplies search, memory-management, and source-extraction
38
+ tools. Add it with `eve add memory/supermemory`. It requires a Supermemory API
39
+ key and a memory scope you choose; review its retention and data handling before
40
+ sending sensitive content to the service.
38
41
 
39
42
  ## Use file memory
40
43
 
@@ -294,15 +294,15 @@ eve traces --json # dump the full trace as JSON
294
294
 
295
295
  Reads the immutable OTLP/JSON segments under `.eve/traces/v1`, so `eve dev` need not be running. Accepts a full trace id, an `agent.session.id`, or an unambiguous prefix of either. Malformed segments are skipped without hiding valid spans from the same trace.
296
296
 
297
- Span rows carry inline metrics when the span recorded them — `↑input`/`↓output` token counts, gateway cost, and the tool name for `ai.toolCall` spans — and the header aggregates models, token totals, cost, and error count across the trace's step spans. `--verbose` expands each span under its tree row: status (with the error message on failures), timing, ids, every attribute (prompts, responses, and tool payloads as transcripts or pretty-printed JSON), and every span event with its offset from span start. `--json` prints the same records as JSON, one object per selected trace.
297
+ Span rows carry inline metrics when the span recorded them — `↑input`/`↓output` token counts, gateway cost, and the tool name for `execute_tool` spans — and the header aggregates models, token totals, cost, and error count across the trace's step spans. `--verbose` expands each span under its tree row: status (with the error message on failures), timing, ids, every attribute (prompts, responses, and tool payloads as transcripts or pretty-printed JSON), and every span event with its offset from span start. `--json` prints the same records as JSON, one object per selected trace.
298
298
 
299
- A local subagent keeps its own session id but records into the parent trace. Its turn is parented to the `agent.action` span that dispatched it, so the span tree carries the relationship without duplicate lineage attributes; `agent.subagent.name` remains on the child turn as a standalone label. Either session id resolves to that trace. Remote agents propagate the parent trace context over `traceparent`.
299
+ A local subagent keeps its own session id but records into the parent trace. Its `invoke_agent` span is parented to the `agent.action` span that dispatched it, so the span tree carries the relationship without duplicate lineage attributes; `agent.subagent.name` remains on the child invocation as a standalone label. Either session id resolves to that trace. Remote agents propagate the parent trace context over `traceparent`.
300
300
 
301
301
  A durable session keeps one persisted trace context across turns and worker resumptions. Independently replayed attempts can still produce another trace; passing the session id shows every trace it produced, oldest first.
302
302
 
303
- Every span carries a real duration except `agent.session`: an idle session never closes, so it is recorded as a zero-duration marker and the span tree shows its descendant extent instead. A turn's span is written when the turn settles, so a running turn shows only its steps.
303
+ Every span carries a real duration except `agent.session`: an idle session never closes, so it is recorded as a zero-duration marker and the span tree shows its descendant extent instead. A turn's `invoke_agent` span is written when the turn settles, so a running turn shows only its steps.
304
304
 
305
- Model and tool-call spans omit their inputs and outputs by default. Set `EVE_TRACES_CONTENT=on` to capture system prompts, prompt messages, and response text for models, plus call arguments and results for tools. Each captured value is capped at 32 KB.
305
+ Model and `execute_tool` spans omit their inputs and outputs by default. Set `EVE_TRACES_CONTENT=on` to capture system prompts, prompt messages, and response text for models, plus call arguments and results for tools. Each captured value is capped at 32 KB.
306
306
 
307
307
  Step spans carry token counts, and cost when Vercel AI Gateway served the call. Both follow the [OTel GenAI semantic conventions](https://github.com/open-telemetry/semantic-conventions-genai) (`gen_ai.usage.*`), so a third-party backend reads them without mapping.
308
308
 
@@ -30,28 +30,28 @@ export default defineTool({
30
30
 
31
31
  ## The define\* helpers
32
32
 
33
- | Helper | Import from | Authored at | Guide |
34
- | ----------------------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------ |
35
- | `defineAgent` | `eve` | `agent/agent.ts` | [agent.ts](../agent-config) |
36
- | `defineTool` | `eve/tools` | `agent/tools/<name>.ts` | [Tools](../tools) |
37
- | `defineDynamic` | `eve`, `eve/tools`, `eve/skills`, `eve/instructions` | dynamic model or subagent `agent.ts`; `agent/{tools,skills,instructions}/` | [Dynamic capabilities](../guides/dynamic-capabilities) |
38
- | `defineMcpClientConnection` | `eve/connections` | `agent/connections/<name>.ts` | [MCP connections](../connections/mcp) |
39
- | `defineOpenAPIConnection` | `eve/connections` | `agent/connections/<name>.ts` | [OpenAPI connections](../connections/openapi) |
40
- | `defineChannel` | `eve/channels` | `agent/channels/<name>.ts` | [Custom channels](../channels/custom) |
41
- | `eveChannel`, `slackChannel`, and the other platforms | `eve/channels/<platform>` | `agent/channels/<platform>.ts` | [Channels](../channels/overview) |
42
- | `defineSkill` | `eve/skills` | `agent/skills/<name>.ts` | [Skills](../skills) |
43
- | `defineInstructions` | `eve/instructions` | `agent/instructions.ts` | [Instructions](../instructions) |
44
- | `defineMemory`, `defineMemoryProvider` | `eve/memory` | `agent/memory.ts` or `agent/memory/<slot>.ts` | [Memory](../memory) |
45
- | `defineHook` | `eve/hooks` | `agent/hooks/<slug>.ts` | [Hooks](../guides/hooks) |
46
- | `defineSchedule` | `eve/schedules` | `agent/schedules/<name>.ts` | [Schedules](../schedules) |
47
- | `defineState` | `eve/context` | tools, hooks, lifecycle | [Session context](../guides/session-context) |
48
- | `defineSandbox` | `eve/sandbox` | `agent/sandbox.ts` | [Sandbox](../sandbox) |
49
- | `defineInstrumentation` | `eve/instrumentation` | `agent/instrumentation.ts` | [instrumentation.ts](../guides/instrumentation) |
50
- | `defineRemoteAgent` | `eve` | `agent/subagents/<id>/agent.ts` | [Remote agents](../guides/remote-agents) |
51
- | `defineEval` | `eve/evals` | `evals/*.eval.ts` | [Evals](../evals/overview) |
52
- | `defineEvalConfig` | `eve/evals` | `evals/evals.config.ts` | [Evals](../evals/overview) |
53
- | `mockModel` | `eve/evals` | Deterministic fixture agent models | [Evals](../evals/overview) |
54
- | `useEveAgent` | `eve/react`, `eve/vue`, `eve/svelte` | frontend | [Frontend](../guides/frontend/overview) |
33
+ | Helper | Import from | Authored at | Guide |
34
+ | ----------------------------------------------------- | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------ |
35
+ | `defineAgent` | `eve` | `agent/agent.ts` | [agent.ts](../agent-config) |
36
+ | `defineTool` | `eve/tools` | `agent/tools/<name>.ts` | [Tools](../tools) |
37
+ | `defineDynamic` | `eve`, `eve/tools`, `eve/skills`, `eve/instructions`, `eve/connections` | dynamic model or subagent `agent.ts`; `agent/{tools,skills,instructions,connections}/` | [Dynamic capabilities](../guides/dynamic-capabilities) |
38
+ | `defineMcpClientConnection` | `eve/connections` | `agent/connections/<name>.ts` | [MCP connections](../connections/mcp) |
39
+ | `defineOpenAPIConnection` | `eve/connections` | `agent/connections/<name>.ts` | [OpenAPI connections](../connections/openapi) |
40
+ | `defineChannel` | `eve/channels` | `agent/channels/<name>.ts` | [Custom channels](../channels/custom) |
41
+ | `eveChannel`, `slackChannel`, and the other platforms | `eve/channels/<platform>` | `agent/channels/<platform>.ts` | [Channels](../channels/overview) |
42
+ | `defineSkill` | `eve/skills` | `agent/skills/<name>.ts` | [Skills](../skills) |
43
+ | `defineInstructions` | `eve/instructions` | `agent/instructions.ts` | [Instructions](../instructions) |
44
+ | `defineMemory`, `defineMemoryProvider` | `eve/memory` | `agent/memory.ts` or `agent/memory/<slot>.ts` | [Memory](../memory) |
45
+ | `defineHook` | `eve/hooks` | `agent/hooks/<slug>.ts` | [Hooks](../guides/hooks) |
46
+ | `defineSchedule` | `eve/schedules` | `agent/schedules/<name>.ts` | [Schedules](../schedules) |
47
+ | `defineState` | `eve/context` | tools, hooks, lifecycle | [Session context](../guides/session-context) |
48
+ | `defineSandbox` | `eve/sandbox` | `agent/sandbox.ts` | [Sandbox](../sandbox) |
49
+ | `defineInstrumentation` | `eve/instrumentation` | `agent/instrumentation.ts` | [instrumentation.ts](../guides/instrumentation) |
50
+ | `defineRemoteAgent` | `eve` | `agent/subagents/<id>/agent.ts` | [Remote agents](../guides/remote-agents) |
51
+ | `defineEval` | `eve/evals` | `evals/*.eval.ts` | [Evals](../evals/overview) |
52
+ | `defineEvalConfig` | `eve/evals` | `evals/evals.config.ts` | [Evals](../evals/overview) |
53
+ | `mockModel` | `eve/evals` | Deterministic fixture agent models | [Evals](../evals/overview) |
54
+ | `useEveAgent` | `eve/react`, `eve/vue`, `eve/svelte` | frontend | [Frontend](../guides/frontend/overview) |
55
55
 
56
56
  Tool-wide authoring helpers such as `defineTool`, `defineDynamic`, and `disableTool` come from `eve/tools`. Capability-specific definitions and helpers use their own subpaths (see [Built-in tools](../concepts/built-in-tools)): reusable definitions such as `bash` and `glob` come from `eve/tools/<name>`, `webSearch` comes from `eve/tools/web_search`, `experimental_workflow` comes from `eve/tools/workflow`, `sleep` comes from `eve/tools/sleep`, and approval policies and types come from `eve/tools/approval`. The route verbs `GET`/`HEAD`/`POST`/`PUT`/`PATCH`/`DELETE`/`OPTIONS`/`WS` plus `disableRoute` come from `eve/channels`, and the channel auth helpers `localDev`/`vercelOidc`/`placeholderAuth` come from `eve/channels/auth`.
57
57
 
@@ -59,6 +59,15 @@ Tool-wide authoring helpers such as `defineTool`, `defineDynamic`, and `disableT
59
59
 
60
60
  `defineInstructions` accepts `{ content: string, role?: "system" | "user" }`; omitted `role` means `"system"`. Its `eve/instructions` version of `defineDynamic` accepts only `session.started` and `turn.started` handlers returning `defineInstructions(...)` or `null`. The legacy `{ markdown: string }` definition remains available as a deprecated system-role form.
61
61
 
62
+ The `eve/connections` version of `defineDynamic` accepts `session.started` and
63
+ `turn.started` handlers returning one MCP or OpenAPI connection definition, a
64
+ map of connection definitions, or `null`. Its resolver context exposes
65
+ authenticated session identity and `channel.kind`, but not conversation history,
66
+ delivery payloads, tool inputs, model outputs, or free-form channel metadata. An
67
+ authenticated returned definition must set `instanceKey` to a stable,
68
+ non-secret account or tenant identifier so durable authorization resumes cannot
69
+ cross resolved instances.
70
+
62
71
  ## Authored module lifecycle
63
72
 
64
73
  eve evaluates TypeScript definition modules during compilation so it can validate and normalize the agent. Within one agent node, each module namespace loads at most once during that compile. The resolved definition then determines whether the module is also an entry in the runtime bundle:
@@ -107,7 +116,7 @@ import template from "../../prompts/template.txt?raw";
107
116
  | `eve/tools/web_search` | Provider-managed `webSearch` configuration |
108
117
  | `eve/tools/workflow` | Experimental `Workflow` tool definition |
109
118
  | `eve/tools/sleep` | Opt-in durable `sleep` tool |
110
- | `eve/connections` | `defineMcpClientConnection`, `defineOpenAPIConnection` |
119
+ | `eve/connections` | `defineMcpClientConnection`, `defineOpenAPIConnection`, `defineDynamic` |
111
120
  | `eve/channels` | `defineChannel`, `disableRoute`, route verbs |
112
121
  | `eve/channels/eve` | `eveChannel` |
113
122
  | `eve/channels/auth` | `localDev`, `vercelOidc`, `placeholderAuth` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.47.3",
3
+ "version": "0.47.5",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [
@@ -1,9 +0,0 @@
1
- import type { RuntimeActionResult } from "#shared/action-types.js";
2
- /**
3
- * Emits one caller-side `invoke_agent` span per successful delegated
4
- * subagent result that reports token usage, so the parent session's
5
- * observability can attribute a child agent's tokens. Runs in the
6
- * parent's turn step, so the span lands in the caller's trace.
7
- * Best-effort: a tracer failure never blocks the turn.
8
- */
9
- export declare function recordSubagentUsageSpans(results: readonly RuntimeActionResult[]): void;
@@ -1 +0,0 @@
1
- import{createLogger}from"#internal/logging.js";import{trace}from"#compiled/@opentelemetry/api/index.js";const log=createLogger(`execution.subagent-usage-span`);function recordSubagentUsageSpans(e){for(let t of e){if(t.kind!==`subagent-result`||t.isError===!0)continue;let e=t.usage;if(e!==void 0)try{trace.getTracer(`eve`).startSpan(`invoke_agent ${t.subagentName}`,{attributes:{"gen_ai.operation.name":`invoke_agent`,"gen_ai.agent.name":t.subagentName,"gen_ai.usage.input_tokens":e.inputTokens,"gen_ai.usage.output_tokens":e.outputTokens,"gen_ai.usage.cache_read.input_tokens":e.cacheReadTokens,"gen_ai.usage.cache_creation.input_tokens":e.cacheWriteTokens}}).end()}catch(e){log.warn(`failed to emit subagent usage span`,{error:e})}}}export{recordSubagentUsageSpans};
@@ -1 +0,0 @@
1
- import{attemptIdempotencyKey,modelCallIdempotencyKey,toolCallIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{structuralProviderMetadata}from"#harness/instrumentation/content.js";function createAiSdkHookBridge(i,a,o=directRunInContext,s){let c={capturesContent:a.capturesContent,modelKeys:new Map,runtimeContext:s!==void 0&&Object.keys(s).length>0?Object.freeze({...s}):void 0,scope:i,toolKeys:new Map};return{onStart(e){c.operation=Object.freeze({modelId:e.modelId,operationId:e.operationId,provider:e.provider})},async onStepStart(e){c.stepNumber=e.stepNumber;let t=toStepAttemptStarted(c);t!==void 0&&await a.publish(t)},async onLanguageModelCallStart(e){let n=modelCallIdempotencyKey(c.scope,c.stepNumber??0);c.modelKeys.set(e.callId,n);let r=toModelCallStarted(c,n,e);await a.publish(r)},executeLanguageModelCall({callId:e,execute:t}){let n=c.modelKeys.get(e);return n===void 0?t():o({idempotencyKey:n,scope:i,type:`model.call`},t)},async onLanguageModelCallEnd(e){let t=c.modelKeys.get(e.callId);if(t===void 0)return;c.modelKeys.delete(e.callId);let n=toModelCallCompleted(c,t,e);await a.publish(n)},async onStepEnd(t){if(t.providerMetadata===void 0)return;let n=c.capturesContent?t.providerMetadata:structuralProviderMetadata(t.providerMetadata);await a.publish(Object.freeze({idempotencyKey:attemptIdempotencyKey(c.scope),providerMetadata:n,scope:c.scope,type:`step.attempt.metadata`}))},async onToolExecutionStart(e){let t=toolCallIdempotencyKey(c.scope,e.toolCall.toolCallId,c.stepNumber??0);c.toolKeys.set(e.toolCall.toolCallId,t);let r=toToolCallStarted(c,t,e);await a.publish(r)},executeTool({toolCallId:e,execute:t}){let n=c.toolKeys.get(e);return n===void 0?t():o({idempotencyKey:n,scope:i,type:`tool.call`},t)},async onToolExecutionEnd(e){let t=e.toolCall.toolCallId,n=c.toolKeys.get(t);if(n===void 0)return;c.toolKeys.delete(t);let r=toToolCallCompleted(c,n,e);await a.publish(r)},async onAbort(e){await failOpenOperations(e.reason)},async onError(e){await failOpenOperations(e.error)}};async function failOpenOperations(e){let t=[];for(let n of c.modelKeys.values())t.push(a.publish(Object.freeze({error:e,idempotencyKey:n,scope:i,type:`model.call.failed`})));for(let n of c.toolKeys.values())t.push(a.publish(Object.freeze({error:e,idempotencyKey:n,scope:i,type:`tool.call.failed`})));c.modelKeys.clear(),c.toolKeys.clear(),await Promise.all(t)}}const directRunInContext=(e,t)=>t();function toStepAttemptStarted(t){if(!(t.operation===void 0||t.stepNumber===void 0))return Object.freeze({idempotencyKey:attemptIdempotencyKey(t.scope),operation:t.operation,runtimeContext:t.runtimeContext,scope:t.scope,type:`step.attempt.started`})}function toModelCallStarted(e,t,n){return Object.freeze({idempotencyKey:t,input:e.capturesContent?Object.freeze({instructions:n.instructions,messages:Object.freeze([...n.messages])}):void 0,model:Object.freeze({modelId:n.modelId,provider:n.provider}),runtimeContext:e.runtimeContext,scope:e.scope,type:`model.call.started`})}function toModelCallCompleted(e,t,n){return Object.freeze({content:e.capturesContent?toContentParts(n.content):void 0,finishReason:n.finishReason,idempotencyKey:t,scope:e.scope,type:`model.call.completed`,usage:toUsage(n.usage)})}function toUsage(e){return Object.freeze({inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens}),inputTokens:e.inputTokens,outputTokens:e.outputTokens})}function toContentParts(e){let t=[];for(let n of e)switch(n.type){case`text`:case`reasoning`:t.push(Object.freeze({text:n.text,type:n.type}));break;case`tool-call`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,toolName:n.toolName,type:`tool-call`}));break;case`tool-result`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,output:n.output,toolName:n.toolName,type:`tool-result`}));break;case`tool-error`:t.push(Object.freeze({callId:n.toolCallId,error:n.error,input:n.input,toolName:n.toolName,type:`tool-error`}));break;default:break}return Object.freeze(t)}function toToolCallStarted(e,t,n){return Object.freeze({callId:n.toolCall.toolCallId,idempotencyKey:t,input:e.capturesContent?n.toolCall.input:void 0,scope:e.scope,toolName:n.toolCall.toolName,type:`tool.call.started`})}function toToolCallCompleted(e,t,n){return Object.freeze({idempotencyKey:t,output:toToolOutput(n.toolOutput,e.capturesContent),scope:e.scope,type:`tool.call.completed`})}function toToolOutput(e,t){return e.type===`tool-result`?Object.freeze(t?{output:e.output,type:`result`}:{type:`result`}):Object.freeze(t?{error:e.error,type:`error`}:{type:`error`})}export{createAiSdkHookBridge};
@@ -1 +0,0 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ActiveChannelDeliveriesKey,ChannelInstrumentationKey,ParentTraceContextKey,SessionTraceSeedKey}from"#context/keys.js";import{channelDeliveryIdempotencyKey}from"#harness/instrumentation/lifecycle.js";async function instrumentChannelDelivery(r){if(!(`delivery`in r)){let e=r.ctx.get(ActiveChannelDeliveriesKey);if(e===void 0||r.hooks===void 0)return;let n=`channel.delivery.${r.outcome}`;for(let t of e)await r.hooks.publish({agentName:t.agentName,delivery:t.delivery,error:r.error,errorCode:r.errorCode,idempotencyKey:channelDeliveryIdempotencyKey(t.sessionId,t.delivery.deliveryId),outcome:r.outcome,rootSessionId:t.rootSessionId,sequence:r.includeTurn?t.sequence:void 0,sessionId:t.sessionId,turnId:r.includeTurn?t.turnId:void 0,type:n});r.ctx.delete(ActiveChannelDeliveriesKey);return}if(r.hooks===void 0||r.delivery.deliveryMetadata===void 0)return;let i=[],a=normalizeChannelAudience(r.ctx.get(ChannelInstrumentationKey)?.metadata.audience),o=r.hooks;for(let e of r.delivery.deliveryMetadata){let t=r.delivery.payloads[e.payloadIndex],n={channelAudience:a,channelKind:e.channelKind,channelName:e.channelName,deliveryId:e.deliveryId,requestId:e.requestId,requestTraceContext:e.requestTraceContext},s=!o?.capturesContent||t===void 0?void 0:projectDeliveryInput(t),c={agentName:r.agentName,delivery:n,rootSessionId:r.rootSessionId,sequence:r.sequence,sessionId:r.sessionId,turnId:r.turnId};i.push(c),await o?.publish({agentName:c.agentName,delivery:n,idempotencyKey:channelDeliveryIdempotencyKey(r.sessionId,n.deliveryId),input:s,parentTraceContext:r.ctx.get(ParentTraceContextKey),rootSessionId:r.rootSessionId,sessionId:r.sessionId,traceSeed:r.ctx.get(SessionTraceSeedKey),type:`channel.delivery.started`})}i.length>0&&r.ctx.set(ActiveChannelDeliveriesKey,i)}function projectDeliveryInput(e){let t={};return e.context!==void 0&&(t.context=e.context),e.message!==void 0&&(t.message=e.message),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.inputResponses!==void 0&&(t.inputResponses=e.inputResponses.map(e=>{let t={};return e.optionId!==void 0&&(t.optionId=e.optionId),e.text!==void 0&&(t.text=e.text),t})),t}function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}export{channelDeliveryErrorCode,instrumentChannelDelivery};
@@ -1 +0,0 @@
1
- import{registerInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{createInstrumentationHooks}from"#harness/instrumentation/lifecycle.js";import{createInstrumentationSetupContext}from"#harness/instrumentation/setup-context.js";const INSTRUMENTATION_CONFIG_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-config`),globalContainer=globalThis;async function registerInstrumentationConfig(n,r){globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]=n,registerInstrumentationRuntime({forceFlush:async()=>void 0,hooks:createInstrumentationHooks([]),otelSettings:{functionId:n.functionId,recordInputs:n.recordInputs===!0,recordOutputs:n.recordOutputs===!0,traceChannelRequests:n.traceChannelRequests===!0},runInContext:(e,t)=>t(),shutdown:async()=>void 0}),await n.setup?.(createInstrumentationSetupContext(r.agentName))}function getInstrumentationConfig(){return globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]}export{getInstrumentationConfig,registerInstrumentationConfig};
@@ -1 +0,0 @@
1
- import{applyAudienceCeiling}from"#shared/instrumentation-content.js";import{withInstrumentationDecision,withoutInstrumentationContent}from"#harness/instrumentation/content.js";function instrumentationEventForTraceDecision(e,t,n){let r=applyAudienceCeiling(t,n);return r.action===`drop`?withoutInstrumentationContent(e):withInstrumentationDecision(e,r)}export{instrumentationEventForTraceDecision};
@@ -1 +0,0 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#harness/instrumentation/state.js";import{withoutInstrumentationContent}from"#harness/instrumentation/content.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=new WeakMap,a=[...r.serialBefore,...r.parallel,...r.serialAfter].some(e=>e.capture===`content`),publish=async e=>{let t=snapshotInstrumentationEvent(e,i),a=t.type===`session.completed`||t.type===`session.failed`,o=t.type===`turn.cancelled`||t.type===`turn.failed`;if(a||o){let e=takeInstrumentationActionScopes(t.sessionId,o?t.turnId:void 0),n=terminalActionFailure(t);for(let t of e)await publish({...n,idempotencyKey:t.idempotencyKey,scope:t.scope,type:`action.failed`})}let s,visibleEvent=e=>e.capture===`content`?t:(s??=withoutInstrumentationContent(t),s);try{try{for(let e of r.serialBefore)await dispatchToProvider(e,t,n,()=>visibleEvent(e));if(r.parallel.length===1){let e=r.parallel[0];await dispatchToProvider(e,t,n,()=>visibleEvent(e))}else if(r.parallel.length>1){let e=(await Promise.allSettled(r.parallel.map(e=>dispatchToProvider(e,t,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(e!==void 0)throw e.reason}}finally{for(let e of r.serialAfter)await dispatchToProvider(e,t,n,()=>visibleEvent(e))}}finally{releaseTerminalState(t)}};return{capturesContent:a,publish}}function snapshotInstrumentationEvent(e,t){return snapshotPlainValue(e,t)}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,a,o,s){let c=a.type.endsWith(`.started`)||a.type===`input.requested`,l=stateOwner(a),u=e.name,d=e.stateNamespace??u;if(isInstrumentationStateAbandoned(d,a.idempotencyKey))return;let f=e.events?.[a.type];if(f===void 0)return;let p=instrumentationStateSlot(d,a.idempotencyKey,l);try{await withTimeout(async()=>{let t=s();await f(e.projectEvent===void 0?t:await e.projectEvent(t),{state:p})},o,()=>{p.revoke(),c&&abandonInstrumentationState(d,a.idempotencyKey,l)})||log.warn(`instrumentation provider timed out`,{boundary:a.type,provider:u,timeoutMs:o})}catch(e){log.warn(`instrumentation provider failed`,{boundary:a.type,error:formatError(e),provider:u})}finally{p.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`action.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`tool.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};
@@ -1 +0,0 @@
1
- import{createInstrumentationDispatcher}from"#harness/instrumentation/dispatch.js";function sessionIdempotencyKey(e){return`session:${e}`}function turnIdempotencyKey(e,t){return`turn:${e}:${t}`}function attemptIdempotencyKey(e){return`step:${e.attemptId}`}function modelCallIdempotencyKey(e,t){return`model:${e.attemptId}:${String(t)}`}function toolCallIdempotencyKey(e,t,n){return`tool:${e.attemptId}:${t}:${String(n)}`}function inputIdempotencyKey(e,t,n){return`input:${e}:${t}:${n}`}function channelDeliveryIdempotencyKey(e,t){return`channel-delivery:${e}:${t}`}function actionIdempotencyKey(e,t,n){return`action:${e}:${t}:${n}`}function createInstrumentationHooks(t,n={}){return createInstrumentationDispatcher(t,n)}export{actionIdempotencyKey,attemptIdempotencyKey,channelDeliveryIdempotencyKey,createInstrumentationHooks,inputIdempotencyKey,modelCallIdempotencyKey,sessionIdempotencyKey,toolCallIdempotencyKey,turnIdempotencyKey};
@@ -1 +0,0 @@
1
- import{contextStorage}from"#context/container.js";import{instrumentChannelDelivery}from"#harness/channel-delivery-instrumentation.js";import{rememberInstrumentationActionScope,rememberInstrumentationInputScope,takeInstrumentationActionScopeForCall,takeInstrumentationInputScope}from"#harness/instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{actionIdempotencyKey,inputIdempotencyKey,sessionIdempotencyKey,turnIdempotencyKey}from"#harness/instrumentation/lifecycle.js";function createInstrumentationHandleEvent(n){if(n.hooks===void 0)return n.handleEvent;if(n.handleEvent===void 0)return;let r=n.handleEvent,i=n.hooks,a=new Set,o=new Set,s=n.turnId;return async(c,l)=>{await r(c,l);let u=toLifecycleEvent(c,n,s);if(c.type===`turn.started`&&(s=c.data.turnId),c.type===`turn.cancelled`||c.type===`turn.completed`||c.type===`turn.failed`||c.type===`session.completed`||c.type===`session.failed`){let n=contextStorage.getStore();n!==void 0&&await instrumentChannelDelivery({ctx:n,error:c.type===`turn.failed`||c.type===`session.failed`?Error(c.data.message):void 0,errorCode:c.type===`turn.failed`||c.type===`session.failed`?c.data.code:void 0,hooks:i,includeTurn:c.type===`turn.cancelled`||c.type===`turn.completed`||c.type===`turn.failed`,outcome:c.type===`turn.failed`||c.type===`session.failed`?`failed`:c.type===`turn.cancelled`?`cancelled`:`completed`})}u!==void 0&&await i.publish(u),c.type===`actions.requested`?await publishActionStarts(c,n,i,a):c.type===`action.result`?await publishActionTerminal(c,n,i):c.type===`input.requested`&&await publishInputStarts(c,n,i,o)}}async function publishInputStarts(e,t,n,i){let a=t.getAttemptScope?.();if(a!==void 0)for(let o of e.data.requests){let s=inputIdempotencyKey(t.sessionId,e.data.turnId,o.requestId);i.has(s)||(i.add(s),rememberInstrumentationInputScope(s,a),await n.publish(Object.freeze({action:Object.freeze({callId:o.action.callId,name:o.action.toolName}),idempotencyKey:s,kind:o.kind,request:n.capturesContent?Object.freeze({allowFreeform:o.allowFreeform,display:o.display,options:o.options,prompt:o.prompt}):void 0,requestId:o.requestId,scope:a,type:`input.requested`})))}}async function publishInputResolutions(e){for(let t of e.batch.inputs){let n=inputIdempotencyKey(e.sessionId,e.batch.event.turnId,t.request.requestId),r=takeInstrumentationInputScope(n);r!==void 0&&await e.hooks.publish(Object.freeze({idempotencyKey:n,kind:t.request.kind,outcome:t.outcome,requestId:t.request.requestId,response:!e.hooks.capturesContent||t.response===void 0?void 0:Object.freeze({optionId:t.response.optionId,text:t.response.text}),scope:r,type:`input.resolved`}))}}async function publishActionStarts(e,t,r,i){let a=t.getAttemptScope?.();if(a!==void 0)for(let o of e.data.actions){let c=actionIdempotencyKey(t.sessionId,e.data.turnId,o.callId);i.has(c)||(i.add(c),rememberInstrumentationActionScope(c,a),await r.publish(Object.freeze({callId:o.callId,idempotencyKey:c,input:r.capturesContent?o.input:void 0,kind:o.kind,name:actionName(o),scope:a,type:`action.started`})))}}async function publishActionTerminal(t,n,r){let a=takeInstrumentationActionScopeForCall(n.sessionId,t.data.result.callId);if(a===void 0)return;let{idempotencyKey:s,scope:c}=a;if(t.data.status===`completed`){await r.publish(Object.freeze({acceptedAtMs:contextStorage.getStore()?.get(RuntimeActionSettlementTimesKey)?.[t.data.result.callId],idempotencyKey:s,outcome:`completed`,output:Object.freeze(r.capturesContent?{output:t.data.result.output,type:`result`}:{type:`result`}),scope:c,type:`action.completed`,usage:actionUsage(t.data.result)}));return}let l=t.data.error===void 0?t.data.result.output:Object.assign(Error(t.data.error.message),{code:t.data.error.code});await r.publish(Object.freeze({acceptedAtMs:contextStorage.getStore()?.get(RuntimeActionSettlementTimesKey)?.[t.data.result.callId],error:l,errorCode:t.data.error?.code,idempotencyKey:s,outcome:t.data.status,scope:c,type:`action.failed`}))}function actionUsage(e){if(!(e.kind!==`subagent-result`||e.origin!==`child`||e.usage===void 0))return{inputTokenDetails:{cacheReadTokens:e.usage.cacheReadTokens,cacheWriteTokens:e.usage.cacheWriteTokens},inputTokens:e.usage.inputTokens,outputTokens:e.usage.outputTokens}}function actionName(e){return e.kind===`tool-call`?e.toolName:e.kind===`load-skill`?`load_skill`:e.name}function toLifecycleEvent(e,t,n){switch(e.type){case`session.started`:return{agentName:t.agentName,channelAudience:t.channelAudience,channelKind:t.channelKind,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,sessionId:t.sessionId,type:`session.started`};case`session.completed`:case`session.waiting`:return{idempotencyKey:sessionIdempotencyKey(t.sessionId),sessionId:t.sessionId,turnId:n,type:e.type};case`session.failed`:return{error:Error(e.data.message),idempotencyKey:sessionIdempotencyKey(t.sessionId),sessionId:t.sessionId,turnId:n,type:`session.failed`};case`turn.started`:return{idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),parentLineage:t.parentLineage,parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId??t.sessionId,sequence:e.data.sequence,sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.started`};case`turn.completed`:case`turn.cancelled`:return{idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),sessionId:t.sessionId,turnId:e.data.turnId,type:e.type};case`turn.failed`:return{error:Error(e.data.message),idempotencyKey:turnIdempotencyKey(t.sessionId,e.data.turnId),sessionId:t.sessionId,turnId:e.data.turnId,type:`turn.failed`};default:return}}export{createInstrumentationHandleEvent,publishInputResolutions};
@@ -1 +0,0 @@
1
- import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{DEVELOPMENT_WORKER_APP_ROOT_ENV}from"#internal/workflow/development-world-protocol.js";import{createInstrumentationSetupContext}from"#harness/instrumentation/setup-context.js";import{agentRuns,localTraces}from"#public/instrumentation/otel.js";import{installInstrumentationRuntime}from"#tracing/install-instrumentation-runtime.js";import{collectOtelPipeline}from"#tracing/otel-declaration.js";import{isInstrumentationDisabled,isInstrumentationProvider}from"#public/instrumentation/provider.js";const INSTRUMENTATION_PROVIDERS_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-providers`),globalContainer=globalThis;function providerRegistry(){let e=globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY];if(e!==void 0)return e;let t=new Map;return globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY]=t,t}function seedInstrumentationProviders(){let e=providerRegistry();process.env.VERCEL_ENV===`production`&&e.set(`agent-runs`,agentRuns()),process.env[DEVELOPMENT_WORKER_APP_ROOT_ENV]!==void 0&&e.set(`local`,localTraces())}async function registerInstrumentationProvider(e){if(isInstrumentationDisabled(e.value)){providerRegistry().delete(e.slot);return}if(!isInstrumentationProvider(e.value))throw Error(`The default export of "instrumentation/${e.slot}" is not an instrumentation provider. Return the result of \`defineInstrumentation\` or \`disableInstrumentation\` from it.`);providerRegistry().set(e.slot,e.value),await e.value.setup?.(createInstrumentationSetupContext(e.agentName))}function getInstrumentationProviders(){return[...providerRegistry()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({provider:t,slot:e}))}function finalizeInstrumentationProviders(t){let n=getInstrumentationProviders(),r=n.map(toProviderDefinition),i=collectOtelPipeline(n.map(e=>e.provider));return installInstrumentationRuntime({collected:i,frameworkVersion:resolveInstalledPackageInfo().version,providers:r,runtimeContextResolvers:i.runtimeContextResolvers,serviceName:t.serviceName})}async function shutdownInstrumentationProviders(){await getInstrumentationRuntime()?.shutdown()}function toProviderDefinition(e){return{capture:e.provider.capture,events:e.provider.events,flush:e.provider.flush,name:e.slot,shutdown:e.provider.shutdown,stateNamespace:`authored:${e.slot}`}}export{finalizeInstrumentationProviders,getInstrumentationProviders,registerInstrumentationProvider,seedInstrumentationProviders,shutdownInstrumentationProviders};
@@ -1 +0,0 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{normalizeInstrumentationChannelKind,resolveInstrumentationProjection}from"#internal/instrumentation.js";import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{AuthKey,ChannelInstrumentationKey,InitiatorAuthKey,ParentSessionKey}from"#context/keys.js";import{parseJsonObject,parseJsonValue}from"#shared/json.js";import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";const log=createLogger(`harness.instrumentation-runtime-context`);function buildTelemetryRuntimeContext(e){let t=e.authored!==void 0,r=e.providerResolvers!==void 0&&e.providerResolvers.length>0;if(!t&&!r)return;let i=resolveStepStartedRuntimeContext(e),o=resolveProviderRuntimeContext(e),c=contextStorage.getStore()?.get(ChannelInstrumentationKey);return{...i,...o,"eve.channel.kind":normalizeInstrumentationChannelKind(c?.kind),"eve.environment":e.environment,"eve.session.id":e.session.sessionId,"eve.step.index":String(e.emissionState.stepIndex),"eve.turn.id":e.emissionState.turnId,"eve.turn.sequence":String(e.emissionState.sequence),"eve.version":e.eveVersion}}function buildInstrumentationStepStartedInput(e){let t=contextStorage.getStore(),r=t?.get(ChannelInstrumentationKey),o=shouldCaptureInstrumentationContent(normalizeChannelAudience(r?.metadata.audience));return{channel:{kind:normalizeInstrumentationChannelKind(r?.kind),metadata:snapshotForInstrumentation(r?.metadata,`channel.metadata`)??{}},modelInput:o?snapshotForInstrumentation(e.modelInput,`modelInput`)??{instructions:void 0,messages:[]}:{instructions:void 0,messages:[]},session:{auth:projectSessionAuth(t),id:e.session.sessionId,parent:snapshotForInstrumentation(t?.get(ParentSessionKey),`session.parent`)},step:{index:e.emissionState.stepIndex},turn:{id:e.emissionState.turnId,sequence:e.emissionState.sequence}}}function filterAuthoredRuntimeContext(e,t){let n={};for(let[r,i]of Object.entries(e)){if(r.startsWith(`eve.`)){log.warn(`ignoring reserved instrumentation runtime context key`,{key:r,source:t});continue}n[r]=i}return Object.keys(n).length>0?n:void 0}function resolveStepStartedRuntimeContext(e){let n=e.authored?.events?.[`step.started`];if(n===void 0)return;let i=`events["step.started"]`,a=resolveInstrumentationProjection({invoke:()=>{let t=buildInstrumentationStepStartedInput(e);return n(t)},log,source:i});if(a===void 0)return;if(!(`runtimeContext`in a)){log.warn(`ignoring instrumentation event result because runtimeContext is missing`,{source:i});return}let o;try{o=parseJsonObject(a.runtimeContext)}catch(e){log.warn(`ignoring instrumentation event result because runtimeContext is invalid`,{error:formatError(e),source:i});return}return filterAuthoredRuntimeContext(o,i)}function resolveProviderRuntimeContext(e){let t=e.providerResolvers;if(t===void 0||t.length===0)return;let n={},i=!1;for(let a of t){let t=`provider.runtimeContext`,o=resolveInstrumentationProjection({invoke:()=>{let t=buildInstrumentationStepStartedInput(e);return a(t)},log,source:t});if(o===void 0)continue;let s=filterAuthoredRuntimeContext(o,t);s!==void 0&&(Object.assign(n,s),i=!0)}return i?n:void 0}function projectSessionAuth(e){let t=e?.get(AuthKey)??null,n=e?.get(InitiatorAuthKey)??t;return{current:snapshotForInstrumentation(t,`session.auth.current`)??null,initiator:snapshotForInstrumentation(n,`session.auth.initiator`)??null}}function snapshotForInstrumentation(e,n){if(e!==void 0)try{return parseJsonValue(e)}catch(e){log.warn(`dropping non-serializable instrumentation snapshot`,{error:formatError(e),source:n});return}}export{buildTelemetryRuntimeContext};
@@ -1,21 +0,0 @@
1
- import type { InstrumentationContextRunner, InstrumentationHooks, InstrumentationSessionStartedEvent, InstrumentationTraceSeed, InstrumentationTurnStartedEvent } from "#harness/instrumentation/lifecycle.js";
2
- import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
3
- import type { OtelHarnessSettings, RuntimeContextResolver } from "#tracing/otel-declaration.js";
4
- /** Process-wide runtime consumed by every harness execution surface. */
5
- export interface InstrumentationRuntime {
6
- readonly forceFlush: () => Promise<void>;
7
- readonly hooks: InstrumentationHooks;
8
- readonly idGenerator?: AgentSpanIdGenerator;
9
- readonly prepareSessionTrace?: (event: InstrumentationSessionStartedEvent) => Promise<InstrumentationTraceSeed>;
10
- readonly prepareTurnTrace?: (event: InstrumentationTurnStartedEvent) => Promise<InstrumentationTraceSeed>;
11
- otelSettings: OtelHarnessSettings | undefined;
12
- readonly runtimeContextResolvers?: readonly RuntimeContextResolver[];
13
- readonly runInContext: InstrumentationContextRunner;
14
- readonly shutdown: () => Promise<void>;
15
- }
16
- /** Instrumentation capabilities consumed inside one harness execution. */
17
- export type HarnessInstrumentation = Pick<InstrumentationRuntime, "hooks" | "prepareSessionTrace" | "prepareTurnTrace" | "runInContext">;
18
- /** Registers the process instrumentation runtime before agent execution begins. */
19
- export declare function registerInstrumentationRuntime(runtime: InstrumentationRuntime): InstrumentationRuntime;
20
- /** Returns the process instrumentation runtime, when one was installed. */
21
- export declare function getInstrumentationRuntime(): InstrumentationRuntime | undefined;
@@ -1 +0,0 @@
1
- const INSTRUMENTATION_RUNTIME_KEY=Symbol.for(`eve.instrumentation-runtime`),globalRuntime=globalThis;function registerInstrumentationRuntime(e){let t=globalRuntime[INSTRUMENTATION_RUNTIME_KEY];return t===void 0?(globalRuntime[INSTRUMENTATION_RUNTIME_KEY]=e,e):(t.otelSettings=e.otelSettings,t)}function getInstrumentationRuntime(){return globalRuntime[INSTRUMENTATION_RUNTIME_KEY]}export{getInstrumentationRuntime,registerInstrumentationRuntime};
@@ -1 +0,0 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{sessionIdempotencyKey,turnIdempotencyKey}from"#harness/instrumentation/lifecycle.js";const log=createLogger(`harness.prepare-trace-context`);async function prepareTurnTraceContext(e){let t;if(!e.sessionStarted&&e.instrumentation?.prepareSessionTrace!==void 0)try{t=await e.instrumentation.prepareSessionTrace({agentName:e.agentName,channelAudience:e.channelAudience,channelType:e.channelType,idempotencyKey:sessionIdempotencyKey(e.sessionId),parentTraceContext:e.parentTraceContext,rootSessionId:e.rootSessionId,sessionId:e.sessionId,traceSeed:e.traceSeed,type:`session.started`})}catch(e){warn(`session.started`,e)}if(e.instrumentation?.prepareTurnTrace!==void 0)try{t=await e.instrumentation.prepareTurnTrace({idempotencyKey:turnIdempotencyKey(e.sessionId,e.turnId),parentLineage:e.parentLineage,parentTraceContext:e.parentTraceContext,rootSessionId:e.rootSessionId,sequence:e.sequence,sessionId:e.sessionId,turnId:e.turnId,type:`turn.started`})}catch(e){warn(`turn.started`,e)}return e.traceSeed===void 0&&t?.decision!==void 0&&contextStorage.getStore()?.set(SessionTraceSeedKey,t),e.traceContext??t}function warn(e,n){log.warn(`instrumentation trace preparation failed`,{boundary:e,error:formatError(n)})}export{prepareTurnTraceContext};