eve 0.52.2 → 0.52.3

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 (195) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/src/channel/types.d.ts +1 -0
  3. package/dist/src/chunks/{use-eve-agent-1NAM6ftx.js → use-eve-agent-BR8EpIOX.js} +27 -10
  4. package/dist/src/chunks/{use-eve-agent-BEjdhhhK.js → use-eve-agent-XnfjQt1Z.js} +27 -10
  5. package/dist/src/cli/commands/deploy.js +1 -1
  6. package/dist/src/cli/commands/extension-init.d.ts +2 -1
  7. package/dist/src/cli/commands/extension-init.js +1 -1
  8. package/dist/src/cli/commands/init.d.ts +2 -13
  9. package/dist/src/cli/commands/init.js +1 -1
  10. package/dist/src/cli/dev/run-interactive-ui.d.ts +3 -0
  11. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  12. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  13. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  14. package/dist/src/cli/dev/tui/runner.js +1 -1
  15. package/dist/src/cli/dev/tui/setup-commands.d.ts +5 -3
  16. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  17. package/dist/src/cli/dev/tui/status-line.js +1 -1
  18. package/dist/src/cli/dev/tui/tui.d.ts +4 -0
  19. package/dist/src/cli/dev/tui/tui.js +1 -1
  20. package/dist/src/cli/run.d.ts +1 -1
  21. package/dist/src/cli/run.js +2 -2
  22. package/dist/src/cli/telemetry/index.d.ts +15 -0
  23. package/dist/src/cli/telemetry/index.js +2 -2
  24. package/dist/src/client/session.js +1 -1
  25. package/dist/src/compiled/.vendor-stamp.json +1 -1
  26. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  27. package/dist/src/compiler/compile-from-memory.js +1 -1
  28. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  29. package/dist/src/compiler/extension-compatibility.js +1 -1
  30. package/dist/src/context/build-dynamic-tools.d.ts +2 -1
  31. package/dist/src/context/build-dynamic-tools.js +1 -1
  32. package/dist/src/context/dynamic-tool-lifecycle.d.ts +3 -3
  33. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  34. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -1
  35. package/dist/src/context/hook-lifecycle.js +1 -1
  36. package/dist/src/context/keys.d.ts +2 -0
  37. package/dist/src/context/keys.js +1 -1
  38. package/dist/src/eve-channel/index.js +1 -1
  39. package/dist/src/execution/activity-events.d.ts +1 -0
  40. package/dist/src/execution/activity-events.js +1 -1
  41. package/dist/src/execution/node-step.js +1 -1
  42. package/dist/src/execution/sandbox/prewarm.js +1 -1
  43. package/dist/src/execution/session-activity-projection.js +1 -1
  44. package/dist/src/execution/session-activity.js +1 -1
  45. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  46. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  47. package/dist/src/execution/tasks/parent/task-cancel.d.ts +2 -2
  48. package/dist/src/execution/tasks/parent/task-cancel.js +1 -1
  49. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  50. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  51. package/dist/src/execution/workflow-runtime.js +1 -1
  52. package/dist/src/execution/workflow-steps.js +1 -1
  53. package/dist/src/harness/action-presentation.d.ts +13 -0
  54. package/dist/src/harness/action-presentation.js +1 -0
  55. package/dist/src/harness/compaction.js +1 -1
  56. package/dist/src/harness/coordination.js +1 -1
  57. package/dist/src/harness/emission.d.ts +1 -6
  58. package/dist/src/harness/emission.js +1 -1
  59. package/dist/src/harness/execute-tool.d.ts +2 -1
  60. package/dist/src/harness/finish-reason.d.ts +3 -0
  61. package/dist/src/harness/finish-reason.js +1 -0
  62. package/dist/src/harness/provider-tool-schemas.d.ts +1 -0
  63. package/dist/src/harness/provider-tool-schemas.js +1 -1
  64. package/dist/src/harness/step-hooks.js +1 -1
  65. package/dist/src/harness/stream-actions.d.ts +2 -2
  66. package/dist/src/harness/stream-actions.js +1 -1
  67. package/dist/src/harness/tool-call-input-errors.d.ts +4 -3
  68. package/dist/src/harness/tool-call-input-errors.js +1 -1
  69. package/dist/src/harness/tool-loop.js +2 -2
  70. package/dist/src/harness/tool-presentation.d.ts +5 -0
  71. package/dist/src/harness/tool-presentation.js +1 -0
  72. package/dist/src/harness/turn-client-context.d.ts +1 -0
  73. package/dist/src/harness/workflow-lifecycle.d.ts +2 -3
  74. package/dist/src/harness/workflow-lifecycle.js +1 -1
  75. package/dist/src/internal/application/compiled-artifacts.d.ts +3 -0
  76. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  77. package/dist/src/internal/application/package.js +1 -1
  78. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  79. package/dist/src/internal/authored-module-conditions.d.ts +2 -0
  80. package/dist/src/internal/authored-module-conditions.js +1 -0
  81. package/dist/src/internal/authored-module-loader.d.ts +3 -0
  82. package/dist/src/internal/authored-module-loader.js +3 -3
  83. package/dist/src/internal/authored-module-map-loader.d.ts +3 -1
  84. package/dist/src/internal/authored-module-map-loader.js +1 -1
  85. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  86. package/dist/src/internal/authored-runtime-modules.js +1 -1
  87. package/dist/src/internal/bundler/nitro-rolldown.d.ts +1 -0
  88. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  89. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  90. package/dist/src/internal/nitro/development-generation.js +1 -1
  91. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  92. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  93. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  94. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  95. package/dist/src/internal/workflow-bundle/builder-support.d.ts +5 -0
  96. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  97. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  98. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  99. package/dist/src/protocol/activity.d.ts +6 -0
  100. package/dist/src/protocol/activity.js +1 -1
  101. package/dist/src/protocol/message.d.ts +13 -1
  102. package/dist/src/protocol/message.js +1 -1
  103. package/dist/src/public/channels/slack/activity-plan.js +1 -1
  104. package/dist/src/public/channels/slack/activity.js +2 -2
  105. package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +6 -0
  106. package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -0
  107. package/dist/src/public/models/openai/chatgpt/model.d.ts +1 -1
  108. package/dist/src/public/models/openai/chatgpt/oauth.d.ts +20 -0
  109. package/dist/src/public/models/openai/chatgpt/oauth.js +1 -0
  110. package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +4 -3
  111. package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
  112. package/dist/src/public/models/openai/chatgpt/transport.d.ts +1 -2
  113. package/dist/src/public/models/openai/index.d.ts +3 -4
  114. package/dist/src/public/tools/index.d.ts +1 -1
  115. package/dist/src/runtime/prompt/compose.js +1 -1
  116. package/dist/src/runtime/resolve-tool.js +1 -1
  117. package/dist/src/runtime/types.d.ts +2 -0
  118. package/dist/src/self-modification/agent.js +1 -1
  119. package/dist/src/self-modification/extension/instructions.d.ts +1 -3
  120. package/dist/src/self-modification/extension/instructions.js +4 -2
  121. package/dist/src/self-modification/filesystem.js +1 -1
  122. package/dist/src/setup/flows/chatgpt-auth.d.ts +14 -2
  123. package/dist/src/setup/flows/chatgpt-auth.js +1 -1
  124. package/dist/src/setup/flows/model.d.ts +3 -2
  125. package/dist/src/setup/flows/model.js +1 -1
  126. package/dist/src/setup/flows/provider.js +1 -1
  127. package/dist/src/setup/flows/registry.d.ts +4 -0
  128. package/dist/src/setup/flows/registry.js +1 -1
  129. package/dist/src/setup/scaffold/create/project.js +1 -1
  130. package/dist/src/shared/boundary-hook-error.d.ts +4 -0
  131. package/dist/src/shared/boundary-hook-error.js +1 -0
  132. package/dist/src/{execution/activity-text.d.ts → shared/presentation-text.d.ts} +1 -1
  133. package/dist/src/shared/presentation-text.js +1 -0
  134. package/dist/src/svelte/index.js +1 -1
  135. package/dist/src/svelte/use-eve-agent.js +1 -1
  136. package/dist/src/tools/definition.d.ts +21 -0
  137. package/dist/src/tools/definition.js +1 -1
  138. package/dist/src/tools/durable-callbacks.d.ts +37 -9
  139. package/dist/src/tools/durable-callbacks.js +1 -1
  140. package/dist/src/tools/dynamic.d.ts +2 -1
  141. package/dist/src/tools/framework/agent-contract.js +1 -1
  142. package/dist/src/tools/provided/bash.js +1 -1
  143. package/dist/src/tools/provided/glob.js +1 -1
  144. package/dist/src/tools/provided/grep.js +1 -1
  145. package/dist/src/tools/provided/load-skill.js +1 -1
  146. package/dist/src/tools/provided/read-file.js +1 -1
  147. package/dist/src/tools/provided/web-fetch.js +1 -1
  148. package/dist/src/tools/provided/write-file.js +1 -1
  149. package/dist/src/tools/tool-label.d.ts +1 -0
  150. package/dist/src/tools/tool-label.js +1 -0
  151. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  152. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  153. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  154. package/dist/src/tracing/agent-otel-provider.js +2 -2
  155. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  156. package/dist/src/tracing/agent-otel-usage.d.ts +10 -0
  157. package/dist/src/tracing/agent-otel-usage.js +1 -1
  158. package/dist/src/tracing/agent-span-naming.d.ts +1 -0
  159. package/dist/src/tracing/agent-span-naming.js +1 -0
  160. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  161. package/dist/src/vue/index.js +1 -1
  162. package/dist/src/vue/use-eve-agent.js +1 -1
  163. package/docs/concepts/default-harness.md +6 -0
  164. package/docs/concepts/sessions-runs-and-streaming.md +4 -0
  165. package/docs/connections/overview.mdx +1 -1
  166. package/docs/guides/client/continuations.mdx +11 -0
  167. package/docs/guides/dynamic-capabilities.md +4 -4
  168. package/docs/guides/hooks.md +1 -1
  169. package/docs/guides/instrumentation.md +40 -1
  170. package/docs/guides/remote-agents.md +2 -0
  171. package/docs/instructions.mdx +1 -1
  172. package/docs/memory/overview.mdx +45 -13
  173. package/docs/reference/cli.md +6 -0
  174. package/docs/reference/telemetry.md +2 -2
  175. package/docs/reference/typescript-api.md +13 -9
  176. package/docs/sandbox.mdx +14 -2
  177. package/docs/subagents/index.mdx +8 -4
  178. package/docs/tools/overview.mdx +44 -2
  179. package/docs/tools/workflows.mdx +6 -0
  180. package/docs/tutorial/connect-a-warehouse.mdx +49 -26
  181. package/docs/tutorial/first-agent.mdx +20 -19
  182. package/docs/tutorial/guard-the-spend.mdx +4 -4
  183. package/docs/tutorial/how-it-runs.mdx +2 -3
  184. package/docs/tutorial/meta.json +2 -2
  185. package/docs/tutorial/query-sample-data.mdx +30 -19
  186. package/docs/tutorial/remember-definitions.mdx +5 -5
  187. package/docs/tutorial/run-analysis.mdx +155 -18
  188. package/docs/tutorial/ship-it.mdx +71 -81
  189. package/docs/tutorial/team-playbooks.mdx +10 -10
  190. package/package.json +1 -1
  191. package/dist/src/execution/activity-text.js +0 -1
  192. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +0 -9
  193. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +0 -1
  194. package/dist/src/public/models/openai/chatgpt/codex-app-server.d.ts +0 -40
  195. package/dist/src/public/models/openai/chatgpt/codex-app-server.js +0 -1
@@ -19,6 +19,14 @@ interface ToolDefinitionBase {
19
19
  readonly description: string;
20
20
  readonly execution?: ToolExecution;
21
21
  }
22
+ export interface ToolLabelDefinition<TInput = unknown, TOutput = unknown> {
23
+ /** Returns the presentation-safe label when one action invocation starts. */
24
+ start(input: Readonly<TInput>): string;
25
+ /** Projects one preliminary output snapshot into presentation-safe label text. */
26
+ delta?(input: Readonly<TInput>, partial: Readonly<TOutput>): string;
27
+ /** Projects a successful final output into presentation-safe settlement text. */
28
+ complete?(input: Readonly<TInput>, output: Readonly<TOutput>): string;
29
+ }
22
30
  /**
23
31
  * Internal/compiled tool definition shape. Carries `name` because the
24
32
  * compiler stamps a path-derived identifier onto every tool entry.
@@ -26,7 +34,13 @@ interface ToolDefinitionBase {
26
34
  * Authored public definitions (see {@link PublicToolDefinition}) do not
27
35
  * carry `name`; identity comes from the file path.
28
36
  */
