eve 0.54.0 → 0.54.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 (138) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/src/chunks/{use-eve-agent-BR8EpIOX.js → use-eve-agent-CxPlg0KL.js} +0 -1
  3. package/dist/src/chunks/{use-eve-agent-XnfjQt1Z.js → use-eve-agent-D-KQzzyW.js} +0 -1
  4. package/dist/src/cli/dev/tui/setup-commands.js +1 -1
  5. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  6. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +1 -3
  7. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -2
  8. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  9. package/dist/src/cli/dev/tui/traces/trace-view.js +1 -1
  10. package/dist/src/client/agent-info-schema.d.ts +0 -1
  11. package/dist/src/client/agent-info-schema.js +1 -1
  12. package/dist/src/compiled/.vendor-stamp.json +3 -1
  13. package/dist/src/compiled/just-secrets/LICENSE +21 -0
  14. package/dist/src/compiled/just-secrets/index.d.ts +20 -0
  15. package/dist/src/compiled/just-secrets/index.js +2 -0
  16. package/dist/src/compiled/just-secrets/windows.ps1 +138 -0
  17. package/dist/src/compiler/default-tool-policy.js +1 -1
  18. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  19. package/dist/src/compiler/extension-compatibility.js +1 -1
  20. package/dist/src/compiler/manifest.js +1 -1
  21. package/dist/src/compiler/normalize-manifest-helpers.d.ts +2 -1
  22. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  23. package/dist/src/compiler/normalize-manifest.js +1 -1
  24. package/dist/src/compiler/resolve-workspace-subagent.d.ts +13 -0
  25. package/dist/src/compiler/resolve-workspace-subagent.js +1 -0
  26. package/dist/src/context/memory-event-lifecycle.d.ts +2 -0
  27. package/dist/src/context/memory-event-lifecycle.js +1 -1
  28. package/dist/src/context/memory-lifecycle.d.ts +5 -0
  29. package/dist/src/context/memory-lifecycle.js +1 -1
  30. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  31. package/dist/src/execution/create-session-step.js +1 -1
  32. package/dist/src/execution/durable-session-migrations/snapshot.d.ts +0 -16
  33. package/dist/src/execution/durable-session-migrations/snapshot.js +1 -1
  34. package/dist/src/execution/parked-delivery-wait.js +1 -1
  35. package/dist/src/execution/session.d.ts +0 -2
  36. package/dist/src/execution/session.js +1 -1
  37. package/dist/src/execution/tasks/parent/dispatch.d.ts +1 -12
  38. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  39. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  40. package/dist/src/execution/tools/subagent/invoke-agent.d.ts +1 -2
  41. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  42. package/dist/src/execution/tools/tasks.d.ts +1 -8
  43. package/dist/src/execution/tools/tasks.js +1 -1
  44. package/dist/src/execution/workflow-steps.js +1 -1
  45. package/dist/src/framework/sources/registry.js +1 -1
  46. package/dist/src/harness/compaction.js +1 -1
  47. package/dist/src/harness/coordination.js +1 -1
  48. package/dist/src/harness/emission.js +1 -1
  49. package/dist/src/harness/execute-tool.d.ts +2 -4
  50. package/dist/src/harness/messages.d.ts +1 -1
  51. package/dist/src/harness/messages.js +1 -1
  52. package/dist/src/harness/model-call-error.d.ts +5 -0
  53. package/dist/src/harness/model-call-error.js +1 -1
  54. package/dist/src/harness/semantic-errors/rules/model-provider.js +1 -1
  55. package/dist/src/harness/step-hooks.d.ts +17 -10
  56. package/dist/src/harness/step-hooks.js +1 -1
  57. package/dist/src/harness/tool-loop.js +2 -2
  58. package/dist/src/instrumentation/content.js +1 -1
  59. package/dist/src/instrumentation/dispatch.js +1 -1
  60. package/dist/src/instrumentation/lifecycle.d.ts +7 -3
  61. package/dist/src/instrumentation/memory.d.ts +72 -0
  62. package/dist/src/instrumentation/memory.js +1 -0
  63. package/dist/src/instrumentation/native-events.js +1 -1
  64. package/dist/src/instrumentation/provider.d.ts +1 -0
  65. package/dist/src/instrumentation/runtime.d.ts +3 -0
  66. package/dist/src/instrumentation/runtime.js +1 -1
  67. package/dist/src/internal/application/package.js +1 -1
  68. package/dist/src/internal/nitro/routes/index.d.ts +6 -0
  69. package/dist/src/internal/nitro/routes/index.js +7 -7
  70. package/dist/src/internal/vercel/assemble-eve-services.js +1 -1
  71. package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
  72. package/dist/src/internal/vercel/build-multi-agent-landing-page.d.ts +3 -0
  73. package/dist/src/internal/vercel/build-multi-agent-landing-page.js +1 -0
  74. package/dist/src/internal/vercel/eve-service-contribution.d.ts +4 -0
  75. package/dist/src/internal/vercel/eve-service-contribution.js +1 -1
  76. package/dist/src/public/definitions/workspace-agent.d.ts +25 -0
  77. package/dist/src/public/definitions/workspace-agent.js +1 -0
  78. package/dist/src/public/index.d.ts +1 -0
  79. package/dist/src/public/index.js +1 -1
  80. package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +22 -4
  81. package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -1
  82. package/dist/src/public/models/openai/chatgpt/oauth.d.ts +6 -4
  83. package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
  84. package/dist/src/setup/flows/chatgpt-auth.js +1 -1
  85. package/dist/src/setup/flows/model.d.ts +0 -2
  86. package/dist/src/setup/flows/model.js +1 -1
  87. package/dist/src/setup/scaffold/create/project.js +1 -1
  88. package/dist/src/shared/action-types.d.ts +4 -0
  89. package/dist/src/shared/action-types.js +1 -1
  90. package/dist/src/shared/dispatch-action.d.ts +1 -1
  91. package/dist/src/subagents/callback-route.js +1 -1
  92. package/dist/src/subagents/callback-step.d.ts +0 -8
  93. package/dist/src/subagents/callback-step.js +1 -1
  94. package/dist/src/svelte/index.js +1 -1
  95. package/dist/src/svelte/use-eve-agent.js +1 -1
  96. package/dist/src/tasks/delivery-context.d.ts +2 -2
  97. package/dist/src/tasks/delivery-context.js +2 -2
  98. package/dist/src/tasks/session-index.d.ts +6 -3
  99. package/dist/src/tasks/session-index.js +1 -1
  100. package/dist/src/tasks/session-task-cohorts.d.ts +10 -2
  101. package/dist/src/tasks/session-task-cohorts.js +1 -1
  102. package/dist/src/tools/behavior.d.ts +1 -3
  103. package/dist/src/tools/framework/task-contract.d.ts +0 -4
  104. package/dist/src/tools/framework/task-contract.js +1 -1
  105. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  106. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  107. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  108. package/dist/src/tracing/agent-memory-instrumentation.d.ts +13 -0
  109. package/dist/src/tracing/agent-memory-instrumentation.js +1 -0
  110. package/dist/src/tracing/agent-otel-content.d.ts +4 -12
  111. package/dist/src/tracing/agent-otel-content.js +3 -3
  112. package/dist/src/tracing/agent-otel-provider.js +2 -2
  113. package/dist/src/tracing/agent-span-contract.d.ts +1 -0
  114. package/dist/src/tracing/agent-span-contract.js +1 -1
  115. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  116. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  117. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  118. package/dist/src/tracing/agent-trace-state.d.ts +3 -1
  119. package/dist/src/tracing/content-attributes.js +1 -1
  120. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  121. package/dist/src/vue/index.js +1 -1
  122. package/dist/src/vue/use-eve-agent.js +1 -1
  123. package/docs/concepts/built-in-tools.md +0 -20
  124. package/docs/concepts/sessions-runs-and-streaming.md +9 -1
  125. package/docs/guides/frontend/overview.mdx +1 -1
  126. package/docs/guides/instrumentation.md +65 -30
  127. package/docs/reference/cli.md +9 -9
  128. package/docs/reference/typescript-api.md +7 -3
  129. package/docs/subagents/index.mdx +46 -10
  130. package/package.json +2 -6
  131. package/dist/src/execution/tasks/child/update-step.d.ts +0 -6
  132. package/dist/src/execution/tasks/child/update-step.js +0 -1
  133. package/dist/src/execution/tasks/child/update.d.ts +0 -8
  134. package/dist/src/execution/tasks/child/update.js +0 -1
  135. package/dist/src/public/tools/task-update.d.ts +0 -1
  136. package/dist/src/public/tools/task-update.js +0 -1
  137. package/dist/src/tools/framework/task-update.d.ts +0 -5
  138. package/dist/src/tools/framework/task-update.js +0 -1
