eve 0.70.2 → 0.71.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/src/chunks/{use-eve-agent-CJQeE7-t.js → use-eve-agent-CFCaYnrI.js} +1 -1
  3. package/dist/src/chunks/{use-eve-agent-DdemtY6C.js → use-eve-agent-DcDhXNv1.js} +1 -1
  4. package/dist/src/client/ndjson.js +1 -1
  5. package/dist/src/compiled/.vendor-stamp.json +1 -1
  6. package/dist/src/context/memory-tools.js +1 -1
  7. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  8. package/dist/src/execution/proxied-deliver-step.js +1 -1
  9. package/dist/src/execution/sandbox/bash.d.ts +34 -11
  10. package/dist/src/execution/sandbox/bash.js +24 -1
  11. package/dist/src/execution/sandbox/bindings/docker-session.js +1 -1
  12. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  13. package/dist/src/execution/sandbox/bindings/local-provider-utils.js +1 -1
  14. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  15. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  16. package/dist/src/execution/sandbox/glob-tool.js +1 -1
  17. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  18. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  19. package/dist/src/harness/attachment-staging.js +1 -1
  20. package/dist/src/harness/compaction-prompt.js +1 -1
  21. package/dist/src/harness/token-estimate.d.ts +6 -4
  22. package/dist/src/harness/token-estimate.js +1 -1
  23. package/dist/src/harness/tool-loop.js +2 -2
  24. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  25. package/dist/src/instrumentation/lifecycle.d.ts +2 -0
  26. package/dist/src/internal/application/package.js +1 -1
  27. package/dist/src/protocol/message.d.ts +2 -1
  28. package/dist/src/react/use-eve-agent.js +1 -1
  29. package/dist/src/setup/scaffold/create/project.js +1 -1
  30. package/dist/src/subagents/hitl-proxy.d.ts +2 -0
  31. package/dist/src/subagents/hitl-proxy.js +1 -1
  32. package/dist/src/svelte/index.js +1 -1
  33. package/dist/src/svelte/use-eve-agent.js +1 -1
  34. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  35. package/dist/src/tools/provided/bash.d.ts +17 -2
  36. package/dist/src/tools/provided/bash.js +1 -1
  37. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  38. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  39. package/dist/src/vue/index.js +1 -1
  40. package/dist/src/vue/use-eve-agent.js +1 -1
  41. package/docs/README.md +1 -0
  42. package/docs/code-extension.mdx +119 -0
  43. package/docs/concepts/built-in-tools.md +17 -0
  44. package/docs/concepts/sessions-runs-and-streaming.md +3 -1
  45. package/docs/extensions.md +1 -0
  46. package/docs/guides/client/streaming.mdx +1 -1
  47. package/docs/memory/custom-provider.md +4 -1
  48. package/docs/meta.json +1 -0
  49. package/docs/sandbox/index.mdx +2 -0
  50. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ ---