37
+ export interface InternalToolLabelDefinition {
38
+ readonly complete?: (input: unknown, output: unknown) => string;
39
+ readonly delta?: (input: unknown, partial: unknown) => string;
40
+ readonly start?: (input: unknown) => string;
41
+ }
29
42
  export interface InternalToolDefinition extends ToolDefinitionBase {
43
+ label?: InternalToolLabelDefinition;
30
44
  name: string;
31
45
  inputSchema: JsonObject | null;
32
46
  outputSchema?: JsonObject;
@@ -38,6 +52,7 @@ export type PublicToolOutputSchema<TOutput = unknown> = StandardJSONSchemaV1<unk
38
52
  * file path at compile time, so `name` is intentionally absent here.
39
53
  */
40
54
  export interface PublicToolDefinition<TInput = unknown, TOutput = unknown> extends ToolDefinitionBase {
55
+ label?: ToolLabelDefinition<TInput, TOutput>;
41
56
  inputSchema: PublicToolInputSchema<TInput>;
42
57
  /**
43
58
  * Optional schema describing the value returned by the tool executor.
@@ -180,6 +195,7 @@ export declare function defineTool<TSchema extends StandardSchemaV1<unknown, unk
180
195
  inputSchema: TSchema;
181
196
  outputSchema?: PublicToolDefinition<unknown, TaskReceipt>["outputSchema"];
182
197
  execute(input: StandardSchemaV1.InferOutput<TSchema>, ctx: ToolContext, task: TaskExec): TReturn;
198
+ label?: BackgroundToolDefinition<StandardSchemaV1.InferOutput<TSchema>, BackgroundToolOutputFromExecuteReturn<TReturn>>["label"];
183
199
  approval?: BackgroundToolDefinition<StandardSchemaV1.InferOutput<TSchema>, unknown>["approval"];
184
200
  approvalKey?: BackgroundToolDefinition<StandardSchemaV1.InferOutput<TSchema>, unknown>["approvalKey"];
185
201
  toModelOutput?: BackgroundToolDefinition<unknown, BackgroundToolOutputFromExecuteReturn<TReturn>>["toModelOutput"];
@@ -189,6 +205,7 @@ export declare function defineTool<TInputSchema extends StandardSchemaV1<unknown
189
205
  inputSchema: TInputSchema;
190
206
  outputSchema: TOutputSchema;
191
207
  execute(input: StandardSchemaV1.InferOutput<TInputSchema>, ctx: ToolContext): TReturn;
208
+ label?: ToolDefinition<StandardSchemaV1.InferOutput<TInputSchema>, StandardJSONSchemaV1.InferOutput<TOutputSchema>>["label"];
192
209
  approval?: ToolDefinition<StandardSchemaV1.InferOutput<TInputSchema>, unknown>["approval"];
193
210
  approvalKey?: ToolDefinition<StandardSchemaV1.InferOutput<TInputSchema>, unknown>["approvalKey"];
194
211
  toModelOutput?: ToolDefinition<unknown, StandardJSONSchemaV1.InferOutput<TOutputSchema>>["toModelOutput"];
@@ -198,6 +215,7 @@ export declare function defineTool<TSchema extends StandardSchemaV1<unknown, unk
198
215
  inputSchema: TSchema;
199
216
  outputSchema?: JsonObject;
200
217
  execute(input: StandardSchemaV1.InferOutput<TSchema>, ctx: ToolContext): TReturn;
218
+ label?: ToolDefinition<StandardSchemaV1.InferOutput<TSchema>, ToolOutputFromExecuteReturn<TReturn>>["label"];
201
219
  approval?: ToolDefinition<StandardSchemaV1.InferOutput<TSchema>, unknown>["approval"];
202
220
  approvalKey?: ToolDefinition<StandardSchemaV1.InferOutput<TSchema>, unknown>["approvalKey"];
203
221
  toModelOutput?: ToolDefinition<unknown, ToolOutputFromExecuteReturn<TReturn>>["toModelOutput"];
@@ -207,6 +225,7 @@ export declare function defineTool<TOutputSchema extends StandardJSONSchemaV1<un
207
225
  inputSchema: JsonObject;
208
226
  outputSchema: TOutputSchema;
209
227
  execute(input: Record<string, unknown>, ctx: ToolContext): TReturn;
228
+ label?: ToolDefinition<Record<string, unknown>, StandardJSONSchemaV1.InferOutput<TOutputSchema>>["label"];
210
229
  approval?: ToolDefinition<Record<string, unknown>, unknown>["approval"];
211
230
  approvalKey?: ToolDefinition<Record<string, unknown>, unknown>["approvalKey"];
212
231
  toModelOutput?: ToolDefinition<unknown, StandardJSONSchemaV1.InferOutput<TOutputSchema>>["toModelOutput"];
@@ -216,6 +235,7 @@ export declare function defineTool<TReturn>(definition: {
216
235
  inputSchema: JsonObject;
217
236
  outputSchema?: JsonObject;
218
237
  execute(input: Record<string, unknown>, ctx: ToolContext): TReturn;
238
+ label?: ToolDefinition<Record<string, unknown>, ToolOutputFromExecuteReturn<TReturn>>["label"];
219
239
  approval?: ToolDefinition<Record<string, unknown>, unknown>["approval"];
220
240
  approvalKey?: ToolDefinition<Record<string, unknown>, unknown>["approvalKey"];
221
241
  toModelOutput?: ToolDefinition<unknown, ToolOutputFromExecuteReturn<TReturn>>["toModelOutput"];
@@ -224,6 +244,7 @@ export declare function defineTool<TInput = unknown, TOutput = unknown>(definiti
224
244
  export declare function stampToolDefinition<T extends {
225
245
  readonly description: string;
226
246
  readonly execute: (...args: never[]) => unknown;
247
+ readonly label?: ToolLabelDefinition;
227
248
  readonly approval?: Approval<never>;
228
249
  readonly approvalKey?: (...args: never[]) => unknown;
229
250
  readonly toModelOutput?: (...args: never[]) => unknown;
@@ -1 +1 @@
1
- import{collectDurableDynamicToolCallbacks,stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{TOOL_BRAND}from"#tools/dynamic.js";import{stampDefinitionKey}from"#internal/authored-definition/source-identity.js";function defineTool(e){return stampToolDefinition(e,`defineTool`)}function stampToolDefinition(e,t){if(e.auth!==void 0)throw Error(`${t}: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDurableDynamicToolCallbacks(e,collectDurableDynamicToolCallbacks({approval:e.approval,approvalKey:e.approvalKey,execute:e.execute,toModelOutput:e.toModelOutput})),stampDefinitionKey(e,`tool:${e.description}`),e}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}export{defineTool,disableTool,isDisabledToolSentinel,stampToolDefinition};
1
+ import{collectDurableDynamicToolCallbacks,stampDurableDynamicToolCallbacks}from"#tools/durable-callbacks.js";import{TOOL_BRAND}from"#tools/dynamic.js";import{stampDefinitionKey}from"#internal/authored-definition/source-identity.js";function defineTool(e){return stampToolDefinition(e,`defineTool`)}function stampToolDefinition(e,t){if(e.auth!==void 0)throw Error(`${t}: The "auth" field is no longer supported. Pass auth providers inline to ctx.getToken(provider) or ctx.requireAuth(provider).`);return Object.assign(e,{[TOOL_BRAND]:!0}),stampDurableDynamicToolCallbacks(e,collectDurableDynamicToolCallbacks({label:e.label,approval:e.approval,approvalKey:e.approvalKey,execute:e.execute,toModelOutput:e.toModelOutput})),stampDefinitionKey(e,`tool:${e.description}`),e}const DISABLED_TOOL_SENTINEL_KIND=`eve:disabled-tool`;function disableTool(){return{kind:DISABLED_TOOL_SENTINEL_KIND}}function isDisabledToolSentinel(e){return typeof e==`object`&&!!e&&e.kind===DISABLED_TOOL_SENTINEL_KIND}export{defineTool,disableTool,isDisabledToolSentinel,stampToolDefinition};
@@ -1,10 +1,11 @@
1
1
  import type { Approval } from "#approval/definition.js";
2
2
  import type { JsonObject } from "#shared/json.js";
3
- export type DurableDynamicCallbackPhase = "approvalKey" | "approvalRequest" | "approvalResponse" | "execute" | "toModelOutput";
3
+ export type DurableDynamicCallbackPhase = "labelComplete" | "labelDelta" | "labelStart" | "approvalKey" | "approvalRequest" | "approvalResponse" | "execute" | "toModelOutput";
4
4
  export type DurableDynamicCallbackFn = (closure: JsonObject, ...args: never[]) => unknown;
5
5
  /**
6
6
  * Persisted binding for one callback phase. Identity is
7
- * `(toolName, phase)` — carried by the surrounding metadata — so only the
7
+ * session, lifecycle scope, resolver, entry, tool name, and phase — carried
8
+ * by the surrounding context and metadata — so only the
8
9
  * snapshotted closure values persist.
9
10
  */
10
11
  export interface DurableDynamicCallbackReference {
@@ -13,6 +14,11 @@ export interface DurableDynamicCallbackReference {
13
14
  }
14
15
  export interface DurableDynamicToolCallbacks {
15
16
  readonly execute: DurableDynamicCallbackReference;
17
+ readonly label?: {
18
+ readonly complete?: DurableDynamicCallbackReference;
19
+ readonly delta?: DurableDynamicCallbackReference;
20
+ readonly start?: DurableDynamicCallbackReference;
21
+ };
16
22
  readonly approvalKey?: DurableDynamicCallbackReference;
17
23
  readonly approvalRequest?: DurableDynamicCallbackReference;
18
24
  readonly approvalResponse?: DurableDynamicCallbackReference;
@@ -25,35 +31,57 @@ export interface StampedDurableDynamicCallback {
25
31
  }
26
32
  export type LiveDurableDynamicToolCallbacks = Partial<{
27
33
  execute: StampedDurableDynamicCallback;
34
+ label: {
35
+ readonly complete?: StampedDurableDynamicCallback;
36
+ readonly delta?: StampedDurableDynamicCallback;
37
+ readonly start?: StampedDurableDynamicCallback;
38
+ };
28
39
  approvalKey: StampedDurableDynamicCallback;
29
40
  approvalRequest: StampedDurableDynamicCallback;
30
41
  approvalResponse: StampedDurableDynamicCallback;
31
42
  toModelOutput: StampedDurableDynamicCallback;
32
43
  }>;
33
44
  export declare const DURABLE_DYNAMIC_TOOL_CALLBACKS: unique symbol;
34
- /**
35
- * Binds the current implementation of one tool callback phase. Re-resolution
36
- * replaces the binding, so replay after a redeploy runs the latest code.
37
- */
45
+ export type DynamicToolCallbackScope = "session" | "turn" | "step";
46
+ export interface DynamicToolCallbackOwner {
47
+ readonly sessionId: string;
48
+ readonly scope: DynamicToolCallbackScope;
49
+ readonly resolverSlug: string;
50
+ readonly entryKey: string;
51
+ readonly name: string;
52
+ }
53
+ /** Re-resolution updates only the same session's resolver and lifecycle scope. */
38
54
  export declare function registerDurableDynamicCallback(input: {
39
55
  readonly callback: DurableDynamicCallbackFn;
40
56
  readonly phase: DurableDynamicCallbackPhase;
41
- readonly toolName: string;
57
+ readonly owner: DynamicToolCallbackOwner;
58
+ }): void;
59
+ export declare function lookupDurableDynamicCallback(owner: DynamicToolCallbackOwner, phase: DurableDynamicCallbackPhase): DurableDynamicCallbackFn | undefined;
60
+ /** Discards completed sessions or a resolver's previous result before replacement. */
61
+ export declare function clearDurableDynamicCallbacks(sessionId: string, resolver?: {
62
+ readonly scope: DynamicToolCallbackScope;
63
+ readonly resolverSlug: string;
42
64
  }): void;
43
- export declare function lookupDurableDynamicCallback(toolName: string, phase: DurableDynamicCallbackPhase): DurableDynamicCallbackFn | undefined;
44
65
  /** Invokes a registered callback with its snapshotted closure and live arguments. */
45
66
  export declare function callDurableDynamicCallback(callback: DurableDynamicCallbackFn, closure: JsonObject, ...args: unknown[]): unknown;
46
67
  /** True when any persisted callback of these tools has no registered binding. */
47
68
  export declare function hasUnregisteredDurableDynamicCallbacks(metadata: readonly {
48
69
  callbacks: DurableDynamicToolCallbacks;
49
70
  name: string;
50
- }[]): boolean;
71
+ resolverSlug: string;
72
+ entryKey: string;
73
+ }[], scope: Pick<DynamicToolCallbackOwner, "sessionId" | "scope">): boolean;
51
74
  /** Marks a live callback with the descriptor needed to register it at resolve time. */
52
75
  export declare function stampDurableDynamicCallback<TCallback extends (...args: never[]) => unknown>(callback: TCallback, descriptor: StampedDurableDynamicCallback): TCallback;
53
76
  export declare function readDurableDynamicCallback(callback: unknown): StampedDurableDynamicCallback | undefined;
54
77
  /** Copies phase-specific callback descriptors onto a branded tool definition. */
55
78
  export declare function stampDurableDynamicToolCallbacks(definition: object, callbacks: LiveDurableDynamicToolCallbacks): void;
56
79
  export declare function collectDurableDynamicToolCallbacks(input: {
80
+ readonly label?: {
81
+ readonly complete?: (...args: never[]) => unknown;
82
+ readonly delta?: (...args: never[]) => unknown;
83
+ readonly start?: (...args: never[]) => unknown;
84
+ };
57
85
  readonly approval?: Approval<never>;
58
86
  readonly approvalKey?: (...args: never[]) => unknown;
59
87
  readonly execute: (...args: never[]) => unknown;
@@ -1 +1 @@
1
- import{resolveApprovalPolicy}from"#approval/definition.js";const STAMPED_CALLBACK=Symbol.for(`eve:durable-dynamic-callback`),DURABLE_DYNAMIC_TOOL_CALLBACKS=Symbol.for(`eve:durable-dynamic-tool-callbacks`),REGISTRY=Symbol.for(`eve:dynamic-tool-callbacks`);function getRegistry(){let e=globalThis,t=e[REGISTRY];if(t!==void 0)return t;let n=new Map;return e[REGISTRY]=n,n}function registerDurableDynamicCallback(e){let t=getRegistry(),n=t.get(e.toolName);n===void 0&&(n=new Map,t.set(e.toolName,n)),n.set(e.phase,e.callback)}function lookupDurableDynamicCallback(e,t){return getRegistry().get(e)?.get(t)}function callDurableDynamicCallback(e,t,...n){return e(t,...n)}function hasUnregisteredDurableDynamicCallbacks(e){return e.some(e=>Object.keys(e.callbacks).some(t=>lookupDurableDynamicCallback(e.name,t)===void 0))}function stampDurableDynamicCallback(e,t){return Object.defineProperty(e,STAMPED_CALLBACK,{configurable:!0,value:t}),e}function readDurableDynamicCallback(e){if(typeof e==`function`)return Reflect.get(e,STAMPED_CALLBACK)}function stampDurableDynamicToolCallbacks(e,t){Object.defineProperty(e,DURABLE_DYNAMIC_TOOL_CALLBACKS,{configurable:!0,value:t})}function collectDurableDynamicToolCallbacks(e){let t=e.approval===void 0?void 0:readDurableDynamicCallback(resolveApprovalPolicy(e.approval)),n=e.approval===void 0||typeof e.approval==`function`?void 0:readDurableDynamicCallback(e.approval.response),r=readDurableDynamicCallback(e.approvalKey),i=readDurableDynamicCallback(e.execute),a=readDurableDynamicCallback(e.toModelOutput),o={};return i!==void 0&&(o.execute=i),r!==void 0&&(o.approvalKey=r),t!==void 0&&(o.approvalRequest=t),n!==void 0&&(o.approvalResponse=n),a!==void 0&&(o.toModelOutput=a),o}function readDurableDynamicToolCallbacks(e){return e[DURABLE_DYNAMIC_TOOL_CALLBACKS]}export{DURABLE_DYNAMIC_TOOL_CALLBACKS,callDurableDynamicCallback,collectDurableDynamicToolCallbacks,hasUnregisteredDurableDynamicCallbacks,lookupDurableDynamicCallback,readDurableDynamicCallback,readDurableDynamicToolCallbacks,registerDurableDynamicCallback,stampDurableDynamicCallback,stampDurableDynamicToolCallbacks};
1
+ import{resolveApprovalPolicy}from"#approval/definition.js";const STAMPED_CALLBACK=Symbol.for(`eve:durable-dynamic-callback`),DURABLE_DYNAMIC_TOOL_CALLBACKS=Symbol.for(`eve:durable-dynamic-tool-callbacks`),REGISTRY=Symbol.for(`eve:scoped-dynamic-tool-callbacks`);function getRegistry(){let e=globalThis;return e[REGISTRY]??=new Map}function getSessionBindings(e){let t=getRegistry(),n=t.get(e);return n!==void 0&&(t.delete(e),t.set(e,n)),n}function callbackKey(e,t){return JSON.stringify([e.scope,e.resolverSlug,e.entryKey,e.name,t])}function registerDurableDynamicCallback(e){let t=getRegistry(),n=getSessionBindings(e.owner.sessionId);n===void 0&&(n=new Map,t.set(e.owner.sessionId,n),t.size>1024&&t.delete(t.keys().next().value)),n.set(callbackKey(e.owner,e.phase),e.callback)}function lookupDurableDynamicCallback(e,t){return getSessionBindings(e.sessionId)?.get(callbackKey(e,t))}function clearDurableDynamicCallbacks(e,t){if(t===void 0){getRegistry().delete(e);return}let n=getSessionBindings(e);if(n===void 0)return;let r=JSON.stringify([t.scope,t.resolverSlug]).slice(0,-1)+`,`;for(let e of n.keys())e.startsWith(r)&&n.delete(e)}function callDurableDynamicCallback(e,t,...n){return e(t,...n)}function hasUnregisteredDurableDynamicCallbacks(e,t){return e.some(e=>durableCallbackPhases(e.callbacks).some(n=>lookupDurableDynamicCallback({...e,...t},n)===void 0))}function durableCallbackPhases(e){return[[`execute`,e.execute],[`labelComplete`,e.label?.complete],[`labelDelta`,e.label?.delta],[`labelStart`,e.label?.start],[`approvalKey`,e.approvalKey],[`approvalRequest`,e.approvalRequest],[`approvalResponse`,e.approvalResponse],[`toModelOutput`,e.toModelOutput]].flatMap(([e,t])=>t===void 0?[]:[e])}function stampDurableDynamicCallback(e,t){return Object.defineProperty(e,STAMPED_CALLBACK,{configurable:!0,value:t}),e}function readDurableDynamicCallback(e){if(typeof e==`function`)return Reflect.get(e,STAMPED_CALLBACK)}function stampDurableDynamicToolCallbacks(e,t){Object.defineProperty(e,DURABLE_DYNAMIC_TOOL_CALLBACKS,{configurable:!0,value:t})}function collectDurableDynamicToolCallbacks(e){let t=readDurableDynamicCallback(e.label?.complete),n=readDurableDynamicCallback(e.label?.delta),r=readDurableDynamicCallback(e.label?.start),i=e.approval===void 0?void 0:readDurableDynamicCallback(resolveApprovalPolicy(e.approval)),a=e.approval===void 0||typeof e.approval==`function`?void 0:readDurableDynamicCallback(e.approval.response),o=readDurableDynamicCallback(e.approvalKey),s=readDurableDynamicCallback(e.execute),c=readDurableDynamicCallback(e.toModelOutput),l={};return s!==void 0&&(l.execute=s),(t!==void 0||n!==void 0||r!==void 0)&&(l.label={complete:t,delta:n,start:r}),o!==void 0&&(l.approvalKey=o),i!==void 0&&(l.approvalRequest=i),a!==void 0&&(l.approvalResponse=a),c!==void 0&&(l.toModelOutput=c),l}function readDurableDynamicToolCallbacks(e){return e[DURABLE_DYNAMIC_TOOL_CALLBACKS]}export{DURABLE_DYNAMIC_TOOL_CALLBACKS,callDurableDynamicCallback,clearDurableDynamicCallbacks,collectDurableDynamicToolCallbacks,hasUnregisteredDurableDynamicCallbacks,lookupDurableDynamicCallback,readDurableDynamicCallback,readDurableDynamicToolCallbacks,registerDurableDynamicCallback,stampDurableDynamicCallback,stampDurableDynamicToolCallbacks};
@@ -1,6 +1,6 @@
1
1
  import type { Approval } from "#approval/definition.js";
2
2
  import type { DynamicResolveContext, DynamicToolEventName } from "#dynamic/definition.js";
3
- import type { PublicToolInputSchema, PublicToolOutputSchema, ToolContext } from "#tools/definition.js";
3
+ import type { PublicToolInputSchema, PublicToolOutputSchema, ToolLabelDefinition, ToolContext } from "#tools/definition.js";
4
4
  import type { TaskExec } from "#tools/task.js";
5
5
  import type { ToolModelOutput } from "#tools/model-output.js";
6
6
  /**
@@ -16,6 +16,7 @@ import type { ToolModelOutput } from "#tools/model-output.js";
16
16
  * (Standard Schema) to infer and check the executor return type.
17
17
  */
18
18
  export interface DynamicToolEntry<TInput = Record<string, unknown>, TOutput = any> {
19
+ readonly label?: ToolLabelDefinition<TInput, TOutput>;
19
20
  readonly description: string;
20
21
  readonly inputSchema: PublicToolInputSchema<TInput>;
21
22
  readonly outputSchema?: PublicToolOutputSchema<TOutput>;
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";const AGENT_TOOL_NAME=`agent`,AGENT_TOOL_DESCRIPTION=["Delegate a focused subtask to a copy of yourself, or continue a previous delegation with `agentId`.",`Use it to isolate complex work or split a large task into independent pieces.`,"Issue multiple `agent` calls in one response to run a small fixed set in parallel.","A new child has fresh history and state but shares your tools and sandbox, so include essential context in `message` and give parallel writers non-overlapping scopes."].join(` `),SUBAGENT_TOOL_INPUT_SCHEMA=z.strictObject({agentId:z.string().nullable().describe(`Only pass this to continue a previous delegation: the id of an agent from the <agents> list. To start a new agent — the common case — omit this field entirely (or pass null or an empty string).`).optional(),message:z.string().describe(`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`),outputSchema:z.looseObject({}).describe(`Only provide a non-empty JSON Schema when the caller explicitly requests structured output; otherwise omit this field. The subagent must match a provided schema, and that structured output becomes the tool result.`).optional()});export{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,SUBAGENT_TOOL_INPUT_SCHEMA};
1
+ import{z}from"#compiled/zod/index.js";const AGENT_TOOL_NAME=`agent`,AGENT_TOOL_DESCRIPTION=["Delegate a focused subtask to a copy of yourself, or continue or steer a previous delegation with `agentId`.",`Use it to isolate complex work or split a large task into independent pieces.`,"Issue multiple `agent` calls in one response to run a small fixed set in parallel.","A new child has fresh history and state but shares your tools and sandbox, so include essential context in `message` and give parallel writers non-overlapping scopes."].join(` `),SUBAGENT_TOOL_INPUT_SCHEMA=z.strictObject({agentId:z.string().nullable().describe(`The id of an existing agent from the <agents> list or a task receipt. A message to a busy agent steers it: its previous task is cancelled and the updated work runs in the same child session. Omit this field (or pass null or an empty string) to start a new agent.`).optional(),message:z.string().describe(`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`),outputSchema:z.looseObject({}).describe(`Only provide a non-empty JSON Schema when the caller explicitly requests structured output; otherwise omit this field. The subagent must match a provided schema, and that structured output becomes the tool result.`).optional()});export{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,SUBAGENT_TOOL_INPUT_SCHEMA};
@@ -1 +1 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeBashOnSandbox}from"#execution/sandbox/bash.js";const BASH_INPUT_SCHEMA=z.strictObject({command:z.string().describe(`The shell command to execute.`)}),BASH_OUTPUT_SCHEMA=z.strictObject({exitCode:z.number(),stderr:z.string(),stdout:z.string(),truncated:z.boolean()}),bash=defineTool({description:`Execute a shell command in the shared workspace environment.`,async execute(e,t){return await executeBashOnSandbox(await t.getSandbox(),e)},inputSchema:BASH_INPUT_SCHEMA,outputSchema:BASH_OUTPUT_SCHEMA});export{BASH_INPUT_SCHEMA,BASH_OUTPUT_SCHEMA,bash,bash as default};
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeBashOnSandbox}from"#execution/sandbox/bash.js";const BASH_INPUT_SCHEMA=z.strictObject({command:z.string().describe(`The shell command to execute.`)}),BASH_OUTPUT_SCHEMA=z.strictObject({exitCode:z.number(),stderr:z.string(),stdout:z.string(),truncated:z.boolean()}),bash=defineTool({label:{start:e=>toolLabel(`Run`,e.command)},description:`Execute a shell command in the shared workspace environment.`,async execute(e,t){return await executeBashOnSandbox(await t.getSandbox(),e)},inputSchema:BASH_INPUT_SCHEMA,outputSchema:BASH_OUTPUT_SCHEMA});export{BASH_INPUT_SCHEMA,BASH_OUTPUT_SCHEMA,bash,bash as default};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeGlobOnSandbox}from"#execution/sandbox/glob-tool.js";const GLOB_INPUT_SCHEMA=z.strictObject({limit:z.number().int().min(1).max(1e3).describe(`Maximum number of results to return. Defaults to 100.`).optional(),path:z.string().describe(`The directory to search in. Defaults to /workspace. Must be an absolute path or begin with $HOME/. Omit to use the default.`).optional(),pattern:z.string().describe(`The glob pattern to match files against (e.g. "**/*.ts", "src/**/*.js").`)}),GLOB_OUTPUT_SCHEMA=z.strictObject({content:z.string(),count:z.number().int(),path:z.string(),truncated:z.boolean()}),glob=defineTool({description:[`Fast file pattern matching tool that works with any codebase size.`,``,`Usage:`,`- Supports glob patterns like "**/*.js" or "src/**/*.ts".`,`- Returns matching file paths.`,`- Call this tool in parallel when you know there are multiple patterns to search for.`].join(`
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeGlobOnSandbox}from"#execution/sandbox/glob-tool.js";const GLOB_INPUT_SCHEMA=z.strictObject({limit:z.number().int().min(1).max(1e3).describe(`Maximum number of results to return. Defaults to 100.`).optional(),path:z.string().describe(`The directory to search in. Defaults to /workspace. Must be an absolute path or begin with $HOME/. Omit to use the default.`).optional(),pattern:z.string().describe(`The glob pattern to match files against (e.g. "**/*.ts", "src/**/*.js").`)}),GLOB_OUTPUT_SCHEMA=z.strictObject({content:z.string(),count:z.number().int(),path:z.string(),truncated:z.boolean()}),glob=defineTool({label:{start:e=>toolLabel(`Find`,e.pattern)},description:[`Fast file pattern matching tool that works with any codebase size.`,``,`Usage:`,`- Supports glob patterns like "**/*.js" or "src/**/*.ts".`,`- Returns matching file paths.`,`- Call this tool in parallel when you know there are multiple patterns to search for.`].join(`
2
2
  `),async execute(e,t){return await executeGlobOnSandbox(await t.getSandbox(),e)},inputSchema:GLOB_INPUT_SCHEMA,outputSchema:GLOB_OUTPUT_SCHEMA});export{GLOB_INPUT_SCHEMA,GLOB_OUTPUT_SCHEMA,glob as default,glob};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeGrepOnSandbox}from"#execution/sandbox/grep-tool.js";const GREP_INPUT_SCHEMA=z.strictObject({context:z.number().int().min(0).describe(`Number of surrounding context lines to include before and after each match. Defaults to 0.`).optional(),glob:z.string().describe(`Filter files by glob pattern (e.g. "*.ts", "*.{ts,tsx}").`).optional(),ignoreCase:z.boolean().describe(`Perform case-insensitive search. Defaults to false.`).optional(),limit:z.number().int().min(1).max(1e3).describe(`Maximum number of matches to return per file. Defaults to 100.`).optional(),literal:z.boolean().describe(`Treat the pattern as a literal string instead of a regular expression. Defaults to false.`).optional(),path:z.string().describe(`The directory or file to search in. Defaults to /workspace. Must be an absolute path or begin with $HOME/. Omit to use the default.`).optional(),pattern:z.string().describe(`The regex pattern to search for in file contents (e.g. "log.*Error", "function\\s+\\w+").`)}),GREP_OUTPUT_SCHEMA=z.strictObject({content:z.string(),matchCount:z.number().int(),path:z.string(),truncated:z.boolean()}),grep=defineTool({description:[`Fast content search tool that works with any codebase size.`,``,`Usage:`,`- Searches file contents using regular expressions.`,`- Supports full regex syntax (e.g. "log.*Error", "function\\s+\\w+").`,`- Filter files by pattern with the glob parameter (e.g. "*.js", "*.{ts,tsx}").`,`- Returns matching lines with file paths and line numbers.`,`- Call this tool in parallel when you have multiple independent searches.`,`- Any line longer than 2000 characters is truncated.`].join(`
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeGrepOnSandbox}from"#execution/sandbox/grep-tool.js";const GREP_INPUT_SCHEMA=z.strictObject({context:z.number().int().min(0).describe(`Number of surrounding context lines to include before and after each match. Defaults to 0.`).optional(),glob:z.string().describe(`Filter files by glob pattern (e.g. "*.ts", "*.{ts,tsx}").`).optional(),ignoreCase:z.boolean().describe(`Perform case-insensitive search. Defaults to false.`).optional(),limit:z.number().int().min(1).max(1e3).describe(`Maximum number of matches to return per file. Defaults to 100.`).optional(),literal:z.boolean().describe(`Treat the pattern as a literal string instead of a regular expression. Defaults to false.`).optional(),path:z.string().describe(`The directory or file to search in. Defaults to /workspace. Must be an absolute path or begin with $HOME/. Omit to use the default.`).optional(),pattern:z.string().describe(`The regex pattern to search for in file contents (e.g. "log.*Error", "function\\s+\\w+").`)}),GREP_OUTPUT_SCHEMA=z.strictObject({content:z.string(),matchCount:z.number().int(),path:z.string(),truncated:z.boolean()}),grep=defineTool({label:{start:e=>toolLabel(`Search`,e.pattern)},description:[`Fast content search tool that works with any codebase size.`,``,`Usage:`,`- Searches file contents using regular expressions.`,`- Supports full regex syntax (e.g. "log.*Error", "function\\s+\\w+").`,`- Filter files by pattern with the glob parameter (e.g. "*.js", "*.{ts,tsx}").`,`- Returns matching lines with file paths and line numbers.`,`- Call this tool in parallel when you have multiple independent searches.`,`- Any line longer than 2000 characters is truncated.`].join(`
2
2
  `),async execute(e,t){return await executeGrepOnSandbox(await t.getSandbox(),e)},inputSchema:GREP_INPUT_SCHEMA,outputSchema:GREP_OUTPUT_SCHEMA});export{GREP_INPUT_SCHEMA,GREP_OUTPUT_SCHEMA,grep as default,grep};
@@ -1 +1 @@
1
- import{defineTool}from"#tools/definition.js";import{attachToolBehavior}from"#tools/behavior.js";import{SKILL_INPUT_SCHEMA,SKILL_OUTPUT_SCHEMA,executeLoadSkill}from"#execution/tools/load-skill.js";const loadSkill=attachToolBehavior(defineTool({description:[`Load the full instructions for one available skill by name or id.`,`Use this tool when the request clearly matches a listed skill description or when the user explicitly asks for that skill.`,`Loading adds the skill instructions to the current turn.`,`Choose the "skill" value from the Available skills block.`].join(` `),execute:executeLoadSkill,inputSchema:SKILL_INPUT_SCHEMA,outputSchema:SKILL_OUTPUT_SCHEMA}),{availability:[],presentation:`load-skill`});export{loadSkill as default,loadSkill};
1
+ import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{attachToolBehavior}from"#tools/behavior.js";import{SKILL_INPUT_SCHEMA,SKILL_OUTPUT_SCHEMA,executeLoadSkill}from"#execution/tools/load-skill.js";const loadSkill=attachToolBehavior(defineTool({label:{start:e=>toolLabel(`Load`,typeof e==`object`&&e?Reflect.get(e,`skill`):void 0)},description:[`Load the full instructions for one available skill by name or id.`,`Use this tool when the request clearly matches a listed skill description or when the user explicitly asks for that skill.`,`Loading adds the skill instructions to the current turn.`,`Choose the "skill" value from the Available skills block.`].join(` `),execute:executeLoadSkill,inputSchema:SKILL_INPUT_SCHEMA,outputSchema:SKILL_OUTPUT_SCHEMA}),{availability:[],presentation:`load-skill`});export{loadSkill as default,loadSkill};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeReadFileOnSandbox}from"#execution/sandbox/read-file.js";const READ_FILE_INPUT_SCHEMA=z.strictObject({filePath:z.string().describe(`The absolute path to the file to read. A leading $HOME is supported.`),limit:z.number().int().min(1).describe(`Maximum number of lines to return. Defaults to 2000.`).optional(),offset:z.number().int().min(1).describe(`1-based line number to start from. Defaults to 1.`).optional()}),READ_FILE_OUTPUT_SCHEMA=z.strictObject({content:z.string(),nextOffset:z.number().int().min(1).optional(),path:z.string(),totalLines:z.number().int().min(0),truncated:z.boolean()}),readFile=defineTool({description:[`Read a file from the local filesystem. If the path does not exist, an error is returned.`,``,`Usage:`,`- The filePath parameter should be an absolute path or begin with $HOME/.`,`- By default, this tool returns up to 2000 lines from the start of the file.`,`- The offset parameter is the line number to start from (1-indexed).`,`- To read later sections, call this tool again with a larger offset.`,'- Contents are returned with each line prefixed by its line number as `<line>: <content>`. For example, if a file has contents "foo\\n", you will receive "1: foo\\n".',`- Any line longer than 2000 characters is truncated.`,`- Call this tool in parallel when you know there are multiple files you want to read.`,`- Avoid tiny repeated slices (30 line chunks). If you need more context, read a larger window.`].join(`
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeReadFileOnSandbox}from"#execution/sandbox/read-file.js";const READ_FILE_INPUT_SCHEMA=z.strictObject({filePath:z.string().describe(`The absolute path to the file to read. A leading $HOME is supported.`),limit:z.number().int().min(1).describe(`Maximum number of lines to return. Defaults to 2000.`).optional(),offset:z.number().int().min(1).describe(`1-based line number to start from. Defaults to 1.`).optional()}),READ_FILE_OUTPUT_SCHEMA=z.strictObject({content:z.string(),nextOffset:z.number().int().min(1).optional(),path:z.string(),totalLines:z.number().int().min(0),truncated:z.boolean()}),readFile=defineTool({label:{start:e=>toolLabel(`Read`,e.filePath)},description:[`Read a file from the local filesystem. If the path does not exist, an error is returned.`,``,`Usage:`,`- The filePath parameter should be an absolute path or begin with $HOME/.`,`- By default, this tool returns up to 2000 lines from the start of the file.`,`- The offset parameter is the line number to start from (1-indexed).`,`- To read later sections, call this tool again with a larger offset.`,'- Contents are returned with each line prefixed by its line number as `<line>: <content>`. For example, if a file has contents "foo\\n", you will receive "1: foo\\n".',`- Any line longer than 2000 characters is truncated.`,`- Call this tool in parallel when you know there are multiple files you want to read.`,`- Avoid tiny repeated slices (30 line chunks). If you need more context, read a larger window.`].join(`
2
2
  `),async execute(e,t){return await executeReadFileOnSandbox(await t.getSandbox(),e)},inputSchema:READ_FILE_INPUT_SCHEMA,outputSchema:READ_FILE_OUTPUT_SCHEMA});export{READ_FILE_INPUT_SCHEMA,READ_FILE_OUTPUT_SCHEMA,readFile as default,readFile};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeWebFetchTool}from"#execution/web-fetch/execute.js";const WEB_FETCH_INPUT_SCHEMA=z.strictObject({format:z.enum([`markdown`,`text`,`html`]).describe(`The format to return the content in (text, markdown, or html). HTML responses are automatically converted to the requested format. Defaults to "markdown".`).optional(),timeout:z.number().describe(`Optional timeout in seconds. Defaults to 30, max 120.`).optional(),url:z.string().describe(`The fully-formed URL to fetch content from. Must start with https://.`)}),WEB_FETCH_OUTPUT_SCHEMA=z.strictObject({content:z.string(),contentType:z.string(),truncated:z.boolean(),url:z.string()}),webFetch=defineTool({description:[`Fetch a webpage and return its content in the requested format. Use this to retrieve and analyze content from URLs.`,``,`Usage notes:`,`- The URL must be a fully-formed valid URL starting with https://`,`- HTML responses are automatically converted to markdown or plain text based on the requested format`,`- Format options: "markdown" (default), "text", or "html"`,`- Default timeout is 30 seconds (max 120 seconds)`,`- Maximum response size is 5 MB; content is further capped at the shared tool-output budget (50 KB / 2000 lines)`,`- This tool is read-only and does not modify any files`].join(`
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeWebFetchTool}from"#execution/web-fetch/execute.js";const WEB_FETCH_INPUT_SCHEMA=z.strictObject({format:z.enum([`markdown`,`text`,`html`]).describe(`The format to return the content in (text, markdown, or html). HTML responses are automatically converted to the requested format. Defaults to "markdown".`).optional(),timeout:z.number().describe(`Optional timeout in seconds. Defaults to 30, max 120.`).optional(),url:z.string().describe(`The fully-formed URL to fetch content from. Must start with https://.`)}),WEB_FETCH_OUTPUT_SCHEMA=z.strictObject({content:z.string(),contentType:z.string(),truncated:z.boolean(),url:z.string()}),webFetch=defineTool({label:{start:e=>toolLabel(`Fetch`,e.url)},description:[`Fetch a webpage and return its content in the requested format. Use this to retrieve and analyze content from URLs.`,``,`Usage notes:`,`- The URL must be a fully-formed valid URL starting with https://`,`- HTML responses are automatically converted to markdown or plain text based on the requested format`,`- Format options: "markdown" (default), "text", or "html"`,`- Default timeout is 30 seconds (max 120 seconds)`,`- Maximum response size is 5 MB; content is further capped at the shared tool-output budget (50 KB / 2000 lines)`,`- This tool is read-only and does not modify any files`].join(`
2
2
  `),async execute(e,t){return await executeWebFetchTool(e,{abortSignal:t.abortSignal})},inputSchema:WEB_FETCH_INPUT_SCHEMA,outputSchema:WEB_FETCH_OUTPUT_SCHEMA});export{WEB_FETCH_INPUT_SCHEMA,WEB_FETCH_OUTPUT_SCHEMA,webFetch as default,webFetch};
@@ -1,2 +1,2 @@
1
- import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{executeWriteFileOnSandbox}from"#execution/sandbox/write-file.js";const WRITE_FILE_INPUT_SCHEMA=z.strictObject({content:z.string().describe(`Complete replacement file contents.`),filePath:z.string().describe(`The absolute path to the file to write. A leading $HOME is supported.`)}),WRITE_FILE_OUTPUT_SCHEMA=z.strictObject({existed:z.boolean(),path:z.string()}),writeFile=defineTool({description:[`Writes a file to the local filesystem.`,``,`Usage:`,`- This tool will overwrite the existing file if there is one at the provided path.`,`- If this is an existing file, you MUST use the read_file tool first to read the file's contents. This tool will fail if you did not read the file first.`,`- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.`,`- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.`,`- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`].join(`
1
+ import{z}from"#compiled/zod/index.js";import{defineTool}from"#tools/definition.js";import{toolLabel}from"#tools/tool-label.js";import{executeWriteFileOnSandbox}from"#execution/sandbox/write-file.js";const WRITE_FILE_INPUT_SCHEMA=z.strictObject({content:z.string().describe(`Complete replacement file contents.`),filePath:z.string().describe(`The absolute path to the file to write. A leading $HOME is supported.`)}),WRITE_FILE_OUTPUT_SCHEMA=z.strictObject({existed:z.boolean(),path:z.string()}),writeFile=defineTool({label:{start:e=>toolLabel(`Write`,e.filePath)},description:[`Writes a file to the local filesystem.`,``,`Usage:`,`- This tool will overwrite the existing file if there is one at the provided path.`,`- If this is an existing file, you MUST use the read_file tool first to read the file's contents. This tool will fail if you did not read the file first.`,`- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.`,`- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.`,`- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.`].join(`
2
2
  `),async execute(e,t){return await executeWriteFileOnSandbox(await t.getSandbox(),e)},inputSchema:WRITE_FILE_INPUT_SCHEMA,outputSchema:WRITE_FILE_OUTPUT_SCHEMA});export{WRITE_FILE_INPUT_SCHEMA,WRITE_FILE_OUTPUT_SCHEMA,writeFile as default,writeFile};
@@ -0,0 +1 @@
1
+ export declare function toolLabel(verb: string, value: unknown): string;
@@ -0,0 +1 @@
1
+ function toolLabel(e,t){if(typeof t!=`string`&&typeof t!=`number`)return e;let n=String(t).trim();return n===``?e:`${e} ${n}`}export{toolLabel};
@@ -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"#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(e){let t=new Map,onStarted=async n=>{let r=await e.resolveTraceContext(n);if(r===void 0||!isSampledTrace(r))return;let i=await e.stateStore.getAction(n.idempotencyKey)??{attemptIndex:n.scope.attemptIndex,callId:n.callId,channelAudience:normalizeChannelAudience(n.scope.channelAudience),inputAttribute:e.recordInputs?contentAttribute(n.input,!1):void 0,kind:n.kind,name:n.name,parent:{spanId:e.idGenerator.deriveSpanId(attemptIdempotencyKey(n.scope)),traceFlags:r.traceFlags,traceId:r.traceId},rootSessionId:n.scope.rootSessionId??n.scope.sessionId,sessionId:n.scope.sessionId,spanId:e.idGenerator.deriveSpanId(`action:${n.idempotencyKey}`),startTimeMs:Date.now(),stepIndex:n.scope.stepIndex,turnId:n.scope.turnId};await e.stateStore.setAction(n.idempotencyKey,i);let a=t.get(n.scope.attemptId)??new Set;a.add(n.idempotencyKey),t.set(n.scope.attemptId,a)},onTerminal=async t=>{let n=await e.stateStore.getAction(t.idempotencyKey);if(n!==void 0)try{let r=startSpan(n);if(r.setAttribute(`agent.action.outcome`,t.outcome),t.type===`action.failed`)t.errorCode!==void 0&&(r.setAttribute(`agent.action.error.code`,t.errorCode),r.setAttribute(`error.type`,t.errorCode)),recordError(r,t.error);else if(t.output.type===`error`)recordError(r,t.output.error);else if(t.usage!==void 0&&setAgentUsage(r,t.usage,{includeGenAiDetails:!1}),e.recordOutputs){let e=contentAttribute(t.output.output,!1);e!==void 0&&r.setAttribute(`gen_ai.tool.call.result`,e)}r.end(t.acceptedAtMs)}finally{await e.stateStore.deleteAction(t.idempotencyKey),forget(t.idempotencyKey)}},startSpan=t=>{let n=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":t.callId,"agent.action.kind":t.kind,"agent.action.name":t.name,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.session.id":t.sessionId,"agent.step.attempt":t.attemptIndex,"agent.step.index":t.stepIndex,"agent.turn.id":t.turnId},startTime:t.startTimeMs},contextFromActionState(t)));return t.inputAttribute!==void 0&&n.setAttribute(`gen_ai.tool.call.arguments`,t.inputAttribute),n};return{async contextFor(t,n,r){let i=actionIdempotencyKey(t,n,r),a=await e.stateStore.getAction(i);if(a!==void 0)return actionContext(a);let o=await e.stateStore.findAction(t,r);return o===void 0?void 0:actionContext(o)},deleteForSession:t=>e.stateStore.deleteActions(t),deleteForTurn:(t,n)=>e.stateStore.deleteActions(t,n),async failForAttempt(n,r){let i=t.get(n.attemptId);if(i!==void 0){t.delete(n.attemptId);for(let t of i){let n=await e.stateStore.getAction(t);if(n===void 0)continue;let i=startSpan(n);recordError(i,r),i.end(),await e.stateStore.deleteAction(t)}}},events:{"action.completed":onTerminal,"action.failed":onTerminal,"action.started":onStarted}};function forget(e){for(let[n,r]of t)r.delete(e),r.size===0&&t.delete(n)}}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{agentSpanNamingAttributes}from"#tracing/agent-span-naming.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(e){let t=new Map,onStarted=async n=>{let r=await e.resolveTraceContext(n);if(r===void 0||!isSampledTrace(r))return;let i=await e.stateStore.getAction(n.idempotencyKey)??{attemptIndex:n.scope.attemptIndex,callId:n.callId,channelAudience:normalizeChannelAudience(n.scope.channelAudience),inputAttribute:e.recordInputs?contentAttribute(n.input,!1):void 0,kind:n.kind,name:n.name,parent:{spanId:e.idGenerator.deriveSpanId(attemptIdempotencyKey(n.scope)),traceFlags:r.traceFlags,traceId:r.traceId},rootSessionId:n.scope.rootSessionId??n.scope.sessionId,sessionId:n.scope.sessionId,spanId:e.idGenerator.deriveSpanId(`action:${n.idempotencyKey}`),startTimeMs:Date.now(),stepIndex:n.scope.stepIndex,turnId:n.scope.turnId};await e.stateStore.setAction(n.idempotencyKey,i);let a=t.get(n.scope.attemptId)??new Set;a.add(n.idempotencyKey),t.set(n.scope.attemptId,a)},onTerminal=async t=>{let n=await e.stateStore.getAction(t.idempotencyKey);if(n!==void 0)try{let r=startSpan(n);if(r.setAttribute(`agent.action.outcome`,t.outcome),t.type===`action.failed`)t.errorCode!==void 0&&(r.setAttribute(`agent.action.error.code`,t.errorCode),r.setAttribute(`error.type`,t.errorCode)),recordError(r,t.error);else if(t.output.type===`error`)recordError(r,t.output.error);else if(t.usage!==void 0&&setAgentUsage(r,t.usage,{includeGenAiDetails:!1}),e.recordOutputs){let e=contentAttribute(t.output.output,!1);e!==void 0&&r.setAttribute(`gen_ai.tool.call.result`,e)}r.end(t.acceptedAtMs)}finally{await e.stateStore.deleteAction(t.idempotencyKey),forget(t.idempotencyKey)}},startSpan=t=>{let n=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`agent.action`,{attributes:{"agent.action.call_id":t.callId,"agent.action.kind":t.kind,"agent.action.name":t.name,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.session.id":t.sessionId,"agent.step.attempt":t.attemptIndex,"agent.step.index":t.stepIndex,"agent.turn.id":t.turnId,...agentSpanNamingAttributes(`agent.action`)},startTime:t.startTimeMs},contextFromActionState(t)));return t.inputAttribute!==void 0&&n.setAttribute(`gen_ai.tool.call.arguments`,t.inputAttribute),n};return{async contextFor(t,n,r){let i=actionIdempotencyKey(t,n,r),a=await e.stateStore.getAction(i);if(a!==void 0)return actionContext(a);let o=await e.stateStore.findAction(t,r);return o===void 0?void 0:actionContext(o)},deleteForSession:t=>e.stateStore.deleteActions(t),deleteForTurn:(t,n)=>e.stateStore.deleteActions(t,n),async failForAttempt(n,r){let i=t.get(n.attemptId);if(i!==void 0){t.delete(n.attemptId);for(let t of i){let n=await e.stateStore.getAction(t);if(n===void 0)continue;let i=startSpan(n);recordError(i,r),i.end(),await e.stateStore.deleteAction(t)}}},events:{"action.completed":onTerminal,"action.failed":onTerminal,"action.started":onStarted}};function forget(e){for(let[n,r]of t)r.delete(e),r.size===0&&t.delete(n)}}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 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentApprovalInstrumentation(e){return{"input.requested":async(t,n)=>{if(t.kind!==`tool-approval`||readState(n.state.get())!==void 0)return;let r=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.action.callId);if(r===void 0)return;let i={actionCallId:t.action.callId,actionName:t.action.name,attemptIndex:t.scope.attemptIndex,channelAudience:normalizeChannelAudience(t.scope.channelAudience),parent:{spanId:r.spanContext.spanId,traceFlags:r.spanContext.traceFlags,traceId:r.spanContext.traceId},requestId:t.requestId,rootSessionId:t.scope.rootSessionId??t.scope.sessionId,sessionId:t.scope.sessionId,startTimeMs:Date.now(),stepIndex:t.scope.stepIndex,turnId:t.scope.turnId},a=contentAttribute(t.request,!1);a!==void 0&&(i.requestAttribute=a),n.state.set(i)},"input.resolved":(t,n)=>{let r=readState(n.state.get());if(r===void 0)return;let i=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(`approval:${t.idempotencyKey}`),()=>e.tracer.startSpan(`agent.approval`,{attributes:{"agent.action.call_id":r.actionCallId,"agent.action.name":r.actionName,"agent.approval.kind":`tool-approval`,"agent.approval.outcome":t.outcome,"agent.approval.request_id":r.requestId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.session.id":r.sessionId,"agent.step.attempt":r.attemptIndex,"agent.step.index":r.stepIndex,"agent.turn.id":r.turnId},startTime:r.startTimeMs},withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext({...r.parent,isRemote:!1})),r.channelAudience)));if(r.requestAttribute!==void 0&&i.setAttribute(`agent.approval.request`,r.requestAttribute),t.response!==void 0){let e=contentAttribute(t.response,!1);e!==void 0&&i.setAttribute(`agent.approval.response`,e)}t.outcome===`failed`&&recordError(i,t.error),i.end()}}}function readState(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=t.parent;if(typeof n!=`object`||!n||Array.isArray(n))return;let r=n;if(typeof t.actionCallId!=`string`||typeof t.actionName!=`string`||typeof t.attemptIndex!=`number`||typeof r.spanId!=`string`||typeof r.traceFlags!=`number`||typeof r.traceId!=`string`||typeof t.requestId!=`string`||typeof t.rootSessionId!=`string`||typeof t.sessionId!=`string`||typeof t.startTimeMs!=`number`||typeof t.stepIndex!=`number`||typeof t.turnId!=`string`)return;let i=t.requestAttribute;if(i===void 0||typeof i==`string`)return{actionCallId:t.actionCallId,actionName:t.actionName,attemptIndex:t.attemptIndex,channelAudience:normalizeChannelAudience(t.channelAudience),parent:{isRemote:!1,spanId:r.spanId,traceFlags:r.traceFlags,traceId:r.traceId},requestAttribute:i,requestId:t.requestId,rootSessionId:t.rootSessionId,sessionId:t.sessionId,startTimeMs:t.startTimeMs,stepIndex:t.stepIndex,turnId:t.turnId}}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentApprovalInstrumentation};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{ROOT_CONTEXT,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentApprovalInstrumentation(e){return{"input.requested":async(t,n)=>{if(t.kind!==`tool-approval`||readState(n.state.get())!==void 0)return;let r=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.action.callId);if(r===void 0)return;let i={actionCallId:t.action.callId,actionName:t.action.name,attemptIndex:t.scope.attemptIndex,channelAudience:normalizeChannelAudience(t.scope.channelAudience),parent:{spanId:r.spanContext.spanId,traceFlags:r.spanContext.traceFlags,traceId:r.spanContext.traceId},requestId:t.requestId,rootSessionId:t.scope.rootSessionId??t.scope.sessionId,sessionId:t.scope.sessionId,startTimeMs:Date.now(),stepIndex:t.scope.stepIndex,turnId:t.scope.turnId},a=contentAttribute(t.request,!1);a!==void 0&&(i.requestAttribute=a),n.state.set(i)},"input.resolved":(t,n)=>{let r=readState(n.state.get());if(r===void 0)return;let i=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(`approval:${t.idempotencyKey}`),()=>e.tracer.startSpan(`agent.approval`,{attributes:{"agent.action.call_id":r.actionCallId,"agent.action.name":r.actionName,"agent.approval.kind":`tool-approval`,"agent.approval.outcome":t.outcome,"agent.approval.request_id":r.requestId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.session.id":r.sessionId,"agent.step.attempt":r.attemptIndex,"agent.step.index":r.stepIndex,"agent.turn.id":r.turnId,...agentSpanNamingAttributes(`agent.approval`)},startTime:r.startTimeMs},withChannelAudience(trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext({...r.parent,isRemote:!1})),r.channelAudience)));if(r.requestAttribute!==void 0&&i.setAttribute(`agent.approval.request`,r.requestAttribute),t.response!==void 0){let e=contentAttribute(t.response,!1);e!==void 0&&i.setAttribute(`agent.approval.response`,e)}t.outcome===`failed`&&recordError(i,t.error),i.end()}}}function readState(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n=t.parent;if(typeof n!=`object`||!n||Array.isArray(n))return;let r=n;if(typeof t.actionCallId!=`string`||typeof t.actionName!=`string`||typeof t.attemptIndex!=`number`||typeof r.spanId!=`string`||typeof r.traceFlags!=`number`||typeof r.traceId!=`string`||typeof t.requestId!=`string`||typeof t.rootSessionId!=`string`||typeof t.sessionId!=`string`||typeof t.startTimeMs!=`number`||typeof t.stepIndex!=`number`||typeof t.turnId!=`string`)return;let i=t.requestAttribute;if(i===void 0||typeof i==`string`)return{actionCallId:t.actionCallId,actionName:t.actionName,attemptIndex:t.attemptIndex,channelAudience:normalizeChannelAudience(t.channelAudience),parent:{isRemote:!1,spanId:r.spanId,traceFlags:r.traceFlags,traceId:r.traceId},requestAttribute:i,requestId:t.requestId,rootSessionId:t.rootSessionId,sessionId:t.sessionId,startTimeMs:t.startTimeMs,stepIndex:t.stepIndex,turnId:t.turnId}}function recordError(e,t){t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentApprovalInstrumentation};
@@ -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"#instrumentation/lifecycle.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentChannelDeliveryInstrumentation(e){let onStarted=async(t,n)=>{let r=await e.ensureSessionContext({agentName:t.agentName,channelAudience:t.delivery.channelAudience,channelKind:t.delivery.channelKind,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceSeed:t.traceSeed,type:`session.started`});if(!isSampledTrace(r.context))return;let i=e.recordInputs?contentAttribute(t.input,!1):void 0,a={channelAudience:normalizeChannelAudience(t.delivery.channelAudience),parent:{isRemote:r.context.isRemote??!1,spanId:r.context.spanId,traceFlags:r.context.traceFlags,traceId:r.context.traceId},spanId:e.idGenerator.deriveSpanId(`channel-delivery:${t.idempotencyKey}`),startTimeMs:Date.now()};i!==void 0&&(a.inputAttribute=i),t.delivery.requestTraceContext!==void 0&&(a.requestTraceContext={spanId:t.delivery.requestTraceContext.spanId,traceFlags:t.delivery.requestTraceContext.traceFlags,traceId:t.delivery.requestTraceContext.traceId}),n.state.set(a)},onTerminal=async(t,n)=>{let r=readState(n.state.get());if(r===void 0)return;let i=t.turnId===void 0?void 0:await e.stateStore.getTurn(t.sessionId,t.turnId),a=i===void 0?r.startTimeMs:Math.max(r.startTimeMs,i.startTimeMs),o=r.requestTraceContext,s=e.idGenerator.withSpanId(r.spanId,()=>e.tracer.startSpan(`agent.channel.delivery`,{attributes:{"agent.channel.delivery.id":t.delivery.deliveryId,"agent.channel.delivery.outcome":t.outcome,"agent.channel.kind":t.delivery.channelKind,"agent.channel.name":t.delivery.channelName,"agent.channel.request.id":t.delivery.requestId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.turn.id":t.turnId,"agent.turn.sequence":t.sequence},kind:SpanKind.CONSUMER,links:o===void 0?void 0:[{attributes:{"eve.link.type":`channel.request`},context:o}],startTime:a},withChannelAudience(contextFromSpanContext(r.parent),r.channelAudience)));if(s.addEvent(`channel.delivery.started`,void 0,a),s.addEvent(t.type),r.inputAttribute!==void 0&&s.setAttribute(`agent.channel.delivery.input`,r.inputAttribute),t.outcome===`failed`){let e=t.errorCode??(t.error instanceof Error?t.error.name:`Error`);s.setAttribute(`error.type`,e),t.errorCode!==void 0&&s.setAttribute(`agent.channel.delivery.error.code`,t.errorCode),recordError(s,t.error)}s.end(),i!==void 0&&t.turnId!==void 0&&i.parentSpanId===r.parent.spanId&&i.context.traceId===r.parent.traceId&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>e.parentSpanId===r.parent.spanId&&e.context.traceId===r.parent.traceId?{...e,parentIsRemote:!1,parentSpanId:r.spanId}:e)};return{"channel.delivery.cancelled":onTerminal,"channel.delivery.completed":onTerminal,"channel.delivery.failed":onTerminal,"channel.delivery.started":onStarted}}function readState(e){if(!isRecord(e)||!isSpanContext(e.parent)||typeof e.spanId!=`string`||typeof e.startTimeMs!=`number`)return;let t=isSpanContext(e.requestTraceContext)?e.requestTraceContext:void 0;return{channelAudience:normalizeChannelAudience(e.channelAudience),inputAttribute:typeof e.inputAttribute==`string`?e.inputAttribute:void 0,parent:e.parent,requestTraceContext:t,spanId:e.spanId,startTimeMs:e.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{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentChannelDeliveryInstrumentation(e){let onStarted=async(t,n)=>{let r=await e.ensureSessionContext({agentName:t.agentName,channelAudience:t.delivery.channelAudience,channelKind:t.delivery.channelKind,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceSeed:t.traceSeed,type:`session.started`});if(!isSampledTrace(r.context))return;let i=e.recordInputs?contentAttribute(t.input,!1):void 0,a={channelAudience:normalizeChannelAudience(t.delivery.channelAudience),parent:{isRemote:r.context.isRemote??!1,spanId:r.context.spanId,traceFlags:r.context.traceFlags,traceId:r.context.traceId},spanId:e.idGenerator.deriveSpanId(`channel-delivery:${t.idempotencyKey}`),startTimeMs:Date.now()};i!==void 0&&(a.inputAttribute=i),t.delivery.requestTraceContext!==void 0&&(a.requestTraceContext={spanId:t.delivery.requestTraceContext.spanId,traceFlags:t.delivery.requestTraceContext.traceFlags,traceId:t.delivery.requestTraceContext.traceId}),n.state.set(a)},onTerminal=async(t,n)=>{let r=readState(n.state.get());if(r===void 0)return;let i=t.turnId===void 0?void 0:await e.stateStore.getTurn(t.sessionId,t.turnId),a=i===void 0?r.startTimeMs:Math.max(r.startTimeMs,i.startTimeMs),o=r.requestTraceContext,s=e.idGenerator.withSpanId(r.spanId,()=>e.tracer.startSpan(`agent.channel.delivery`,{attributes:{"agent.channel.delivery.id":t.delivery.deliveryId,"agent.channel.delivery.outcome":t.outcome,"agent.channel.kind":t.delivery.channelKind,"agent.channel.name":t.delivery.channelName,"agent.channel.request.id":t.delivery.requestId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.turn.id":t.turnId,"agent.turn.sequence":t.sequence,...agentSpanNamingAttributes(`agent.channel.delivery`)},kind:SpanKind.CONSUMER,links:o===void 0?void 0:[{attributes:{"eve.link.type":`channel.request`},context:o}],startTime:a},withChannelAudience(contextFromSpanContext(r.parent),r.channelAudience)));if(s.addEvent(`channel.delivery.started`,void 0,a),s.addEvent(t.type),r.inputAttribute!==void 0&&s.setAttribute(`agent.channel.delivery.input`,r.inputAttribute),t.outcome===`failed`){let e=t.errorCode??(t.error instanceof Error?t.error.name:`Error`);s.setAttribute(`error.type`,e),t.errorCode!==void 0&&s.setAttribute(`agent.channel.delivery.error.code`,t.errorCode),recordError(s,t.error)}s.end(),i!==void 0&&t.turnId!==void 0&&i.parentSpanId===r.parent.spanId&&i.context.traceId===r.parent.traceId&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>e.parentSpanId===r.parent.spanId&&e.context.traceId===r.parent.traceId?{...e,parentIsRemote:!1,parentSpanId:r.spanId}:e)};return{"channel.delivery.cancelled":onTerminal,"channel.delivery.completed":onTerminal,"channel.delivery.failed":onTerminal,"channel.delivery.started":onStarted}}function readState(e){if(!isRecord(e)||!isSpanContext(e.parent)||typeof e.spanId!=`string`||typeof e.startTimeMs!=`number`)return;let t=isSpanContext(e.requestTraceContext)?e.requestTraceContext:void 0;return{channelAudience:normalizeChannelAudience(e.channelAudience),inputAttribute:typeof e.inputAttribute==`string`?e.inputAttribute:void 0,parent:e.parent,requestTraceContext:t,spanId:e.spanId,startTimeMs:e.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,2 +1,2 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{markAgentTraceContext}from"#tracing/agent-trace-context.js";import{attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{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 t=e.recordInputs??!1,n=e.recordOutputs??!1,r=new WeakMap,i=new Map,a=new WeakMap,o=new WeakMap,s=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),c=createAgentApprovalInstrumentation({actionContextFor:s.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),l=createAgentToolInstrumentation({actionContextFor:s.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveFallback:e=>{let t=i.get(e.scope.attemptId)??e.scope,n=a.get(t);return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:u,prepareSessionTrace:d,prepareTurnTrace:f}=createAgentOtelSessionContext(e),projectEvent=async r=>{let i=await e.stateStore.getSession(sessionIdForEvent(r)),a=audienceForEvent(r,i?.channelAudience),o=`traceSeed`in r?r.traceSeed:void 0,s=contextStorage.getStore()?.get(SessionTraceSeedKey),c=resolveForwardedTraceSeed(s),l=resolveForwardedTraceSeed(o,c?.forwardedTracePolicy),u=l?.decision??c?.decision??readInstrumentationDecision(i?.decision)??(o===void 0?s===void 0?i===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(i.context),a):resolveTracePolicyDecision(isSampledTrace(s),a):resolveTracePolicyDecision(isSampledTrace(o),a));if(u===void 0)return withoutInstrumentationContent(r);let d=l===void 0||!(`traceSeed`in r)||r.traceSeed===void 0?r:{...r,traceSeed:{...r.traceSeed,decision:l.decision,traceFlags:l.traceFlags}};return instrumentationEventForTraceDecision(d,applyLiveDeliveryAudienceCeiling(u.action===`drop`?u:{action:`record`,recordInputs:t&&u.recordInputs,recordOutputs:n&&u.recordOutputs},a,l?.forwardedTracePolicy??c?.forwardedTracePolicy),a,{applyAudienceCeiling:!1})},onSessionStarted=async e=>{await d(e)},onTurnStarted=async e=>{await f(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let r=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),o=trace.getSpan(context.active())?.spanContext(),s=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...runtimeContextAttributes(t.runtimeContext)},links:o===void 0||o.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},r));s.addEvent(`step.started`);let c=trace.setSpan(r,s);a.set(t.scope,{context:c,span:s}),i.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=i.get(e.scope.attemptId)??e.scope;r.delete(t),drainOpenSpans({...e,scope:t}),l.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await s.failForAttempt(t,e.error),i.delete(e.scope.attemptId);let n=a.get(t);n!==void 0&&(n.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&recordError(n.span,e.error),n.span.end(),a.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await s.deleteForTurn(t.sessionId,t.turnId),await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}}))},onSessionTransition=async t=>{if(t.type===`session.failed`&&t.turnId!==void 0&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:e.terminal??{error:t.error,type:`turn.failed`}})),t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId);if(isSampledTrace(n.context)){let i=r?.agentName??n.subagentName,a=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(agentSpanName(i),{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":i,"agent.session.id":t.sessionId,"agent.subagent.name":n.subagentName,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence,"gen_ai.agent.name":i,"gen_ai.conversation.id":t.sessionId,"gen_ai.operation.name":`invoke_agent`},kind:SpanKind.INTERNAL,startTime:n.startTimeMs},withChannelAudience(contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId}),r?.channelAudience)));setAgentInvocationUsage(a,n.modelUsage),a.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(a.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(a,n.terminal.error)),a.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await s.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let r=a.get(n.scope);if(r===void 0)return;r.span.setAttribute(`agent.model.id`,n.model.modelId),r.span.setAttribute(`agent.model.provider`,n.model.provider);let i=e.tracer.startSpan(modelSpanName(n.model.modelId),{attributes:{"gen_ai.agent.name":n.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":n.model.provider,"gen_ai.request.model":n.model.modelId,...runtimeContextAttributes(n.runtimeContext)}},r.context);if(t&&n.input!==void 0){let e=messagesContentAttribute(n.input.messages);e!==void 0&&i.setAttribute(`ai.prompt.messages`,e);let t=genAiInputMessagesAttribute(n.input.messages);t!==void 0&&i.setAttribute(`gen_ai.input.messages`,t);let r=systemPromptAttribute(n.input.instructions);r!==void 0&&i.setAttribute(`ai.prompt.system`,r);let a=genAiSystemInstructionsAttribute(n.input.instructions);a!==void 0&&i.setAttribute(`gen_ai.system_instructions`,a)}let s={context:trace.setSpan(r.context,i),span:i};getExecutionContexts(n.scope).set(n.idempotencyKey,s.context),getSpanStates(o,n.scope).set(n.idempotencyKey,s)},onModelCallTerminal=async e=>{r.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(o,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{await recordTurnUsage(e),setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let r=a.get(e.scope);if(r!==void 0&&setAgentUsage(r.span,e.usage),n){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let i=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
- `));i!==void 0&&t.span.setAttribute(`ai.response.reasoning`,i);let a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},recordTurnUsage=async t=>{(t.usage.inputTokens!==void 0||t.usage.outputTokens!==void 0)&&await e.stateStore.updateTurn(t.scope.sessionId,t.scope.turnId,e=>({...e,modelUsage:{inputTokens:t.usage.inputTokens===void 0?e.modelUsage?.inputTokens:(e.modelUsage?.inputTokens??0)+t.usage.inputTokens,outputTokens:t.usage.outputTokens===void 0?e.modelUsage?.outputTokens:(e.modelUsage?.outputTokens??0)+t.usage.outputTokens}}))},p=createAgentChannelDeliveryInstrumentation({ensureSessionContext:u,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=a.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.span.setAttribute(e,r)};return{hook:{events:{...p,"action.completed":s.events[`action.completed`],"action.failed":s.events[`action.failed`],async"action.started"(e,t){await s.events[`action.started`](e,t),await l.actionStarted(e)},...c,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...l.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent,tracePolicy:()=>({emit:!0,recordInputs:t,recordOutputs:n})},prepareSessionTrace:d,prepareTurnTrace:f,async runInContext(t,n){let a=i.get(t.scope.attemptId)??t.scope,o=r.get(a),s=t.type===`model.call`?o?.get(t.idempotencyKey):l.contextFor(t.scope.attemptId,t.idempotencyKey);if(s===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(s=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(s=suppressTracing(s)))}return s===void 0?n():context.with(markAgentTraceContext(s),n)}};function getExecutionContexts(e){let t=r.get(e);return t===void 0&&(t=new Map,r.set(e,t)),t}function drainOpenSpans(e){for(let t of o.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();o.delete(e.scope)}}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(e,t){return`delivery`in e?normalizeChannelAudience(e.delivery.channelAudience):`scope`in e&&e.scope.channelAudience!==void 0?normalizeChannelAudience(e.scope.channelAudience):e.type===`session.started`?normalizeChannelAudience(e.channelAudience):normalizeChannelAudience(t)}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function 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};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{contextStorage}from"#context/container.js";import{SessionTraceSeedKey}from"#context/keys.js";import{applyLiveDeliveryAudienceCeiling,resolveForwardedTraceSeed}from"#shared/forwarded-trace-policy.js";import{isSampledTrace,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{ROOT_CONTEXT,SpanKind,SpanStatusCode,context,trace}from"#compiled/@opentelemetry/api/index.js";import{markAgentTraceContext}from"#tracing/agent-trace-context.js";import{attemptIdempotencyKey}from"#instrumentation/lifecycle.js";import{withoutInstrumentationContent}from"#instrumentation/content.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute,genAiInputMessagesAttribute,genAiOutputMessagesAttribute,genAiSystemInstructionsAttribute,messagesContentAttribute,systemPromptAttribute,textContentAttribute,toolResultsContentAttribute}from"#tracing/agent-otel-content.js";import{readGatewayCost,setAgentInvocationUsage,setAgentUsage}from"#tracing/agent-otel-usage.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";import{instrumentationEventForTraceDecision}from"#instrumentation/content-policy.js";import{createAgentActionInstrumentation}from"#tracing/agent-action-instrumentation.js";import{createAgentApprovalInstrumentation}from"#tracing/agent-approval-instrumentation.js";import{createAgentChannelDeliveryInstrumentation}from"#tracing/agent-channel-delivery-instrumentation.js";import{createAgentToolInstrumentation}from"#tracing/agent-tool-instrumentation.js";import{runtimeContextAttributes}from"#tracing/agent-otel-runtime-context.js";import{createAgentOtelSessionContext}from"#tracing/agent-otel-session-context.js";import{suppressTracing}from"#tracing/suppress-tracing.js";function createAgentOtelInstrumentation(e){let t=e.recordInputs??!1,n=e.recordOutputs??!1,r=new WeakMap,i=new Map,a=new WeakMap,o=new WeakMap,s=createAgentActionInstrumentation({frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveTraceContext:async t=>(await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId))?.context,stateStore:e.stateStore,tracer:e.tracer}),c=createAgentApprovalInstrumentation({actionContextFor:s.contextFor,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,tracer:e.tracer}),l=createAgentToolInstrumentation({actionContextFor:s.contextFor,idGenerator:e.idGenerator,recordInputs:t,recordOutputs:n,resolveFallback:e=>{let t=i.get(e.scope.attemptId)??e.scope,n=a.get(t);return n===void 0?void 0:{context:n.context,spanContext:n.span.spanContext()}},tracer:e.tracer}),{ensureSessionContext:u,prepareSessionTrace:d,prepareTurnTrace:f}=createAgentOtelSessionContext(e),projectEvent=async r=>{let i=await e.stateStore.getSession(sessionIdForEvent(r)),a=audienceForEvent(r,i?.channelAudience),o=`traceSeed`in r?r.traceSeed:void 0,s=contextStorage.getStore()?.get(SessionTraceSeedKey),c=resolveForwardedTraceSeed(s),l=resolveForwardedTraceSeed(o,c?.forwardedTracePolicy),u=l?.decision??c?.decision??readInstrumentationDecision(i?.decision)??(o===void 0?s===void 0?i===void 0?void 0:resolveTracePolicyDecision(isSampledTrace(i.context),a):resolveTracePolicyDecision(isSampledTrace(s),a):resolveTracePolicyDecision(isSampledTrace(o),a));if(u===void 0)return withoutInstrumentationContent(r);let d=l===void 0||!(`traceSeed`in r)||r.traceSeed===void 0?r:{...r,traceSeed:{...r.traceSeed,decision:l.decision,traceFlags:l.traceFlags}};return instrumentationEventForTraceDecision(d,applyLiveDeliveryAudienceCeiling(u.action===`drop`?u:{action:`record`,recordInputs:t&&u.recordInputs,recordOutputs:n&&u.recordOutputs},a,l?.forwardedTracePolicy??c?.forwardedTracePolicy),a,{applyAudienceCeiling:!1})},onSessionStarted=async e=>{await d(e)},onTurnStarted=async e=>{await f(e)},onStepStarted=async t=>{let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);if(n===void 0||!isSampledTrace(n.context))return;let r=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),o=trace.getSpan(context.active())?.spanContext(),s=e.idGenerator.withSpanId(e.idGenerator.deriveSpanId(attemptIdempotencyKey(t.scope)),()=>e.tracer.startSpan(`agent.step`,{attributes:{"agent.session.id":t.scope.sessionId,"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.step.attempt":t.scope.attemptIndex,"agent.step.index":t.scope.stepIndex,"agent.turn.id":t.scope.turnId,"agent.name":t.scope.functionId,...agentSpanNamingAttributes(`agent.step`),...runtimeContextAttributes(t.runtimeContext)},links:o===void 0||o.traceId===n.context.traceId?void 0:[{attributes:{"eve.link.type":`workflow.delivery`},context:o}]},r));s.addEvent(`step.started`);let c=trace.setSpan(r,s);a.set(t.scope,{context:c,span:s}),i.set(t.scope.attemptId,t.scope)},onStepTerminal=async e=>{let t=i.get(e.scope.attemptId)??e.scope;r.delete(t),drainOpenSpans({...e,scope:t}),l.drain(e.scope.attemptId,e.type===`step.attempt.failed`?{error:e.error}:void 0),e.type===`step.attempt.failed`&&await s.failForAttempt(t,e.error),i.delete(e.scope.attemptId);let n=a.get(t);n!==void 0&&(n.span.addEvent(e.type===`step.attempt.completed`?`step.completed`:`step.failed`),e.type===`step.attempt.failed`&&recordError(n.span,e.error),n.span.end(),a.delete(t))},onTurnTerminal=async t=>{(t.type===`turn.cancelled`||t.type===`turn.failed`)&&await s.deleteForTurn(t.sessionId,t.turnId),await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:t.type===`turn.failed`?{error:t.error,type:t.type}:{type:t.type}}))},onSessionTransition=async t=>{if(t.type===`session.failed`&&t.turnId!==void 0&&await e.stateStore.updateTurn(t.sessionId,t.turnId,e=>({...e,terminal:e.terminal??{error:t.error,type:`turn.failed`}})),t.turnId!==void 0){let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0){let r=await e.stateStore.getSession(t.sessionId);if(isSampledTrace(n.context)){let i=r?.agentName??n.subagentName,a=e.idGenerator.withSpanId(n.context.spanId,()=>e.tracer.startSpan(agentSpanName(i),{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.name":i,"agent.session.id":t.sessionId,"agent.subagent.name":n.subagentName,"agent.turn.id":t.turnId,"agent.turn.sequence":n.sequence,"gen_ai.agent.name":i,"gen_ai.conversation.id":t.sessionId,"gen_ai.operation.name":`invoke_agent`,...agentSpanNamingAttributes(agentSpanName(i),`invoke_agent`)},kind:SpanKind.INTERNAL,startTime:n.startTimeMs},withChannelAudience(contextFromSpanContext({isRemote:n.parentIsRemote??!1,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId}),r?.channelAudience)));setAgentInvocationUsage(a,n.modelUsage),a.addEvent(`turn.started`,void 0,n.startTimeMs),n.terminal!==void 0&&(a.setAttribute(`agent.turn.outcome`,n.terminal.type===`turn.completed`?`completed`:n.terminal.type===`turn.cancelled`?`cancelled`:`failed`),a.addEvent(n.terminal.type),n.terminal.type===`turn.failed`&&recordError(a,n.terminal.error)),a.end()}await e.stateStore.deleteTurn(t.sessionId,t.turnId)}}(t.type===`session.completed`||t.type===`session.failed`)&&(await s.deleteForSession(t.sessionId),await e.stateStore.deleteSession(t.sessionId))},onModelCallStarted=n=>{let r=a.get(n.scope);if(r===void 0)return;r.span.setAttribute(`agent.model.id`,n.model.modelId),r.span.setAttribute(`agent.model.provider`,n.model.provider);let i=e.tracer.startSpan(modelSpanName(n.model.modelId),{attributes:{"gen_ai.agent.name":n.scope.functionId,"gen_ai.operation.name":`chat`,"gen_ai.provider.name":n.model.provider,"gen_ai.request.model":n.model.modelId,...agentSpanNamingAttributes(modelSpanName(n.model.modelId),`chat`),...runtimeContextAttributes(n.runtimeContext)}},r.context);if(t&&n.input!==void 0){let e=messagesContentAttribute(n.input.messages);e!==void 0&&i.setAttribute(`ai.prompt.messages`,e);let t=genAiInputMessagesAttribute(n.input.messages);t!==void 0&&i.setAttribute(`gen_ai.input.messages`,t);let r=systemPromptAttribute(n.input.instructions);r!==void 0&&i.setAttribute(`ai.prompt.system`,r);let a=genAiSystemInstructionsAttribute(n.input.instructions);a!==void 0&&i.setAttribute(`gen_ai.system_instructions`,a)}let s={context:trace.setSpan(r.context,i),span:i};getExecutionContexts(n.scope).set(n.idempotencyKey,s.context),getSpanStates(o,n.scope).set(n.idempotencyKey,s)},onModelCallTerminal=async e=>{r.get(e.scope)?.delete(e.idempotencyKey);let t=takeSpanState(o,e.scope,e.idempotencyKey);if(t!==void 0){if(e.type===`model.call.failed`)recordError(t.span,e.error);else{await recordTurnUsage(e),setAgentUsage(t.span,e.usage),t.span.setAttribute(`gen_ai.response.finish_reasons`,[e.finishReason]);let r=a.get(e.scope);if(r!==void 0&&setAgentUsage(r.span,e.usage),n){t.span.setAttribute(`ai.response.finish_reason`,e.finishReason);let n=e.content;if(n===void 0){t.span.end();return}let r=genAiOutputMessagesAttribute(n,e.finishReason);r!==void 0&&t.span.setAttribute(`gen_ai.output.messages`,r);let i=textContentAttribute(n.filter(e=>e.type===`reasoning`).map(e=>e.text).filter(e=>e.trim().length>0).join(`
2
+ `));i!==void 0&&t.span.setAttribute(`ai.response.reasoning`,i);let a=textContentAttribute(n.filter(e=>e.type===`text`).map(e=>e.text).join(``));a!==void 0&&t.span.setAttribute(`ai.response.text`,a);let o=n.filter(e=>e.type===`tool-call`).map(e=>({callId:e.callId,input:e.input,toolName:e.toolName}));if(o.length>0){let e=contentAttribute(o,!1);e!==void 0&&t.span.setAttribute(`ai.response.tool_calls`,e)}let s=n.filter(e=>e.type===`tool-result`||e.type===`tool-error`).map(e=>e.type===`tool-result`?{callId:e.callId,input:e.input,output:e.output,toolName:e.toolName}:{callId:e.callId,error:errorText(e.error),input:e.input,toolName:e.toolName});if(s.length>0){let e=toolResultsContentAttribute(s);e!==void 0&&t.span.setAttribute(`ai.response.tool_results`,e)}}}t.span.end()}},recordTurnUsage=async t=>{(t.usage.inputTokens!==void 0||t.usage.outputTokens!==void 0)&&await e.stateStore.updateTurn(t.scope.sessionId,t.scope.turnId,e=>({...e,modelUsage:{inputTokens:t.usage.inputTokens===void 0?e.modelUsage?.inputTokens:(e.modelUsage?.inputTokens??0)+t.usage.inputTokens,outputTokens:t.usage.outputTokens===void 0?e.modelUsage?.outputTokens:(e.modelUsage?.outputTokens??0)+t.usage.outputTokens}}))},p=createAgentChannelDeliveryInstrumentation({ensureSessionContext:u,frameworkVersion:e.frameworkVersion,idGenerator:e.idGenerator,recordInputs:t,stateStore:e.stateStore,tracer:e.tracer}),onStepMetadata=e=>{let t=a.get(e.scope);if(t===void 0)return;let n=readGatewayCost(e.providerMetadata);if(n!==void 0)for(let[e,r]of Object.entries(n))t.span.setAttribute(e,r)};return{hook:{events:{...p,"action.completed":s.events[`action.completed`],"action.failed":s.events[`action.failed`],async"action.started"(e,t){await s.events[`action.started`](e,t),await l.actionStarted(e)},...c,"step.attempt.completed":onStepTerminal,"step.attempt.failed":onStepTerminal,"step.attempt.metadata":onStepMetadata,"step.attempt.started":onStepStarted,"model.call.completed":onModelCallTerminal,"model.call.failed":onModelCallTerminal,"model.call.started":onModelCallStarted,"session.completed":onSessionTransition,"session.failed":onSessionTransition,"session.started":onSessionStarted,"session.waiting":onSessionTransition,...l.events,"turn.cancelled":onTurnTerminal,"turn.completed":onTurnTerminal,"turn.failed":onTurnTerminal,"turn.started":onTurnStarted},name:`eve.otel`,projectEvent,tracePolicy:()=>({emit:!0,recordInputs:t,recordOutputs:n})},prepareSessionTrace:d,prepareTurnTrace:f,async runInContext(t,n){let a=i.get(t.scope.attemptId)??t.scope,o=r.get(a),s=t.type===`model.call`?o?.get(t.idempotencyKey):l.contextFor(t.scope.attemptId,t.idempotencyKey);if(s===void 0){let n=await e.stateStore.getTurn(t.scope.sessionId,t.scope.turnId);n!==void 0&&(s=withChannelAudience(contextFromSpanContext(n.context),t.scope.channelAudience),isSampledTrace(n.context)||(s=suppressTracing(s)))}return s===void 0?n():context.with(markAgentTraceContext(s),n)}};function getExecutionContexts(e){let t=r.get(e);return t===void 0&&(t=new Map,r.set(e,t)),t}function drainOpenSpans(e){for(let t of o.get(e.scope)?.values()??[])e.type===`step.attempt.failed`&&recordError(t.span,e.error),t.span.end();o.delete(e.scope)}}function sessionIdForEvent(e){return`scope`in e?e.scope.sessionId:e.sessionId}function audienceForEvent(e,t){return`delivery`in e?normalizeChannelAudience(e.delivery.channelAudience):`scope`in e&&e.scope.channelAudience!==void 0?normalizeChannelAudience(e.scope.channelAudience):e.type===`session.started`?normalizeChannelAudience(e.channelAudience):normalizeChannelAudience(t)}function getSpanStates(e,t){let n=e.get(t);return n===void 0&&(n=new Map,e.set(t,n)),n}function takeSpanState(e,t,n){let r=e.get(t),i=r?.get(n);if(r!==void 0)return r.delete(n),r.size===0&&e.delete(t),i}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function modelSpanName(e){return`chat ${e}`}function agentSpanName(e){return e===void 0?`invoke_agent`:`invoke_agent ${e}`}function errorText(e){return e instanceof Error?e.message:e}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentOtelInstrumentation};
@@ -1 +1 @@
1
- import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{sessionIdempotencyKey}from"#instrumentation/lifecycle.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";function createAgentOtelSessionContext(e){let openSessionTrace=t=>{if(t.traceSeed!==void 0){if(t.traceDecision.action===`drop`||!isSampledTrace(t.traceSeed))return{isRemote:!1,spanId:t.traceSeed.spanId,traceFlags:0,traceId:t.traceSeed.traceId};let startSpan=()=>e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3},root:!0}),n=e.idGenerator.withSpanId(t.traceSeed.spanId,()=>e.idGenerator.withTraceId(t.traceSeed.traceId,startSpan));return n.addEvent(`session.started`),n.end(),n.spanContext()}if(t.traceDecision.action===`drop`)return{isRemote:!1,spanId:e.idGenerator.deriveSpanId(`session:${t.sessionId}`),traceFlags:0,traceId:e.idGenerator.generateTraceId()};let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3},root:!0});return n.addEvent(`session.started`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);if(n===void 0){let r=normalizeChannelAudience(t.channelAudience),i=resolveSessionTraceDecision(t,r,e.tracePolicy);n={agentName:t.agentName,channelAudience:r,channelKind:t.channelKind,decision:i,context:t.parentTraceContext===void 0?openSessionTrace({agentName:t.agentName,channelAudience:r,channelType:t.channelType,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceDecision:i,traceSeed:t.traceSeed}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId},await e.stateStore.setSession(t.sessionId,n)}return n};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0)return{decision:(await e.stateStore.getSession(t.sessionId))?.decision,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId};let r=await ensureSessionContext({agentName:t.agentName,channelAudience:`unknown`,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`}),i={isRemote:!1,spanId:e.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:r.context.traceFlags,traceId:r.context.traceId};return await e.stateStore.setTurn(t.sessionId,t.turnId,{context:i,parentIsRemote:r.context.isRemote,parentSpanId:r.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now(),subagentName:t.parentLineage?.subagentName}),portableSpanContext(r.context,r.decision)}}}function portableSpanContext(e,t){return{decision:t,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function resolveSessionTraceDecision(e,t,n){return e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?n===void 0?resolveTracePolicyDecision(!0,t):{action:`drop`}:resolveTracePolicy(n,{agentName:e.agentName,audience:t,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),t):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),t):readInstrumentationDecision(e.traceSeed.decision)??{action:`drop`}}export{createAgentOtelSessionContext};
1
+ import{normalizeChannelAudience}from"#shared/channel-audience.js";import{isSampledTrace,resolveTracePolicy,resolveTracePolicyDecision}from"#tracing/sampled-trace.js";import{sessionIdempotencyKey}from"#instrumentation/lifecycle.js";import{readInstrumentationDecision}from"#shared/instrumentation-decision.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";function createAgentOtelSessionContext(e){let openSessionTrace=t=>{if(t.traceSeed!==void 0){if(t.traceDecision.action===`drop`||!isSampledTrace(t.traceSeed))return{isRemote:!1,spanId:t.traceSeed.spanId,traceFlags:0,traceId:t.traceSeed.traceId};let startSpan=()=>e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3,...agentSpanNamingAttributes(`agent.session`)},root:!0}),n=e.idGenerator.withSpanId(t.traceSeed.spanId,()=>e.idGenerator.withTraceId(t.traceSeed.traceId,startSpan));return n.addEvent(`session.started`),n.end(),n.spanContext()}if(t.traceDecision.action===`drop`)return{isRemote:!1,spanId:e.idGenerator.deriveSpanId(`session:${t.sessionId}`),traceFlags:0,traceId:e.idGenerator.generateTraceId()};let n=e.tracer.startSpan(`agent.session`,{attributes:{"agent.framework.name":`eve`,"agent.framework.version":e.frameworkVersion,"agent.channel.audience":t.channelAudience,"agent.name":t.agentName,"agent.session.id":t.sessionId,"agent.trace.schema.version":3,...agentSpanNamingAttributes(`agent.session`)},root:!0});return n.addEvent(`session.started`),n.end(),n.spanContext()},ensureSessionContext=async t=>{let n=await e.stateStore.getSession(t.sessionId);if(n===void 0){let r=normalizeChannelAudience(t.channelAudience),i=resolveSessionTraceDecision(t,r,e.tracePolicy);n={agentName:t.agentName,channelAudience:r,channelKind:t.channelKind,decision:i,context:t.parentTraceContext===void 0?openSessionTrace({agentName:t.agentName,channelAudience:r,channelType:t.channelType,rootSessionId:t.rootSessionId,sessionId:t.sessionId,traceDecision:i,traceSeed:t.traceSeed}):adoptedSpanContext(t.parentTraceContext),rootSessionId:t.rootSessionId},await e.stateStore.setSession(t.sessionId,n)}return n};return{ensureSessionContext,prepareSessionTrace:async e=>{let t=await ensureSessionContext(e);return portableSpanContext(t.context,t.decision)},prepareTurnTrace:async t=>{let n=await e.stateStore.getTurn(t.sessionId,t.turnId);if(n!==void 0)return{decision:(await e.stateStore.getSession(t.sessionId))?.decision,spanId:n.parentSpanId,traceFlags:n.context.traceFlags,traceId:n.context.traceId};let r=await ensureSessionContext({agentName:t.agentName,channelAudience:`unknown`,channelKind:void 0,idempotencyKey:sessionIdempotencyKey(t.sessionId),parentTraceContext:t.parentTraceContext,rootSessionId:t.rootSessionId,sessionId:t.sessionId,type:`session.started`}),i={isRemote:!1,spanId:e.idGenerator.deriveSpanId(`turn:${t.idempotencyKey}`),traceFlags:r.context.traceFlags,traceId:r.context.traceId};return await e.stateStore.setTurn(t.sessionId,t.turnId,{context:i,parentIsRemote:r.context.isRemote,parentSpanId:r.context.spanId,rootSessionId:t.rootSessionId,sequence:t.sequence,startTimeMs:Date.now(),subagentName:t.parentLineage?.subagentName}),portableSpanContext(r.context,r.decision)}}}function portableSpanContext(e,t){return{decision:t,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function adoptedSpanContext(e){return{isRemote:`isRemote`in e&&e.isRemote===!0,spanId:e.spanId,traceFlags:e.traceFlags,traceId:e.traceId}}function resolveSessionTraceDecision(e,t,n){return e.traceSeed?.decision===void 0?e.traceSeed===void 0?e.parentTraceContext===void 0?e.agentName===void 0?n===void 0?resolveTracePolicyDecision(!0,t):{action:`drop`}:resolveTracePolicy(n,{agentName:e.agentName,audience:t,channelType:e.channelType}):resolveTracePolicyDecision(isSampledTrace(e.parentTraceContext),t):resolveTracePolicyDecision(isSampledTrace(e.traceSeed),t):readInstrumentationDecision(e.traceSeed.decision)??{action:`drop`}}export{createAgentOtelSessionContext};
@@ -1,6 +1,16 @@
1
1
  import type { Span } from "#compiled/@opentelemetry/api/index.js";
2
2
  import type { InstrumentationUsage } from "#instrumentation/lifecycle.js";
3
+ import type { AgentTurnTraceState } from "#tracing/agent-trace-state.js";
3
4
  /** Applies eve's structural token usage attributes to an agent span. */
4
5
  export declare function setAgentUsage(span: Span, usage: InstrumentationUsage, options?: {
5
6
  readonly includeGenAiDetails?: boolean;
6
7
  }): void;
8
+ export declare function setAgentInvocationUsage(span: Span, modelUsage: AgentTurnTraceState["modelUsage"]): void;
9
+ /**
10
+ * Extracts cost data from a step result's provider metadata. Only Vercel AI
11
+ * Gateway reports it (`providerMetadata.gateway`): raw inference cost, the
12
+ * gateway's surcharged total, the input/output split, and the generation id
13
+ * for dashboard reconciliation. Values arrive as USD strings; anything
14
+ * missing or non-numeric is skipped, so non-gateway providers get nothing.
15
+ */
16
+ export declare function readGatewayCost(providerMetadata: Readonly<Record<string, unknown>>): Record<string, string | number> | undefined;
@@ -1 +1 @@
1
- function setAgentUsage(e,t,n={}){t.inputTokens!==void 0&&e.setAttribute(`agent.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`agent.usage.output_tokens`,t.outputTokens);let r=t.inputTokenDetails;r?.cacheReadTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_read_tokens`,r.cacheReadTokens):e.setAttribute(`gen_ai.usage.cache_read.input_tokens`,r.cacheReadTokens)),r?.cacheWriteTokens!==void 0&&(n.includeGenAiDetails===!1?e.setAttribute(`agent.usage.cache_write_tokens`,r.cacheWriteTokens):e.setAttribute(`gen_ai.usage.cache_creation.input_tokens`,r.cacheWriteTokens))}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))}function setAgentInvocationUsage(e,t){t!==void 0&&(t.inputTokens!==void 0&&e.setAttribute(`gen_ai.usage.input_tokens`,t.inputTokens),t.outputTokens!==void 0&&e.setAttribute(`gen_ai.usage.output_tokens`,t.outputTokens))}function readGatewayCost(e){let t=e.gateway;if(!isRecord(t))return;let n={},r=readUsd(t.cost);r!==void 0&&(n[`gen_ai.usage.cost`]=r);let i=readUsd(t.gatewayCost);i!==void 0&&(n[`gen_ai.usage.gateway_cost`]=i);let a=readUsd(t.inputInferenceCost);a!==void 0&&(n[`gen_ai.usage.input_cost`]=a);let o=readUsd(t.outputInferenceCost);return o!==void 0&&(n[`gen_ai.usage.output_cost`]=o),typeof t.generationId==`string`&&t.generationId.length>0&&(n[`gen_ai.generation.id`]=t.generationId),Object.keys(n).length===0?void 0:n}function readUsd(e){if(typeof e!=`string`)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}export{readGatewayCost,setAgentInvocationUsage,setAgentUsage};
@@ -0,0 +1 @@
1
+ export declare function agentSpanNamingAttributes(name: string, operation?: string): Record<string, string>;
@@ -0,0 +1 @@
1
+ function agentSpanNamingAttributes(e,t=e){return{"operation.name":t,"resource.name":e}}export{agentSpanNamingAttributes};
@@ -1 +1 @@
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";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentToolInstrumentation(e){let t=new Map,n=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),r=e.resolveFallback(t),i=r===void 0?void 0:reserve(t,n,r),a=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(i===void 0){if(a===void 0)return;i=reserve(t,n,a)}a!==void 0&&startSpan(i,a.context)},onTerminal=async t=>{let r=n.get(t.scope.attemptId)?.get(t.idempotencyKey);if(r!==void 0){if(r.terminal=t,r.span===void 0){let t=await e.actionContextFor(r.event.scope.sessionId,r.event.scope.turnId,r.event.callId);t!==void 0&&startSpan(r,t.context)}finishIfReady(r)}};return{async actionStarted(n){let r=t.get(n.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(n.scope.sessionId,n.scope.turnId,n.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>n.get(e)?.get(t)?.context,drain(e,t){let r=n.get(e);if(r!==void 0){for(let e of r.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));n.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function reserve(n,r,i){let a=e.idGenerator.deriveSpanId(`tool:${n.idempotencyKey}`),o={actionKey:r,attemptId:n.scope.attemptId,context:withChannelAudience(contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),n.scope.channelAudience),event:n,fallbackParent:i.context,idempotencyKey:n.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(n.scope.attemptId).set(n.idempotencyKey,o),t.set(r,o),o}function startSpan(t,n){if(t.span===void 0&&t.finished!==!0&&(t.span=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`execute_tool ${t.event.toolName}`,{attributes:toolAttributes(t.event),kind:SpanKind.INTERNAL,startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input,!1);e!==void 0&&t.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span!==void 0&&e.terminal!==void 0&&finish(e)}function finish(r,i){let a=r.span;if(a===void 0||r.finished===!0)return;r.finished=!0;let o=r.terminal;if(i!==void 0)recordError(a,i.error);else if(o?.type===`tool.call.failed`)recordError(a,o.error);else if(o?.output.type===`error`)recordError(a,o.output.error);else if(o!==void 0&&e.recordOutputs){let e=contentAttribute(o.output.output,!1);e!==void 0&&a.setAttribute(`gen_ai.tool.call.result`,e)}a.end(),t.delete(r.actionKey);let s=n.get(r.attemptId);s?.delete(r.idempotencyKey),s?.size===0&&n.delete(r.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName,"gen_ai.tool.type":`function`}}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
1
+ import{ROOT_CONTEXT,SpanKind,SpanStatusCode,trace}from"#compiled/@opentelemetry/api/index.js";import{actionIdempotencyKey}from"#instrumentation/lifecycle.js";import{agentSpanNamingAttributes}from"#tracing/agent-span-naming.js";import{contentAttribute}from"#tracing/agent-otel-content.js";import{withChannelAudience}from"#tracing/channel-audience-context.js";function createAgentToolInstrumentation(e){let t=new Map,n=new Map,onStarted=async t=>{let n=actionIdempotencyKey(t.scope.sessionId,t.scope.turnId,t.callId),r=e.resolveFallback(t),i=r===void 0?void 0:reserve(t,n,r),a=await e.actionContextFor(t.scope.sessionId,t.scope.turnId,t.callId);if(i===void 0){if(a===void 0)return;i=reserve(t,n,a)}a!==void 0&&startSpan(i,a.context)},onTerminal=async t=>{let r=n.get(t.scope.attemptId)?.get(t.idempotencyKey);if(r!==void 0){if(r.terminal=t,r.span===void 0){let t=await e.actionContextFor(r.event.scope.sessionId,r.event.scope.turnId,r.event.callId);t!==void 0&&startSpan(r,t.context)}finishIfReady(r)}};return{async actionStarted(n){let r=t.get(n.idempotencyKey);if(r===void 0||r.span!==void 0||r.finished===!0)return;let i=await e.actionContextFor(n.scope.sessionId,n.scope.turnId,n.callId);i!==void 0&&(startSpan(r,i.context),finishIfReady(r))},contextFor:(e,t)=>n.get(e)?.get(t)?.context,drain(e,t){let r=n.get(e);if(r!==void 0){for(let e of r.values())e.finished!==!0&&(e.span===void 0&&startSpan(e,e.fallbackParent),finish(e,t));n.delete(e)}},events:{"tool.call.completed":onTerminal,"tool.call.failed":onTerminal,"tool.call.started":onStarted}};function getAttemptStates(e){let t=n.get(e);return t===void 0&&(t=new Map,n.set(e,t)),t}function reserve(n,r,i){let a=e.idGenerator.deriveSpanId(`tool:${n.idempotencyKey}`),o={actionKey:r,attemptId:n.scope.attemptId,context:withChannelAudience(contextFromSpanContext({isRemote:!1,spanId:a,traceFlags:i.spanContext.traceFlags,traceId:i.spanContext.traceId}),n.scope.channelAudience),event:n,fallbackParent:i.context,idempotencyKey:n.idempotencyKey,spanId:a,startTimeMs:Date.now()};return getAttemptStates(n.scope.attemptId).set(n.idempotencyKey,o),t.set(r,o),o}function startSpan(t,n){if(t.span===void 0&&t.finished!==!0&&(t.span=e.idGenerator.withSpanId(t.spanId,()=>e.tracer.startSpan(`execute_tool ${t.event.toolName}`,{attributes:toolAttributes(t.event),kind:SpanKind.INTERNAL,startTime:t.startTimeMs},n)),e.recordInputs)){let e=contentAttribute(t.event.input,!1);e!==void 0&&t.span.setAttribute(`gen_ai.tool.call.arguments`,e)}}function finishIfReady(e){e.span!==void 0&&e.terminal!==void 0&&finish(e)}function finish(r,i){let a=r.span;if(a===void 0||r.finished===!0)return;r.finished=!0;let o=r.terminal;if(i!==void 0)recordError(a,i.error);else if(o?.type===`tool.call.failed`)recordError(a,o.error);else if(o?.output.type===`error`)recordError(a,o.output.error);else if(o!==void 0&&e.recordOutputs){let e=contentAttribute(o.output.output,!1);e!==void 0&&a.setAttribute(`gen_ai.tool.call.result`,e)}a.end(),t.delete(r.actionKey);let s=n.get(r.attemptId);s?.delete(r.idempotencyKey),s?.size===0&&n.delete(r.attemptId)}}function toolAttributes(e){return{"gen_ai.operation.name":`execute_tool`,"gen_ai.tool.call.id":e.callId,"gen_ai.tool.name":e.toolName,"gen_ai.tool.type":`function`,...agentSpanNamingAttributes(`execute_tool ${e.toolName}`,`execute_tool`)}}function contextFromSpanContext(e){return trace.setSpan(ROOT_CONTEXT,trace.wrapSpanContext(e))}function recordError(e,t){e.setAttribute(`error.type`,t instanceof Error?t.name||`Error`:`_OTHER`),t instanceof Error?(e.recordException(t),e.setStatus({code:SpanStatusCode.ERROR,message:t.message})):e.setStatus({code:SpanStatusCode.ERROR})}export{createAgentToolInstrumentation};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-1NAM6ftx.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BR8EpIOX.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-1NAM6ftx.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-BR8EpIOX.js";
2
2
 
