Released 2026-11-03 · Compare with 1.0.0-rc.2
Breaking Changes
- The code extension (
eve/extensions/code) no longer mounts itscode__greptool, which removes about 1.6K characters of tool schema from every model step.
To keep a structured search tool, runeve add tool/grep, which writesagent/tools/grep.tsre-exportingeve/tools/grep.eve/extensions/code/toolsstill exports the samegrepdefinition. Delete anagent/tools/code__grep.tsfile that exportsdisableTool(), becauseeve buildnow rejects it withdisables a slot with no lower-precedence source. Anagent/tools/code__grep.tsoverride that spreadsgrepkeeps working as your own tool namedcode__grep. (#5815) - The code extension (
eve/extensions/code) no longer adds the read-onlycode__workersubagent, andcode()rejects theworkeroption.
To migrate, removeworkerfrom yourcode()mount and delegate with the built-inagenttool. If anagent/tools/agent.tsoverride disablesagentso delegation goes tocode__worker, delete the override. A mount that still passesworkerfails withInvalid extension config: eve-code no longer ships a worker subagent; delegate with the built-in `agent` tool and remove the `worker` option.
Thecode__reviewskill starts a fresh-context agent with a no-edit audit brief when one is available and otherwise audits in the current session. Thecode__lookup-agent-runskill and the internaleve/internal/code/prwatchexport are removed. (#5800) - A dynamic tool no longer replaces a static tool of the same name: the static tool keeps the name and eve logs an error, as it already did for two dynamic tools with the same name.
To change a tool for some sessions only, define it only in a dynamic file that returns the usual version to the other sessions.
Agents whose only tools are dynamic now get the parallel-calls note in their system prompt, and the$eve.tool_countspan attribute counts the tools offered to the model rather than the tools the agent declares. (#5638)
Features
- The provided
bashtool accepts an optionaltimeoutin seconds, so the model can wait up to 120 seconds for a build or test suite before the command keeps running in the background.
Calls withouttimeoutstill wait 30 seconds. Values above 120 wait 120 seconds, and values below 1 wait 1 second. A command still running after the wait returnsstatus: "running"as before. (#5813) eve/eventsexportscreateStreamChecker, which checks a stored session stream against its lifecycle rules.
Run it over a stored or recorded stream to find lines that break the lifecycle rules, such as a turn that settles twice or a fact that names something never introduced. ItsStreamChecker,Violation, andViolationRuletypes, and theStoredLine,CommitLine, andProgressLinetypes it reads, are exported beside it. (#5834)- Slack message hooks can return
status: "deferred"to keep a message's turn quiet until a tool call finishes, andguidanceto tell the model how to treat that one message, so an agent can follow a thread and stay silent withno_replywhen a reply isn't meant for it.
status: "deferred"skips thereceivedacknowledgement. Mentions and DMs outside code channels get that acknowledgement before their hook runs, so for them it keeps only the rest of the turn quiet. A message that isn't deferred and joins the turn shows the status again. eve addsguidanceas a<guidance>block inside the message's<slack_message>or<slack_message_edit>block, after the metadata and before the content. The Slack docs show how to follow threads the agent already serves withonMessage.
Message edits now go through an app's own message hooks. Without an authoredonMessageEdited, an edit goes to the hook a new message of the same kind would reach:onDirectMessage, thenonMessage, for DMs;onAppMention, thenonMessage, for messages that mention the agent;onMessage, thenonAppMention, in code channels; andonMessagefor other messages. Without those hooks, the built-in defaults send edits to DMs, code channel messages, and messages that mention the agent before or after the edit, and drop the rest. Edits are always quiet and ignorestatus, and an authoredonEventstill comes before this default. The newctx.editis set while a hook decides an edit.
In 1.0.0-rc.2, an authoredonAppMention,onDirectMessage, oronMessageturned off edits unless the app also definedonMessageEdited. Those hooks now also run for edits in threads that have a session. If a hook has side effects, such asctx.send(),ctx.end(), or a decision model call, return early whenctx.editis set. To keep edits off, defineonMessageEditedand returnnull. (#5801) - The provided
bashtool shows the model its output as plain text instead of JSON, so source code, diffs, and test logs reach the model without escaped newlines and quotes.
The model reads stdout, then any stderr after a[stderr]line, then a final[exit code: N]line; for a command still running, its instructions replace the exit code line. The tool'sexecuteoutput, its output schema, andcall.settledevents keep the structured fields. Authored code that reads the conversation, throughctx.messagesin tools orctx.messages()in dynamic capabilities, sees this text for newbashresults, and sessions keep the JSON results they already saved. Abashtool published over MCP sends the text incontent[0].text, and itsstructuredContentkeeps the structured fields. Wrappers that spreadbashkeep the plain-text view: a wrapper'sexecutethat returns a string reaches the model as text, and any other shape as JSON. (#5822) auto()fromeve/modelsandeve/tools/approvalacceptmodelOptions.providerOptions, anddecide()acceptsproviderOptions, so decision calls can set options such as AI Gateway'szeroDataRetention. (#5846)- The code extension (
eve/extensions/code) sends a prompt about a third of its previous size (4,942 to 1,636 characters) that keeps only coding and safety rules, so agents spend fewer tokens on every step.
The prompt no longer assumes a chat product or sets consumer policy, such as brevity, asking one question, avoiding em dashes, omitting private references, or not rebasing. Agents that relied on those rules should state them in their ownagent/instructions.md. Agents publish or write to external systems only when the requester asks for it or for an outcome that requires it, such as a pull request. The prompt asks agents to edit files with the editing tool instead of the shell, and no longer namesapply_patchspecifically. The issue and design checklists moved into thecode__investigateskill. (#5805) - Update the bundled Workflow runtime to 5.3.0 and create new runs with Workflow spec version 9, which drives each run from one orchestrator.
Workflow 5.3.0 lets parallel branches advance inline steps without waiting on slower siblings, reuses resolved hooks to skip token lookups on later resumes, and fixes a step that could be created but never run when two executions raced in one process. eve now setsWORKFLOW_SPEC_VERSION=9before it creates a world unlessWORKFLOW_SPEC_VERSIONorWORKFLOW_SEALED_LOGis already set. SetWORKFLOW_SPEC_VERSION=8to keep creating spec 8 runs. Existing runs keep their version. (#5860)
Bug Fixes
- Fix durable agent traces keeping every finished turn that called tools in parallel: each one stayed in the session's serialized context, so step inputs grew with every turn.
A checkpoint this process had already written, read back through another execution context, was treated as another process's write and forked the turn's trace tree; the stale copy then overwrote the tool completions and the checkpoint was never deleted. A replaced tree now also stops persisting. (#5835) - User-role instructions, static and dynamic, now join the conversation the same way: once ahead of the next turn's input, again when their content changes, and again after a compaction or clear removes them from the history.
A newer deployment that changes a static user-role instruction adds the new text to existing sessions instead of keeping the text the session started with. Sessions that already hold an instruction don't receive it twice. (#5638) - Every eve build now reads
pathsaliases from the authored package's owntsconfig.jsonorjsconfig.json, and an asset import that leaves the authored package fails the build.
The Nitro host, authored module bundles, and the workflow driver share one resolver. The workflow driver no longer searches parent directories for a config, and an agent directory without its ownpackage.jsonuses the enclosing package's config in every build. Before, only?rawasset imports were checked against the package root; now plain imports such asimport notes from "../../notes.txt"are checked too. If a build fails with "resolves outside package root", move the file into the authored package or into the workspace package that imports it. (#5879) - Model calls made by
decide()fromeve/ai, and so byauto()and approvalauto(), now count toward the session's usage andlimits.sessionUsage. (#5638) - Inline tool execution now requires permission from eve's approval gate.
When a person answers the same call more than once, eve uses their latest answer. (#5638) - eve now records which of its catalog tools a session has been offered in the same session state as its other definitions, rather than under a separate context key.
A session an earlier deployment ran still keeps every catalog tool it was offered. (#5638) - Under
eve dev, eve now throws if a tool call starts before its approval is accepted, or names a different approval as what cleared it. (#5638) - Compacting a session between turns no longer repeats the last question after its answer, so the next turn's new message follows the summary and recent history instead of an already-answered question. (#5638)
- Keep child questions and approvals answerable while a serving task remains active after replying to its original call.
Upgrading a session whose history was cleared or compacted also restores its dynamic user instructions before the next model call. (#5638) - Fix tool-stub validation for memory-only agents, mounted dynamic connection names, and sandbox skill files when an earlier definition starts offering a colliding skill.
The chosen model also remains visible to session code across separately bundled runtime modules. (#5638) - Dynamic connection resolvers can exchange names within one evaluation without a transient collision, and namespaced tools and skills retain their full name-length validation. (#5638)
- Fix release asset uploads failing with 401 through the git extension's
ghtool.
The credential lease now coversuploads.github.com, not onlyapi.github.comandgithub.com. A 401 there was read as a revoked token and opened a sign-in for a user who was already signed in.
When Vercel Connect starts an authorization without a sign-in URL or device code, the user-scoped GitHub sign-in now fails withConnectionAuthorizationFailedErrorinstead of opening a sign-in prompt with no link. (#5852) - A workflow tool's question that reaches the session after its turn was cancelled no longer fails the session: eve drops it, and the next message starts a turn. (#5638)
- Memory slots and schedule collections now offer their tools themselves, so agent info no longer lists them as generated dynamic tool files.
A tool file atagent/tools/<slot>.tsoragent/tools/schedule__<name>.tsstill replaces those tools, anddisableTool()there still removes them. Sessions and approvals parked across the upgrade keep working. (#5638) - Upgrade Nitro to 3.0.261103-rc, the first Nitro 3 release candidate eve builds on.
eve now declares Rolldown 1.2.16 itself and hands that copy to Nitro, so a plain npm install builds without relying on another package to provide Rolldown, and Nitro never installs a package into your app on demand. Importingnitro/storage,nitro/kv, ornitro/databasefrom agent code now fails the build with an explanation instead of pulling in storage drivers. A request with a method its path doesn't declare, other thanHEAD, now gets405 Method Not Allowedwith anAllowheader instead of404.eve devruns on env-runner 0.3, and a stoppedeve startserver runs Nitro's close hooks and exits on its own.
Thanks @pi0 for the investigation in #5167. (#5870) - eve now compiles an agent's dynamic tool, skill, connection, and instructions files, hooks, and memories to one list in the compiled manifest, and runs them as definitions of one shape.
Rebuild agents after upgrading; authored files don't change. (#5638) - The discovery manifest in
.eve/discovery/agent-discovery-manifest.jsonnow lists an agent's authored files in onesourcesarray, with each file's kind given by its path, instead of one array per kind. (#5638) - Session history now changes in one place, which checks every message as it joins, and under
eve devfails a step whose tool results don't follow the calls they answer.
A turn that fails after the model delivered its structured reply keeps that reply in history instead of an unansweredeve__replycall. A compaction whose summary model fails to resolve now appears on the stream as a failed compaction instead of failing the turn before it starts. (#5638) - The model no longer sees an "awaiting approval" note in history after the approval it describes is answered or dropped, because eve now tells each model call about pending approvals from the session's current state instead of writing a note into history when the call parks. (#5638)
- eve now renders each model call's system prompt from the current deployment's agent files instead of storing it with the session.
Session checkpoints move to version 19, withoutagent.system. A deployment from before this change refuses to take over a session this one wrote, so the session stays on the deployment that wrote it, such as after a rollback. (#5638) - A turn's input now joins history before its first model call, so a model call that fails keeps the person's message for the next turn.
A response the provider filters is the exception: a refusal note replaces its turn's input, so the next turn doesn't send that input again. Completed tool calls and their results stay in history, so the model knows which actions already ran.
A compaction now opens only once it summarizes or rewrites the history, sosession.compact()records no change when its model doesn't resolve or the history has nothing to compact. (#5638) - eve's session loop now runs as a kernel that owns every session transition, with no change in behavior. (#5638)
- Prevent
gh-signed-commitfrom publishing another file's contents for paths that resemble Git stage syntax or silently losing file modes and types.
The command now reads staged paths literally and rejects additions or updates involving executable files, symlinks, submodules, or mode changes before contacting GitHub. Staged changes remain intact; publish unsupported changes with native Git and a configured signing key. (#5863) - Ending a stranded session now writes the same checked commit as any other session end.
A stranded stream that never recordedsession.started, such as one an older deployment opened, gets it in the commit that ends the session. (#5638) - Self-hosted eve servers now close their Workflow world on shutdown, so a pending workflow
sleepor delivery retry no longer holds the process open until the supervisor kills it.
If closing the world fails or takes longer than 5 seconds, eve logs it and still runs the rest of its shutdown, including sandbox shutdown and the final trace flush. (#5879)