@@ -48,13 +48,13 @@ Use the `setup` callback to register your OTel provider (for example `registerOT
48
48
 
49
49
  Any OTel-compatible backend works (Braintrust, PostHog, Sentry, Raindrop, Arize, Honeycomb, Datadog, Jaeger). Install the exporter package you need and configure it in the callback. The [PostHog AI Observability integration](/integrations/posthog-instrumentation) provides a ready-to-install exporter and optional user identification. The [Sentry integration](/integrations/sentry-instrumentation) provides a ready-to-install OTLP exporter that sends traces to Sentry without a Sentry SDK.
50
50
 
51
- Three more fields control what the AI SDK records inside those spans (see the AI SDK's [telemetry reference](https://ai-sdk.dev/docs/ai-sdk-core/telemetry)):
51
+ Three more fields control what eve and the AI SDK record inside those spans (see the AI SDK's [telemetry reference](https://ai-sdk.dev/docs/ai-sdk-core/telemetry)):
52
52
 
53
- - `recordInputs` records full message history on each step span. It defaults to `false`; set it to `true` to include input content.
54
- - `recordOutputs` records model outputs on spans. It defaults to `false`; set it to `true` to include output content.
53
+ - `recordInputs` records full message history on each step span and recalled records on memory spans. It defaults to `false`; set it to `true` to include input content.
54
+ - `recordOutputs` records model outputs. It defaults to `false`; set it to `true` to include output content.
55
55
  - `functionId` overrides the function name on spans (defaults to the agent name).
56
56
 
57
- eve records metadata without model or tool inputs and outputs by default. Enable either content category only after reviewing the exporter and its data-retention path.
57
+ eve records metadata without model, tool, or memory-record content by default. Enable either content category only after reviewing the exporter and its data-retention path.
58
58
 
59
59
  In the provider layout, eve stamps each span with `gen_ai.conversation.id`, which stays fixed across local and remote activations, including independent remote root workflows. Query this attribute to find the conversation's exported, retained traces; it does not grant access or control trace parenting. On Vercel, `vercel.session_id` additionally identifies the current Workflow run. See [Query exported traces](#query-exported-traces) for the cross-backend workflow.
60
60
 
@@ -103,19 +103,28 @@ not mark the active span as failed.
103
103
  The built-in OpenTelemetry provider preserves each span's OTel name and adds
104
104
  `operation.name` and `resource.name` for Datadog's operation/resource mapping:
105
105
 
106
- | OTel span name | `operation.name` | `resource.name` |
107
- | ----------------------------------------------------------------------- | ----------------- | ---------------------- |
108
- | `invoke_agent weather` | `invoke_agent` | `invoke_agent weather` |
109
- | `execute_tool search` | `execute_tool` | `execute_tool search` |
110
- | `chat <model>` | `chat` | `chat <model>` |
111
- | `agent.step`, `agent.action`, `agent.approval`, `agent.channel.request` | Same as span name | Same as span name |
106
+ | OTel span name | `operation.name` | `resource.name` |
107
+ | ----------------------------------------------------------------------- | ----------------- | ------------------------ |
108
+ | `invoke_agent weather` | `invoke_agent` | `invoke_agent weather` |
109
+ | `invoke_workflow deploy` | `invoke_workflow` | `invoke_workflow deploy` |
110
+ | `execute_tool search` | `execute_tool` | `execute_tool search` |
111
+ | `chat <model>` | `chat` | `chat <model>` |
112
+ | `search_memory`, `upsert_memory` | Same as span name | Same as span name |
113
+ | `agent.step`, `agent.action`, `agent.approval`, `agent.channel.request` | Same as span name | Same as span name |
112
114
 
113
- These attributes apply to eve-owned spans in local tracing and the
115
+ These rows apply to eve-owned spans in local tracing and the
114
116
  [instrumentation provider layout](./instrumentation-providers). They do not
115
117
  rename Workflow, AI SDK, or other third-party spans, or change trace IDs,
116
- parenting, sampling, or session grouping. Legacy `instrumentation.ts` setup
117
- still owns its exporter configuration and [authored trace
118
- hierarchy](#authored-trace-hierarchy).
118
+ parenting, or session grouping. Legacy `instrumentation.ts` setup still owns
119
+ its exporter configuration and [authored trace hierarchy](#authored-trace-hierarchy).
120
+
121
+ Workflow action spans enter the sampler as `agent.action`, with
122
+ `gen_ai.operation.name` and `gen_ai.workflow.name` already present. After
123
+ sampling, eve changes the exported span name to `invoke_workflow <tool>`.
124
+ Existing name-based samplers therefore keep their `agent.action` behavior;
125
+ attribute-based samplers can select GenAI workflow operations explicitly.
126
+ Review custom attribute rules when upgrading because the new workflow
127
+ attributes may change their decisions.
119
128
 
120
129
  In Datadog APM, `operation_name:invoke_agent resource_name:"invoke_agent weather"`
121
130
  selects named agent invocations. Operation-based dashboards and monitors may
@@ -137,25 +146,47 @@ that discard span events, including Sentry's [direct OTLP
137
146
  intake](https://docs.sentry.io/concepts/otlp/direct/traces/). These attributes
138
147
  remain available when model and tool content is redacted.
139
148
 
149
+ ## Memory spans
150
+
151
+ eve records [OpenTelemetry GenAI memory spans](https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/#memory) for provider calls. Recalls at `turn.started` and `compaction.completed` use `search_memory`; capture handlers use `upsert_memory`. They are client spans, following the GenAI memory convention for a call to a memory system.
152
+
153
+ Every memory span includes `gen_ai.operation.name` and `gen_ai.memory.store.id`. The store ID is eve's opaque `memory.scope.key`, which identifies the resolved scope without exposing the namespace or scope values. Recall spans set `gen_ai.memory.record.count` to their result count.
154
+
155
+ `gen_ai.memory.records` contains recalled record content only when `recordInputs` is enabled. eve classifies recalled records as input content because they become part of the model context. eve does not set `gen_ai.memory.query.text` because a memory provider receives structured conversation messages, not a standalone search-query string. The `agent.memory.slot` and `agent.memory.phase` attributes identify the eve slot and lifecycle boundary without adding either to the span name.
156
+
157
+ Messages in `gen_ai.input.messages` include a `kind` for user-role entries.
158
+ New human input uses `user`; framework-authored input uses namespaced kinds
159
+ such as `context.instruction` and `execution.background_task`. When resuming
160
+ history saved before eve 0.54, entries without a kind use `legacy.unknown`:
161
+ the old format did not reliably distinguish human input from framework input.
162
+ Their content and metadata remain unchanged, and already classified entries
163
+ retain their kind. Unknown legacy entries are not replayed as the latest human
164
+ request after compaction.
165
+
140
166
  ## Agent trace contract
141
167
 
142
168
  The provider layout and zero-config local tracing emit the following spans.
143
169
  The legacy `instrumentation.ts` layout still uses its authored OTel setup.
144
170
 
145
- | Span | Meaning |
146
- | ----------------------- | -------------------------------------------------------- |
147
- | `invoke_agent <agent>` | One agent activation in its own trace |
148
- | `agent.step` | One model attempt |
149
- | `chat <model>` | One model call beneath its step |
150
- | `agent.action` | Durable action lifecycle, including dispatch and waiting |
151
- | `execute_tool <tool>` | In-process tool execution beneath its action |
152
- | `agent.approval` | Approval waiting beneath its action |
153
- | `agent.channel.request` | Optional HTTP request span in the provider layout |
171
+ | Span | Meaning |
172
+ | ------------------------ | -------------------------------------------------------- |
173
+ | `invoke_agent <agent>` | One agent activation in its own trace |
174
+ | `agent.step` | One model attempt |
175
+ | `chat <model>` | One model call beneath its step |
176
+ | `invoke_workflow <tool>` | One workflow tool run that coordinated a nested agent |
177
+ | `agent.action` | Durable action lifecycle, including dispatch and waiting |
178
+ | `execute_tool <tool>` | In-process tool execution beneath its action |
179
+ | `agent.approval` | Approval waiting beneath its action |
180
+ | `search_memory` | Recall memory records before a turn or after compaction |
181
+ | `upsert_memory` | Automatic memory capture |
182
+ | `agent.channel.request` | Optional HTTP request span in the provider layout |
154
183
 
155
184
  For background tools and subagents, the AI SDK's `execute_tool` span ends when
156
185
  the model receives the task receipt. The enclosing `agent.action` span remains
157
- open until the background task completes, fails, or is cancelled. Its duration,
158
- outcome, and usage describe the background task rather than the receipt.
186
+ open until the background task completes, fails, or is cancelled. When a
187
+ workflow tool coordinates a nested `ctx.agent()` call, eve exports that span as
188
+ `invoke_workflow` instead. Its duration, outcome, and usage describe the
189
+ background task rather than the receipt.
159
190
  Background tool results follow the output-content policy. Recorded task failure
160
191
  details become bounded exception and status messages; redacted spans retain only
161
192
  the failure outcome, error status, and error type. The initiating turn can
@@ -163,10 +194,14 @@ finish or be cancelled while the action remains open. Ending the session closes
163
194
  an action whose task never reported a terminal result.
164
195
 
165
196
  Schema v4 removes the session-long `agent.session` root and duplicate agent session and lineage attributes. Every eve span carries `agent.trace.schema.version=4` and `gen_ai.conversation.id`; Vercel deployments additionally carry `vercel.session_id`.
166
- Only activations use the `invoke_agent` operation. Dispatch lifecycle spans use
167
- `agent.action` with `agent.invocation.role=caller`; the built-in `agent` tool
168
- executes under `execute_tool agent`. Turn IDs such as `turn_0` are local to a session,
169
- so correlate turns by session ID and turn ID together.
197
+ Only activations use the `invoke_agent` operation. A workflow tool invocation
198
+ that coordinates at least one nested agent uses `invoke_workflow`, with its
199
+ path-derived tool name in `gen_ai.workflow.name`. Durable workflow tools without
200
+ agent operations, including `sleep`, remain `agent.action` spans. Dispatch
201
+ lifecycle spans use `agent.action` with
202
+ `agent.invocation.role=caller`; the built-in `agent` tool executes under
203
+ `execute_tool agent`. Turn IDs such as `turn_0` are local to a session, so
204
+ correlate turns by session ID and turn ID together.
170
205
 
171
206
  A conversation remains durable state; `gen_ai.conversation.id` joins the activations that operate on it.
172
207
 
@@ -373,7 +408,7 @@ Without an `instrumentation.ts`, `eve dev` records spans to disk with one bounde
373
408
  - [`/traces`](dev-tui#logs-and-traces) in the dev TUI: a live trace viewer that replays captured content as a conversation.
374
409
  - [`eve traces`](../reference/cli#eve-traces): a span tree in the terminal, `eve traces ls` to list. Works after `eve dev` exits.
375
410
 
376
- Local traces omit model and tool inputs and outputs by default. Set `EVE_TRACES_CONTENT=on` in `.env.local` to capture that content.
411
+ Local traces omit model, tool, and memory-record content by default. Set `EVE_TRACES_CONTENT=on` in `.env.local` to capture that content.
377
412
 
378
413
  Writing `instrumentation.ts` replaces this: your `setup` takes over and nothing is recorded locally. For span attributes, retention, and the `EVE_TRACES*` variables, see [`eve traces`](../reference/cli#eve-traces).
379
414
 
@@ -310,13 +310,13 @@ Span rows carry inline metrics when the span recorded them — `↑input`/`↓ou
310
310
 
311
311
  Every subagent activation starts its own trace. The first child's `invoke_agent` root links to the dispatching caller with `eve.link.type=agent.dispatch`; remote agents carry that caller context over `traceparent`. Later turns also start fresh traces without repeating the initial caller link. All related sessions retain the same `gen_ai.conversation.id`, and `agent.subagent.name` labels the child invocation.
312
312
 
313
- Each `agent()` call inside an authored workflow has its own `agent.action` caller span, including sequential, parallel, and background calls. The workflow tool keeps its own `agent.action` and `execute_tool` spans. Only agent execution uses `invoke_agent`.
313
+ Each `agent()` call inside an authored workflow has its own `agent.action` caller span, including sequential, parallel, and background calls. A workflow tool that coordinates one of those calls has an enclosing `invoke_workflow <tool>` span; a workflow tool without agent calls remains `agent.action`. The tool also keeps its `execute_tool <tool>` span. Only agent execution uses `invoke_agent`.
314
314
 
315
315
  A durable conversation produces one bounded trace per turn. Worker replacements reuse the prepared context for the same turn, while a later turn or an independently replayed attempt starts a fresh trace. Passing the conversation ID shows every trace it produced, oldest first.
316
316
 
317
317
  Every span carries a real duration. A turn's root `invoke_agent` span is written when the turn settles, so a running turn shows only its steps.
318
318
 
319
- Model and `execute_tool` spans omit their inputs and outputs by default. Set `EVE_TRACES_CONTENT=on` to capture system prompts, prompt messages, and response text for models, plus call arguments and results for tools. Each captured value is capped at 32 KB.
319
+ Model, `execute_tool`, and memory spans omit their content by default. Set `EVE_TRACES_CONTENT=on` to capture system prompts, prompt messages, and response text for models; call arguments and results for tools; and recalled memory records. Each captured value is capped at 32 KB.
320
320
 
321
321
  Step spans carry token counts under `agent.usage.*`, and cost when Vercel AI Gateway served the call. Model spans also expose `gen_ai.usage.*` token counters. The CLI sums step-level counters only, so model and delegated-call totals are not counted twice.
322
322
 
@@ -324,13 +324,13 @@ Step spans carry token counts under `agent.usage.*`, and cost when Vercel AI Gat
324
324
 
325
325
  eve sweeps the store when an activation's writes finish, when a session finishes, and when the dev server starts. An open conversation does not pin every completed turn's trace. Sweeps evict oldest-first past the bounds below, except that active traces, the newest traces, and anything written in the last five minutes are kept. A sweep can therefore exceed the size budget. Set the bounds in `.env.local`, which `eve dev` loads automatically; each accepts `off` to disable it individually.
326
326
 
327
- | Variable | Default | Effect |
328
- | ---------------------------- | -------------------- | ----------------------------------------------------------------------------------- |
329
- | `EVE_TRACES` | on | `off` stops writing traces and stops sweeping |
330
- | `EVE_TRACES_CONTENT` | off | `on` captures model prompt/response and tool input/output attributes on local spans |
331
- | `EVE_TRACES_MAX_AGE_MS` | `604800000` (7d) | Age after which a trace may be evicted |
332
- | `EVE_TRACES_MAX_TOTAL_BYTES` | `536870912` (512 MB) | Size budget for the whole store |
333
- | `EVE_TRACES_RETAIN_COUNT` | `20` | Newest traces kept regardless of age or size |
327
+ | Variable | Default | Effect |
328
+ | ---------------------------- | -------------------- | --------------------------------------------------------------------------------------------------- |
329
+ | `EVE_TRACES` | on | `off` stops writing traces and stops sweeping |
330
+ | `EVE_TRACES_CONTENT` | off | `on` captures model prompt/response, tool input/output, and memory-record attributes on local spans |
331
+ | `EVE_TRACES_MAX_AGE_MS` | `604800000` (7d) | Age after which a trace may be evicted |
332
+ | `EVE_TRACES_MAX_TOTAL_BYTES` | `536870912` (512 MB) | Size budget for the whole store |
333
+ | `EVE_TRACES_RETAIN_COUNT` | `20` | Newest traces kept regardless of age or size |
334
334
 
335
335
  ## `eve link`
336
336
 
@@ -192,16 +192,20 @@ Sign in directly from eve; the Codex CLI is not required:
192
192
  2. Complete sign-in in the browser. If the browser does not open, use the URL printed in the terminal.
193
193
  3. Return to eve after the terminal confirms that your subscription is connected. Normal token expiry is refreshed automatically.
194
194
 
195
- eve stores this session in `~/.eve/auth/chatgpt.json` with owner-only file permissions on Unix. It is separate from any Codex login and is never written to your project. Keep this file private. To remove the local eve login, stop your eve processes and delete the file. Existing Codex users must sign in once through eve after upgrading.
195
+ eve stores your refresh token and account details in your operating system's credential store through [just-secrets](https://github.com/vercel-labs/just-secrets): the login Keychain on macOS, Credential Manager on Windows, or Secret Service on Linux. Access tokens stay in process memory; a new eve process refreshes the saved session when it first needs a token. The login is separate from Codex and is never written to your project.
196
196
 
197
- Over SSH, or if localhost port 1455 is occupied, eve shows a device code instead. Open the displayed link in a browser and enter the code. Device sign-in requires enabling device code authorization in **ChatGPT Settings → Security**, or having a workspace admin enable it in workspace permissions. Sign-in times out after five minutes; press **Ctrl+C** to cancel sooner.
197
+ If you previously signed in through Codex or used eve's `~/.eve/auth/chatgpt.json` file, sign in once through eve after upgrading. eve removes the old plaintext file after successfully saving the new session. It does not fall back to file storage if the OS credential store is unavailable.
198
+
199
+ Linux, including WSL, requires `/usr/bin/secret-tool` (commonly provided by `libsecret-tools`), a session D-Bus, and an unlocked Secret Service keyring. On macOS, unlock your login keychain and allow credential access if prompted. On Windows, PowerShell and Credential Manager must be available in your user session. OS credential storage protects secrets at rest; it does not guarantee isolation from malicious processes running as your OS user.
200
+
201
+ Over SSH, or if localhost port 1455 is occupied, eve shows a device code instead. Open the displayed link in a browser and enter the code. Device sign-in requires enabling device code authorization in **ChatGPT Settings → Security**, or having a workspace admin enable it in workspace permissions. Sign-in times out after five minutes; press **Ctrl+C** to cancel sooner. Device sign-in still requires an available OS credential store; use an API-key model in headless environments without one.
198
202
 
199
203
  ChatGPT subscription credentials are local user credentials. `eve deploy` blocks agents whose active model is `chatgpt()` because those credentials are not uploaded to a deployment. Use an environment branch with a deployable model, or switch to an AI Gateway model before deploying.
200
204
 
201
205
  Troubleshooting:
202
206
 
203
207
  - **`chatgpt-sub login`**: open `/model` and select **Provider** → **ChatGPT subscription** to sign in again. The running dev session picks up the new login.
204
- - **`chatgpt-sub unavailable`**: check your network connection and retry from `/model`. If eve reports an invalid credential file, remove `~/.eve/auth/chatgpt.json` and sign in again.
208
+ - **`chatgpt-sub unavailable`**: follow the reported OS credential-store recovery steps, or check your network connection if token refresh failed. Retry from `/model`. If eve reports an invalid stored session, sign in again to replace it.
205
209
  - **Model rejected by the backend**: model availability depends on the signed-in ChatGPT account. Pick another supported OpenAI model.
206
210
  - **Device sign-in unavailable**: enable device code authorization in ChatGPT security settings, or sign in from a local terminal with port 1455 available.
207
211
 
@@ -7,13 +7,18 @@ eve supports two ways to delegate work: the root-only built-in `agent` tool, whi
7
7
 
8
8
  ## Completion batching
9
9
 
10
- eve automatically combines adjacent successful completions already queued from
11
- tasks launched in the same parent turn. Every result is retained, and the parent
12
- responds to the batch in one turn. No configuration is required.
13
-
14
- There is no debounce timer or waiting for unfinished tasks. Failures, input
15
- requests, explicit updates, user messages, and different task cohorts remain
16
- separate delivery boundaries.
10
+ Overlapping background work owned by a session forms a cohort. Tasks launched in
11
+ later user turns join the open cohort while earlier work is still pending or its
12
+ successful results await delivery. eve holds successful completion notifications
13
+ until every task in that cohort has completed, failed, or been cancelled, then
14
+ delivers the successful results together in one parent turn. Partial completions
15
+ do not invoke the parent model. Work started after the cohort settles forms a new
16
+ cohort. No configuration or debounce timer is required.
17
+
18
+ User messages, input requests, authorization events, failures, and cancellation
19
+ are handled without waiting for the cohort. Child lifecycle events are processed
20
+ before completion delivery so usage accounting and handle cleanup stay ordered.
21
+ To follow work in progress, subscribe to the child session streams.
17
22
 
18
23
  ## The built-in `agent` tool
19
24
 
@@ -27,7 +32,7 @@ The root session receives `agent` by default. The model calls it to delegate a t
27
32
  }