3
3
  export { useEveAgent };
@@ -18,6 +18,12 @@ export default defineAgent({
18
18
  });
19
19
  ```
20
20
 
21
+ Before summarizing, eve tries to shorten oversized tool results in older history.
22
+ It checks whether that reduction is sufficient using the last provider-reported
23
+ input token count plus an estimate of new messages. A smaller character estimate
24
+ alone cannot satisfy compaction triggered by a higher provider count. If trimming
25
+ cannot free enough space, eve summarizes the older history.
26
+
21
27
  Compaction also preserves the framework's own tool state automatically. It resets read-before-write tracking (so a write afterward re-reads the file whose read evidence was summarized away) and re-injects the active todo list, so the model keeps its task list across the summary. There is no per-tool hook to configure.
22
28
 
23
29
  First-class [memory](../memory) participates in a separate lifecycle. eve asks
@@ -119,6 +119,10 @@ Alongside `type` and `data`, every event carries a `meta` envelope:
119
119
 
120
120
  - **`meta.id`** uniquely identifies the event. It is an `evt_`-prefixed [ULID](https://github.com/ulid/spec): a millisecond timestamp followed by random bits, so ids are broadly time-ordered.
121
121
  - **`meta.at`** is the ISO-8601 time the event was emitted.
122
+ - **`meta.deliveryIds`**, when present, identifies the accepted messages that own
123
+ the turn. `POST /eve/v1/session/:sessionId` returns its `deliveryId`, allowing
124
+ clients to skip earlier turns when resuming from an old cursor. Coalesced
125
+ messages share the same turn events.
122
126
 
123
127
  `meta.id` is stable. eve mints it once, when the event is written to the durable stream, and stores it with the event. Reconnecting from a cursor, rewinding to `startIndex=0`, or replaying a finished session all return the same id for the same event.
124
128
 
@@ -200,7 +200,7 @@ export default defineMcpClientConnection({
200
200
  });
201
201
  ```
