github vercel/eve eve@0.76.0

3 hours ago

Minor Changes

  • 8c55ea7: Skills now load through eve__skill({ name }), which every agent with a skill has in place of load_skill, and a skill with deferred: true (in SKILL.md frontmatter or on defineSkill, static or dynamic) leaves the system prompt and is found with eve__search instead.

    • The load_skill tool and the eve/tools/load_skill export are removed. Delete any agent/tools/load_skill.ts override or approval policy that names it; an authored agent/tools/load_skill.ts is now an ordinary tool.
    • A skill load's load-skill action now carries the skill's name, and its input is the model's { name } instead of { skill }. Its result is a load-skill-result with the same name instead of a tool-result named load_skill. Its client message part has the toolName eve__skill instead of eve:load-skill, with the skill's name in toolMetadata.eve.name. Sessions recorded by earlier versions replay with name filled in from input.skill.
    • Eval facts report skill loads in skillLoads, which t.loadedSkill reads. They no longer count toward toolCallCount, usedNoTools, or maxToolCalls.
    • Skill names must use only ASCII letters, digits, underscores, and dashes, start with a letter or digit, and have at most 64 characters. The compiler rejects a static skill with another name, and eve skips a dynamic skill resolver that returns one.
  • 8c55ea7: An agent with deferred entries or connections now has eve__search to find tools marked deferred: true, agents marked tool: "deferred", and every connection tool, and eve__tool to call them, without growing the model's tool list. An agent with skills has eve__skill to load them, and eve__search also finds deferred skills. An agent with none of these gets no catalog tools, so its tool list is unchanged apart from load_skill becoming eve__skill. They replace connection_search and connection_execute, and stream events, approvals, hooks, and traces now name each connection tool call <connection>__<tool>. eve__search never asks the user to sign in: it lists a connection that needs sign-in under the connection's own name, and eve__tool on that name, such as eve__tool({ name: "linear" }), asks the user to sign in. eve__search takes a required query; a query such as linear__ searches only that connection's tools.

    Breaking changes:

    • The tools eve adds itself now live in the eve namespace: task_wait is eve__task_wait, task_cancel is eve__task_cancel, and final_output, the tool a session with an output schema calls to deliver its structured result, is eve__reply. The catalog tools are eve__search, eve__tool, and eve__skill. Update evals, approval policies, hooks, and channel code that match task_wait, task_cancel, or final_output by name. A turn held on task_wait when you upgrade stays held until the next message or a cancel.
    • eve reserves the eve namespace. A tool, subagent, skill, connection, or extension mount named eve or starting with eve__ now fails to build, or fails when the agent loads or a dynamic entry resolves; rename it. search, execute, task_wait, task_cancel, and final_output are ordinary names again.
    • A connection owns its name and every name starting with <name>__. A tool, subagent, or connection under another connection's prefix is rejected at build time, and a dynamic one when it resolves.
    • Dynamic tool map keys must be legal tool names: ASCII letters, digits, _, and -, starting with a letter, up to 64 characters.
    • Connection approvals are keyed by <connection>__<tool> instead of a [connection, tool] pair, so saved "always approve" decisions for connection tools reset.
    • A connection_execute call still waiting for approval when you upgrade fails when someone answers it, with "The tool "connection_execute" is no longer available, so the call didn't run."
    • Eval tool-name helpers (calledTool, notCalledTool, toolOrder, and requireToolCall) now throw, saying what to assert instead, for eve__tool and eve__skill, whose calls are reported under the entry they reach and as skill loads, and for a retired eve tool name (load_skill, task_wait, task_cancel, final_output, connection_search, connection_execute) unless the root agent declares a tool by that name or has a dynamic tool resolver. Before, notCalledTool on one of these names always passed. usedNoTools and maxToolCalls count eve__search calls; skill loads no longer do.
    • Removed: the parentCallId field on tool-call actions in actions.requested events, and the agent.action.parent_call_id span attribute. The subagent parentCallId on session.started invocation metadata is unchanged.
  • 2cc43ca: GitHub work moves out of eve/extensions/code into a new built-in extension, eve/extensions/git. The code extension used to tell every agent that "GitHub credentials are not available to ordinary bash" and to route GitHub work through its gh tool, which only works with Connect-brokered github config. Agents whose shell already has gh credentials were steered to a tool that could not authenticate.

    git({}) adds the GitHub instructions and a git__pr skill that commits, pushes, and opens a draft with the shell's gh pr create --draft. git({ github }) adds the Connect-brokered git__gh tool and switches git__pr to the signed-commit workflow. The tool and sandbox helpers are exported from eve/extensions/git/tools and eve/extensions/git/sandbox.

    Deprecated: code({ github }). While it is set, the code extension still contributes code__gh, its GitHub instructions, and the signed-commit code__pr skill. Without it, code({}) no longer contributes code__gh, code__pr, or any GitHub instructions; mount eve/extensions/git for the pull request skill. gh from eve/extensions/code/tools and the GitHub shell helpers from eve/extensions/code/sandbox still work but are deprecated.

  • 14f2af0: Add dynamic schedule updates for timing and complete payload replacement, with prepared-payload approval for model calls. Payload replacement makes the updating caller the new creator; custom schedule providers must implement update, and preparePayload now receives a create or update operation.

  • 0ef5c4c: eve add channel/slack now resumes interrupted setup, reopens workspace installation for existing connectors, fixes stale routes without detaching, and avoids sharing a Slack app with another project or creating one with a taken name. The eve/setup Slack provisioning API now takes a connector selection from inspectSlackbotConnectors rather than inspecting a second time; a failed Vercel create reports its original error instead of a misleading cleanup failure.

