Release eve@0.87.0 | 2026-10-28 | minor
🚀 Features
-
Typed
eve/clienterrors now extend the newEveError(fromeve/clientandeve/sessions) with a stable snake_casecode, andsession.snapshot()now returns the full session state, including the opaqueinboxvalue. #5479Match
SessionNotActiveErroronsession_not_activeorsession_not_readyinstead ofEVE_SESSION_NOT_ACTIVE, expectClientError.codeto behttp_errorwhen the response had none, and narrow withClientError.is(error)and friends instead ofinstanceof. Persist thesessionthatsnapshot()returns as is to keepinboxacross restores. -
Rename the terminal display flags on
eve devandeve remote connectto--show-tools,--show-reasoning,--show-subagents, and--show-connection-auth. #5479The old
--tools,--reasoning,--subagents, and--connection-authdisplay flags are no longer accepted, and rendering defaults are unchanged. Model reasoning effort still uses--reasoningoneve initandeve set model. -
Rename
reset()toend()on client sessions, frontend stores/hooks, and channel/Slack handles, and the HTTP retirement endpoint toPOST /eve/v1/session/:sessionId/end(upgrade the server before using the new client). #5479Ending keeps the retired ID: use
newSession()orclient.sessions.create()for a fresh conversation, orclear()to clear context in place; remote-agent and session-history compatibility encodings remain unchanged. -
eve's authoring and configuration types no longer expose AI SDK, zod, OpenTelemetry, or channel-adapter types, so import eve's own types where you named the third-party ones. #5479
Agent
modelfields acceptEveLanguageModel,DecisionModelrequires specificationv4, memory providers returnMemoryToolSetinstead of the removedMemoryToolDefinition,TokenUsageis exported fromeve, andeve/instrumentation/otel,eve/channels/linq, andeve/channels/photonexport eve-owned span processor/exporter,LinqWebhookVerifier, andPhotonIMessageWebhookVerifier/PhotonProjectCredentialstypes. Any AI SDK language model or OpenTelemetry processor still type-checks wherever eve accepts one. -
Import durable primitives from
eve/workflowand run/hook operations fromeve/workflow/api, because bareworkflowimports now fail in authored modules. #5479Both entries declare eve-owned types:
start(workflow, args?)takes no options, runs expose onlyrunId,status,returnValue, andcancel(), andgetHookByTokenis removed, so pass a deterministictokentocreateHookand callresumeHook(token, payload). Ambient Workflow types are no longer needed, though existingeve/workflow-modulestsconfig entries can stay through 1.x. -
The just-bash escape hatches and the Discord Gateway relay move to experimental entries, so update their imports. #5479
Pass
customCommandsandfilesystemasJustBashSandbox.environment({ experimental: { customCommands, filesystem } })and import their types, such asJustBashCommandandJustBashFilesystem, fromeve/experimental/sandbox/just-bash. ImportrunDiscordGatewayRelay(formerlyexperimental_runDiscordGatewayRelay) fromeve/experimental/channels/discord/gatewayinstead ofeve/channels/discord/gateway. -
Import
defineWorkspaceAgent,WorkspaceAgentDefinition, andWorkspaceAgentTransportfromeve/experimental/workspaceinstead ofeve. #5479The helper is experimental; workspace layout and
eve/vercelremain stable. -
Builds now reject agent and connection definitions that don't come from eve's helpers. #5479
Export
defineAgent({...})from every localagent.ts(and return it from dynamic subagents), wrap static connections indefineMcpClientConnectionordefineOpenAPIConnection(plain objects no longer default to MCP), and create sentinels only withdefineDynamic(),disableTool(), anddisableRoute(). Move anagent/sandbox.tsthat sits besideagent/sandbox/toagent/sandbox/sandbox.ts. -
Remove the undocumented public exports
isDisabledToolSentinel,isDisabledRouteSentinel,isInstrumentationDisabled,answerFromText,failureOf, and Linear'sdefaultOnAgentSession. #5479Use
failure(view, turnId)fromeve/eventson a folded view, or check rawturn.settledandsession.endedevents foroutcome === "failed". OmitonAgentSessionto keep Linear's default handler. -
Flatten client stream retry settings into
reconnect?: false | ReconnectOptions. #5479Replace
streamReconnectPolicy: { reconnect: false }withreconnect: false, movestreamOpenReconnectPolicyfields underreconnect, and renameretryableErrorStatusestoretryableStatuses. TheStreamReconnectPolicyandStreamReconnectRetryPolicytypes are removed in favor ofReconnectOptions. -
Rename
compaction.thresholdPercenttocompaction.threshold, which takes a 0–1 fraction. #5479The old key now fails with migration guidance. Set
limits.sessionUsage: falseto disable usage limits, including limits inherited from a parent agent. -
Built-in channel state types no longer publish the default handlers' bookkeeping, so keep custom handler data in your own state keys. #5479
Hidden fields include Slack
taskCards,threadStatus, and the code-channel reply fieldsreplyThreadTsandpendingReplyThreadTs, Chat SDK streaming fields,pendingSignIns, prompt-card fields, and Discord'sinteractionToken(read it from the Discord handle), andTelegramHitlStateis no longer exported.SendTurnPayloadis now exported fromeve/client. -
Slack
initialMessagenow accepts Markdown, text, raw blocks, or a card, with optional files uploaded into the root message's thread. #5479Remove unsupported
Modal*,ExternalSelect*,TextInput*,CardJSXElement,CardJSXProps,isCardElement, andcardChildToFallbackTextexports, plus the card builders' JSX-props overloads and their*Props,ContainerProps, andChatElementtypes. Call builders with their data forms such asButton({ id, label }), useCardTextfor labels, native Slack view data for modals, andcardToFallbackTextfor whole cards (see Slack cards). -
Clarify that Next.js
servicePrefixsupports manually configured Vercel services and production proxying; it is not a legacy option. #5479
Other Changes
See the full list of changes.