28
33
  ```
29
34
 
30
- The copy uses the root's instructions, connections, auth, and sandbox. It receives the same tools except for the root-only `agent` and `Workflow`, and starts with fresh conversation history and fresh state. Its file writes are immediately visible to the root. The built-in `agent` always runs in the background and needs no configuration: each call returns `{ status: "working", taskId, agentId }`, then task notifications wake the parent with updates or the final result. Give parallel children non-overlapping write scopes.
35
+ The copy uses the root's instructions, connections, auth, and sandbox. It receives the same tools except for the root-only `agent` and `Workflow`, and starts with fresh conversation history and fresh state. Its file writes are immediately visible to the root. The built-in `agent` always runs in the background and needs no configuration: each call returns `{ status: "working", taskId, agentId }`, then task notifications wake the parent with completion, failure, or cancellation. Give parallel children non-overlapping write scopes.
31
36
 
32
37
  `agent` is intentionally root-only. Copies created by it cannot call `agent`, and declared subagents never receive the built-in tool. If a stale or forced recursive call reaches execution, eve rejects it instead of starting another child session.
33
38
 
@@ -56,12 +61,43 @@ export default defineAgent({
56
61
  });
57
62
  ```
58
63
 
59
- `description` is required. The parent reads it to decide whether to delegate, so the compiler rejects any subagent whose `agent.ts` leaves it out. Every declared local or remote subagent runs as a durable background task: the call returns `{ status: "working", taskId, agentId }` immediately, then task notifications wake the parent with updates, completion, failure, or cancellation. Human input requests surface separately on the parent session.
64
+ `description` is required. The parent reads it to decide whether to delegate, so the compiler rejects any subagent whose `agent.ts` leaves it out. Every declared local or remote subagent runs as a durable background task: the call returns `{ status: "working", taskId, agentId }` immediately, then task notifications wake the parent with completion, failure, or cancellation. Human input requests surface separately on the parent session.
60
65
 