202
202
 
203
- `"linear/myagent"` is the UID you chose when registering the Connect client. `connect("linear/myagent")` is shorthand for a user-scoped interactive OAuth connection: eve resolves a token for the active user before each tool call, emits `authorization.required` when that user has not authorized yet, and resumes the parked turn after the callback completes.
203
+ Use the connector UID returned by `vercel connect create`; the display name passed to `--name` is not the UID. `connect("linear/myagent")` is shorthand for a user-scoped interactive OAuth connection: eve resolves a token for the active user before each tool call, emits `authorization.required` when that user has not authorized yet, and resumes the parked turn after the callback completes.
204
204
 
205
205
  When a local subagent needs interactive authorization, eve surfaces the authorization lifecycle on the root session's channel, including through nested subagent chains. The challenge still points to the child session's callback, so completing it resumes the child directly while the parent continues waiting for its result.
206
206
 
@@ -52,6 +52,17 @@ console.log((await response.result()).message);
52
52
  `attach()` performs no request. Every later operation targets exactly
53
53
  `saved.sessionId`; it never follows or creates a replacement.
54
54
 
55
+ `send()` correlates its response with the message accepted by the server. If the
56
+ saved cursor is behind, it skips earlier turns and advances past them before
57
+ collecting the new result, including when another turn is active or queued. You
58
+ do not need to drain the stream before sending. Upgrade the server alongside the
59
+ client: a server that omits the accepted delivery identity causes `send()` to
60
+ throw instead of returning an ambiguous result.
61
+
62
+ If a configured reconnect limit ends the stream before the accepted turn reaches
63
+ a boundary, collecting its response throws. A partial stream is not a completed
64
+ result.
65
+
55
66
  ## Waiting, completed, and reset sessions
56
67
 
57
68
  A session that emits `session.waiting` accepts another message through the same