Repository navigation
eve@1.0.0-rc.11
Pre-release
Pre-release
·
9 commits
to main
since this release
Released 2026-11-12 · Compare with 1.0.0-rc.10
Features
- Add
ctx.conversation.space, which names the place a conversation happens, such as a Slack channel, so tools, approval policies, dynamic values, and memory scopes can share data per place.
Slack, Discord, Teams, Telegram, Linq, Photon, and Chat SDK channels report a space with a stableidnamespaced by platform and workspace, atypeofdirectorshared, avisibilityofpublicorprivatewhen the platform says, and aworkspaceIdwhere the platform has one. Custom channels report theirs with a newspace({ state })hook besideaudience. Tools and memory scope resolvers can now readctx.conversation, which dynamic values already had. (#6111) - Add the experimental
eve/experimental/extensions/custom-skillsextension, which lets the people talking to an agent save their own versioned skills, for themselves or shared with everyone in a channel or group chat.
Each skill has immutable versions and one live version, with drafts, publish and rollback, andalways,on-demand, ordeferredapplication modes saved per version. A validator and an approval rule you can replace decide which descriptions and instructions are accepted and which changes run, ask a person, or are refused, and the approval card shows the content that would go live. Shared skills follow the conversation'sctx.conversation.spaceon Slack, Discord, Teams, Telegram, and Chat SDK channels. Every skill has a stable ID beside its name. Skills are stored in anyeve/memory/filedocument backend, Vercel Blob by default, in a documented, versioned layout whose index lists every scope for admin views, or in your ownSkillRepositoryfromeve/experimental/extensions/custom-skills/repository;eve/experimental/extensions/custom-skills/policiesexports the built-in scopes, validator, and approval rule to compose your own. (#6106) - Dynamic schedules'
authandruncallbacks receive aschedulehandle that disables or deletes the schedule that fired, andauthcan return only{ attributes }to run as the stored creator.
Anauththat returnsnullnow fails the occurrence permanently: on Vercel the occurrence is acknowledged without redelivery andoccurrence.failedfires once, instead of after ten deliveries. The same applies whenauthreturns a principal other than the creator or a value of another shape. An error thatauththrows is still retried. If yourauthturns a failed lookup intonull, make it throw instead, or an outage will fail occurrences without a retry.
The handle and theauthresult are exported asScheduleHandleandScheduleAuthResult. (#6211) - Add an optional
idto the experimentaldefineDynamicSchedules, so a schedule collection keeps its stored schedules when its file is renamed or moved.
Withoutid, the collection's name still comes from its path underagent/schedules/. To move a collection, setidto its old path-derived name. A collection that a mounted extension contributes uses itsidas written, without the mount prefix.
eve buildnow fails when two collections, or a collection and a static schedule, in one agent resolve to the same name. A tool file that replaces or disables a collection's tools is named for the resolved name,agent/tools/schedule__<name>.ts. (#6212) - Clarify the experimental dynamic schedules types and error messages, and deprecate the top-level identity fields of
ScheduleOccurrenceEventin favor ofoccurrence.
ThescopeandpreparePayloadcontexts are now exported asScheduleScopeResolverContextandSchedulePreparePayloadContext. No fields were removed and runtime behavior is unchanged. (#6213) - Slack's
approvalChannelaccepts"ephemeral"to show an approval orctx.ask()question only to the person who started the turn, in the thread.
Everyone else sees aWaiting onnote naming that person, which shows the outcome once the request ends. The card needs only thechat:writescope and keeps the conversation in the thread, unlike"direct-message". A click replaces the card with the answer, because Slack can't edit an ephemeral message later. (#6270) - Slack renderers can handle
call.inputto show a tool call's arguments while the model is still writing them.
This lets a renderer post a draft of what a call will produce, such as a card, and edit it as the arguments stream in. eve's default rendering ignorescall.input, so existing channels behave the same. (#6112) - Explain more prominently that
defineDynamicfunctions run before every model call, so network requests, database queries, API calls, and sandbox reads belong insidectx.memo. (#6278) - Fix
vercelBlob()fromeve/memory/file/vercelso a document whose key contains/can be read back after it is written.
Before, such a read returned nothing, so the next write tried to create the document again and failed because it already existed. (#6106)
Bug Fixes
- Let
auto()route messages longer than 16,000 characters using the configured decision provider's input limits.
The decider receives the full text of the turn's opening input and up to seven earlier user and assistant messages. Larger inputs can increase decision cost and latency. Provider input-limit errors use the configuredfallback, like other decision failures. (#6273) - When a finished
bashcommand's output is truncated, the result again keeps the start of a very long last line and the lines before it.
The truncation note again gives the whole output's line count (showing last N of M lines), and memory stays bounded however much the command prints.
Thanks @zackleman for reporting this in #5925 and for the implementation plan this fix follows. (#6248) - A context compaction's summary request during a turn now exports its own
chat <model>span under the turn'sinvoke_agentspan, with its token usage, cost, andai.settings.context.eve.compaction.request=summary, so traces no longer undercount compacting turns.
Model spans now also carryagent.turn.id.@vercel/agent-runsaddsTurnOperation.modelCallfor model calls a turn makes outside its steps.
Thanks @zackleman for reporting this in #5922. (#6251) - When a session stream write fails, the turn step now stops writing and fails at once, so Workflow retries it with a fresh stream, instead of retrying the model call, steering, or reporting a model call failure to the stream that just failed.
Previously, eve read a failed write as a model call error: it retried the provider request, logged that it was "parking session for retry by the user", and tried to write a failure that could never arrive. The retried step closes the model attempt the write cut asabandoned, as it does for any interrupted step.
Thanks @zackleman for reporting this in #5917. (#6264) - A turn whose step fails every Workflow retry now settles
failedwith codeTURN_FAILED, a fixed message, and an error id, instead of the thrown error's class and raw message, which could carry prompt text or tool input.
eve's own log line for the failure records that error id and the thrown error's class, but not its message or details, and the recovery step's stored input carries only the class. Workflow's own step-failure log still includes the error's stack.
A turn cancelled while its failing step was between retries now settlescancelledand keeps its input in history, instead of settlingfailedwith the step's error.
Thanks @zackleman for reporting this and proposing the fix in #5915. (#6261) - Turns no longer resume a session's sandbox in the background when they start, so a turn that never uses the sandbox no longer wakes it; the first tool or file operation that needs it resumes it instead. (#6187)
- Keep a session open when its requests outgrow the compaction threshold or the model's context window.
When the agent's instructions, tools, memory, and context leave no room undercompaction.threshold, eve logs a warning and compacts against the model's context window instead of ending the session withCOMPACTION_FAILED. When they don't fit the window either, only the turn fails withCOMPACTION_FAILED. When a provider rejects a request as longer than the model's context window, only the turn fails withMODEL_CALL_FAILED, and the session can receive another message.
Thanks @zackleman for reporting this in #5921. (#6262) - Sessions that started on eve 0.69 through 0.83 and delegated to a subagent now move to the new deployment instead of staying on the old one until they end.
An idle resumable task no longer keeps such a session on its earlier deployment: the move ends the task's old run, and the model starts a new task on the current build when it needs one. A task that is still working, or has results the model hasn't read, still keeps the session where it is until that clears.
Thanks @zackleman for reporting this and for the implementation plan in #5927. (#6260) - Answers eve discards, such as an empty answer it asks the model for again or a
content-filteranswer that fails the turn, now record their usage on the session stream and count toward session usage andlimits.sessionUsage, like a steered answer always has.
A reissued answer'susage.recordedfollows itsmodel.retried; a failed run's follows itsmodel.settled. Thanks @zackleman for reporting this in #5918. (#6253) - Model calls now retry when a stream chunk fails the provider's schema (
AI_TypeValidationError) or when AI Gateway's provider stream ends before the response finishes (gateway_stream_terminated).
Thanks @zackleman for reporting these in #5911 and #5912. (#6249) - A root session whose
otel({ tracePolicy })withholds inputs or outputs, or drops the trace, no longer tags its workflow run as content-visible, so observability stops showing run data the policy excludes.
A trace policy can only hide content its audience would show by default. A private or unknown-audience run stays hidden even when its policy records content, because Agent Runs'exportPolicymay still redact those spans. Sessions without OpenTelemetry keep the audience default.
Thanks @zackleman for reporting the related visibility gap in #5931. (#6294) - Steering no longer discards a model call that is streaming a tool call's input, so the model doesn't write a long input twice.
The call finishes, the tool runs, and the new message applies at the next step boundary in the same turn.
Thanks @zackleman for reporting this and proposing the fix in #5929. (#6257) - Sessions recorded before eve 1.0 now read the way a current eve records them, and opening a subagent's stream through such a parent no longer re-reads the parent's whole history on every open and reconnect, which could make long sessions answer 404
descendant_unavailable.
eve now verifies the child against only the parent's stored line at the requested position, whichever eve version wrote it.
A question or approval that a subagent relayed before eve 1.0 now reads as a current relayed request: it names the task it came from when there is one, and carries the subagent's session, request, and the call it asks about. A relayed approval no longer reads as an approval of the parent's own subagent call.
Turns recorded before eve 1.0 now keep their trace context when read: each convertedturn.startedcarries thetraceits stored line recorded, as a turn a current eve runs does. A malformed recorded trace reads as absent instead of failing the line's schema.
Thanks @zackleman for reporting these in #5928, #5933, and #5934. (#6250) - Vercel sandboxes refresh or replace expired and near-expiry
VERCEL_OIDC_TOKENcredentials before template builds to avoid 403invalidTokenerrors.
WhenVERCEL_TEAM_ID(orVERCEL_ORG_ID) andVERCEL_PROJECT_IDwere set, eve usedVERCEL_OIDC_TOKENdirectly without checking its expiry, so a build that started after the token expired failed while preparing sandbox templates. eve now resolves the OIDC token through the Vercel OIDC helper, which attempts refresh within five minutes of expiry, and falls back toVERCEL_TOKENwhen it is set and the OIDC token can't be used. (#6188)