61
- A child running as a background task receives the framework `task_update` tool. It uses `task_update` to report progress to its parent. `task_cancel` is available to sessions that own background tasks, including a child that starts nested background work.
66
+ `task_cancel` is available to sessions that own background tasks, including a child that starts nested background work.
62
67
 
63
68
  A mounted extension can also contribute declared subagents from `extension/subagents/`. The mount namespace prefixes the subagent visible to the consuming agent node: mounting an extension as `crm` exposes its `reviewer` subagent as `crm__reviewer`. The contributed subagent keeps its own isolated tools, connections, skills, hooks, instructions, sandbox, and nested subagents, and its modules can read configuration from the extension handle. See [Extensions](./extensions#add-a-subagent) for the authoring and override behavior.
64
69
 
70
+ ### Vercel workspace peers
71
+
72
+ In a Vercel agent workspace, expose one other workspace member as a remote subagent with `defineWorkspaceAgent`. Create an ordinary file under the caller's `agent/subagents/` directory. Its filename gives the model-visible tool name; `name` identifies the peer under `agents/`.
73
+
74
+ ```ts title="agents/foreman/agent/subagents/research.ts"
75
+ import { defineWorkspaceAgent } from "eve";
76
+
77
+ export default defineWorkspaceAgent({
78
+ name: "research",
79
+ });
80
+ ```
81
+
82
+ The helper uses the peer's root `defineAgent({ description })` value as the model-visible tool description. Pass `description` to override it for this caller. When `transport` is omitted, eve selects the built-in transport for the runtime environment. Vercel deployments route through the current deployment and authenticate with the caller's Vercel OIDC token. Outside Vercel, provide an explicit transport with `url` and optional `auth` or `headers`:
83
+
84
+ ```ts title="agents/foreman/agent/subagents/research.ts"
85
+ import { defineWorkspaceAgent } from "eve";
86
+ import { bearer } from "eve/agents/auth";
87
+
88
+ export default defineWorkspaceAgent({
89
+ name: "research",
90
+ transport: {
91
+ url: () => process.env.RESEARCH_AGENT_URL!,
92
+ auth: bearer(() => process.env.RESEARCH_AGENT_TOKEN!),
93
+ },
94
+ });
95
+ ```
96
+
97
+ An explicit transport replaces the environment default completely. The receiving peer must still accept the transport's credentials through its channel authentication policy. Set `forwardPrincipal: true` only when the peer trusts the caller to forward user identity, as described in [Remote agents](./guides/remote-agents#forward-the-callers-identity).
98
+
99
+ Use the peer's directory name under `agents/`. eve requires an exact workspace-member match, so add another declared subagent file for each additional peer. `eve dev` does not provide local workspace routing; configure an explicit transport to target a separately running peer.
100
+
65
101
  ### Conditional availability
66
102
 
67
103
  To expose a declared subagent only for certain sessions or turns, export
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.54.0",
3
+ "version": "0.54.3",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [
@@ -186,11 +186,6 @@
186
186
  "import": "./dist/src/public/tools/task-cancel.js",
187
187
  "default": "./dist/src/public/tools/task-cancel.js"
188
188
  },
189
- "./tools/task_update": {
190
- "types": "./dist/src/public/tools/task-update.d.ts",
191
- "import": "./dist/src/public/tools/task-update.js",
192
- "default": "./dist/src/public/tools/task-update.js"
193
- },
194
189
  "./tools/glob": {
195
190
  "types": "./dist/src/public/tools/glob.d.ts",
196
191
  "import": "./dist/src/public/tools/glob.js",
@@ -498,6 +493,7 @@
498
493
  "jose": "6.2.3",
499
494
  "jsonc-parser": "3.3.1",
500
495
  "just-bash": "3.1.0",
496
+ "just-secrets": "0.0.2",
501
497
  "marked": "17.0.6",
502
498
  "microsandbox": "0.5.5",
503
499
  "next": "16.3.4",
@@ -1,6 +0,0 @@
1
- import type { TaskInboundUpdate } from "#tasks/types.js";
2
- /** Forwards a local task-owned child's progress update to its active parent hook. */
3
- export declare function forwardLocalTaskUpdateStep(input: {
4
- readonly parentContinuationToken: string;
5
- readonly update: TaskInboundUpdate;
6
- }): Promise<void>;
@@ -1 +0,0 @@
1
- import{resumeHook}from"#internal/workflow/runtime.js";async function forwardLocalTaskUpdateStep(e){"use step";await resumeHook(e.parentContinuationToken,e.update)}export{forwardLocalTaskUpdateStep};
@@ -1,8 +0,0 @@
1
- import type { ChannelAdapter } from "#channel/adapter.js";
2
- import type { TaskInboundUpdate } from "#tasks/types.js";
3
- /** Delivers a task update through the local child adapter or remote callback. */
4
- export declare function deliverTaskUpdate(input: {
5
- readonly adapter?: ChannelAdapter;
6
- readonly callback: unknown;
7
- readonly update: TaskInboundUpdate;
8
- }): Promise<string | undefined>;
@@ -1 +0,0 @@
1
- import{fireTaskUpdateCallbackStep}from"#subagents/callback-step.js";import{forwardLocalTaskUpdateStep}from"#execution/tasks/child/update-step.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#subagents/adapter-state.js";async function deliverTaskUpdate(e){let t=e.adapter?.state;return e.adapter?.kind===SUBAGENT_ADAPTER_KIND&&isSubagentAdapterState(t)&&t.taskId!==void 0?(await forwardLocalTaskUpdateStep({parentContinuationToken:t.parentContinuationToken,update:e.update}),t.taskId):await fireTaskUpdateCallbackStep({callback:e.callback,callId:e.update.callId,message:e.update.message,updateEpoch:e.update.updateEpoch,updateIndex:e.update.updateIndex})}export{deliverTaskUpdate};
@@ -1 +0,0 @@
1
- export { taskUpdate, taskUpdate as default } from "#tools/framework/task-update.js";
@@ -1 +0,0 @@
1
- import{taskUpdate,taskUpdate as task_update_default}from"#tools/framework/task-update.js";export{task_update_default as default,taskUpdate};
@@ -1,5 +0,0 @@
1
- export declare const TASK_UPDATE_SESSION_INSTRUCTION = "Background task updates\nYou are running as a background task. For multi-step work, use `task_update` at meaningful milestones to briefly state what you are currently doing. Keep updates terse and activity-focused; do not include preliminary findings or results. Do not wait for a response, and return your final result normally.";
2
- export declare const taskUpdate: import("#tools/native-definition.js").NativeToolDefinition<{
3
- message: string;
4
- }, unknown>;
5
- export default taskUpdate;
@@ -1 +0,0 @@
1
- import{TASK_UPDATE_INPUT_SCHEMA}from"#tools/framework/task-contract.js";import{defineNativeTool}from"#tools/native-definition.js";const TASK_UPDATE_SESSION_INSTRUCTION="Background task updates\nYou are running as a background task. For multi-step work, use `task_update` at meaningful milestones to briefly state what you are currently doing. Keep updates terse and activity-focused; do not include preliminary findings or results. Do not wait for a response, and return your final result normally.",taskUpdate=defineNativeTool({description:`Briefly tell the parent agent what this background task is currently doing. Report activity, not preliminary findings or results.`,inputSchema:TASK_UPDATE_INPUT_SCHEMA},{availability:[`delegated-task-child`],handling:{action:`task-update`,kind:`dispatch`}});export{TASK_UPDATE_SESSION_INSTRUCTION,taskUpdate as default,taskUpdate};