Patch Changes

  • 32aaf68: Accept create-session responses from remote agents on eve 0.66–0.68 (protocol 1). A newer parent no longer fails a call that the older remote already accepted and is running.
  • 8c55ea7: Catalog calls now read as what happened: eve__search shows Search tools for “linear issues” and then how much it found, a skill load shows Load skill <name> and then Loaded skill <name>, and a connection's sign-in entry shows Sign in to Linear. Linear activities, Chat SDK typing indicators, and ACP tool calls now show each call's label instead of its raw tool name, and eve/client tool parts carry that text as toolMetadata.eve.label.
  • 47f1f18: grep and apply_patch in eve/extensions/code now work in sandboxes whose workspace is not /workspace, such as /app. apply_patch no longer requires a git checkout: root is optional and defaults to the workspace root, and outside git it still reports whitespace problems the patch introduced. It also accepts unified-diff range headers such as @@ -118,8 +118,8 @@ def second():, using the function context to pick between identical blocks.
  • afe7058: eve__tool now runs a tool from the agent's tool list, other than eve's own catalog and task tools and tools a provider or client runs, instead of returning an error, so a model that routes a listed tool through it no longer wastes a step.
  • f8ea556: webSearch({ provider: "native" }) uses the model vendor's own hosted search for AI Gateway models: OpenAI web search for OpenAI models, Anthropic web search for Anthropic models, and Google Search grounding for Gemini 3 and later, instead of Exa. Other Gateway models don't get web_search with this setting unless you set fallback, for example webSearch({ provider: "native", fallback: "exa" }). Gemini models before Gemini 3, including direct ones, no longer get Google Search, which made the model drop every other tool.
  • 73adcdf: Dynamic schedules now use Vercel's local scheduler and queue delivery under vc dev, so cron and one-time occurrences fire automatically. The local consumer loads only for Vercel-backed dynamic collections; standalone eve dev keeps its in-memory scheduling backend.
  • f15eaa6: Remove the stream-writer WebSocket default added in 0.73.0, which never took effect. Behavior is unchanged.
  • 192732a: Remote-agent create requests now report that work may have completed when a successful response has an incompatible protocol or unreadable body. These failures stop automatic workflow retries, and protocol mismatches include the remote session ID for checking the outcome.
  • c25caf3: Datadog Experiment reports now link each eval to its sampled runtime traces using Datadog-indexed IDs. Linked traces include classified structural spans and, when capture is enabled, turn-level task input and output; zero-duration Experiment spans are normalized to a positive duration. Canonical runtime spans remain unchanged.

Don't miss a new eve release

NewReleases is sending notifications on new releases.