2
+ title: "Code Extension"
3
+ description: "Mount eve's coding extension, eve-code, and see its latest benchmark results against other coding agent harnesses."
4
+ ---
5
+
6
+ `eve/extensions/code` (eve-code) turns an eve agent into a coding agent. It ships inside the `eve` package, so you mount it without installing anything else. The extension contributes file-editing and search tools, an authenticated GitHub CLI tool, coding skills, a read-only worker subagent, and sandbox bootstrap helpers.
7
+
8
+ ## Benchmark results
9
+
10
+ 12 tasks × 3 attempts on `anthropic/claude-sonnet-5.5`. Snapshot updated 2026-10-03.
11
+
12
+ | Harness | Resolved | 95% interval | Median latency | p90 latency | Measured |
13
+ | --- | --- | --- | --- | --- | --- |
14
+ | `pi` | 72% (26/36) | 50%–92% | 266.7s | 340.5s | 2026-09-30 |
15
+ | `eve-code` | 67% (24/36) | 53%–81% | 235.4s | 389.7s | 2026-09-30 |
16
+ | `opencode` | 50% (18/36) | 28%–72% | 611.7s | 1170.3s | 2026-09-30 |
17
+
18
+ These results show baseline performance. Each harness uses its standard setup with high reasoning. The results do not show how a harness performs with other models, settings, or tasks.
19
+
20
+ <details>
21
+ <summary>How the benchmark works</summary>
22
+
23
+ The benchmark uses eve-bench and the DeepSWE-lean dataset. DeepSWE-lean has 12 feature and bug-fix tasks from DeepSWE v1.1.
24
+
25
+ - All harnesses use the same model and the same tasks.
26
+ - Each harness does each task 3 times.
27
+ - Each attempt runs in a new Vercel Sandbox.
28
+ - Each attempt has a limit of 20 minutes.
29
+ - The DeepSWE verifier examines the files that the agent leaves.
30
+ - An attempt passes only when the verifier passes.
31
+ - A crash or a timeout is a failure.
32
+
33
+ The line on each correctness row shows the 95% interval. When the lines of two harnesses overlap, the benchmark does not show a difference between them.
34
+
35
+ </details>
36
+
37
+ <details>
38
+ <summary>How the results update</summary>
39
+
40
+ 1. A maintainer runs the `eve-code` workflow on `main` with the `deepswe-lean` dataset.
41
+ 2. The workflow runs eve-code, opencode, and pi. It saves each complete result in the eve-bench result store.
42
+ 3. The workflow writes a summary of the result to `apps/docs/lib/evals/eve-code-benchmark.json`. Then it commits the file to `main`.
43
+ 4. The next docs deployment shows the new results.
44
+
45
+ The workflow does not publish incomplete runs, single-task runs, or pull request runs. Results can be older than `main`, because a maintainer starts each run. Select a harness name to open the GitHub Actions run for that result.
46
+
47
+ </details>
48
+
49
+ ## Mount the extension
50
+
51
+ Create an extension file in your agent. The file name sets the mount name, which prefixes every contributed tool and subagent ID (for example, `code__grep`):
52
+
53
+ ```ts title="agent/extensions/code.ts"
54
+ import code from "eve/extensions/code";
55
+
56
+ export default code({});
57
+ ```
58
+
59
+ `code({})` mounts the extension without GitHub or Vercel authentication. Add the options below when the agent needs them.
60
+
61
+ ## Configure the extension
62
+
63
+ | Option | Required | Effect |
64
+ | ------------------------------ | ------------- | ---------------------------------------------------------------------------------------------- |
65
+ | `github.connector` | With `github` | Connector that mints a GitHub token |
66
+ | `github.org` | With `github` | Organization whose repositories the `gh` tool can access |
67
+ | `github.broker` | With `github` | `broker(sandbox, rules)` callback that installs, then removes, the GitHub credential rules |
68
+ | `vercel.connector` | With `vercel` | Connector that requests an app-subject Vercel token |
69
+ | `vercel.delivery` | No | `"firewall"` (default) or `"command"` |
70
+ | `broker` | No | `broker(sandbox, rules)` callback that merges Vercel credential rules into your network policy |
71
+ | `worker.model` | With `worker` | Model for the `worker` subagent. Defaults to `openai/gpt-5.6-terra-fast` |
72
+ | `worker.reasoning` | With `worker` | Reasoning level for the `worker` subagent. Defaults to `xhigh` |
73
+ | `worker.openaiReasoningEffort` | No | Passed to OpenAI models as `reasoningEffort` |
74
+
75
+ ```ts title="agent/extensions/code.ts"
76
+ import code from "eve/extensions/code";
77
+
78
+ export default code({
79
+ vercel: { connector: "vercel/acme-bot" },
80
+ worker: { model: "openai/gpt-5.6-terra-fast", reasoning: "high" },
81
+ });
82
+ ```
83
+
84
+ ### Credentials stay outside the sandbox
85
+
86
+ With firewall delivery, Vercel tokens never enter sandbox processes. Firewall delivery without a top-level `broker` requires a sandbox provider that exposes `setNetworkPolicy()`, and fails otherwise. Set `vercel.delivery: "command"` for providers without a mutable network policy.
87
+
88
+ The `gh` tool requests a token scoped to exactly one repository in `github.org` for each invocation. The sandbox process receives a placeholder `GH_TOKEN`, and the firewall exchanges it on matching GitHub requests. Your `github.broker` callback receives the header-transform rules for the command, then `null` to remove the lease. The callback must preserve your other network rules. GitHub authentication has no command-delivery option.
89
+
90
+ To use a personal access token or another credential provider, omit the connector and call `authenticateGitHub` or `authenticateVercel` from `eve/extensions/code/sandbox` in your own sandbox lifecycle. These helpers authenticate commands you run yourself; they do not configure the `gh` tool.
91
+
92
+ ## Prepare the sandbox
93
+
94
+ Install the CLI tooling in your sandbox environment's `prepare` callback:
95
+
96
+ ```ts title="agent/sandbox.ts"
97
+ import { defineSandbox } from "eve/sandbox";
98
+ import { VercelSandbox } from "eve/sandbox/vercel";
99
+ import { installCodeTooling } from "eve/extensions/code/sandbox";
100
+
101
+ export const environment = VercelSandbox.environment({
102
+ prepare: async (sandbox) => {
103
+ await installCodeTooling(sandbox, { vercel: true });
104
+ },
105
+ });
106
+
107
+ export default defineSandbox(() => environment.open());
108
+ ```
109
+
110
+ Preparation installs `gh`, wrappers for `gh`, `vc`, and `gh-signed-commit`, and TypeScript diagnostics. For repositories that require verified signatures, stage your changes and commit with `gh-signed-commit`.
111
+
112
+ eve derives the prepared environment generation from the sandbox file and environment options, not from imported helpers. Upgrading eve alone does not rebuild an existing prepared environment.
113
+
114
+ ## What to read next
115
+
116
+ - [Extensions](/docs/extensions): mount, configure, and override extension packages
117
+ - [Sandbox](/docs/sandbox): environments, preparation, and network policy
118
+ - [Subagents](/docs/subagents): how declared subagents run and inherit configuration
119
+ - [Skills](/docs/skills): how the model loads skills on demand
@@ -38,6 +38,23 @@ eve add tool/bash
38
38
  export { default } from "eve/tools/bash";
