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
@@ -1 +1 @@
1
- import{McpConnectionClient}from"#runtime/connections/mcp-client.js";import{OpenApiConnectionClient}from"#runtime/connections/openapi-client.js";var ConnectionRegistryImpl=class{#e=new Map;#t;constructor(e){this.#t=e}getClient(n){let r=this.#e.get(n);if(r!==void 0)return r;let i=this.#t.find(e=>e.connectionName===n);if(i===void 0)throw Error(`Connection "${n}" is not registered.`);let a=i.protocol===`openapi`?new OpenApiConnectionClient(i):new McpConnectionClient(i);return this.#e.set(n,a),a}getConnectionApproval(e){return this.#t.find(t=>t.connectionName===e)?.approval}getConnectionNames(){return this.#t.map(e=>e.connectionName)}getConnections(){return this.#t}async dispose(){let e=[...this.#e.values()].map(e=>e.close());await Promise.allSettled(e),this.#e.clear()}};export{ConnectionRegistryImpl};
1
+ import{McpConnectionClient}from"#runtime/connections/mcp-client.js";import{OpenApiConnectionClient}from"#runtime/connections/openapi-client.js";var ConnectionRegistryImpl=class{#e=new Map;#t;#n;#r=new Map;#i=new Map;constructor(e){this.#n=e,this.#t=e}async replaceDynamicConnections(e,t){let n=e===`session`?new Map(t):this.#r,r=e===`turn`?new Map(t):this.#i,i=this.#a(n,r),a=new Map(this.#t.map(e=>[e.connectionName,e])),o=new Map(i.map(e=>[e.connectionName,e])),s=[];for(let[e,t]of this.#e)a.get(e)!==o.get(e)&&(this.#e.delete(e),s.push(t));this.#r=n,this.#i=r,this.#t=i,await Promise.allSettled(s.map(e=>e.close()))}#a(e,t){let n=new Map(e);for(let[e,r]of t)n.set(e,r);let r=new Map,i=new Map(this.#n.map(e=>[e.connectionName,e]));for(let[e,t]of n)for(let n of t){let t=r.get(n.connectionName);if(t!==void 0&&t!==e)throw Error(`Dynamic connection "${n.connectionName}" from resolver "${e}" collides with dynamic resolver "${t}". Namespace the map key manually.`);r.set(n.connectionName,e),i.set(n.connectionName,n)}return[...i.values()]}getClient(n){let r=this.#e.get(n);if(r!==void 0)return r;let i=this.#t.find(e=>e.connectionName===n);if(i===void 0)throw Error(`Connection "${n}" is not registered.`);let a=i.protocol===`openapi`?new OpenApiConnectionClient(i):new McpConnectionClient(i);return this.#e.set(n,a),a}getConnectionApproval(e){return this.#t.find(t=>t.connectionName===e)?.approval}getConnectionNames(){return this.#t.map(e=>e.connectionName)}getConnections(){return this.#t}async dispose(){let e=[...this.#e.values()].map(e=>e.close());await Promise.allSettled(e),this.#e.clear()}};export{ConnectionRegistryImpl};
@@ -2,9 +2,10 @@
2
2
  * Scope-parameterized authorization flow shared by MCP connections and
3
3
  * authored tools that declare `auth`.
4
4
  *
5
- * A *scope* is the stable identifier the per-step token cache and the
6
- * framework-owned callback URL are keyed by — a connection name for an
7
- * MCP connection, a tool name for tool-hosted auth. Everything else
5
+ * A *scope* names the framework-owned callback URL — a connection name for
6
+ * an MCP connection, a tool name for tool-hosted auth. Connection-hosted
7
+ * authorization also carries an opaque instance ID that keys its token cache
8
+ * and pins callback completion to the exact resolved connection. Everything else
8
9
  * (principal resolution, the park/resume webhook dance, the loop guard)
9
10
  * is identical across both, so it lives here once instead of being
10
11
  * duplicated per caller.
@@ -21,6 +22,8 @@ import { type AuthorizationDefinition, type ConnectionAuthorizationContext, type
21
22
  */
22
23
  export interface ScopedAuthorization {
23
24
  readonly boundResponder?: SessionAuthContext;
25
+ /** Opaque resolved instance identity for connection-hosted authorization. */
26
+ readonly instanceId?: string;
24
27
  readonly scope: string;
25
28
  readonly authorization: Readonly<AuthorizationDefinition>;
26
29
  readonly connection: ConnectionAuthorizationContext;
@@ -29,9 +32,10 @@ export interface ScopedAuthorization {
29
32
  * Resolves a bearer token for one scope, consulting the per-step token
30
33
  * cache before invoking the authored `getToken`.
31
34
  *
32
- * The cache is keyed by `(scope, principalKey(principal))` so concurrent
33
- * users on one session never alias onto each other's bearer. Outside a
34
- * runtime scope the cache is unavailable, but `getToken` still runs with
35
+ * The cache is keyed by `(instanceId ?? scope, principalKey(principal))` so
36
+ * concurrent users and resolved connection instances never alias onto each
37
+ * other's bearer. Outside a runtime scope the cache is unavailable, but
38
+ * `getToken` still runs with
35
39
  * a framework-resolved principal so ad-hoc `"app"`-scoped use keeps
36
40
  * working; `"user"`-scoped strategies without a context fail fast inside
37
41
  * {@link resolveConnectionPrincipal}.
@@ -1 +1 @@
1
- import{contextStorage,loadContext}from"#context/container.js";import{consumeAuthorizationResult,createAuthorizationAttempt,requestAuthorization}from"#harness/authorization.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";import{evictCachedToken,readCachedToken,writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{principalKey,resolveConnectionPrincipal,resolveConnectionPrincipalFromAuth}from"#runtime/connections/principal.js";const LOCAL_HTTP_VERCEL_CONNECT_HOSTNAMES=new Set([`127.0.0.1`,`[::1]`]);async function resolveScopedToken(t){let{scope:n,authorization:r,connection:i}=t,a=contextStorage.getStore(),o=resolveScopedPrincipal(t,a);if(a===void 0)return await r.getToken({connection:i,principal:o});let u=principalKey(o),d=readCachedToken(a,n,u);if(d!==void 0)return d;let f=await r.getToken({connection:i,principal:o});return writeCachedToken(a,n,u,f),f}async function evictScopedToken(t){let{scope:n,authorization:r,connection:i}=t,a=contextStorage.getStore();if(a===void 0)return;let s;try{s=resolveScopedPrincipal(t,a),evictCachedToken(a,n,principalKey(s))}catch{return}try{await r.evict?.({connection:i,principal:s})}catch{}}async function completeScopedAuthorization(e){let{scope:r,authorization:i,connection:o}=e;if(!supportsInteractiveAuthorization(i))return!1;let s=consumeAuthorizationResult(r);if(s===void 0)return!1;let u=i,d=loadContext(),f=s.principal??resolveScopedPrincipal(e,d),p=await u.completeAuthorization({callbackUrl:s.hookUrl,connection:o,principal:f,resume:s.resume,callback:s.callback});return writeCachedToken(d,r,principalKey(f),p),!0}async function startScopedAuthorization(e){let{scope:t,authorization:n,connection:o}=e;if(!supportsInteractiveAuthorization(n))return;let s=createAuthorizationAttempt(t);if(s===void 0)return;let c=n,l=resolveScopedPrincipal(e),u=resolveAuthorizationCallbackUrl({authorization:n,callbackUrl:s.hookUrl}),{challenge:d,resume:f}=await c.startAuthorization({callbackUrl:u,connection:o,principal:l});return requestAuthorization([{attemptId:s.attemptId,challenge:stampChallengeDisplayName(d,n),hookUrl:u,name:t,principal:l,resume:f}])}function resolveScopedPrincipal(e,t){return e.boundResponder===void 0?resolveConnectionPrincipal(e.scope,e.authorization,t):resolveConnectionPrincipalFromAuth(e.scope,e.authorization,e.boundResponder,t)}function resolveAuthorizationCallbackUrl(e){if(e.authorization.vercelConnect===void 0)return e.callbackUrl;let t;try{t=new URL(e.callbackUrl)}catch{return e.callbackUrl}return t.protocol!==`http:`||!LOCAL_HTTP_VERCEL_CONNECT_HOSTNAMES.has(t.hostname)?e.callbackUrl:(t.hostname=`localhost`,t.toString())}function stampChallengeDisplayName(e,t){let n=t.displayName??e.displayName;return n===e.displayName?e:{...e,displayName:n}}export{completeScopedAuthorization,evictScopedToken,resolveAuthorizationCallbackUrl,resolveScopedToken,stampChallengeDisplayName,startScopedAuthorization};
1
+ import{contextStorage,loadContext}from"#context/container.js";import{consumeAuthorizationResult,createAuthorizationAttempt,requestAuthorization}from"#harness/authorization.js";import{supportsInteractiveAuthorization}from"#shared/connection-types.js";import{evictCachedToken,readCachedToken,writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{principalKey,resolveConnectionPrincipal,resolveConnectionPrincipalFromAuth}from"#runtime/connections/principal.js";const LOCAL_HTTP_VERCEL_CONNECT_HOSTNAMES=new Set([`127.0.0.1`,`[::1]`]);async function resolveScopedToken(t){let{scope:n,authorization:r,connection:i}=t,a=t.instanceId??n,o=contextStorage.getStore(),u=resolveScopedPrincipal(t,o);if(o===void 0)return await r.getToken({connection:i,principal:u});let d=principalKey(u),f=readCachedToken(o,a,d);if(f!==void 0)return f;let p=await r.getToken({connection:i,principal:u});return writeCachedToken(o,a,d,p),p}async function evictScopedToken(t){let{scope:n,authorization:r,connection:i}=t,a=t.instanceId??n,s=contextStorage.getStore();if(s===void 0)return;let c;try{c=resolveScopedPrincipal(t,s),evictCachedToken(s,a,principalKey(c))}catch{return}try{await r.evict?.({connection:i,principal:c})}catch{}}async function completeScopedAuthorization(e){let{scope:r,authorization:i,connection:o}=e;if(!supportsInteractiveAuthorization(i))return!1;let s=consumeAuthorizationResult(r,e.instanceId);if(s===void 0)return!1;let u=i,d=loadContext(),f=s.principal??resolveScopedPrincipal(e,d),p=await u.completeAuthorization({callbackUrl:s.hookUrl,connection:o,principal:f,resume:s.resume,callback:s.callback});return writeCachedToken(d,e.instanceId??r,principalKey(f),p),!0}async function startScopedAuthorization(e){let{scope:t,authorization:n,connection:o}=e;if(!supportsInteractiveAuthorization(n))return;let s=createAuthorizationAttempt(t);if(s===void 0)return;let c=n,l=resolveScopedPrincipal(e),u=resolveAuthorizationCallbackUrl({authorization:n,callbackUrl:s.hookUrl}),{challenge:d,resume:f}=await c.startAuthorization({callbackUrl:u,connection:o,principal:l});return requestAuthorization([{attemptId:s.attemptId,challenge:stampChallengeDisplayName(d,n),hookUrl:u,instanceId:e.instanceId,name:t,principal:l,resume:f}])}function resolveScopedPrincipal(e,t){return e.boundResponder===void 0?resolveConnectionPrincipal(e.scope,e.authorization,t):resolveConnectionPrincipalFromAuth(e.scope,e.authorization,e.boundResponder,t)}function resolveAuthorizationCallbackUrl(e){if(e.authorization.vercelConnect===void 0)return e.callbackUrl;let t;try{t=new URL(e.callbackUrl)}catch{return e.callbackUrl}return t.protocol!==`http:`||!LOCAL_HTTP_VERCEL_CONNECT_HOSTNAMES.has(t.hostname)?e.callbackUrl:(t.hostname=`localhost`,t.toString())}function stampChallengeDisplayName(e,t){let n=t.displayName??e.displayName;return n===e.displayName?e:{...e,displayName:n}}export{completeScopedAuthorization,evictScopedToken,resolveAuthorizationCallbackUrl,resolveScopedToken,stampChallengeDisplayName,startScopedAuthorization};
@@ -1 +1 @@
1
- import{ResolveAgentError,createResolvedModuleSourceRef}from"#runtime/resolve-helpers.js";import{resolveChannelDefinition}from"#runtime/resolve-channel.js";import{resolveConnectionDefinition}from"#runtime/resolve-connection.js";import{resolveHookDefinition}from"#runtime/resolve-hook.js";import{resolveSandboxDefinition}from"#runtime/resolve-sandbox.js";import{resolveDynamicInstructionsDefinition}from"#runtime/resolve-dynamic-instructions.js";import{resolveDynamicSkillDefinition}from"#runtime/resolve-dynamic-skill.js";import{resolveDynamicToolDefinition}from"#runtime/resolve-dynamic-tool.js";import{resolveToolDefinition}from"#runtime/resolve-tool.js";import{resolveMemoryDefinition}from"#runtime/resolve-memory.js";async function resolveAgent(e){let t=e.manifest.skills.map(t=>({...t,owner:requireCompiledSourceOwner(e.manifest,t),metadata:t.metadata===void 0?void 0:{...t.metadata}})),i=await Promise.all(e.manifest.channelRoutes.effective.map(t=>resolveChannelDefinition(t,e.moduleMap,e.nodeId))),a=await Promise.all(e.manifest.tools.map(t=>resolveToolDefinition(t,e.moduleMap,e.nodeId,requireBindingOwner(e.manifest,t.sourceId)))),o=await Promise.all((e.manifest.dynamicInstructions??[]).map(t=>resolveDynamicInstructionsDefinition(t,e.moduleMap,e.nodeId))),s=await Promise.all((e.manifest.dynamicSkills??[]).map(t=>resolveDynamicSkillDefinition(t,e.moduleMap,e.nodeId))),c=await Promise.all(e.manifest.dynamicTools.map(t=>resolveDynamicToolDefinition(t,e.moduleMap,e.nodeId))),l=await Promise.all(e.manifest.hooks.map(t=>resolveHookDefinition(t,e.moduleMap,e.nodeId))),u=await Promise.all(e.manifest.connections.map(t=>resolveConnectionDefinition(t,e.moduleMap,e.nodeId))),d=await Promise.all(e.manifest.memories.map(t=>resolveMemoryDefinition(t,e.moduleMap,e.nodeId))),f=await resolveSandboxDefinition(e.manifest.sandbox,e.moduleMap,e.nodeId),p=e.manifest.instructions.map(t=>createResolvedInstructionsDefinition(e.manifest,t)),m=e.manifest.workspaceResourceRoot,h={channels:i,connections:u,workflowTool:e.manifest.workflowTool===void 0?void 0:{maxSubagents:e.manifest.workflowTool.maxSubagents},webSearchProvider:e.manifest.webSearchProvider,dynamicInstructionsResolvers:o,dynamicSkillResolvers:s,dynamicToolResolvers:c,hooks:l,instructions:p,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},memories:d,sandbox:f,workspaceResourceRoot:m,skills:t,tools:a,workspaceSpec:{rootEntries:[...m.rootEntries]}};return`config`in e.manifest?{...h,config:createResolvedAgentConfig(e.manifest)}:h}function requireBindingOwner(e,t){let n=e.bindings[t];if(n===void 0)throw Error(`Compiled source "${t}" has no binding.`);return n.owner}function createResolvedInstructionsDefinition(e,t){return{content:t.content,name:t.name,owner:requireCompiledSourceOwner(e,t),logicalPath:t.logicalPath,role:t.role,sourceId:t.sourceId,sourceKind:t.sourceKind}}function requireCompiledSourceOwner(e,t){let n=e.bindings[t.sourceId]?.owner??t.owner;if(n===void 0)throw Error(`Compiled source "${t.sourceId}" has no owner.`);return n}function createResolvedAgentConfig(e){let n={name:e.config.name};if(e.config.compaction!==void 0){let t={};e.config.compaction.model!==void 0&&(t.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId}}),e.config.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=e.config.compaction.thresholdPercent),n.compaction=t}if(e.config.experimental!==void 0&&(n.experimental={instrumentationProviders:e.config.experimental.instrumentationProviders,tasks:e.config.experimental.tasks,workflow:e.config.experimental.workflow===void 0?void 0:{world:e.config.experimental.workflow.world}}),e.config.outputSchema!==void 0&&(n.outputSchema=e.config.outputSchema),e.config.reasoning!==void 0&&(n.reasoning=e.config.reasoning),e.config.source!==void 0&&(n.source=createResolvedModuleSourceRef(e.config.source)),e.config.limits!==void 0&&(n.limits={maxInputTokensPerSession:e.config.limits.maxInputTokensPerSession,maxOutputTokensPerSession:e.config.limits.maxOutputTokensPerSession,sessionTimeoutMs:e.config.limits.sessionTimeoutMs}),e.config.dynamicModel!==void 0)return{...n,dynamicModel:{...createResolvedModuleSourceRef(e.config.dynamicModel),eventNames:[...e.config.dynamicModel.eventNames]}};let r=e.config.model;return{...n,model:r.source===void 0?{id:r.id,contextWindowTokens:r.contextWindowTokens,maxOutputTokens:r.maxOutputTokens,providerOptions:r.providerOptions}:{contextWindowTokens:r.contextWindowTokens,id:r.id,maxOutputTokens:r.maxOutputTokens,providerOptions:r.providerOptions,source:{exportName:r.source.exportName,sourceKind:`module`,logicalPath:r.source.logicalPath,sourceId:r.source.sourceId}}}}export{ResolveAgentError,resolveAgent};
1
+ import{resolveConnectionDefinition}from"#runtime/resolve-connection.js";import{ResolveAgentError,createResolvedModuleSourceRef}from"#runtime/resolve-helpers.js";import{resolveChannelDefinition}from"#runtime/resolve-channel.js";import{resolveDynamicConnectionDefinition}from"#runtime/resolve-dynamic-connection.js";import{resolveHookDefinition}from"#runtime/resolve-hook.js";import{resolveSandboxDefinition}from"#runtime/resolve-sandbox.js";import{resolveDynamicInstructionsDefinition}from"#runtime/resolve-dynamic-instructions.js";import{resolveDynamicSkillDefinition}from"#runtime/resolve-dynamic-skill.js";import{resolveDynamicToolDefinition}from"#runtime/resolve-dynamic-tool.js";import{resolveToolDefinition}from"#runtime/resolve-tool.js";import{resolveMemoryDefinition}from"#runtime/resolve-memory.js";async function resolveAgent(t){let n=t.manifest.skills.map(e=>({...e,owner:requireCompiledSourceOwner(t.manifest,e),metadata:e.metadata===void 0?void 0:{...e.metadata}})),i=await Promise.all(t.manifest.channelRoutes.effective.map(e=>resolveChannelDefinition(e,t.moduleMap,t.nodeId))),a=await Promise.all(t.manifest.tools.map(e=>resolveToolDefinition(e,t.moduleMap,t.nodeId,requireBindingOwner(t.manifest,e.sourceId)))),o=await Promise.all(t.manifest.dynamicConnections.map(e=>resolveDynamicConnectionDefinition(e,t.moduleMap,t.nodeId))),s=await Promise.all((t.manifest.dynamicInstructions??[]).map(e=>resolveDynamicInstructionsDefinition(e,t.moduleMap,t.nodeId))),c=await Promise.all((t.manifest.dynamicSkills??[]).map(e=>resolveDynamicSkillDefinition(e,t.moduleMap,t.nodeId))),l=await Promise.all(t.manifest.dynamicTools.map(e=>resolveDynamicToolDefinition(e,t.moduleMap,t.nodeId))),u=await Promise.all(t.manifest.hooks.map(e=>resolveHookDefinition(e,t.moduleMap,t.nodeId))),d=await Promise.all(t.manifest.connections.map(n=>resolveConnectionDefinition(n,t.moduleMap,t.nodeId))),f=await Promise.all(t.manifest.memories.map(e=>resolveMemoryDefinition(e,t.moduleMap,t.nodeId))),p=await resolveSandboxDefinition(t.manifest.sandbox,t.moduleMap,t.nodeId),m=t.manifest.instructions.map(e=>createResolvedInstructionsDefinition(t.manifest,e)),h=t.manifest.workspaceResourceRoot,g={channels:i,connections:d,dynamicConnectionResolvers:o,workflowTool:t.manifest.workflowTool===void 0?void 0:{maxSubagents:t.manifest.workflowTool.maxSubagents},webSearchProvider:t.manifest.webSearchProvider,dynamicInstructionsResolvers:s,dynamicSkillResolvers:c,dynamicToolResolvers:l,hooks:u,instructions:m,metadata:{agentRoot:t.manifest.agentRoot,appRoot:t.manifest.appRoot,diagnosticsSummary:t.manifest.diagnosticsSummary},memories:f,sandbox:p,workspaceResourceRoot:h,skills:n,tools:a,workspaceSpec:{rootEntries:[...h.rootEntries]}};return`config`in t.manifest?{...g,config:createResolvedAgentConfig(t.manifest)}:g}function requireBindingOwner(e,t){let n=e.bindings[t];if(n===void 0)throw Error(`Compiled source "${t}" has no binding.`);return n.owner}function createResolvedInstructionsDefinition(e,t){return{content:t.content,name:t.name,owner:requireCompiledSourceOwner(e,t),logicalPath:t.logicalPath,role:t.role,sourceId:t.sourceId,sourceKind:t.sourceKind}}function requireCompiledSourceOwner(e,t){let n=e.bindings[t.sourceId]?.owner??t.owner;if(n===void 0)throw Error(`Compiled source "${t.sourceId}" has no owner.`);return n}function createResolvedAgentConfig(e){let t={name:e.config.name};if(e.config.compaction!==void 0){let n={};e.config.compaction.model!==void 0&&(n.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,maxOutputTokens:e.config.compaction.model.maxOutputTokens,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId}}),e.config.compaction.thresholdPercent!==void 0&&(n.thresholdPercent=e.config.compaction.thresholdPercent),t.compaction=n}if(e.config.experimental!==void 0&&(t.experimental={instrumentationProviders:e.config.experimental.instrumentationProviders,tasks:e.config.experimental.tasks,workflow:e.config.experimental.workflow===void 0?void 0:{world:e.config.experimental.workflow.world}}),e.config.outputSchema!==void 0&&(t.outputSchema=e.config.outputSchema),e.config.reasoning!==void 0&&(t.reasoning=e.config.reasoning),e.config.source!==void 0&&(t.source=createResolvedModuleSourceRef(e.config.source)),e.config.limits!==void 0&&(t.limits={maxInputTokensPerSession:e.config.limits.maxInputTokensPerSession,maxOutputTokensPerSession:e.config.limits.maxOutputTokensPerSession,sessionTimeoutMs:e.config.limits.sessionTimeoutMs}),e.config.dynamicModel!==void 0)return{...t,dynamicModel:{...createResolvedModuleSourceRef(e.config.dynamicModel),eventNames:[...e.config.dynamicModel.eventNames]}};let r=e.config.model;return{...t,model:r.source===void 0?{id:r.id,contextWindowTokens:r.contextWindowTokens,maxOutputTokens:r.maxOutputTokens,providerOptions:r.providerOptions}:{contextWindowTokens:r.contextWindowTokens,id:r.id,maxOutputTokens:r.maxOutputTokens,providerOptions:r.providerOptions,source:{exportName:r.source.exportName,sourceKind:`module`,logicalPath:r.source.logicalPath,sourceId:r.source.sourceId}}}}export{ResolveAgentError,resolveAgent};
@@ -1,6 +1,7 @@
1
1
  import type { CompiledConnectionDefinition } from "#compiler/manifest.js";
2
2
  import type { CompiledModuleMap } from "#compiler/module-map.js";
3
3
  import type { ResolvedConnectionDefinition } from "#runtime/types.js";
4
+ import type { ModuleSourceRef } from "#shared/source-ref.js";
4
5
  /**
5
6
  * Resolves one compiled connection entry into a runtime-owned definition
6
7
  * with the live `auth`, `headers`, and `tools` objects attached
@@ -13,3 +14,7 @@ import type { ResolvedConnectionDefinition } from "#runtime/types.js";
13
14
  * variables, `AlsContext`, etc.).
14
15
  */
15
16
  export declare function resolveConnectionDefinition(definition: CompiledConnectionDefinition, moduleMap: CompiledModuleMap, nodeId: string | undefined): Promise<ResolvedConnectionDefinition>;
17
+ /** Resolves one branded connection returned by a dynamic connection handler. */
18
+ export declare function resolveDynamicConnectionValue(value: unknown, source: Readonly<ModuleSourceRef & {
19
+ readonly connectionName: string;
20
+ }>): ResolvedConnectionDefinition;
@@ -1 +1 @@
1
- import{expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{registerDefinitionSource,stampDefinitionKey}from"#internal/authored-definition/source-identity.js";import{normalizeAuthorizationSpec}from"#shared/validate-authorization.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveConnectionDefinition(t,n,r){try{let i=expectObjectRecord(await loadResolvedModuleExport({definition:t,kindLabel:`connection`,moduleMap:n,nodeId:r}),`Expected the connection export "${t.exportName??`default`}" from "${t.logicalPath}" to return an object.`),a={kind:`connection`,logicalPath:t.logicalPath,name:t.connectionName},o=`connection-source:${t.sourceId}`;stampDefinitionKey(i,o),registerDefinitionSource(o,a),registerDefinitionSource(`connection:${t.url}`,a);let s=i.auth!==void 0,c=i.headers!==void 0,l=t.protocol===`openapi`?i.operations:i.tools,u={connectionName:t.connectionName,description:t.description,exportName:t.exportName,logicalPath:t.logicalPath,protocol:t.protocol,sourceId:t.sourceId,sourceKind:`module`,url:t.url};if(s)if(typeof i.auth==`function`)u.authorization=i.auth;else try{u.authorization=normalizeAuthorizationSpec(i.auth,`Connection "${t.connectionName}" at "${t.logicalPath}":`)}catch(e){throw new ResolveAgentError(toErrorMessage(e),{logicalPath:t.logicalPath,sourceId:t.sourceId})}return c&&(u.headers=i.headers),i.toolCall!==void 0&&(u.toolCall=i.toolCall),l!==void 0&&(u.tools=l),t.protocol===`openapi`&&i.spec!==void 0&&(u.spec=i.spec),typeof i.approval==`function`&&(u.approval=i.approval),u}catch(e){throw e instanceof ResolveAgentError?e:new ResolveAgentError(`Failed to resolve connection "${t.connectionName}" from "${t.logicalPath}": ${toErrorMessage(e)}`,{logicalPath:t.logicalPath,sourceId:t.sourceId})}}export{resolveConnectionDefinition};
1
+ import{expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{normalizeMcpClientConnectionDefinition,normalizeOpenApiConnectionDefinition}from"#internal/authored-definition/connection.js";import{readStampedConnectionProtocol}from"#public/definitions/connections/protocol.js";import{registerDefinitionSource,stampDefinitionKey}from"#internal/authored-definition/source-identity.js";import{normalizeAuthorizationSpec}from"#shared/validate-authorization.js";import{createConnectionInstanceId}from"#runtime/connections/instance-identity.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveConnectionDefinition(n,r,i){try{let c=expectObjectRecord(await loadResolvedModuleExport({definition:n,kindLabel:`connection`,moduleMap:r,nodeId:i}),`Expected the connection export "${n.exportName??`default`}" from "${n.logicalPath}" to return an object.`),l={kind:`connection`,logicalPath:n.logicalPath,name:n.connectionName},u=`connection-source:${n.sourceId}`;stampDefinitionKey(c,u),registerDefinitionSource(u,l),registerDefinitionSource(`connection:${n.url}`,l);let d=c.auth!==void 0,f=c.headers!==void 0,p=n.protocol===`openapi`?c.operations:c.tools,m={connectionName:n.connectionName,description:n.description,exportName:n.exportName,logicalPath:n.logicalPath,instanceId:createConnectionInstanceId({connectionName:n.connectionName,instanceKey:typeof c.instanceKey==`string`?c.instanceKey:void 0,protocol:n.protocol,sourceId:n.sourceId,url:n.url}),protocol:n.protocol,sourceId:n.sourceId,sourceKind:`module`,url:n.url};if(d)if(typeof c.auth==`function`)m.authorization=c.auth;else try{m.authorization=normalizeAuthorizationSpec(c.auth,`Connection "${n.connectionName}" at "${n.logicalPath}":`)}catch(e){throw new ResolveAgentError(toErrorMessage(e),{logicalPath:n.logicalPath,sourceId:n.sourceId})}return f&&(m.headers=c.headers),c.toolCall!==void 0&&(m.toolCall=c.toolCall),p!==void 0&&(m.tools=p),n.protocol===`openapi`&&c.spec!==void 0&&(m.spec=c.spec),typeof c.approval==`function`&&(m.approval=c.approval),m}catch(e){throw e instanceof ResolveAgentError?e:new ResolveAgentError(`Failed to resolve connection "${n.connectionName}" from "${n.logicalPath}": ${toErrorMessage(e)}`,{logicalPath:n.logicalPath,sourceId:n.sourceId})}}function resolveDynamicConnectionValue(e,t){let a=readStampedConnectionProtocol(e),o=`Dynamic connection "${t.connectionName}" from "${t.logicalPath}" must be created by defineMcpClientConnection() or defineOpenAPIConnection().`;if(a===void 0)throw Error(o);let s={kind:`connection`,logicalPath:t.logicalPath,name:t.connectionName},c=`dynamic-connection-source:${t.sourceId}:${t.connectionName}`;if(stampDefinitionKey(e,c),registerDefinitionSource(c,s),a===`openapi`){let n=normalizeOpenApiConnectionDefinition(e,o);return assertAuthenticatedDynamicInstanceKey(n.auth,n.instanceKey,o),omitUndefined({approval:n.approval,authorization:n.auth,connectionName:t.connectionName,description:n.description,exportName:t.exportName,headers:n.headers,instanceId:createConnectionInstanceId({connectionName:t.connectionName,instanceKey:n.instanceKey,protocol:a,sourceId:t.sourceId,url:n.baseUrl??``}),logicalPath:t.logicalPath,protocol:a,sourceId:t.sourceId,sourceKind:`module`,spec:n.spec,toolCall:n.toolCall,tools:n.operations,url:n.baseUrl??``})}let l=normalizeMcpClientConnectionDefinition(e,o);return assertAuthenticatedDynamicInstanceKey(l.auth,l.instanceKey,o),omitUndefined({approval:l.approval,authorization:l.auth,connectionName:t.connectionName,description:l.description,exportName:t.exportName,headers:l.headers,instanceId:createConnectionInstanceId({connectionName:t.connectionName,instanceKey:l.instanceKey,protocol:a,sourceId:t.sourceId,url:l.url}),logicalPath:t.logicalPath,protocol:a,sourceId:t.sourceId,sourceKind:`module`,toolCall:l.toolCall,tools:l.tools,url:l.url})}function assertAuthenticatedDynamicInstanceKey(e,t,n){if(!(e===void 0||t!==void 0))throw Error(`${n} Authenticated dynamic connections must set "instanceKey" to a stable, non-secret account or tenant identifier.`)}function omitUndefined(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>e!==void 0))}export{resolveConnectionDefinition,resolveDynamicConnectionValue};
@@ -0,0 +1,5 @@
1
+ import type { CompiledDynamicConnectionDefinition } from "#compiler/manifest.js";
2
+ import type { CompiledModuleMap } from "#compiler/module-map.js";
3
+ import type { ResolvedDynamicConnectionResolver } from "#runtime/types.js";
4
+ /** Reattaches live event handlers for one compiled dynamic connection source. */
5
+ export declare function resolveDynamicConnectionDefinition(definition: CompiledDynamicConnectionDefinition, moduleMap: CompiledModuleMap, nodeId: string | undefined): Promise<ResolvedDynamicConnectionResolver>;
@@ -0,0 +1 @@
1
+ import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{isDynamicSentinel}from"#dynamic/definition.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveDynamicConnectionDefinition(i,a,o){try{let n=expectObjectRecord(await loadResolvedModuleExport({definition:i,kindLabel:`dynamic connection`,moduleMap:a,nodeId:o}),describe(i,`to return an object`));if(!isDynamicSentinel(n))throw Error(describe(i,`to be created by defineDynamic()`));let r=expectObjectRecord(n.events,describe(i,`to provide an events object`)),s={};for(let t of i.eventNames)s[t]=expectFunction(r[t],describe(i,`to provide a handler for event "${t}"`));return{eventNames:[...i.eventNames],events:s,exportName:i.exportName,extensionNamespace:i.extensionNamespace,logicalPath:i.logicalPath,slug:i.slug,sourceId:i.sourceId,sourceKind:`module`}}catch(e){throw e instanceof ResolveAgentError?e:new ResolveAgentError(`Failed to resolve dynamic connection from "${i.logicalPath}": ${toErrorMessage(e)}`,{logicalPath:i.logicalPath,sourceId:i.sourceId})}}function describe(e,t){return`Expected the dynamic connection export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}export{resolveDynamicConnectionDefinition};
@@ -83,6 +83,8 @@ export interface ResolvedConnectionDefinition extends ResolvedModuleSourceRef {
83
83
  readonly connectionName: string;
84
84
  readonly description: string;
85
85
  readonly headers?: Readonly<HeadersDefinition>;
86
+ /** Opaque identity used to pin authorization and credential state to this resolved instance. */
87
+ readonly instanceId?: string;
86
88
  readonly toolCall?: Readonly<ConnectionToolCallDefinition>;
87
89
  /**
88
90
  * Wire protocol. Selects the runtime client implementation. `tools`
@@ -309,6 +311,14 @@ export interface ResolvedDynamicToolResolver extends Readonly<ModuleSourceRef> {
309
311
  */
310
312
  readonly extensionNamespace?: string;
311
313
  }
314
+ /** Runtime resolver for dynamic connections declared in `agent/connections/`. */
315
+ export interface ResolvedDynamicConnectionResolver extends Readonly<ModuleSourceRef> {
316
+ readonly slug: string;
317
+ readonly eventNames: readonly string[];
318
+ readonly events: Readonly<Record<string, (event: unknown, ctx: unknown) => unknown | Promise<unknown>>>;
319
+ /** Map results from extensions receive this mount namespace. */
320
+ readonly extensionNamespace?: string;
321
+ }
312
322
  export type ResolvedMemoryDefinition = Readonly<MemoryDefinition & ModuleSourceRef & {
313
323
  readonly slot: string;
314
324
  readonly visibility: "scope" | "session";
@@ -345,6 +355,7 @@ export interface ResolvedAgent {
345
355
  readonly channels: readonly ResolvedChannelDefinition[];
346
356
  readonly config?: ResolvedAgentDefinition;
347
357
  readonly connections: readonly ResolvedConnectionDefinition[];
358
+ readonly dynamicConnectionResolvers?: readonly ResolvedDynamicConnectionResolver[];
348
359
  /**
349
360
  * Configuration for the experimental framework `Workflow` orchestration
350
361
  * tool. Present when an authored tool module exports
@@ -1 +1 @@
1
- import{createRegistrySession}from"./registry-session.js";import{z}from"#compiled/zod/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{detectDeployment}from"#setup/project-resolution.js";import{withSpinner}from"#setup/with-spinner.js";const ADDRESS_PREFIX=`address:`,BACK=`action:back`,DONE=`action:done`,ALL=`category:all`,REGISTRY_CATEGORIES=[{value:`category:channel`,prefix:`channel/`,label:`Channels`,hint:`Where people talk to your agent — Web, Slack, Discord, Teams`,browseLabel:`Browse channels`},{value:`category:connection`,prefix:`connection/`,label:`MCP connections`,hint:`Connect services like Linear, Notion, GitHub, and Vercel`,browseLabel:`Browse MCP connections`},{value:`category:extension`,prefix:`extension/`,label:`Extensions`,hint:`Add browser automation, memory, and developer tools`,browseLabel:`Browse extensions`},{value:`category:instrumentation`,prefix:`instrumentation/`,label:`Observability`,hint:`Trace, evaluate, and monitor your agent`,browseLabel:`Browse observability integrations`}];var RegistryFlowFailedError=class extends Error{completed;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.name=`RegistryFlowFailedError`,this.completed=t}};function itemLabel(e){return e.title===void 0?(e.name.split(`/`).at(-1)??e.name).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `):e.title}function itemRows(e){return e.map((e,t)=>({value:`item:${t}`,label:itemLabel(e),hint:e.description??e.type}))}function categoryRows(){return[...REGISTRY_CATEGORIES.map(e=>({value:e.value,label:e.label,hint:e.hint})),{value:ALL,label:`Browse all`,hint:`Search every integration or enter an item address`},{value:DONE,label:`Return to chat`,trailingAction:!0}]}function categoryFor(e){return REGISTRY_CATEGORIES.find(t=>t.value===e)}function itemsForCategory(e,t){if(t===ALL)return e;let n=categoryFor(t);return n===void 0?e:e.filter(e=>e.address.startsWith(n.prefix)||e.name.startsWith(n.prefix))}function stringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function itemSource(e){if(e.startsWith(`@`))return e.split(`/`)[0]??e;if(/^https?:\/\//u.test(e))try{return new URL(e).host}catch{return e}return`Vercel`}function manifestRecord(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}const RegistryDocumentationSchema=z.object({meta:z.object({eve:z.object({docs:z.string().min(1).optional()}).optional()}).optional()});function documentationLink(e){let t=RegistryDocumentationSchema.safeParse(e).data?.meta?.eve?.docs;if(t!==void 0)return t.startsWith(`/`)?`https://eve.dev${t}`:t}function summarizeDetails(e,t=3){let n=e.slice(0,t),r=e.length-n.length;return r>0?`${n.join(`, `)} … (+${r} more)`:n.join(`, `)}function environmentVariables(e){let t=e.envVars;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t):[]}function itemDetails(e,t){let n=[{label:`Source`,value:e.source}],r=[...stringArray(t.dependencies),...stringArray(t.devDependencies),...stringArray(t.registryDependencies)];r.length>0&&n.push({label:`Packages`,value:summarizeDetails(r)});let i=environmentVariables(t);i.length>0&&n.push({label:`Environment`,value:summarizeDetails(i)});let a=(Array.isArray(t.files)?t.files:[]).flatMap(e=>{if(typeof e!=`object`||!e||Array.isArray(e))return[];let t=e.target;return typeof t==`string`?[t]:[]});return a.length>0&&n.push({label:`Files`,value:summarizeDetails(a)}),n}async function inspectItem(e,t,n,r,i,o){let s=i??manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r.address)));for(;;){let i={message:typeof s.title==`string`?s.title:r.name,metadata:itemDetails(r,s),options:[{value:`add`,label:`Add to project`},{value:`back`,label:`Back`}]},a=typeof s.description==`string`?s.description:r.description;if(a!==void 0&&(i.description=a),await e.select(i)===`back`)return{kind:`back`};let c=e.log.spinner?.(`Installing ${itemLabel(r)} and dependencies…`);try{c?.stop();let install=()=>t.installRegistryItem(n,r.address,{silent:!0,prompter:e,signal:o}),i=await(e.withExclusiveTerminal?.(install)??install());return{kind:`added`,documentation:documentationLink(s),environment:environmentVariables(s),...i}}finally{c?.stop()}}}async function resolveAddressItem(e,t,n,r){let i=manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r))),o={address:r,name:typeof i.name==`string`?i.name:r,source:itemSource(r)};return typeof i.type==`string`&&(o.type=i.type),typeof i.description==`string`&&(o.description=i.description),{item:o,manifest:i}}async function offerItem(e,t,n,r,i){let a=await inspectItem(e.prompter,t,e.appRoot,r,i,e.signal);if(a.kind!==`added`)return;let o=[...a.output];a.environment!==void 0&&a.environment.length>0&&o.push(`Environment: ${a.environment.join(`, `)}`),a.documentation!==void 0&&o.push(`Setup: ${a.documentation}`),n.add(r.address,itemLabel(r),o,a.setup);let s=await n.continueAfterInstall({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal});return s===`add-more`?void 0:s}async function runRegistryFlow(t){let l;(t.deps?.browseRegistryCatalog===void 0||t.deps.getRegistryItemManifest===void 0||t.deps.installRegistryItem===void 0)&&(l=await import(`#cli/commands/registry.js`));let u={browseRegistryCatalog:t.deps?.browseRegistryCatalog??l.browseRegistryCatalog,detectDeployment:t.deps?.detectDeployment??detectDeployment,getRegistryItemManifest:t.deps?.getRegistryItemManifest??l.getRegistryItemManifest,installRegistryItem:t.deps?.installRegistryItem??l.installRegistryItem,runDeployFlow:t.deps?.runDeployFlow??runDeployFlow},d=[],f=createRegistrySession(u),p=t.initialAddress?.trim(),m=p===``?void 0:p;try{for(;;){if(t.signal?.throwIfAborted(),m!==void 0){let e=m;m=void 0;let n=await resolveAddressItem(t.prompter,u,t.appRoot,e),r=await offerItem(t,u,f,n.item,n.manifest);if(r!==void 0)return r;continue}let e=await withSpinner(t.prompter,`Loading registry…`,()=>u.browseRegistryCatalog(t.appRoot));d=[...d,...e.errors.map(e=>({tone:`warning`,text:`${e.registry}: ${e.message}`}))];let n=await t.prompter.select({message:`Add an integration`,options:categoryRows(),hintLayout:`inline`,notices:d});if(d=[],n===DONE)return f.result();let r=itemsForCategory(e.items,n),i=itemRows(r);i.push({value:BACK,label:`Back`,trailingAction:!0});let l=await t.prompter.select({message:categoryFor(n)?.browseLabel??`Browse integrations`,options:i,search:!0,placeholder:`Search integrations or enter an item address`,searchAction:{label:e=>`Add “${e}”`,value:e=>`${ADDRESS_PREFIX}${e.trim()}`},hintLayout:`inline`});if(l===BACK)continue;let p=l.startsWith(ADDRESS_PREFIX)?await resolveAddressItem(t.prompter,u,t.appRoot,l.slice(8)):{item:r[Number(l.slice(5))]};if(p.item===void 0)throw Error(`The selected registry item is no longer available.`);let h=await offerItem(t,u,f,p.item,`manifest`in p?p.manifest:void 0);if(h!==void 0)return h}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};let t=f.result();throw t.addedItems.length>0?new RegistryFlowFailedError(e,t):e}}export{RegistryFlowFailedError,runRegistryFlow};
1
+ import{createRegistrySession}from"./registry-session.js";import{z}from"#compiled/zod/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{detectDeployment}from"#setup/project-resolution.js";import{withSpinner}from"#setup/with-spinner.js";const ADDRESS_PREFIX=`address:`,BACK=`action:back`,DONE=`action:done`,ALL=`category:all`,REGISTRY_CATEGORIES=[{value:`category:channel`,prefix:`channel/`,label:`Channels`,hint:`Where people talk to your agent — Web, Slack, Discord, Teams`,browseLabel:`Browse channels`},{value:`category:connection`,prefix:`connection/`,label:`MCP connections`,hint:`Connect services like Linear, Notion, GitHub, and Vercel`,browseLabel:`Browse MCP connections`},{value:`category:extension`,prefix:`extension/`,label:`Extensions`,hint:`Add browser automation, memory, and developer tools`,browseLabel:`Browse extensions`},{value:`category:memory`,prefix:`memory/`,label:`Memory providers`,hint:`Retain and recall scoped context across sessions`,browseLabel:`Browse memory providers`},{value:`category:instrumentation`,prefix:`instrumentation/`,label:`Observability`,hint:`Trace, evaluate, and monitor your agent`,browseLabel:`Browse observability integrations`}];var RegistryFlowFailedError=class extends Error{completed;constructor(e,t){super(e instanceof Error?e.message:String(e),{cause:e}),this.name=`RegistryFlowFailedError`,this.completed=t}};function itemLabel(e){return e.title===void 0?(e.name.split(`/`).at(-1)??e.name).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `):e.title}function itemRows(e){return e.map((e,t)=>({value:`item:${t}`,label:itemLabel(e),hint:e.description??e.type}))}function categoryRows(){return[...REGISTRY_CATEGORIES.map(e=>({value:e.value,label:e.label,hint:e.hint})),{value:ALL,label:`Browse all`,hint:`Search every integration or enter an item address`},{value:DONE,label:`Return to chat`,trailingAction:!0}]}function categoryFor(e){return REGISTRY_CATEGORIES.find(t=>t.value===e)}function itemsForCategory(e,t){if(t===ALL)return e;let n=categoryFor(t);return n===void 0?e:e.filter(e=>e.address.startsWith(n.prefix)||e.name.startsWith(n.prefix))}function stringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function itemSource(e){if(e.startsWith(`@`))return e.split(`/`)[0]??e;if(/^https?:\/\//u.test(e))try{return new URL(e).host}catch{return e}return`Vercel`}function manifestRecord(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}const RegistryDocumentationSchema=z.object({meta:z.object({eve:z.object({docs:z.string().min(1).optional()}).optional()}).optional()});function documentationLink(e){let t=RegistryDocumentationSchema.safeParse(e).data?.meta?.eve?.docs;if(t!==void 0)return t.startsWith(`/`)?`https://eve.dev${t}`:t}function summarizeDetails(e,t=3){let n=e.slice(0,t),r=e.length-n.length;return r>0?`${n.join(`, `)} … (+${r} more)`:n.join(`, `)}function environmentVariables(e){let t=e.envVars;return typeof t==`object`&&t&&!Array.isArray(t)?Object.keys(t):[]}function itemDetails(e,t){let n=[{label:`Source`,value:e.source}],r=[...stringArray(t.dependencies),...stringArray(t.devDependencies),...stringArray(t.registryDependencies)];r.length>0&&n.push({label:`Packages`,value:summarizeDetails(r)});let i=environmentVariables(t);i.length>0&&n.push({label:`Environment`,value:summarizeDetails(i)});let a=(Array.isArray(t.files)?t.files:[]).flatMap(e=>{if(typeof e!=`object`||!e||Array.isArray(e))return[];let t=e.target;return typeof t==`string`?[t]:[]});return a.length>0&&n.push({label:`Files`,value:summarizeDetails(a)}),n}async function inspectItem(e,t,n,r,i,o){let s=i??manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r.address)));for(;;){let i={message:typeof s.title==`string`?s.title:r.name,metadata:itemDetails(r,s),options:[{value:`add`,label:`Add to project`},{value:`back`,label:`Back`}]},a=typeof s.description==`string`?s.description:r.description;if(a!==void 0&&(i.description=a),await e.select(i)===`back`)return{kind:`back`};let c=e.log.spinner?.(`Installing ${itemLabel(r)} and dependencies…`);try{c?.stop();let install=()=>t.installRegistryItem(n,r.address,{silent:!0,prompter:e,signal:o}),i=await(e.withExclusiveTerminal?.(install)??install());return{kind:`added`,documentation:documentationLink(s),environment:environmentVariables(s),...i}}finally{c?.stop()}}}async function resolveAddressItem(e,t,n,r){let i=manifestRecord(await withSpinner(e,`Loading registry item…`,()=>t.getRegistryItemManifest(n,r))),o={address:r,name:typeof i.name==`string`?i.name:r,source:itemSource(r)};return typeof i.type==`string`&&(o.type=i.type),typeof i.description==`string`&&(o.description=i.description),{item:o,manifest:i}}async function offerItem(e,t,n,r,i){let a=await inspectItem(e.prompter,t,e.appRoot,r,i,e.signal);if(a.kind!==`added`)return;let o=[...a.output];a.environment!==void 0&&a.environment.length>0&&o.push(`Environment: ${a.environment.join(`, `)}`),a.documentation!==void 0&&o.push(`Setup: ${a.documentation}`),n.add(r.address,itemLabel(r),o,a.setup);let s=await n.continueAfterInstall({appRoot:e.appRoot,prompter:e.prompter,signal:e.signal});return s===`add-more`?void 0:s}async function runRegistryFlow(t){let l;(t.deps?.browseRegistryCatalog===void 0||t.deps.getRegistryItemManifest===void 0||t.deps.installRegistryItem===void 0)&&(l=await import(`#cli/commands/registry.js`));let u={browseRegistryCatalog:t.deps?.browseRegistryCatalog??l.browseRegistryCatalog,detectDeployment:t.deps?.detectDeployment??detectDeployment,getRegistryItemManifest:t.deps?.getRegistryItemManifest??l.getRegistryItemManifest,installRegistryItem:t.deps?.installRegistryItem??l.installRegistryItem,runDeployFlow:t.deps?.runDeployFlow??runDeployFlow},d=[],f=createRegistrySession(u),p=t.initialAddress?.trim(),m=p===``?void 0:p;try{for(;;){if(t.signal?.throwIfAborted(),m!==void 0){let e=m;m=void 0;let n=await resolveAddressItem(t.prompter,u,t.appRoot,e),r=await offerItem(t,u,f,n.item,n.manifest);if(r!==void 0)return r;continue}let e=await withSpinner(t.prompter,`Loading registry…`,()=>u.browseRegistryCatalog(t.appRoot));d=[...d,...e.errors.map(e=>({tone:`warning`,text:`${e.registry}: ${e.message}`}))];let n=await t.prompter.select({message:`Add an integration`,options:categoryRows(),hintLayout:`inline`,notices:d});if(d=[],n===DONE)return f.result();let r=itemsForCategory(e.items,n),i=itemRows(r);i.push({value:BACK,label:`Back`,trailingAction:!0});let l=await t.prompter.select({message:categoryFor(n)?.browseLabel??`Browse integrations`,options:i,search:!0,placeholder:`Search integrations or enter an item address`,searchAction:{label:e=>`Add “${e}”`,value:e=>`${ADDRESS_PREFIX}${e.trim()}`},hintLayout:`inline`});if(l===BACK)continue;let p=l.startsWith(ADDRESS_PREFIX)?await resolveAddressItem(t.prompter,u,t.appRoot,l.slice(8)):{item:r[Number(l.slice(5))]};if(p.item===void 0)throw Error(`The selected registry item is no longer available.`);let h=await offerItem(t,u,f,p.item,`manifest`in p?p.manifest:void 0);if(h!==void 0)return h}}catch(e){if(e instanceof WizardCancelledError)return{kind:`cancelled`};let t=f.result();throw t.addedItems.length>0?new RegistryFlowFailedError(e,t):e}}export{RegistryFlowFailedError,runRegistryFlow};
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.58`,DEFAULT_CONNECT_PACKAGE_VERSION=`1.0.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.47.3`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,n){let r=parseChatGptModelSelection(e);return r===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(r)}),\n${reasoningTemplateLine(n)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,n){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(n.model)!==void 0?renderAgentTemplate(n.model,n.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,n.appName).replaceAll(`__EVE_INIT_MODEL__`,n.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(n.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(n.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(n.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,n.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,n.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,n.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,n.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,n.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,n.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.58`,DEFAULT_CONNECT_PACKAGE_VERSION=`1.0.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.47.5`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,n){let r=parseChatGptModelSelection(e);return r===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(r)}),\n${reasoningTemplateLine(n)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,n){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(n.model)!==void 0?renderAgentTemplate(n.model,n.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,n.appName).replaceAll(`__EVE_INIT_MODEL__`,n.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(n.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(n.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(n.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(n.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,n.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,n.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,n.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,n.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,n.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,n.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -0,0 +1,20 @@
1
+ import type { ChannelAudience } from "#shared/channel-audience.js";
2
+ import { type InstrumentationDecision } from "#shared/instrumentation-decision.js";
3
+ /** @deprecated Use `TraceCapturePolicy` to select directional content. */
4
+ export type InstrumentationCapture = "content" | "metadata";
5
+ export interface TraceCaptureContext {
6
+ readonly agentName: string;
7
+ readonly audience: ChannelAudience;
8
+ readonly channelType?: string;
9
+ }
10
+ export type TracePolicyDecision = {
11
+ readonly emit: false;
12
+ } | {
13
+ readonly emit: true;
14
+ readonly recordInputs: boolean;
15
+ readonly recordOutputs: boolean;
16
+ };
17
+ export type TraceCapturePolicy = (trace: TraceCaptureContext) => TracePolicyDecision | boolean;
18
+ export declare function legacyCaptureTracePolicy(capture: InstrumentationCapture | undefined): TraceCapturePolicy | undefined;
19
+ export declare function resolveTracePolicy(policy: TraceCapturePolicy | undefined, trace: TraceCaptureContext, onError?: (error: unknown) => void): InstrumentationDecision;
20
+ export declare function resolveTracePolicyDecision(decision: TracePolicyDecision | boolean, audience: ChannelAudience): InstrumentationDecision;
@@ -0,0 +1 @@
1
+ import{shouldCaptureInstrumentationContent}from"#shared/instrumentation-content.js";import{DROP_INSTRUMENTATION}from"#shared/instrumentation-decision.js";function legacyCaptureTracePolicy(e){if(e===void 0)return;let t=e===`content`;return()=>({emit:!0,recordInputs:t,recordOutputs:t})}function resolveTracePolicy(e,n,r){try{let t=e?.({agentName:n.agentName,audience:n.audience,channelType:n.channelType});return resolveTracePolicyDecision(t??{emit:!0,recordInputs:n.audience===`public`,recordOutputs:n.audience===`public`},n.audience)}catch(e){try{r?.(e)}catch{}return DROP_INSTRUMENTATION}}function resolveTracePolicyDecision(n,r){if(n===!1)return DROP_INSTRUMENTATION;if(n===!0){let t=shouldCaptureInstrumentationContent(r);return{action:`record`,recordInputs:t,recordOutputs:t}}return n.emit?{action:`record`,recordInputs:n.recordInputs,recordOutputs:n.recordOutputs}:DROP_INSTRUMENTATION}export{legacyCaptureTracePolicy,resolveTracePolicy,resolveTracePolicyDecision};
@@ -1,5 +1,5 @@
1
1
  import { type Context, type SpanContext, type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationActionStartedEvent, InstrumentationAttemptScope, InstrumentationProviderDefinition } from "#harness/instrumentation/lifecycle.js";
2
+ import type { InstrumentationActionStartedEvent, InstrumentationAttemptScope, InstrumentationProviderDefinition } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { AgentTraceStateStore } from "#tracing/agent-trace-state.js";
5
5
  export interface AgentActionInstrumentation {
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey,attemptIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentActionInstrumentation(n){let r=new Map,onStarted=async i=>{let a=await n.resolveTraceContext(i);if(a===void 0||!isSampledTrace(a))return;let c=await n.stateStore.getAction(i.idempotencyKey)??{attemptIndex:i.scope.attemptIndex,callId:i.callId,channelAudience:normalizeChannelAudience(i.scope.channelAudience),inputAttribute:n.recordInputs?contentAttribute(i.input,!1):void 0,kind:i.kind,name:i.name,parent:{spanId:n.idGenerator.deriveSpanId(attemptIdempotencyKey(i.scope)),traceFlags:a.traceFlags,traceId:a.traceId},rootSessionId:i.scope.rootSessionId??i.scope.sessionId,sessionId:i.scope.sessionId,spanId:n.idGenerator.deriveSpanId(`action:${i.idempotencyKey}`),startTimeMs:Date.now(),stepIndex:i.scope.stepIndex,turnId:i.scope.turnId};await n.stateStore.setAction(i.idempotencyKey,c);let l=r.get(i.scope.attemptId)??new Set;l.add(i.idempotencyKey),r.set(i.scope.attemptId,l)},onTerminal=async e=>{let t=await n.stateStore.getAction(e.idempotencyKey);if(t!==void 0)try{let r=startSpan(t);if(r.setAttribute(`agent.action.outcome`,e.outcome),e.type===`action.failed`)e.errorCode!==void 0&&(r.setAttribute(`agent.action.error.code`,e.errorCode),r.setAttribute(`error.type`,e.errorCode)),recordError(r,e.error);else if(e.output.type===`error`)recordError(r,e.output.error);else if(e.usage!==void 0&&setAgentUsage(r,e.usage),n.recordOutputs){let t=contentAttribute(e.output.output,!1);t!==void 0&&r.setAttribute(`gen_ai.tool.call.result`,t)}r.end(e.acceptedAtMs)}finally{await n.stateStore.deleteAction(e.idempotencyKey),forget(e.idempotencyKey)}},startSpan=e=>{let t=n.idGenerator.withSpanId(e.spanId,()=>n.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":e.callId,"agent.action.kind":e.kind,"agent.action.name":e.name,"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.session.id":e.sessionId,"agent.step.attempt":e.attemptIndex,"agent.step.index":e.stepIndex,"agent.turn.id":e.turnId},startTime:e.startTimeMs},contextFromActionState(e)));return e.inputAttribute!==void 0&&t.setAttribute(`gen_ai.tool.call.arguments`,e.inputAttribute),t};return{async contextFor(e,t,r){let i=actionIdempotencyKey(e,t,r),o=await n.stateStore.getAction(i);if(o!==void 0)return actionContext(o);let s=await n.stateStore.findAction(e,r);return s===void 0?void 0:actionContext(s)},deleteForSession:e=>n.stateStore.deleteActions(e),deleteForTurn:(e,t)=>n.stateStore.deleteActions(e,t),async failForAttempt(e,t){let i=r.get(e.attemptId);if(i!==void 0){r.delete(e.attemptId);for(let e of i){let r=await n.stateStore.getAction(e);if(r===void 0)continue;let i=startSpan(r);recordError(i,t),i.end(),await n.stateStore.deleteAction(e)}}},events:{"action.completed":onTerminal,"action.failed":onTerminal,"action.started":onStarted}};function forget(e){for(let[t,n]of r)n.delete(e),n.size===0&&r.delete(t)}}function actionContext(e){let t={isRemote:!1,spanId:e.spanId,traceFlags:e.parent.traceFlags,traceId:e.parent.traceId};return{context:withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t)),e.channelAudience),spanContext:t}}function contextFromActionState(e){return withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext({...e.parent,isRemote:!1})),e.channelAudience)}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentActionInstrumentation};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey,attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentActionInstrumentation(n){let r=new Map,onStarted=async i=>{let a=await n.resolveTraceContext(i);if(a===void 0||!isSampledTrace(a))return;let c=await n.stateStore.getAction(i.idempotencyKey)??{attemptIndex:i.scope.attemptIndex,callId:i.callId,channelAudience:normalizeChannelAudience(i.scope.channelAudience),inputAttribute:n.recordInputs?contentAttribute(i.input,!1):void 0,kind:i.kind,name:i.name,parent:{spanId:n.idGenerator.deriveSpanId(attemptIdempotencyKey(i.scope)),traceFlags:a.traceFlags,traceId:a.traceId},rootSessionId:i.scope.rootSessionId??i.scope.sessionId,sessionId:i.scope.sessionId,spanId:n.idGenerator.deriveSpanId(`action:${i.idempotencyKey}`),startTimeMs:Date.now(),stepIndex:i.scope.stepIndex,turnId:i.scope.turnId};await n.stateStore.setAction(i.idempotencyKey,c);let l=r.get(i.scope.attemptId)??new Set;l.add(i.idempotencyKey),r.set(i.scope.attemptId,l)},onTerminal=async e=>{let t=await n.stateStore.getAction(e.idempotencyKey);if(t!==void 0)try{let r=startSpan(t);if(r.setAttribute(`agent.action.outcome`,e.outcome),e.type===`action.failed`)e.errorCode!==void 0&&(r.setAttribute(`agent.action.error.code`,e.errorCode),r.setAttribute(`error.type`,e.errorCode)),recordError(r,e.error);else if(e.output.type===`error`)recordError(r,e.output.error);else if(e.usage!==void 0&&setAgentUsage(r,e.usage,{includeGenAiDetails:!1}),n.recordOutputs){let t=contentAttribute(e.output.output,!1);t!==void 0&&r.setAttribute(`gen_ai.tool.call.result`,t)}r.end(e.acceptedAtMs)}finally{await n.stateStore.deleteAction(e.idempotencyKey),forget(e.idempotencyKey)}},startSpan=e=>{let t=n.idGenerator.withSpanId(e.spanId,()=>n.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":e.callId,"agent.action.kind":e.kind,"agent.action.name":e.name,"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.session.id":e.sessionId,"agent.step.attempt":e.attemptIndex,"agent.step.index":e.stepIndex,"agent.turn.id":e.turnId},startTime:e.startTimeMs},contextFromActionState(e)));return e.inputAttribute!==void 0&&t.setAttribute(`gen_ai.tool.call.arguments`,e.inputAttribute),t};return{async contextFor(e,t,r){let i=actionIdempotencyKey(e,t,r),o=await n.stateStore.getAction(i);if(o!==void 0)return actionContext(o);let s=await n.stateStore.findAction(e,r);return s===void 0?void 0:actionContext(s)},deleteForSession:e=>n.stateStore.deleteActions(e),deleteForTurn:(e,t)=>n.stateStore.deleteActions(e,t),async failForAttempt(e,t){let i=r.get(e.attemptId);if(i!==void 0){r.delete(e.attemptId);for(let e of i){let r=await n.stateStore.getAction(e);if(r===void 0)continue;let i=startSpan(r);recordError(i,t),i.end(),await n.stateStore.deleteAction(e)}}},events:{"action.completed":onTerminal,"action.failed":onTerminal,"action.started":onStarted}};function forget(e){for(let[t,n]of r)n.delete(e),n.size===0&&r.delete(t)}}function actionContext(e){let t={isRemote:!1,spanId:e.spanId,traceFlags:e.parent.traceFlags,traceId:e.parent.traceId};return{context:withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t)),e.channelAudience),spanContext:t}}function contextFromActionState(e){return withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext({...e.parent,isRemote:!1})),e.channelAudience)}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentActionInstrumentation};
@@ -1,5 +1,5 @@
1
1
  import { type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationProviderDefinition } from "#harness/instrumentation/lifecycle.js";
2
+ import type { InstrumentationProviderDefinition } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentActionContext } from "#tracing/agent-action-instrumentation.js";
4
4
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
5
5
  /** Builds durable approval wait spans under their originating runtime action. */
@@ -1,5 +1,5 @@
1
1
  import { type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationProviderDefinition, InstrumentationSessionStartedEvent } from "#harness/instrumentation/lifecycle.js";
2
+ import type { InstrumentationProviderDefinition, InstrumentationSessionStartedEvent } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { AgentSessionTraceState, AgentTraceStateStore } from "#tracing/agent-trace-state.js";
5
5
  /** Builds durable channel delivery spans around the turn that consumes each request. */
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{sessionIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentChannelDeliveryInstrumentation(n){let onStarted=async(r,i)=>{let a=await n.ensureSessionContext({agentName:r.agentName,channelAudience:r.delivery.channelAudience,channelKind:r.delivery.channelKind,idempotencyKey:sessionIdempotencyKey(r.sessionId),parentTraceContext:r.parentTraceContext,rootSessionId:r.rootSessionId,sessionId:r.sessionId,traceSeed:r.traceSeed,type:`session.started`});if(!isSampledTrace(a.context))return;let c=n.recordInputs?contentAttribute(r.input,!1):void 0,l={channelAudience:normalizeChannelAudience(r.delivery.channelAudience),parent:{isRemote:a.context.isRemote??!1,spanId:a.context.spanId,traceFlags:a.context.traceFlags,traceId:a.context.traceId},spanId:n.idGenerator.deriveSpanId(`channel-delivery:${r.idempotencyKey}`),startTimeMs:Date.now()};c!==void 0&&(l.inputAttribute=c),r.delivery.requestTraceContext!==void 0&&(l.requestTraceContext={spanId:r.delivery.requestTraceContext.spanId,traceFlags:r.delivery.requestTraceContext.traceFlags,traceId:r.delivery.requestTraceContext.traceId}),i.state.set(l)},onTerminal=async(e,t)=>{let i=readState(t.state.get());if(i===void 0)return;let a=e.turnId===void 0?void 0:await n.stateStore.getTurn(e.sessionId,e.turnId),o=a===void 0?i.parent:{isRemote:a.parentIsRemote??!1,spanId:a.parentSpanId,traceFlags:a.context.traceFlags,traceId:a.context.traceId},s=a===void 0?i.startTimeMs:Math.max(i.startTimeMs,a.startTimeMs),c=i.requestTraceContext,l=n.idGenerator.withSpanId(i.spanId,()=>n.tracer.startSpan(`agent.channel.delivery`,{attributes:{"agent.channel.delivery.id":e.delivery.deliveryId,"agent.channel.delivery.outcome":e.outcome,"agent.channel.kind":e.delivery.channelKind,"agent.channel.name":e.delivery.channelName,"agent.channel.request.id":e.delivery.requestId,"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.turn.id":e.turnId,"agent.turn.sequence":e.sequence},kind:SpanKind.CONSUMER,links:c===void 0?void 0:[{attributes:{"eve.link.type":`channel.request`},context:c}],startTime:s},contextFromSpanContext(o)));if(l.addEvent(`channel.delivery.started`,void 0,s),l.addEvent(e.type),i.inputAttribute!==void 0&&l.setAttribute(`agent.channel.delivery.input`,i.inputAttribute),e.outcome===`failed`){let t=e.errorCode??(e.error instanceof Error?e.error.name:`Error`);l.setAttribute(`error.type`,t),e.errorCode!==void 0&&l.setAttribute(`agent.channel.delivery.error.code`,e.errorCode),recordError(l,e.error)}l.end()};return{"channel.delivery.cancelled":onTerminal,"channel.delivery.completed":onTerminal,"channel.delivery.failed":onTerminal,"channel.delivery.started":onStarted}}function readState(t){if(!isRecord(t)||!isSpanContext(t.parent)||typeof t.spanId!=`string`||typeof t.startTimeMs!=`number`)return;let n=isSpanContext(t.requestTraceContext)?t.requestTraceContext:void 0;return{channelAudience:normalizeChannelAudience(t.channelAudience),inputAttribute:typeof t.inputAttribute==`string`?t.inputAttribute:void 0,parent:t.parent,requestTraceContext:n,spanId:t.spanId,startTimeMs:t.startTimeMs}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentChannelDeliveryInstrumentation};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{sessionIdempotencyKey}from"#instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentChannelDeliveryInstrumentation(n){let onStarted=async(r,i)=>{let a=await n.ensureSessionContext({agentName:r.agentName,channelAudience:r.delivery.channelAudience,channelKind:r.delivery.channelKind,idempotencyKey:sessionIdempotencyKey(r.sessionId),parentTraceContext:r.parentTraceContext,rootSessionId:r.rootSessionId,sessionId:r.sessionId,traceSeed:r.traceSeed,type:`session.started`});if(!isSampledTrace(a.context))return;let c=n.recordInputs?contentAttribute(r.input,!1):void 0,l={channelAudience:normalizeChannelAudience(r.delivery.channelAudience),parent:{isRemote:a.context.isRemote??!1,spanId:a.context.spanId,traceFlags:a.context.traceFlags,traceId:a.context.traceId},spanId:n.idGenerator.deriveSpanId(`channel-delivery:${r.idempotencyKey}`),startTimeMs:Date.now()};c!==void 0&&(l.inputAttribute=c),r.delivery.requestTraceContext!==void 0&&(l.requestTraceContext={spanId:r.delivery.requestTraceContext.spanId,traceFlags:r.delivery.requestTraceContext.traceFlags,traceId:r.delivery.requestTraceContext.traceId}),i.state.set(l)},onTerminal=async(e,t)=>{let i=readState(t.state.get());if(i===void 0)return;let a=e.turnId===void 0?void 0:await n.stateStore.getTurn(e.sessionId,e.turnId),o=a===void 0?i.startTimeMs:Math.max(i.startTimeMs,a.startTimeMs),s=i.requestTraceContext,c=n.idGenerator.withSpanId(i.spanId,()=>n.tracer.startSpan(`agent.channel.delivery`,{attributes:{"agent.channel.delivery.id":e.delivery.deliveryId,"agent.channel.delivery.outcome":e.outcome,"agent.channel.kind":e.delivery.channelKind,"agent.channel.name":e.delivery.channelName,"agent.channel.request.id":e.delivery.requestId,"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.turn.id":e.turnId,"agent.turn.sequence":e.sequence},kind:SpanKind.CONSUMER,links:s===void 0?void 0:[{attributes:{"eve.link.type":`channel.request`},context:s}],startTime:o},contextFromSpanContext(i.parent)));if(c.addEvent(`channel.delivery.started`,void 0,o),c.addEvent(e.type),i.inputAttribute!==void 0&&c.setAttribute(`agent.channel.delivery.input`,i.inputAttribute),e.outcome===`failed`){let t=e.errorCode??(e.error instanceof Error?e.error.name:`Error`);c.setAttribute(`error.type`,t),e.errorCode!==void 0&&c.setAttribute(`agent.channel.delivery.error.code`,e.errorCode),recordError(c,e.error)}c.end(),a!==void 0&&e.turnId!==void 0&&a.parentSpanId===i.parent.spanId&&a.context.traceId===i.parent.traceId&&await n.stateStore.updateTurn(e.sessionId,e.turnId,e=>e.parentSpanId===i.parent.spanId&&e.context.traceId===i.parent.traceId?{...e,parentIsRemote:!1,parentSpanId:i.spanId}:e)};return{"channel.delivery.cancelled":onTerminal,"channel.delivery.completed":onTerminal,"channel.delivery.failed":onTerminal,"channel.delivery.started":onStarted}}function readState(t){if(!isRecord(t)||!isSpanContext(t.parent)||typeof t.spanId!=`string`||typeof t.startTimeMs!=`number`)return;let n=isSpanContext(t.requestTraceContext)?t.requestTraceContext:void 0;return{channelAudience:normalizeChannelAudience(t.channelAudience),inputAttribute:typeof t.inputAttribute==`string`?t.inputAttribute:void 0,parent:t.parent,requestTraceContext:n,spanId:t.spanId,startTimeMs:t.startTimeMs}}function isSpanContext(e){return isRecord(e)&&typeof e.spanId==`string`&&typeof e.traceFlags==`number`&&typeof e.traceId==`string`}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentChannelDeliveryInstrumentation};
@@ -2,7 +2,7 @@ import { type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
2
  import type { AgentTraceStateStore } from "#tracing/agent-trace-state.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { TraceCapturePolicy } from "#tracing/otel-declaration.js";
5
- import type { InstrumentationContextRunner, InstrumentationProviderDefinition, InstrumentationSessionStartedEvent, InstrumentationTraceSeed, InstrumentationTurnStartedEvent } from "#harness/instrumentation/lifecycle.js";
5
+ import type { InstrumentationContextRunner, InstrumentationProviderDefinition, InstrumentationSessionStartedEvent, InstrumentationTraceSeed, InstrumentationTurnStartedEvent } from "#instrumentation/lifecycle.js";
6
6
  export interface AgentOtelInstrumentationInput {
7
7
  /**
8
8
  * Whether to write model prompts and tool call inputs onto spans at all.
@@ -25,5 +25,5 @@ export interface AgentOtelInstrumentation {
25
25
  readonly prepareTurnTrace: (event: InstrumentationTurnStartedEvent) => Promise<InstrumentationTraceSeed>;
26
26
  readonly runInContext: InstrumentationContextRunner;
27
27
  }
28
- /** Creates OTel instrumentation for eve's structural `agent.*` convention. */
28
+ /** Creates OTel instrumentation for eve's structural and GenAI spans. */
29
29
  export declare function createAgentOtelInstrumentation(input: AgentOtelInstrumentationInput): AgentOtelInstrumentation;
@@ -1,2 +1,2 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{attemptIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#harness/instrumentation/content.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{instrumentationEventForTraceDecision}from"#harness/instrumentation/content-policy.js";import{createAgentActionInstrumentation}from"#tracing/agent-action-instrumentation.js";import{createAgentApprovalInstrumentation}from"#tracing/agent-approval-instrumentation.js";import{createAgentChannelDeliveryInstrumentation}from"#tracing/agent-channel-delivery-instrumentation.js";import{createAgentToolInstrumentation}from"#tracing/agent-tool-instrumentation.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";import{suppressTracing}from"#tracing/suppress-tracing.js";function createAgentOtelInstrumentation(e){let a=e.recordInputs??!1,o=e.recordOutputs??!1,m=new WeakMap,h=new Map,g=new WeakMap,_=new WeakMap,v=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:a,recordOutputs:o,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),y=createAgentApprovalInstrumentation({actionContextFor:v.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),b=createAgentToolInstrumentation({actionContextFor:v.contextFor,idGenerator:e.idGenerator,recordInputs:a,recordOutputs:o,resolveFallback:e=>{let t=h.get(e.scope.attemptId)??e.scope,n=g.get(t)?.step;return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:x,prepareSessionTrace:S,prepareTurnTrace:C}=createAgentOtelSessionContext(e),projectEvent=async s=>{let c=await e.stateStore.getSession(sessionIdForEvent(s)),l=audienceForEvent(s,c?.channelAudience),d=`traceSeed`in s?s.traceSeed:void 0,f=contextStorage.getStore()?.get(SessionTraceSeedKey),p=d?.decision??f?.decision??c?.decision??(d===void 0?f===void 0?c===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(c.context),l):resolveTracePolicyDecision(isSampledTrace(f),l):resolveTracePolicyDecision(isSampledTrace(d),l));return p===void 0?withoutInstrumentationContent(s):instrumentationEventForTraceDecision(s,p.action===`drop`?p:{action:`record`,recordInputs:a&&p.recordInputs,recordOutputs:o&&p.recordOutputs},l)},onSessionStarted=async e=>{await S(e)},onTurnStarted=async e=>{await C(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let i=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),a=trace.getSpan(context.active())?.spanContext(),o=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...runtimeContextAttributes(t.runtimeContext)},links:a===void 0||a.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:a}]},i));o.addEvent(`step.started`);let u=trace.setSpan(i,o),d=t.operation.operationId,f=e.tracer.startSpan(d,{attributes:{"ai.operation.name":d,"ai.provider.name":t.operation.provider,"ai.request.model":t.operation.modelId,...runtimeContextAttributes(t.runtimeContext)}},u);g.set(t.scope,{operation:{context:trace.setSpan(u,f),name:d,span:f},step:{context:u,span:o}}),h.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=h.get(e.scope.attemptId)??e.scope;m.delete(t),drainOpenSpans({...e,scope:t}),b.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await v.failForAttempt(t,e.error),h.delete(e.scope.attemptId);let n=g.get(t);n!==void 0&&(n.step.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&(recordError(n.operation.span,e.error),recordError(n.step.span,e.error)),n.operation.span.end(),n.step.span.end(),g.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await v.deleteForTurn(t.sessionId,t.turnId);let n=await e.stateStore.getTurn(t.sessionId,t.turnId);n!==void 0&&await e.stateStore.setTurn(t.sessionId,t.turnId,{...n,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}})},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let i=await e.stateStore.getSession(t.sessionId);if(isSampledTrace(n.context)){let r=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(`agent.turn`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":i?.agentName,"agent.session.id":t.sessionId,"agent.subagent.name":n.subagentName,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence},startTime:n.startTimeMs},contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId})));r.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(r.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(r,n.terminal.error)),r.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await v.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=t=>{let n=g.get(t.scope);if(n===void 0)return;n.step.span.setAttribute(`agent.model.id`,t.model.modelId),n.step.span.setAttribute(`agent.model.provider`,t.model.provider);let r=e.tracer.startSpan(modelSpanName(t.model.modelId),{attributes:{"gen_ai.agent.name":t.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":t.model.provider,"gen_ai.request.model":t.model.modelId,...runtimeContextAttributes(t.runtimeContext)}},n.operation.context);if(a&&t.input!==void 0){let e=messagesContentAttribute(t.input.messages);e!==void 0&&r.setAttribute(`ai.prompt.messages`,e);let n=genAiInputMessagesAttribute(t.input.messages);n!==void 0&&r.setAttribute(`gen_ai.input.messages`,n);let i=systemPromptAttribute(t.input.instructions);i!==void 0&&r.setAttribute(`ai.prompt.system`,i);let a=genAiSystemInstructionsAttribute(t.input.instructions);a!==void 0&&r.setAttribute(`gen_ai.system_instructions`,a)}let i={context:trace.setSpan(n.operation.context,r),span:r};getExecutionContexts(t.scope).set(t.idempotencyKey,i.context),getSpanStates(_,t.scope).set(t.idempotencyKey,i)},onModelCallTerminal=e=>{m.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(_,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let n=g.get(e.scope);if(n!==void 0&&setAgentUsage(n.step.span,e.usage),o){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let i=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
- `));i!==void 0&&t.span.setAttribute(`ai.response.reasoning`,i);let a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},w=createAgentChannelDeliveryInstrumentation({ensureSessionContext:x,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:a,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=g.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.step.span.setAttribute(e,r)};return{hook:{capture:a||o?`content`:`metadata`,events:{...w,"action.completed":v.events[`action.completed`],"action.failed":v.events[`action.failed`],async"action.started"(e,t){await v.events[`action.started`](e,t),await b.actionStarted(e)},...y,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...b.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent},prepareSessionTrace:S,prepareTurnTrace:C,async runInContext(t,n){let i=h.get(t.scope.attemptId)??t.scope,a=m.get(i),o=t.type===`model.call`?a?.get(t.idempotencyKey):b.contextFor(t.scope.attemptId,t.idempotencyKey);if(o===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(o=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(o=suppressTracing(o)))}return o===void 0?n():context.with(o,n)}};function getExecutionContexts(e){let t=m.get(e);return t===void 0&&(t=new Map,m.set(e,t)),t}function drainOpenSpans(e){for(let t of _.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();_.delete(e.scope)}}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(t,n){return`delivery`in t?normalizeChannelAudience(t.delivery.channelAudience):`scope`in t&&t.scope.channelAudience!==void 0?normalizeChannelAudience(t.scope.channelAudience):t.type===`session.started`?normalizeChannelAudience(t.channelAudience):normalizeChannelAudience(n)}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return`chat ${e}`}function runtimeContextAttributes(e){let t={};if(e===void 0)return t;for(let[n,r]of Object.entries(e))flattenContextAttribute(t,`ai.settings.context.${n}`,r);return t}function flattenContextAttribute(e,t,n){if(n!=null){if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`){e[t]=n;return}if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`);if(r.length!==n.length||new Set(r.map(e=>typeof e)).size!==1)return;e[t]=r;return}if(typeof n==`object`)for(let[r,i]of Object.entries(n))flattenContextAttribute(e,`${t}.${r}`,i)}}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{markAgentTraceContext}from"#tracing/agent-trace-context.js";import{attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{instrumentationEventForTraceDecision}from"#instrumentation/content-policy.js";import{createAgentActionInstrumentation}from"#tracing/agent-action-instrumentation.js";import{createAgentApprovalInstrumentation}from"#tracing/agent-approval-instrumentation.js";import{createAgentChannelDeliveryInstrumentation}from"#tracing/agent-channel-delivery-instrumentation.js";import{createAgentToolInstrumentation}from"#tracing/agent-tool-instrumentation.js";import{runtimeContextAttributes}from"#tracing/agent-otel-runtime-context.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";import{suppressTracing}from"#tracing/suppress-tracing.js";function createAgentOtelInstrumentation(e){let a=e.recordInputs??!1,s=e.recordOutputs??!1,p=new WeakMap,m=new Map,h=new WeakMap,g=new WeakMap,_=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:a,recordOutputs:s,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),v=createAgentApprovalInstrumentation({actionContextFor:_.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),y=createAgentToolInstrumentation({actionContextFor:_.contextFor,idGenerator:e.idGenerator,recordInputs:a,recordOutputs:s,resolveFallback:e=>{let t=m.get(e.scope.attemptId)??e.scope,n=h.get(t);return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:b,prepareSessionTrace:x,prepareTurnTrace:S}=createAgentOtelSessionContext(e),projectEvent=async o=>{let c=await e.stateStore.getSession(sessionIdForEvent(o)),l=audienceForEvent(o,c?.channelAudience),u=`traceSeed`in o?o.traceSeed:void 0,d=contextStorage.getStore()?.get(SessionTraceSeedKey),f=u?.decision??d?.decision??c?.decision??(u===void 0?d===void 0?c===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(c.context),l):resolveTracePolicyDecision(isSampledTrace(d),l):resolveTracePolicyDecision(isSampledTrace(u),l));return f===void 0?withoutInstrumentationContent(o):instrumentationEventForTraceDecision(o,f.action===`drop`?f:{action:`record`,recordInputs:a&&f.recordInputs,recordOutputs:s&&f.recordOutputs},l)},onSessionStarted=async e=>{await x(e)},onTurnStarted=async e=>{await S(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let i=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),a=trace.getSpan(context.active())?.spanContext(),o=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...runtimeContextAttributes(t.runtimeContext)},links:a===void 0||a.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:a}]},i));o.addEvent(`step.started`);let s=trace.setSpan(i,o);h.set(t.scope,{context:s,span:o}),m.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=m.get(e.scope.attemptId)??e.scope;p.delete(t),drainOpenSpans({...e,scope:t}),y.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await _.failForAttempt(t,e.error),m.delete(e.scope.attemptId);let n=h.get(t);n!==void 0&&(n.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&recordError(n.span,e.error),n.span.end(),h.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await _.deleteForTurn(t.sessionId,t.turnId),await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}}))},onSessionTransition=async t=>{if(t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let i=await e.stateStore.getSession(t.sessionId);if(isSampledTrace(n.context)){let r=i?.agentName??n.subagentName,a=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(agentSpanName(r),{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":r,"agent.session.id":t.sessionId,"agent.subagent.name":n.subagentName,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence,"gen_ai.agent.name":r,"gen_ai.conversation.id":t.sessionId,"gen_ai.operation.name":`invoke_agent`},kind:SpanKind.INTERNAL,startTime:n.startTimeMs},contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId})));setAgentInvocationUsage(a,n.modelUsage),a.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(a.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(a,n.terminal.error)),a.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await _.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=t=>{let n=h.get(t.scope);if(n===void 0)return;n.span.setAttribute(`agent.model.id`,t.model.modelId),n.span.setAttribute(`agent.model.provider`,t.model.provider);let r=e.tracer.startSpan(modelSpanName(t.model.modelId),{attributes:{"gen_ai.agent.name":t.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":t.model.provider,"gen_ai.request.model":t.model.modelId,...runtimeContextAttributes(t.runtimeContext)}},n.context);if(a&&t.input!==void 0){let e=messagesContentAttribute(t.input.messages);e!==void 0&&r.setAttribute(`ai.prompt.messages`,e);let n=genAiInputMessagesAttribute(t.input.messages);n!==void 0&&r.setAttribute(`gen_ai.input.messages`,n);let i=systemPromptAttribute(t.input.instructions);i!==void 0&&r.setAttribute(`ai.prompt.system`,i);let a=genAiSystemInstructionsAttribute(t.input.instructions);a!==void 0&&r.setAttribute(`gen_ai.system_instructions`,a)}let i={context:trace.setSpan(n.context,r),span:r};getExecutionContexts(t.scope).set(t.idempotencyKey,i.context),getSpanStates(g,t.scope).set(t.idempotencyKey,i)},onModelCallTerminal=async e=>{p.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(g,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{await recordTurnUsage(e),setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let n=h.get(e.scope);if(n!==void 0&&setAgentUsage(n.span,e.usage),s){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let i=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
+ `));i!==void 0&&t.span.setAttribute(`ai.response.reasoning`,i);let a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},recordTurnUsage=async t=>{t.usage.inputTokens===void 0&&t.usage.outputTokens===void 0||await e.stateStore.updateTurn(t.scope.sessionId,t.scope.turnId,e=>({...e,modelUsage:{inputTokens:t.usage.inputTokens===void 0?e.modelUsage?.inputTokens:(e.modelUsage?.inputTokens??0)+t.usage.inputTokens,outputTokens:t.usage.outputTokens===void 0?e.modelUsage?.outputTokens:(e.modelUsage?.outputTokens??0)+t.usage.outputTokens}}))},C=createAgentChannelDeliveryInstrumentation({ensureSessionContext:b,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:a,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=h.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.span.setAttribute(e,r)};return{hook:{events:{...C,"action.completed":_.events[`action.completed`],"action.failed":_.events[`action.failed`],async"action.started"(e,t){await _.events[`action.started`](e,t),await y.actionStarted(e)},...v,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...y.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent,tracePolicy:()=>({emit:!0,recordInputs:a,recordOutputs:s})},prepareSessionTrace:x,prepareTurnTrace:S,async runInContext(t,n){let i=m.get(t.scope.attemptId)??t.scope,a=p.get(i),o=t.type===`model.call`?a?.get(t.idempotencyKey):y.contextFor(t.scope.attemptId,t.idempotencyKey);if(o===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(o=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(o=suppressTracing(o)))}return o===void 0?n():context.with(markAgentTraceContext(o),n)}};function getExecutionContexts(e){let t=p.get(e);return t===void 0&&(t=new Map,p.set(e,t)),t}function drainOpenSpans(e){for(let t of g.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();g.delete(e.scope)}}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(t,n){return`delivery`in t?normalizeChannelAudience(t.delivery.channelAudience):`scope`in t&&t.scope.channelAudience!==void 0?normalizeChannelAudience(t.scope.channelAudience):t.type===`session.started`?normalizeChannelAudience(t.channelAudience):normalizeChannelAudience(n)}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function modelSpanName(e){return`chat ${e}`}function agentSpanName(e){return e===void 0?`invoke_agent`:`invoke_agent ${e}`}function setAgentInvocationUsage(e,t){t!==void 0&&(t.inputTokens!==void 0&&e.setAttribute(`gen_ai.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`gen_ai.usage.output_tokens`,t.outputTokens))}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
@@ -0,0 +1,5 @@
1
+ type SpanAttributePrimitive = string | number | boolean;
2
+ type SpanAttributeValue = SpanAttributePrimitive | SpanAttributePrimitive[];
3
+ /** Flattens merged runtime context into AI SDK-compatible span attributes. */
4
+ export declare function runtimeContextAttributes(runtimeContext: Readonly<Record<string, unknown>> | undefined): Record<string, SpanAttributeValue>;
5
+ export {};
@@ -0,0 +1 @@
1
+ function runtimeContextAttributes(e){let t={};if(e===void 0)return t;for(let[n,r]of Object.entries(e))flattenContextAttribute(t,`ai.settings.context.${n}`,r);return t}function flattenContextAttribute(e,t,n){if(n!=null){if(typeof n==`string`||typeof n==`number`||typeof n==`boolean`){e[t]=n;return}if(Array.isArray(n)){let r=n.filter(e=>typeof e==`string`||typeof e==`number`||typeof e==`boolean`);if(r.length!==n.length||new Set(r.map(e=>typeof e)).size!==1)return;e[t]=r;return}if(typeof n==`object`)for(let[r,i]of Object.entries(n))flattenContextAttribute(e,`${t}.${r}`,i)}}export{runtimeContextAttributes};
@@ -1,5 +1,5 @@
1
1
  import type { Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import { type InstrumentationSessionStartedEvent, type InstrumentationTraceSeed, type InstrumentationTurnStartedEvent } from "#harness/instrumentation/lifecycle.js";
2
+ import { type InstrumentationSessionStartedEvent, type InstrumentationTraceSeed, type InstrumentationTurnStartedEvent } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { TraceCapturePolicy } from "#tracing/otel-declaration.js";
5
5
  import type { AgentSessionTraceState, AgentTraceStateStore } from "#tracing/agent-trace-state.js";
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{sessionIdempotencyKey}from"#harness/instrumentation/lifecycle.js";function createAgentOtelSessionContext(n){let openSessionTrace=e=>{if(e.traceSeed!==void 0){if(!isSampledTrace(e.traceSeed))return{isRemote:!1,spanId:e.traceSeed.spanId,traceFlags:0,traceId:e.traceSeed.traceId};let startSpan=()=>n.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.channel.audience":e.channelAudience,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.trace.schema.version":2},root:!0}),r=n.idGenerator.withSpanId(e.traceSeed.spanId,()=>n.idGenerator.withTraceId(e.traceSeed.traceId,startSpan));return r.addEvent(`session.started`),r.end(),r.spanContext()}if(e.traceDecision.action===`drop`)return{isRemote:!1,spanId:n.idGenerator.deriveSpanId(`session:${e.sessionId}`),traceFlags:0,traceId:n.idGenerator.generateTraceId()};let r=n.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.channel.audience":e.channelAudience,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.trace.schema.version":2},root:!0});return r.addEvent(`session.started`),r.end(),r.spanContext()},ensureSessionContext=async t=>{let r=await n.stateStore.getSession(t.sessionId);if(r===void 0){let i=normalizeChannelAudience(t.channelAudience),a=resolveSessionTraceDecision(t,i,n.tracePolicy);r={agentName:t.agentName,channelAudience:i,channelKind:t.channelKind,decision:a,context:t.parentTraceContext===void 0?openSessionTrace({agentName:t.agentName,channelAudience:i,channelType:t.channelType,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceDecision:a,traceSeed:t.traceSeed}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId},await n.stateStore.setSession(t.sessionId,r)}return r};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async e=>{let t=await n.stateStore.getTurn(e.sessionId,e.turnId);if(t!==void 0)return{decision:(await n.stateStore.getSession(e.sessionId))?.decision,spanId:t.parentSpanId,traceFlags:t.context.traceFlags,traceId:t.context.traceId};let r=await ensureSessionContext({agentName:void 0,channelAudience:`unknown`,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(e.sessionId),parentTraceContext:e.parentTraceContext,rootSessionId:e.rootSessionId,sessionId:e.sessionId,type:`session.started`}),a={isRemote:!1,spanId:n.idGenerator.deriveSpanId(`turn:${e.idempotencyKey}`),traceFlags:r.context.traceFlags,traceId:r.context.traceId};return await n.stateStore.setTurn(e.sessionId,e.turnId,{context:a,parentIsRemote:r.context.isRemote,parentSpanId:r.context.spanId,rootSessionId:e.rootSessionId,sequence:e.sequence,startTimeMs:Date.now(),subagentName:e.parentLineage?.subagentName}),portableSpanContext(r.context,r.decision)}}}function portableSpanContext(e,t){return{decision:t,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function resolveSessionTraceDecision(e,i,a){return e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?resolveTracePolicy(a,{agentName:e.agentName,audience:i,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),i):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),i):e.traceSeed.decision}export{createAgentOtelSessionContext};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{sessionIdempotencyKey}from"#instrumentation/lifecycle.js";function createAgentOtelSessionContext(n){let openSessionTrace=e=>{if(e.traceSeed!==void 0){if(!isSampledTrace(e.traceSeed))return{isRemote:!1,spanId:e.traceSeed.spanId,traceFlags:0,traceId:e.traceSeed.traceId};let startSpan=()=>n.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.channel.audience":e.channelAudience,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.trace.schema.version":3},root:!0}),r=n.idGenerator.withSpanId(e.traceSeed.spanId,()=>n.idGenerator.withTraceId(e.traceSeed.traceId,startSpan));return r.addEvent(`session.started`),r.end(),r.spanContext()}if(e.traceDecision.action===`drop`)return{isRemote:!1,spanId:n.idGenerator.deriveSpanId(`session:${e.sessionId}`),traceFlags:0,traceId:n.idGenerator.generateTraceId()};let r=n.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":n.frameworkVersion,"agent.channel.audience":e.channelAudience,"agent.name":e.agentName,"agent.session.id":e.sessionId,"agent.trace.schema.version":3},root:!0});return r.addEvent(`session.started`),r.end(),r.spanContext()},ensureSessionContext=async t=>{let r=await n.stateStore.getSession(t.sessionId);if(r===void 0){let i=normalizeChannelAudience(t.channelAudience),a=resolveSessionTraceDecision(t,i,n.tracePolicy);r={agentName:t.agentName,channelAudience:i,channelKind:t.channelKind,decision:a,context:t.parentTraceContext===void 0?openSessionTrace({agentName:t.agentName,channelAudience:i,channelType:t.channelType,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceDecision:a,traceSeed:t.traceSeed}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId},await n.stateStore.setSession(t.sessionId,r)}return r};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async e=>{let t=await n.stateStore.getTurn(e.sessionId,e.turnId);if(t!==void 0)return{decision:(await n.stateStore.getSession(e.sessionId))?.decision,spanId:t.parentSpanId,traceFlags:t.context.traceFlags,traceId:t.context.traceId};let r=await ensureSessionContext({agentName:e.agentName,channelAudience:`unknown`,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(e.sessionId),parentTraceContext:e.parentTraceContext,rootSessionId:e.rootSessionId,sessionId:e.sessionId,type:`session.started`}),a={isRemote:!1,spanId:n.idGenerator.deriveSpanId(`turn:${e.idempotencyKey}`),traceFlags:r.context.traceFlags,traceId:r.context.traceId};return await n.stateStore.setTurn(e.sessionId,e.turnId,{context:a,parentIsRemote:r.context.isRemote,parentSpanId:r.context.spanId,rootSessionId:e.rootSessionId,sequence:e.sequence,startTimeMs:Date.now(),subagentName:e.parentLineage?.subagentName}),portableSpanContext(r.context,r.decision)}}}function portableSpanContext(e,t){return{decision:t,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function resolveSessionTraceDecision(e,i,a){return e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?a===void 0?resolveTracePolicyDecision(!0,i):{action:`drop`}:resolveTracePolicy(a,{agentName:e.agentName,audience:i,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),i):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),i):e.traceSeed.decision}export{createAgentOtelSessionContext};
@@ -1,4 +1,6 @@
1
1
  import type { Span } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationUsage } from "#harness/instrumentation/lifecycle.js";
2
+ import type { InstrumentationUsage } from "#instrumentation/lifecycle.js";
3
3
  /** Applies eve's structural token usage attributes to an agent span. */
4
- export declare function setAgentUsage(span: Span, usage: InstrumentationUsage): void;
4
+ export declare function setAgentUsage(span: Span, usage: InstrumentationUsage, options?: {
5
+ readonly includeGenAiDetails?: boolean;
6
+ }): void;
@@ -1 +1 @@
1
- function setAgentUsage(e,t){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let n=t.inputTokenDetails;n?.cacheReadTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,n.cacheReadTokens),n?.cacheWriteTokens!==void 0&&e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,n.cacheWriteTokens)}export{setAgentUsage};
1
+ function setAgentUsage(e,t,n={}){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let r=t.inputTokenDetails;r?.cacheReadTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_read_tokens`,r.cacheReadTokens):e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,r.cacheReadTokens)),r?.cacheWriteTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_write_tokens`,r.cacheWriteTokens):e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,r.cacheWriteTokens))}export{setAgentUsage};
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Id generator shared by `registerOTel` and the agent OTel provider. A span
3
- * whose lifetime crosses durable worker boundaries (`agent.turn`) is emitted
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.
6
6
  */
@@ -1,5 +1,5 @@
1
1
  import { type Context, type SpanContext, type Tracer } from "#compiled/@opentelemetry/api/index.js";
2
- import type { InstrumentationActionStartedEvent, InstrumentationToolCallStartedEvent, InstrumentationToolCallTerminalEvent } from "#harness/instrumentation/lifecycle.js";
2
+ import type { InstrumentationActionStartedEvent, InstrumentationToolCallStartedEvent, InstrumentationToolCallTerminalEvent } from "#instrumentation/lifecycle.js";
3
3
  import type { AgentSpanIdGenerator } from "#tracing/agent-span-id-generator.js";
4
4
  import type { AgentActionContext } from "#tracing/agent-action-instrumentation.js";
5
5
  export interface AgentToolInstrumentation {
@@ -1 +1 @@
1
- import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#harness/instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentToolInstrumentation(e){let t=new Map,n=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),i=e.resolveFallback(t),a=i===void 0?void 0:reserve(t,n,i),o=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(a===void 0){if(o===void 0)return;a=reserve(t,n,o)}o!==void 0&&startSpan(a,o.context)},onTerminal=async t=>{let r=n.get(t.scope.attemptId)?.get(t.idempotencyKey);if(r!==void 0){if(r.terminal=t,r.span===void 0){let t=await e.actionContextFor(r.event.scope.sessionId,r.event.scope.turnId,r.event.callId);t!==void 0&&startSpan(r,t.context)}finishIfReady(r)}};return{async actionStarted(n){let r=t.get(n.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(n.scope.sessionId,n.scope.turnId,n.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>n.get(e)?.get(t)?.context,drain(e,t){let r=n.get(e);if(r!==void 0){for(let e of r.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));n.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function reserve(n,r,i){let a=e.idGenerator.deriveSpanId(`tool:${n.idempotencyKey}`),o={actionKey:r,attemptId:n.scope.attemptId,context:contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),event:n,fallbackParent:i.context,idempotencyKey:n.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(n.scope.attemptId).set(n.idempotencyKey,o),t.set(r,o),o}function startSpan(t,n){if(!(t.span!==void 0||t.finished===!0)&&(t.span=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`ai.toolCall`,{attributes:toolAttributes(t.event),startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input,!1);e!==void 0&&t.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span===void 0||e.terminal===void 0||finish(e)}function finish(r,a){let o=r.span;if(o===void 0||r.finished===!0)return;r.finished=!0;let s=r.terminal;if(a!==void 0)recordError(o,a.error);else if(s?.type===`tool.call.failed`)recordError(o,s.error);else if(s?.output.type===`error`)recordError(o,s.output.error);else if(s!==void 0&&e.recordOutputs){let e=contentAttribute(s.output.output,!1);e!==void 0&&o.setAttribute(`gen_ai.tool.call.result`,e)}o.end(),t.delete(r.actionKey);let c=n.get(r.attemptId);c?.delete(r.idempotencyKey),c?.size===0&&n.delete(r.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function recordError(e,n){n instanceof Error?(e.recordException(n),e.setStatus({code:SpanStatusCode.ERROR,message:n.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
1
+ import{ROOT_CONTEXT,SpanKind,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";function createAgentToolInstrumentation(e){let n=new Map,r=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),r=e.resolveFallback(t),a=r===void 0?void 0:reserve(t,n,r),o=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(a===void 0){if(o===void 0)return;a=reserve(t,n,o)}o!==void 0&&startSpan(a,o.context)},onTerminal=async t=>{let n=r.get(t.scope.attemptId)?.get(t.idempotencyKey);if(n!==void 0){if(n.terminal=t,n.span===void 0){let t=await e.actionContextFor(n.event.scope.sessionId,n.event.scope.turnId,n.event.callId);t!==void 0&&startSpan(n,t.context)}finishIfReady(n)}};return{async actionStarted(t){let r=n.get(t.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>r.get(e)?.get(t)?.context,drain(e,t){let n=r.get(e);if(n!==void 0){for(let e of n.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));r.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=r.get(e);return t===void 0&&(t=new Map,r.set(e,t)),t}function reserve(t,r,i){let a=e.idGenerator.deriveSpanId(`tool:${t.idempotencyKey}`),o={actionKey:r,attemptId:t.scope.attemptId,context:contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),event:t,fallbackParent:i.context,idempotencyKey:t.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(t.scope.attemptId).set(t.idempotencyKey,o),n.set(r,o),o}function startSpan(n,r){if(!(n.span!==void 0||n.finished===!0)&&(n.span=e.idGenerator.withSpanId(n.spanId,()=>e.tracer.startSpan(`execute_tool ${n.event.toolName}`,{attributes:toolAttributes(n.event),kind:SpanKind.INTERNAL,startTime:n.startTimeMs},r)),e.recordInputs)){let e=contentAttribute(n.event.input,!1);e!==void 0&&n.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span===void 0||e.terminal===void 0||finish(e)}function finish(t,i){let o=t.span;if(o===void 0||t.finished===!0)return;t.finished=!0;let s=t.terminal;if(i!==void 0)recordError(o,i.error);else if(s?.type===`tool.call.failed`)recordError(o,s.error);else if(s?.output.type===`error`)recordError(o,s.output.error);else if(s!==void 0&&e.recordOutputs){let e=contentAttribute(s.output.output,!1);e!==void 0&&o.setAttribute(`gen_ai.tool.call.result`,e)}o.end(),n.delete(t.actionKey);let c=r.get(t.attemptId);c?.delete(t.idempotencyKey),c?.size===0&&r.delete(t.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName,"gen_ai.tool.type":`function`}}function contextFromSpanContext(t){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(t))}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
@@ -1,8 +1,10 @@
1
1
  import type { SessionTraceContext } from "#channel/types.js";
2
+ import type { ContextAccessor } from "#context/key.js";
2
3
  import type { AgentActionTraceState, AgentSessionTraceState, AgentTraceStateStore, AgentTurnTraceState } from "#tracing/agent-trace-state.js";
3
4
  import type { InstrumentationDecision } from "#shared/instrumentation-decision.js";
4
5
  /** Reads the decision already bound to a session in the current worker context. */
5
6
  export declare function readCurrentSessionTraceDecision(sessionId: string): InstrumentationDecision | undefined;
7
+ export declare function readSessionTraceDecision(context: ContextAccessor, sessionId: string): InstrumentationDecision | undefined;
6
8
  /** Keeps only framework trace state from an interrupted step's context changes. */
7
9
  export declare function preserveSerializedAgentTraceState(original: Record<string, unknown>, interrupted: Record<string, unknown>): Record<string, unknown>;
8
10
  /**
@@ -26,4 +28,5 @@ export declare class ContextAgentTraceStateStore implements AgentTraceStateStore
26
28
  setAction(idempotencyKey: string, value: AgentActionTraceState): void;
27
29
  setSession(sessionId: string, value: AgentSessionTraceState): void;
28
30
  setTurn(sessionId: string, turnId: string, value: AgentTurnTraceState): void;
31
+ updateTurn(sessionId: string, turnId: string, update: (state: AgentTurnTraceState) => AgentTurnTraceState): void;
29
32
  }