39
39
  ```
40
40
 
41
+ `bash` waits up to 30 seconds for a command. A command that finishes in time returns `status: "completed"` with `exitCode`, `stdout`, `stderr`, and `truncated`. A command that is still running keeps running in the sandbox as its own process group and returns `status: "running"` with:
42
+
43
+ - `pid`: the process group id
44
+ - `outputDirectory`: a directory under `/tmp/.eve/jobs/`
45
+ - `stdout`, `stderr`, and `truncated`: the output so far
46
+ - `message`: instructions for the model
47
+
48
+ The command keeps writing to `stdout` and `stderr` files in `outputDirectory` and writes its exit code to an `exit` file when it finishes. The model checks on or stops it with ordinary shell commands in later `bash` calls, so the tool's approval policy applies to them:
49
+
50
+ ```sh
51
+ tail /tmp/.eve/jobs/3f9a1c2e/stdout # latest output
52
+ cat /tmp/.eve/jobs/3f9a1c2e/exit # exit code, once the command has finished
53
+ kill -- -4312 # stop the command's whole process group
54
+ ```
55
+
56
+ The command keeps running across turns until it exits, the model stops it, or the sandbox stops. Its output files stay in the sandbox until the sandbox stops. Cancelling a turn stops a command that has not yet returned `running`. The `just-bash` provider has no background processes, so it runs every command to completion.
57
+
41
58
  Override its description, approval policy, or executor by wrapping the exported definition:
42
59
 
43
60
  ```ts title="agent/tools/bash.ts"
@@ -123,7 +123,7 @@ Note: consider the privacy, confidentiality, and user-experience implications fo
123
123
 
124
124
  A delegated subagent publishes progress on its own child-session stream. When a subagent tool call or a workflow tool's `ctx.agent` opens a session, the parent emits `agent.started` with the call's `callId` and `turnId`, its `taskId` when the call runs as a task, the child's `sessionId`, and a `streamPath` that a client follows with `session.agent(started).stream()`. A subagent tool call is a [task](#task-events) whose `task.started` has `kind: "agent"`: its `task.started` and `task.settled` carry the call, and `task.settled.data.output` is the child's reply. A call that fails before the child session opens has no `agent.started`. A settled call does not end the child session; later calls with the same `taskId` reach it.
125
125
 
126
- A question or sign-in from inside a running call does not end the turn. This covers a workflow tool's `ctx.ask()`, including the built-in `ask_question` tool, and a delegated subagent's question or sign-in. The stream emits `input.requested` or `authorization.required`, then `turn.waiting` with `on: "input"` and the open turn's `turnId`. After the answer or sign-in, the turn resumes with the next `step.started` for the same `turnId`, and only `turn.completed`, `turn.failed`, or `turn.cancelled` ends it. When you answer a question that belongs to a workflow tool or a subagent, the session you answer on emits `input.resolved` for it as it routes the answer down. If the workflow tool run that relayed a question or approval ends before anyone answers, that session emits `input.resolved` with `outcome: "cancelled"` for it. This covers the run's own `ctx.ask()` questions and requests from sessions it opened with `ctx.agent`. A cancelled turn does the same for every question or approval the session relays. A sign-in or tool approval the turn raises itself holds it the same way, also with `on: "input"`. A message from the same person steers the turn and cancels the request: a sign-in reports `authorization.completed` with `outcome: "declined"`, and an approval reports `input.resolved` with `outcome: "ignored"`. Messages from other people wait until the turn ends. Cancelling the turn ends both: a held sign-in reports `authorization.completed` with `outcome: "declined"`, and a held approval reports `input.resolved` with `outcome: "cancelled"`.
126
+ A question or sign-in from inside a running call does not end the turn. This covers a workflow tool's `ctx.ask()`, including the built-in `ask_question` tool, and a delegated subagent's question or sign-in. The stream emits `input.requested` or `authorization.required`, then `turn.waiting` with `on: "input"` and the open turn's `turnId`. After the answer or sign-in, the turn resumes with the next `step.started` for the same `turnId`, and only `turn.completed`, `turn.failed`, or `turn.cancelled` ends it. When you answer a question that belongs to a workflow tool or a subagent, the session you answer on emits `input.resolved` for it as it routes the answer down. While other relayed questions are still pending, it then emits `turn.waiting` with `on: "input"` again. If the workflow tool run that relayed a question or approval ends before anyone answers, that session emits `input.resolved` with `outcome: "cancelled"` for it. This covers the run's own `ctx.ask()` questions and requests from sessions it opened with `ctx.agent`. A cancelled turn does the same for every question or approval the session relays. A sign-in or tool approval the turn raises itself holds it the same way, also with `on: "input"`. A message from the same person steers the turn and cancels the request: a sign-in reports `authorization.completed` with `outcome: "declined"`, and an approval reports `input.resolved` with `outcome: "ignored"`. Messages from other people wait until the turn ends. Cancelling the turn ends both: a held sign-in reports `authorization.completed` with `outcome: "declined"`, and a held approval reports `input.resolved` with `outcome: "cancelled"`.
127
127
 
128
128
  ### Task events
129
129
 
@@ -225,6 +225,8 @@ A structured response matches any currently pending request by ID, not only the
225
225
 
226
226
  One delivery can answer requests from several batches. eve resumes approval-bearing batches in durable order and carries later answers forward until each batch can resume. If you answer only some approvals in a batch, eve saves those responses until the remaining approvals are answered. Meanwhile, unrelated messages can run tools and receive a completed reply. The saved partial responses neither block that reply nor trigger another model call after it.
227
227
 
228
+ When steering interrupts pending model generation, the interrupted step still ends with `step.completed`, carrying `finishReason: "other"` and any usage the provider reported. The correction's `message.received` and the next `step.started` for the same `turnId` follow.
229
+
228
230
  Multiple steering messages retain their durable arrival order and may be folded into one input at the next boundary. A message accepted after turn settlement starts the next turn. See [message delivery and steering](./execution-model-and-durability#message-delivery-and-steering).
229
231
 
230
232
  ## Cancel the in-flight turn
@@ -370,6 +370,7 @@ At build time, eve checks the extension's generated capability metadata. If the
370
370
  ## What to read next
371
371
 
372
372
  - [Integrations](/integrations): browse ready-to-install extensions using the Extensions filter
373
+ - [Code extension](/docs/code-extension): mount eve-code, the coding extension that ships in `eve`, and see its benchmark results
373
374
  - [Tools](/docs/tools): static tools, approval, and tool output
374
375
  - [Dynamic capabilities](/docs/guides/dynamic-capabilities): dynamic connections, tools, skills, and instructions
375
376
  - [Instructions](/docs/instructions): static and TypeScript instructions
@@ -173,7 +173,7 @@ The sign-in holds the turn open, and the stream emits `turn.waiting` with `on: "
173
173
 
174
174
  HTTP connections can end before a run does. The client reconnects from the number of events already consumed, so long turns continue without replaying events. By default, a turn response keeps reconnecting until it reaches a turn boundary or is aborted, including while the turn is paused for authorization. A manually opened `session.stream()` eventually stops after repeated empty streams when it can no longer make progress.
175
175
 
176
- Browser failures while reading a response body, including `TypeError: Load failed` and `TypeError: network error`, use the same reconnect policy. Invalid stream events still fail the read.
176
+ Browser network failures use the same reconnect policy, both when opening a stream (`TypeError: Failed to fetch`, `TypeError: Load failed`, or `TypeError: NetworkError when attempting to fetch resource.`) and while reading a response body (any `TypeError`, such as `TypeError: network error`). Invalid stream events still fail the read.
177
177
 
178
178
  If your consumer persists events, key on `event.meta.id`. It is stable across reconnects and rewinds, so an overlapping replay is safe to ingest twice. See [the event envelope](../../concepts/sessions-runs-and-streaming#the-event-envelope).
179
179
 
@@ -143,7 +143,10 @@ authored tools.
143
143
 
144
144
  A tool closes over the locked scope for the current turn, so it cannot be
145
145
  redirected to another tenant or caller by the model. eve keeps each tool
146
- callback replayable after a process restart or redeployment.
146
+ callback replayable after a process restart or redeployment. On replay, eve
147
+ calls `tools()` again with the captured `memory`, `turn`, and session context.
148
+ `messages` is the history the current process resolved the turn's tools with,
149
+ so after a mid-turn restart it also includes the turn's earlier tool results.
147
150
 
148
151
  ## Lifecycle
149
152
 
package/docs/meta.json CHANGED
@@ -20,6 +20,7 @@
20
20
  "---Integrate---",
21
21
  "install-integrations",
22
22
  "extensions",
23
+ "code-extension",
23
24
  "protocols/acp",
24
25
  "guides/client",
25
26
  "guides/frontend",
@@ -158,6 +158,8 @@ Before every model call, eve reads the referenced files back from the sandbox:
158
158
  - An image up to 3 MiB or a PDF up to 20 MiB attached to a message reaches the model as a file. Larger files and other types reach the model as a text reference, such as `Attached file /workspace/.eve/attachments/<hash>/report.csv (text/csv)`, that the agent can open with `read_file` or `bash`.
159
159
  - A file returned by a tool always reaches the model as a file.
160
160
 
161
+ If a referenced file is missing, or its bytes no longer match what eve staged because something in the sandbox overwrote it, the model receives a `FileNotFound` note in its place.
162
+
161
163
  Each call sends the same bytes for the same file, so the model still sees attachments from earlier turns and the provider's prompt cache stays valid. Compaction replaces files in older tool results with their text reference. The `read_file` tool shows PNG, JPEG, GIF, and WebP files up to 3 MiB to the model as images, so the agent can look at an image again after compaction.
162
164
 
163
165
  ## Custom providers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.70.2",
3
+ "version": "0.71.0",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [