eve 0.11.2 → 0.11.3
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.
- package/CHANGELOG.md +11 -2
- package/README.md +11 -11
- package/bin/eve.d.ts +1 -1
- package/bin/eve.js +6 -6
- package/dist/src/channel/routes.d.ts +4 -4
- package/dist/src/channel/types.d.ts +2 -2
- package/dist/src/channel/websocket-upgrade-server.d.ts +3 -3
- package/dist/src/chunks/{use-eve-agent-CdETo3qQ.js → use-eve-agent-D9ZhQhyV.js} +2 -2
- package/dist/src/chunks/{use-eve-agent-ClyM-_UT.js → use-eve-agent-DFI0POM9.js} +2 -2
- package/dist/src/cli/banner.d.ts +1 -1
- package/dist/src/cli/banner.js +1 -1
- package/dist/src/cli/commands/channel-add-conflicts.js +1 -1
- package/dist/src/cli/commands/channels.js +1 -1
- package/dist/src/cli/commands/deploy.js +1 -1
- package/dist/src/cli/commands/info.js +1 -1
- package/dist/src/cli/commands/init-agent-instructions.md +1 -1
- package/dist/src/cli/commands/init-git.js +1 -1
- package/dist/src/cli/commands/init.d.ts +1 -1
- package/dist/src/cli/commands/link.js +1 -1
- package/dist/src/cli/commands/preconditions.d.ts +2 -2
- package/dist/src/cli/commands/preconditions.js +1 -1
- package/dist/src/cli/dev/environment.d.ts +1 -1
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/setup-issues.d.ts +2 -0
- package/dist/src/cli/dev/tui/setup-issues.js +1 -1
- package/dist/src/cli/dev/tui/terminal-renderer.js +2 -2
- package/dist/src/cli/dev/tui/theme.d.ts +1 -1
- package/dist/src/cli/dev/tui/tui.d.ts +1 -1
- package/dist/src/cli/dev/url.d.ts +1 -1
- package/dist/src/cli/run.d.ts +1 -1
- package/dist/src/cli/run.js +2 -2
- package/dist/src/cli/ui/output.d.ts +1 -1
- package/dist/src/client/client-error.d.ts +1 -1
- package/dist/src/client/client.d.ts +3 -3
- package/dist/src/client/eve-agent-store.d.ts +1 -1
- package/dist/src/client/eve-agent-store.js +1 -1
- package/dist/src/client/message-reducer-types.d.ts +3 -3
- package/dist/src/client/message-reducer.d.ts +3 -3
- package/dist/src/client/output-schema.d.ts +1 -1
- package/dist/src/client/reducer.d.ts +5 -5
- package/dist/src/client/session.d.ts +1 -1
- package/dist/src/client/types.d.ts +1 -1
- package/dist/src/client/url.d.ts +2 -2
- package/dist/src/compiled/.vendor-stamp.json +1 -1
- package/dist/src/compiled/@vercel/detect-agent/index.d.ts +1 -1
- package/dist/src/compiler/channel-instrumentation-types.js +1 -1
- package/dist/src/compiler/model-catalog.d.ts +1 -1
- package/dist/src/compiler/module-map.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-channel.js +1 -1
- package/dist/src/compiler/normalize-connection.js +1 -1
- package/dist/src/compiler/normalize-instructions.js +1 -1
- package/dist/src/compiler/normalize-sandbox.js +1 -1
- package/dist/src/compiler/normalize-schedule.js +1 -1
- package/dist/src/compiler/normalize-skill.js +1 -1
- package/dist/src/compiler/normalize-subagent.js +1 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/compiler/workspace-resources.js +1 -1
- package/dist/src/context/build-callback-context.js +1 -1
- package/dist/src/context/container.d.ts +4 -4
- package/dist/src/context/container.js +1 -1
- package/dist/src/discover/diagnostics.d.ts +1 -1
- package/dist/src/discover/project.d.ts +2 -2
- package/dist/src/discover/project.js +1 -1
- package/dist/src/evals/cli/eval-client.d.ts +1 -1
- package/dist/src/evals/define-eval.d.ts +1 -1
- package/dist/src/evals/runner/execute-eval.d.ts +1 -1
- package/dist/src/evals/runner/execute-task.d.ts +1 -1
- package/dist/src/evals/types.d.ts +6 -6
- package/dist/src/execution/durable-session-migrations/chain.js +1 -1
- package/dist/src/execution/sandbox/bash-tool.js +1 -1
- package/dist/src/execution/sandbox/bindings/docker-options.d.ts +1 -1
- package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
- package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
- package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
- package/dist/src/execution/sandbox/development-prewarm.js +1 -1
- package/dist/src/execution/sandbox/ensure.js +1 -1
- package/dist/src/execution/sandbox/prewarm.js +1 -1
- package/dist/src/execution/session-callback-step.d.ts +1 -1
- package/dist/src/harness/attachment-staging.js +1 -1
- package/dist/src/harness/code-mode-lifecycle.d.ts +1 -1
- package/dist/src/harness/emission.d.ts +1 -1
- package/dist/src/harness/runtime-actions.d.ts +1 -1
- package/dist/src/internal/application/cache-metadata.d.ts +2 -2
- package/dist/src/internal/application/compiled-artifacts.js +2 -2
- package/dist/src/internal/application/package.d.ts +7 -7
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-module-bundle.js +1 -1
- package/dist/src/internal/helpers/markdown.js +1 -1
- package/dist/src/internal/instrumentation.d.ts +1 -1
- package/dist/src/internal/nitro/host/build-application.d.ts +1 -1
- package/dist/src/internal/nitro/host/channel-routes.d.ts +3 -3
- package/dist/src/internal/nitro/host/configure-nitro-routes.d.ts +1 -1
- package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.d.ts +1 -1
- package/dist/src/internal/nitro/host/cron-handler-route.d.ts +3 -3
- package/dist/src/internal/nitro/host/nitro-bundler-config.d.ts +1 -1
- package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.d.ts +2 -2
- package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +2 -2
- package/dist/src/internal/nitro/host/start-development-server.d.ts +1 -1
- package/dist/src/internal/nitro/host/start-development-server.js +1 -1
- package/dist/src/internal/nitro/host/start-production-server.d.ts +1 -1
- package/dist/src/internal/nitro/host/start-production-server.js +2 -2
- package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.js +1 -1
- package/dist/src/internal/nitro/routes/health.d.ts +1 -1
- package/dist/src/internal/nitro/routes/info.d.ts +1 -1
- package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
- package/dist/src/internal/nitro/routes/schedule-task.d.ts +1 -1
- package/dist/src/internal/package-name.d.ts +1 -1
- package/dist/src/internal/vercel-agent-summary.d.ts +6 -6
- package/dist/src/internal/workflow/builtins.d.ts +3 -3
- package/dist/src/internal/workflow-bundle/nitro-step-entry.js +1 -1
- package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +7 -7
- package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +4 -4
- package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/protocol/message.d.ts +2 -2
- package/dist/src/protocol/routes.d.ts +3 -3
- package/dist/src/public/agents/auth.d.ts +1 -1
- package/dist/src/public/channels/auth.d.ts +1 -1
- package/dist/src/public/channels/discord/api.d.ts +2 -2
- package/dist/src/public/channels/discord/discordChannel.d.ts +2 -2
- package/dist/src/public/channels/discord/hitl.d.ts +4 -4
- package/dist/src/public/channels/discord/verify.d.ts +1 -1
- package/dist/src/public/channels/eve.d.ts +5 -5
- package/dist/src/public/channels/github/api.d.ts +1 -1
- package/dist/src/public/channels/github/defaults.d.ts +1 -1
- package/dist/src/public/channels/github/inbound.d.ts +1 -1
- package/dist/src/public/channels/index.d.ts +2 -2
- package/dist/src/public/channels/linear/auth.d.ts +1 -1
- package/dist/src/public/channels/linear/hitl.d.ts +4 -4
- package/dist/src/public/channels/linear/inbound.d.ts +1 -1
- package/dist/src/public/channels/linear/verify.d.ts +1 -1
- package/dist/src/public/channels/slack/constants.d.ts +1 -1
- package/dist/src/public/channels/teams/api.d.ts +4 -4
- package/dist/src/public/channels/teams/hitl.d.ts +4 -4
- package/dist/src/public/channels/teams/limits.d.ts +3 -3
- package/dist/src/public/channels/teams/verify.d.ts +2 -2
- package/dist/src/public/channels/telegram/api.d.ts +1 -1
- package/dist/src/public/channels/telegram/hitl.d.ts +3 -3
- package/dist/src/public/channels/telegram/verify.d.ts +1 -1
- package/dist/src/public/channels/twilio/api.d.ts +1 -1
- package/dist/src/public/context/index.d.ts +1 -1
- package/dist/src/public/definitions/defineChannel.d.ts +2 -2
- package/dist/src/public/definitions/hook.d.ts +1 -1
- package/dist/src/public/definitions/remote-agent.d.ts +5 -5
- package/dist/src/public/definitions/sandbox.d.ts +1 -1
- package/dist/src/public/definitions/source.d.ts +2 -2
- package/dist/src/public/definitions/state.d.ts +2 -2
- package/dist/src/public/definitions/state.js +1 -1
- package/dist/src/public/instrumentation/index.d.ts +3 -3
- package/dist/src/public/next/index.d.ts +12 -12
- package/dist/src/public/next/index.js +1 -1
- package/dist/src/public/next/server.js +1 -1
- package/dist/src/public/next/vercel-output-config.js +1 -1
- package/dist/src/public/nuxt/dev-server.d.ts +2 -2
- package/dist/src/public/nuxt/dev-server.js +1 -1
- package/dist/src/public/nuxt/module.d.ts +10 -10
- package/dist/src/public/nuxt/routing.d.ts +6 -6
- package/dist/src/public/nuxt/routing.js +1 -1
- package/dist/src/public/nuxt/vercel-json.d.ts +2 -2
- package/dist/src/public/sandbox/backends/just-bash.d.ts +1 -1
- package/dist/src/public/sandbox/backends/microsandbox.d.ts +1 -1
- package/dist/src/public/sandbox/backends/vercel.d.ts +1 -1
- package/dist/src/public/sandbox/docker-sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/just-bash-sandbox.d.ts +1 -1
- package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +3 -3
- package/dist/src/public/sandbox/vercel-sandbox.d.ts +2 -2
- package/dist/src/public/sveltekit/dev-server.d.ts +2 -2
- package/dist/src/public/sveltekit/dev-server.js +1 -1
- package/dist/src/public/sveltekit/index.d.ts +11 -11
- package/dist/src/public/sveltekit/routing.d.ts +5 -5
- package/dist/src/public/sveltekit/routing.js +1 -1
- package/dist/src/public/sveltekit/vercel-json.d.ts +2 -2
- package/dist/src/public/tool-result-narrowing.js +1 -1
- package/dist/src/public/types/json.d.ts +1 -1
- package/dist/src/react/use-eve-agent.d.ts +8 -8
- package/dist/src/runtime/agent/bootstrap-model.js +1 -1
- package/dist/src/runtime/agent/bootstrap.d.ts +1 -1
- package/dist/src/runtime/agent/bootstrap.js +1 -1
- package/dist/src/runtime/agent/mock-model-adapter.js +1 -1
- package/dist/src/runtime/agent/resolve-model.js +1 -1
- package/dist/src/runtime/attributes/emit.d.ts +2 -2
- package/dist/src/runtime/connections/callback-route.d.ts +1 -1
- package/dist/src/runtime/connections/principal.js +1 -1
- package/dist/src/runtime/connections/scoped-authorization.d.ts +1 -1
- package/dist/src/runtime/connections/types.d.ts +4 -4
- package/dist/src/runtime/framework-tools/final-output.d.ts +1 -1
- package/dist/src/runtime/governance/auth/http-basic.d.ts +1 -1
- package/dist/src/runtime/governance/auth/token-claims.d.ts +1 -1
- package/dist/src/runtime/governance/auth/types.d.ts +1 -1
- package/dist/src/runtime/loaders/artifact-paths.d.ts +1 -1
- package/dist/src/runtime/loaders/compile-metadata.js +1 -1
- package/dist/src/runtime/loaders/manifest.js +1 -1
- package/dist/src/runtime/loaders/module-map.js +1 -1
- package/dist/src/runtime/prompt/compose.js +1 -1
- package/dist/src/runtime/resolve-channel.js +1 -1
- package/dist/src/runtime/schedules/register.js +1 -1
- package/dist/src/runtime/sessions/auth.d.ts +1 -1
- package/dist/src/runtime/sessions/runtime-session.d.ts +1 -1
- package/dist/src/runtime/types.d.ts +1 -1
- package/dist/src/runtime/workspace/types.d.ts +1 -1
- package/dist/src/services/dev-client/request-headers.d.ts +2 -2
- package/dist/src/services/dev-client/vercel-auth-error.d.ts +1 -1
- package/dist/src/services/inspect-application.d.ts +1 -1
- package/dist/src/setup/boxes/add-channels.d.ts +1 -1
- package/dist/src/setup/boxes/add-channels.js +1 -1
- package/dist/src/setup/boxes/deploy-project.js +1 -1
- package/dist/src/setup/boxes/resolve-target.d.ts +2 -2
- package/dist/src/setup/boxes/scaffold.d.ts +4 -4
- package/dist/src/setup/boxes/scaffold.js +1 -1
- package/dist/src/setup/channel-add-conflicts.js +1 -1
- package/dist/src/setup/cli/rail-log.d.ts +1 -1
- package/dist/src/setup/flows/model.d.ts +3 -5
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/node-engine.d.ts +5 -5
- package/dist/src/setup/node-engine.js +1 -1
- package/dist/src/setup/onboarding.d.ts +2 -2
- package/dist/src/setup/primitives/open-url.d.ts +1 -1
- package/dist/src/setup/primitives/pm/pnpm.js +1 -1
- package/dist/src/setup/primitives/pm/run.d.ts +1 -1
- package/dist/src/setup/primitives/pm/types.d.ts +1 -1
- package/dist/src/setup/scaffold/connections/catalog.d.ts +1 -1
- package/dist/src/setup/scaffold/create/add-to-project.d.ts +2 -2
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.d.ts +5 -5
- package/dist/src/setup/scaffold/create/project.js +3 -3
- package/dist/src/setup/scaffold/create/web-template.d.ts +2 -2
- package/dist/src/setup/scaffold/create/web-template.js +2 -2
- package/dist/src/setup/scaffold/update/package-json.d.ts +1 -1
- package/dist/src/setup/slack-connect-lifecycle.d.ts +2 -2
- package/dist/src/setup/slack-connect-lifecycle.js +1 -1
- package/dist/src/setup/slackbot.d.ts +1 -1
- package/dist/src/setup/slackbot.js +1 -1
- package/dist/src/setup/validate-gateway-key.d.ts +1 -1
- package/dist/src/setup/vercel-project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +15 -15
- package/dist/src/shared/code-mode.d.ts +3 -3
- package/dist/src/shared/json-schema.d.ts +1 -1
- package/dist/src/shared/model-endpoint-status.d.ts +2 -2
- package/dist/src/shared/sandbox-backend.d.ts +4 -4
- package/dist/src/shared/sandbox-definition.d.ts +3 -3
- package/dist/src/shared/sandbox-network-policy.d.ts +1 -1
- package/dist/src/shared/sandbox-session.d.ts +2 -2
- package/dist/src/shared/skill-package.d.ts +1 -1
- package/dist/src/shared/skill-package.js +1 -1
- package/dist/src/shared/tool-definition.d.ts +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.d.ts +7 -7
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.d.ts +7 -7
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/README.md +10 -10
- package/docs/agent-config.md +2 -2
- package/docs/channels/custom.mdx +5 -5
- package/docs/channels/discord.mdx +3 -3
- package/docs/channels/eve.mdx +7 -7
- package/docs/channels/linear.mdx +6 -6
- package/docs/channels/overview.mdx +11 -11
- package/docs/channels/slack.mdx +4 -4
- package/docs/channels/teams.mdx +2 -2
- package/docs/channels/telegram.mdx +3 -3
- package/docs/channels/twilio.mdx +1 -1
- package/docs/concepts/context-control.md +5 -5
- package/docs/concepts/default-harness.md +2 -2
- package/docs/concepts/execution-model-and-durability.md +9 -9
- package/docs/concepts/security-model.md +9 -9
- package/docs/concepts/sessions-runs-and-streaming.md +3 -3
- package/docs/connections.mdx +11 -11
- package/docs/evals/judge.mdx +2 -2
- package/docs/evals/overview.mdx +2 -2
- package/docs/evals/reporters.mdx +2 -2
- package/docs/getting-started.mdx +10 -10
- package/docs/guides/auth-and-route-protection.md +6 -6
- package/docs/guides/client/continuations.mdx +3 -3
- package/docs/guides/client/output-schema.mdx +1 -1
- package/docs/guides/client/overview.mdx +5 -5
- package/docs/guides/client/streaming.mdx +1 -1
- package/docs/guides/deployment.md +7 -7
- package/docs/guides/dev-tui.md +2 -2
- package/docs/guides/frontend/nextjs.mdx +13 -13
- package/docs/guides/frontend/nuxt.mdx +7 -7
- package/docs/guides/frontend/overview.mdx +12 -12
- package/docs/guides/frontend/sveltekit.mdx +7 -7
- package/docs/guides/frontend/use-eve-agent-svelte.mdx +6 -6
- package/docs/guides/frontend/use-eve-agent-vue.mdx +6 -6
- package/docs/guides/hooks.md +2 -2
- package/docs/guides/instrumentation.md +12 -12
- package/docs/guides/remote-agents.md +4 -4
- package/docs/guides/session-context.md +4 -4
- package/docs/guides/state.md +1 -1
- package/docs/instructions.mdx +4 -4
- package/docs/introduction.mdx +12 -12
- package/docs/reference/cli.md +5 -5
- package/docs/reference/project-layout.md +4 -4
- package/docs/responsible-use.md +3 -3
- package/docs/sandbox.mdx +8 -8
- package/docs/schedules.mdx +1 -1
- package/docs/skills.mdx +4 -4
- package/docs/subagents.mdx +3 -3
- package/docs/tools/human-in-the-loop.md +10 -10
- package/docs/tools/overview.mdx +10 -10
- package/docs/tutorial/connect-a-warehouse.mdx +3 -3
- package/docs/tutorial/first-agent.mdx +2 -2
- package/docs/tutorial/how-it-runs.mdx +2 -2
- package/docs/tutorial/query-sample-data.mdx +1 -1
- package/docs/tutorial/ship-it.mdx +4 -4
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Execution Model and Durability"
|
|
3
|
-
description: "How an
|
|
3
|
+
description: "How an eve session runs. Durable conversations, turns that checkpoint at steps, and parked work that resumes later."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
An
|
|
6
|
+
An eve session is a durable conversation. It can run for days and survives process restarts and redeploys without any work on your part. You write the capabilities (tools, instructions, channels) and eve runs the loop.
|
|
7
7
|
|
|
8
8
|
## Sessions, turns, and steps
|
|
9
9
|
|
|
@@ -13,15 +13,15 @@ Work nests in three levels:
|
|
|
13
13
|
- **turn**: one user message and all the work it triggers (model calls, tool calls, reasoning) until the agent produces its response.
|
|
14
14
|
- **step**: a durable checkpoint inside a turn (one model call and the tool calls it makes).
|
|
15
15
|
|
|
16
|
-
Every turn runs as a durable workflow, built on the open-source [Workflow SDK](https://workflow-sdk.dev/) (Vercel Workflow when you deploy on Vercel).
|
|
16
|
+
Every turn runs as a durable workflow, built on the open-source [Workflow SDK](https://workflow-sdk.dev/) (Vercel Workflow when you deploy on Vercel). eve checkpoints progress and serializes durable state at each step boundary. Your code runs inside a managed step, so tools, the sandbox, and subagents feel synchronous even though the session underneath them is durable.
|
|
17
17
|
|
|
18
18
|
## Resuming after a crash
|
|
19
19
|
|
|
20
|
-
Crash the process, hit a timeout, or redeploy mid-turn, and the run picks up from the last completed step rather than replaying the whole turn. Completed steps never re-run;
|
|
20
|
+
Crash the process, hit a timeout, or redeploy mid-turn, and the run picks up from the last completed step rather than replaying the whole turn. Completed steps never re-run; eve replays the recorded result. A step interrupted mid-execution re-runs, so make non-idempotent side effects like charges or emails idempotent, or gate them with approval.
|
|
21
21
|
|
|
22
|
-
There's nothing to configure.
|
|
22
|
+
There's nothing to configure. eve owns the workflow lifecycle, and sessions are durable by default.
|
|
23
23
|
|
|
24
|
-
You don't write workflow code directly. Workflow primitives (`start()`, `resumeHook()`, etc.) are an implementation detail of
|
|
24
|
+
You don't write workflow code directly. Workflow primitives (`start()`, `resumeHook()`, etc.) are an implementation detail of eve's runtime layer; channels, tools, and hooks never touch them. Two surfaces give your own code session data: tools read the current session's metadata (id, turn, auth, parent lineage) via `ctx.session`, and [`defineState`](../guides/state) reads or writes session-scoped durable state. See [State](../guides/state) for the read/write model.
|
|
25
25
|
|
|
26
26
|
## Parked work
|
|
27
27
|
|
|
@@ -29,9 +29,9 @@ Some work has to wait, including a human approving a [tool](../tools), an intera
|
|
|
29
29
|
|
|
30
30
|
## Message delivery and queueing
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
eve does not maintain a durable FIFO queue of user messages for a session. The `continuationToken` is a resume handle for the session's current workflow hook, not a general message-queue address.
|
|
33
33
|
|
|
34
|
-
When a session is waiting, a delivery to the current continuation token wakes the session and starts the next turn. When a turn is already active, the hook may accept additional deliveries, but the runtime only drains them at specific workflow boundaries. If more than one delivery is ready when the driver checks,
|
|
34
|
+
When a session is waiting, a delivery to the current continuation token wakes the session and starts the next turn. When a turn is already active, the hook may accept additional deliveries, but the runtime only drains them at specific workflow boundaries. If more than one delivery is ready when the driver checks, eve may fold them into the next turn; that drain is best-effort and depends on workflow and transport timing.
|
|
35
35
|
|
|
36
36
|
So don't rely on concurrent sends to the same session behaving like a typical ordered chat queue. For deterministic behavior, send one user turn at a time and wait for `session.waiting` before sending the next message to the same session. If your channel can receive bursts while the agent is working, keep your own per-session queue in the channel or app layer, then deliver the next message after the session parks again. Separate sessions still run independently.
|
|
37
37
|
|
|
@@ -39,7 +39,7 @@ So don't rely on concurrent sends to the same session behaving like a typical or
|
|
|
39
39
|
|
|
40
40
|
A turn can hand work off to a [subagent](../subagents). Each subagent gets its own context and its own durable session; a declared subagent also gets its own sandbox, skills, and state. Nothing crosses the boundary implicitly.
|
|
41
41
|
|
|
42
|
-
## How
|
|
42
|
+
## How eve orders session history
|
|
43
43
|
|
|
44
44
|
Conversation history within a session is append-only. Turns land in order, and the tool calls inside a turn (plus their results) keep their order too. Read a session back and you see events in the order they happened.
|
|
45
45
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Security Model"
|
|
3
|
-
description: "
|
|
3
|
+
description: "eve's trust boundaries, where secrets live, how credentials reach hosts, and what fails closed by default."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Your
|
|
6
|
+
Your eve agent runs across two contexts, with a trust boundary between them and every secret kept on the trusted side. Use this mental model when deciding what an agent (and the model driving it) is allowed to reach.
|
|
7
7
|
|
|
8
8
|
## Trust boundaries
|
|
9
9
|
|
|
@@ -25,7 +25,7 @@ A concrete trace makes the boundary clear. When the model calls a custom `charge
|
|
|
25
25
|
```mermaid
|
|
26
26
|
flowchart LR
|
|
27
27
|
User["User or channel provider"] --> Channel["Channel route and route auth"]
|
|
28
|
-
Channel --> Runtime["
|
|
28
|
+
Channel --> Runtime["eve app runtime and durable session"]
|
|
29
29
|
Runtime --> Model["Configured model provider or Vercel AI Gateway"]
|
|
30
30
|
Runtime --> Tools["Authored tools and connections"]
|
|
31
31
|
Tools --> Services["Customer-selected external services"]
|
|
@@ -34,23 +34,23 @@ flowchart LR
|
|
|
34
34
|
Runtime --> Telemetry["Configured telemetry or eval provider"]
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
eve sends data where your agent configuration and runtime choices send it:
|
|
38
38
|
|
|
39
|
-
- Inbound channel data flows through the channel provider you configure, then into the
|
|
39
|
+
- Inbound channel data flows through the channel provider you configure, then into the eve app runtime.
|
|
40
40
|
- Model inputs and outputs flow to the model or routing path selected in `agent.ts`, such as a Vercel AI Gateway model id or a provider-authored `LanguageModel`.
|
|
41
41
|
- Tool and connection calls flow to the external services, MCP servers, OpenAPI endpoints, and channels you configure.
|
|
42
42
|
- Sandbox commands can reach network destinations allowed by the sandbox network policy.
|
|
43
43
|
- Telemetry and eval data flows to the exporters and providers you configure in `instrumentation.ts` or eval settings.
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
eve stores durable session and workflow state needed to resume conversations, stream events, replay completed steps, and show run observability. You are responsible for deciding whether the selected channels, model providers, connected services, sandbox egress destinations, telemetry exporters, retention settings, and deletion controls are appropriate for your data and use case.
|
|
46
46
|
|
|
47
47
|
## Credential brokering
|
|
48
48
|
|
|
49
|
-
Credential brokering gives the model _authenticated_ network access from inside the sandbox, like a `git clone` of a private repo or an authenticated `curl`, when there's no [tool](../tools) or [connection](../connections) to route it through. On the Vercel Sandbox backend, auth headers get injected at the sandbox's network firewall for matching domains. The secret stays in the app runtime; the sandbox process only ever sees the response. See [Vercel Sandbox Credential Brokering](https://vercel.com/docs/sandbox/concepts/firewall#credentials-brokering) for the platform mechanism, and [Sandbox](../sandbox) for the
|
|
49
|
+
Credential brokering gives the model _authenticated_ network access from inside the sandbox, like a `git clone` of a private repo or an authenticated `curl`, when there's no [tool](../tools) or [connection](../connections) to route it through. On the Vercel Sandbox backend, auth headers get injected at the sandbox's network firewall for matching domains. The secret stays in the app runtime; the sandbox process only ever sees the response. See [Vercel Sandbox Credential Brokering](https://vercel.com/docs/sandbox/concepts/firewall#credentials-brokering) for the platform mechanism, and [Sandbox](../sandbox) for the eve policy API.
|
|
50
50
|
|
|
51
51
|
## Connection credentials
|
|
52
52
|
|
|
53
|
-
[Connection](../connections) tokens (MCP and OpenAPI) come from either `getToken()` or an interactive OAuth flow, and
|
|
53
|
+
[Connection](../connections) tokens (MCP and OpenAPI) come from either `getToken()` or an interactive OAuth flow, and eve injects the resolved token into every outbound request. The token is cached per step and never serialized to durable state.
|
|
54
54
|
|
|
55
55
|
## Channel verification
|
|
56
56
|
|
|
@@ -70,7 +70,7 @@ A custom channel that accepts dashboard-style webhooks should follow the same sh
|
|
|
70
70
|
|
|
71
71
|
## Authored markdown is data
|
|
72
72
|
|
|
73
|
-
[Skill](../skills) and [schedule](../schedules) files are markdown with YAML frontmatter, and
|
|
73
|
+
[Skill](../skills) and [schedule](../schedules) files are markdown with YAML frontmatter, and eve treats that frontmatter strictly as data. The code-capable engines (`---js` / `---javascript`, which would `eval()` the frontmatter body the moment the file is parsed) are disabled, so such a fence throws rather than running. Frontmatter has to parse to a plain YAML object.
|
|
74
74
|
|
|
75
75
|
## Auth fails closed
|
|
76
76
|
|
|
@@ -3,7 +3,7 @@ title: "Sessions, Runs & Streaming"
|
|
|
3
3
|
description: "The session and run contract you touch: continuation tokens, stream handles, the NDJSON event stream, and reconnecting."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Every
|
|
6
|
+
Every eve app speaks the same stable HTTP API to a [durable session](./execution-model-and-durability). This page is the contract you hold: the handles you get back, the events you stream, and how to reconnect.
|
|
7
7
|
|
|
8
8
|
## The two handles
|
|
9
9
|
|
|
@@ -14,7 +14,7 @@ Two handles do two jobs, and mixing them up is the most common mistake. One hand
|
|
|
14
14
|
|
|
15
15
|
A session has one active continuation at a time: each follow-up uses the current `continuationToken`, and a stale one is rejected.
|
|
16
16
|
|
|
17
|
-
React, Vue, and Svelte apps reach for [`useEveAgent()`](../guides/frontend/overview) instead of calling these routes by hand. Next.js and Nuxt apps can proxy them to the
|
|
17
|
+
React, Vue, and Svelte apps reach for [`useEveAgent()`](../guides/frontend/overview) instead of calling these routes by hand. Next.js and Nuxt apps can proxy them to the eve runtime from the same origin.
|
|
18
18
|
|
|
19
19
|
## Start a session
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@ curl -X POST http://127.0.0.1:3000/eve/v1/session \
|
|
|
24
24
|
-d '{"message":"Summarize the latest forecast."}'
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
eve responds right away. The JSON body carries a `sessionId` and a `continuationToken`, and the `x-eve-session-id` header names the durable session to stream.
|
|
28
28
|
|
|
29
29
|
## Stream a session
|
|
30
30
|
|
package/docs/connections.mdx
CHANGED
|
@@ -3,7 +3,7 @@ title: "Connections"
|
|
|
3
3
|
description: "Expose external MCP and OpenAPI servers to the model, with connection tokens the model never sees."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
A connection wires an agent into an external server you don't author, either an MCP server (Linear, GitHub, a warehouse) or any HTTP API with an OpenAPI document.
|
|
6
|
+
A connection wires an agent into an external server you don't author, either an MCP server (Linear, GitHub, a warehouse) or any HTTP API with an OpenAPI document. eve handles the parts you'd otherwise hand-roll, discovering the remote tools, surfacing them to the model, and brokering auth.
|
|
7
7
|
|
|
8
8
|
Connections live under `agent/connections/`. The runtime name comes from the filename, so `agent/connections/linear.ts` registers as `"linear"`. The model never sees a connection's URL or credentials. It discovers tools through the built-in `connection__search` and calls them by their qualified name, `connection__<connection>__<tool>` (e.g. `connection__linear__list_issues`).
|
|
9
9
|
|
|
@@ -27,11 +27,11 @@ The `url` must speak Streamable HTTP or SSE. Write the `description` for the mod
|
|
|
27
27
|
|
|
28
28
|
### Static-token auth
|
|
29
29
|
|
|
30
|
-
`getToken` returns a `TokenResult` (`{ token, expiresAt? }`), and
|
|
30
|
+
`getToken` returns a `TokenResult` (`{ token, expiresAt? }`), and eve sends it as `Authorization: Bearer <token>` on every request. Because it runs on each connection attempt, you can mint a fresh token from wherever you keep secrets, including an env var, a secrets manager, an internal vault, or your own OAuth exchange. If the token has a known TTL, set `expiresAt` (milliseconds since epoch) and eve refreshes ahead of time rather than waiting for a `401`.
|
|
31
31
|
|
|
32
32
|
When `getToken` is the only auth, `principalType` defaults to `"app"`: one shared credential keyed across all sessions. Switch to `principalType: "user"` when each end-user carries their own token.
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
eve resolves and caches connection tokens per step; they never land in conversation history or reach the model.
|
|
35
35
|
|
|
36
36
|
### No auth
|
|
37
37
|
|
|
@@ -44,7 +44,7 @@ export default defineMcpClientConnection({
|
|
|
44
44
|
});
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
We recommend using no-auth connections only for services that are intentionally public, local-only, or otherwise protected outside
|
|
47
|
+
We recommend using no-auth connections only for services that are intentionally public, local-only, or otherwise protected outside eve. Do not use no-auth connections for sensitive third-party services.
|
|
48
48
|
|
|
49
49
|
### Headers
|
|
50
50
|
|
|
@@ -92,7 +92,7 @@ For connection tools that can create, modify, delete, transmit, purchase, messag
|
|
|
92
92
|
|
|
93
93
|
## OpenAPI connections
|
|
94
94
|
|
|
95
|
-
`defineOpenAPIConnection` turns any OpenAPI 3.x document into connection tools, one per operation. Pass an HTTPS URL
|
|
95
|
+
`defineOpenAPIConnection` turns any OpenAPI 3.x document into connection tools, one per operation. Pass an HTTPS URL eve fetches at runtime, or an inline parsed object:
|
|
96
96
|
|
|
97
97
|
```ts title="agent/connections/petstore.ts"
|
|
98
98
|
import { defineOpenAPIConnection } from "eve/connections";
|
|
@@ -104,7 +104,7 @@ export default defineOpenAPIConnection({
|
|
|
104
104
|
});
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Each operation becomes `connection__<connection>__<operationId>` (e.g. `connection__petstore__getInventory`). When an operation has no `operationId`,
|
|
107
|
+
Each operation becomes `connection__<connection>__<operationId>` (e.g. `connection__petstore__getInventory`). When an operation has no `operationId`, eve derives a deterministic `<method>_<sanitized-path>` name instead.
|
|
108
108
|
|
|
109
109
|
`auth`, `headers`, and `approval` work exactly as they do for MCP. There are two fields specific to OpenAPI:
|
|
110
110
|
|
|
@@ -115,7 +115,7 @@ Each operation becomes `connection__<connection>__<operationId>` (e.g. `connecti
|
|
|
115
115
|
|
|
116
116
|
## Interactive OAuth via Vercel Connect
|
|
117
117
|
|
|
118
|
-
When the server uses OAuth and you want each end-user to sign in through their own browser, turn on interactive authorization with [Vercel Connect](https://vercel.com/docs/connect). The `connect()` helper from `@vercel/connect/eve` handles consent, encrypted token storage, and refresh, then hooks all of that into
|
|
118
|
+
When the server uses OAuth and you want each end-user to sign in through their own browser, turn on interactive authorization with [Vercel Connect](https://vercel.com/docs/connect). The `connect()` helper from `@vercel/connect/eve` handles consent, encrypted token storage, and refresh, then hooks all of that into eve's authorization flow:
|
|
119
119
|
|
|
120
120
|
```ts title="agent/connections/linear.ts"
|
|
121
121
|
import { connect } from "@vercel/connect/eve";
|
|
@@ -132,7 +132,7 @@ export default defineMcpClientConnection({
|
|
|
132
132
|
|
|
133
133
|
## Self-hosted interactive OAuth
|
|
134
134
|
|
|
135
|
-
To run your own OAuth, use `defineInteractiveAuthorization` from `eve/connections`, which takes a three-method form and needs no Vercel Connect.
|
|
135
|
+
To run your own OAuth, use `defineInteractiveAuthorization` from `eve/connections`, which takes a three-method form and needs no Vercel Connect. eve mints a callback URL, parks (durably suspends) the turn on a framework-owned webhook, and resumes once the token comes back. Interactive auth is always `principalType: "user"`, and the factory pins that for you.
|
|
136
136
|
|
|
137
137
|
```ts title="agent/connections/linear.ts"
|
|
138
138
|
import {
|
|
@@ -205,7 +205,7 @@ To narrow a caught error, use `isConnectionAuthorizationRequiredError(err)` and
|
|
|
205
205
|
|
|
206
206
|
### Handling a revoked token mid-call
|
|
207
207
|
|
|
208
|
-
`getToken` only runs _before_ a tool call, so a grant revoked while a tool is mid-flight first surfaces as a downstream `401` inside your `execute`. A plain throw there is only a tool error, so the model sees a failure and the cached bearer sticks around. Instead, map a provider `401` to `ctx.requireAuth()` (or rethrow `ConnectionAuthorizationRequiredError`).
|
|
208
|
+
`getToken` only runs _before_ a tool call, so a grant revoked while a tool is mid-flight first surfaces as a downstream `401` inside your `execute`. A plain throw there is only a tool error, so the model sees a failure and the cached bearer sticks around. Instead, map a provider `401` to `ctx.requireAuth()` (or rethrow `ConnectionAuthorizationRequiredError`). eve then evicts the rejected token from its per-step cache and re-runs the consent flow with a fresh one, exactly as it does for a connection whose server rejects the bearer.
|
|
209
209
|
|
|
210
210
|
```ts title="agent/tools/list_issues.ts"
|
|
211
211
|
import { defineTool } from "eve/tools";
|
|
@@ -229,11 +229,11 @@ export default defineTool({
|
|
|
229
229
|
|
|
230
230
|
### Authorization and approval together
|
|
231
231
|
|
|
232
|
-
A tool can require both sign-in (`auth`) and a human approval. The model's approval gate runs before the tool's `execute`, so the order the user sees is **approve, then sign in**.
|
|
232
|
+
A tool can require both sign-in (`auth`) and a human approval. The model's approval gate runs before the tool's `execute`, so the order the user sees is **approve, then sign in**. eve records the approval on session state the moment it's granted, and that record survives the sign-in park, so when the turn resumes after authorization the tool is not put through approval again. You get one approval and one sign-in, never a double prompt.
|
|
233
233
|
|
|
234
234
|
## What to read next
|
|
235
235
|
|
|
236
|
-
- [Integrations](/integrations): browse every channel and connection
|
|
236
|
+
- [Integrations](/integrations): browse every channel and connection eve ships, in one gallery.
|
|
237
237
|
- [Tools](./tools): authored tools live alongside connection-provided tools; the same approval helpers apply.
|
|
238
238
|
- [Auth & route protection](./guides/auth-and-route-protection): the full interactive-OAuth flow with Vercel Connect.
|
|
239
239
|
- [Security model](./concepts/security-model): how connection credentials stay out of the model's reach.
|
package/docs/evals/judge.mdx
CHANGED
|
@@ -3,7 +3,7 @@ title: "Judge"
|
|
|
3
3
|
description: "Grade evals with an LLM judge via t.judge.autoevals, set thresholds on the assertion, and configure the judge model."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
When no deterministic [assertion](./assertions) captures what "good" means (factual correctness, summary quality, free-form criteria), grade the run with an LLM judge. The `t.judge.*` assertions are the only model-backed ones, and they use a judge model that is resolved separately from the agent under test.
|
|
6
|
+
When no deterministic [assertion](./assertions) captures what "good" means (factual correctness, summary quality, free-form criteria), grade the run with an LLM judge. The `t.judge.*` assertions are the only model-backed ones, and they use a judge model that is resolved separately from the agent under test. eve only uses it for scoring, never to swap out the agent.
|
|
7
7
|
|
|
8
8
|
```ts
|
|
9
9
|
import { defineEval } from "eve/evals";
|
|
@@ -19,7 +19,7 @@ export default defineEval({
|
|
|
19
19
|
|
|
20
20
|
## The graders
|
|
21
21
|
|
|
22
|
-
The judges live under `t.judge.autoevals`. The namespace names the [Braintrust autoevals](https://github.com/braintrustdata/autoevals) grader family, so the factuality and closedQA semantics are autoevals', not
|
|
22
|
+
The judges live under `t.judge.autoevals`. The namespace names the [Braintrust autoevals](https://github.com/braintrustdata/autoevals) grader family, so the factuality and closedQA semantics are autoevals', not eve-invented. Each grader scores `t.reply` by default and is soft by default (tracked, no gate):
|
|
23
23
|
|
|
24
24
|
| Grader | Grades |
|
|
25
25
|
| ---------------------------------------- | -------------------------------------------------------------------------------------- |
|
package/docs/evals/overview.mdx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Overview"
|
|
3
|
-
description: "Define repeatable scored checks for an
|
|
3
|
+
description: "Define repeatable scored checks for an eve agent with defineEval and run them with eve eval."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
An eval is a scored check that runs your agent against real sessions and grades the result, catching regressions when you change a prompt or a tool. Drive the agent through one or more turns, assert on what it did (the run completed, the right tool ran, the reply contains the right text), and optionally ship the results to Braintrust.
|
|
@@ -9,7 +9,7 @@ Evals exercise the same HTTP surface your users hit. The runner boots (or target
|
|
|
9
9
|
|
|
10
10
|
## `defineEval`
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
eve discovers evals under the app-root `evals/` directory, in `.eval.ts` files. Each file is one eval by default. A file can also default-export an array to fan out over a dataset (see [Cases](./cases)). The file path is the eval's identity, so you don't author an `id` or `name`. Directories group related evals (`evals/weather/brooklyn-forecast.eval.ts` becomes id `weather/brooklyn-forecast`).
|
|
13
13
|
|
|
14
14
|
```text
|
|
15
15
|
my-agent/
|
package/docs/evals/reporters.mdx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Reporters"
|
|
3
|
-
description: "Ship eval results to Braintrust experiments or JUnit XML.
|
|
3
|
+
description: "Ship eval results to Braintrust experiments or JUnit XML. eve runs and scores everything itself."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
eve runs and grades everything itself; reporters ship the results out. The CLI prints a console summary by default (one line per eval, with failed assertions and their messages), and reporters from `eve/evals/reporters` add destinations on top.
|
|
7
7
|
|
|
8
8
|
You are responsible for ensuring any observability or eval provider is approved for the data exported to it.
|
|
9
9
|
|
package/docs/getting-started.mdx
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Getting Started"
|
|
3
|
-
description: "Install
|
|
3
|
+
description: "Install eve, scaffold your first agent, give it a tool, and run it locally."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
eve is a filesystem-first framework for durable agents. You write capabilities under `agent/`, and eve runs the model loop, persists every session, and serves the agent over HTTP and platform channels. You'll scaffold an app, add a tool, run it locally, then create, stream, and continue a session over HTTP.
|
|
7
7
|
|
|
8
8
|
<Callout>
|
|
9
|
-
|
|
9
|
+
eve is currently in beta and subject to the [Vercel beta
|
|
10
10
|
terms](https://vercel.com/docs/release-phases/public-beta-agreement); the framework, APIs,
|
|
11
11
|
documentation, and behavior may change before general availability.
|
|
12
12
|
</Callout>
|
|
@@ -28,7 +28,7 @@ If you skip this, the dev TUI flags the missing credential and its `/model` comm
|
|
|
28
28
|
|
|
29
29
|
## Quick start
|
|
30
30
|
|
|
31
|
-
`npx` runs `eve init` without installing
|
|
31
|
+
`npx` runs `eve init` without installing eve first:
|
|
32
32
|
|
|
33
33
|
```bash
|
|
34
34
|
npx eve@latest init my-agent
|
|
@@ -36,7 +36,7 @@ npx eve@latest init my-agent
|
|
|
36
36
|
|
|
37
37
|
The command:
|
|
38
38
|
|
|
39
|
-
- Creates an npm-managed child directory and uses
|
|
39
|
+
- Creates an npm-managed child directory and uses eve's default model
|
|
40
40
|
- Installs dependencies and initializes Git
|
|
41
41
|
- Starts the development server and opens the interactive [terminal UI](./guides/dev-tui)
|
|
42
42
|
|
|
@@ -44,11 +44,11 @@ Type a message and watch the model loop run. Pass `--channel-web-nextjs` to add
|
|
|
44
44
|
|
|
45
45
|
`eve init` holds the terminal, so stop it with Ctrl+C to get your shell back before editing the generated agent. The command does not create a Vercel project or deploy.
|
|
46
46
|
|
|
47
|
-
To add
|
|
47
|
+
To add eve to an existing project, run `eve init .` from a directory that already has a `package.json` and no `agent/` files yet. eve adds the missing `eve`, `ai`, and `zod` dependencies without touching anything else the project owns. The eve dependency and the Node engine come from the same release. eve pins `engines.node` to the lowest major that release supports (for example `24.x`). It keeps an existing range only when every version that range allows stays within that major; otherwise it replaces the range and prints a warning.
|
|
48
48
|
|
|
49
49
|
## Manual installation
|
|
50
50
|
|
|
51
|
-
To wire
|
|
51
|
+
To wire eve into an existing app by hand instead of using `eve init`, first declare a compatible Node runtime in `package.json`:
|
|
52
52
|
|
|
53
53
|
```json
|
|
54
54
|
{
|
|
@@ -135,7 +135,7 @@ The same CLI can point at a deployment. `npx eve dev https://your-app.vercel.app
|
|
|
135
135
|
|
|
136
136
|
## Send a message
|
|
137
137
|
|
|
138
|
-
Every
|
|
138
|
+
Every eve app exposes the same stable HTTP API. Start a durable session:
|
|
139
139
|
|
|
140
140
|
```bash
|
|
141
141
|
curl -X POST http://127.0.0.1:3000/eve/v1/session \
|
|
@@ -186,8 +186,8 @@ See [Sessions, runs and streaming](./concepts/sessions-runs-and-streaming) for t
|
|
|
186
186
|
|
|
187
187
|
If a coding agent (Claude Code, Cursor, and the like) is doing the setup, hand it this prompt:
|
|
188
188
|
|
|
189
|
-
<CopyPrompt text="Set up an
|
|
190
|
-
Set up an
|
|
189
|
+
<CopyPrompt text="Set up an eve agent for the user. eve is a filesystem-first TypeScript framework for durable agents, published as the npm package eve. Read its docs: once eve is installed they are bundled in the package at node_modules/eve/docs; before eve is installed, read the published Introduction and Getting Started pages. If the project has no eve app, scaffold one with `npx eve@latest init <name>`; add `--channel-web-nextjs` only when the user wants Web Chat. The init command installs dependencies, initializes Git, and starts the dev server, so run it in a controllable process and stop it with Ctrl+C before editing. To add eve to an existing app, run `eve init .`, or install the dependencies by hand with `npm install eve@latest ai zod` (init adds ai and zod; the by-hand path needs all three). Make sure agent/agent.ts and agent/instructions.md exist, then add a first typed tool at agent/tools/get_weather.ts using defineTool from eve/tools with a Zod inputSchema and an inline execute. Start the dev server again, then exercise the HTTP API: create a session with POST /eve/v1/session, attach to GET /eve/v1/session/:id/stream, and send a follow-up with the returned continuationToken. Verify with the project's typecheck, adapt model and provider choices to the project, and do not commit unless the user asks.">
|
|
190
|
+
Set up an eve agent: read the eve docs (bundled at node_modules/eve/docs once eve is
|
|
191
191
|
installed), scaffold with `npx eve@latest init <name>` (or `npm install eve@latest ai zod` in an existing app), add
|
|
192
192
|
a typed tool at agent/tools/get_weather.ts, run it with `npm run dev`, then create a session, stream
|
|
193
193
|
it, and send a follow-up.
|
|
@@ -3,7 +3,7 @@ title: "Auth & Route Protection"
|
|
|
3
3
|
description: "Secure your agent's HTTP routes with an ordered auth walk, verifier helpers, and connection OAuth via Vercel Connect."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
eve has two independent auth systems:
|
|
7
7
|
|
|
8
8
|
- **Route auth** (inbound) decides who can reach your agent's HTTP routes. It runs at the channel layer, gating the request before any model work runs.
|
|
9
9
|
- **Tool and connection auth** (outbound) is how your agent signs in to an external service it calls, like an OAuth MCP server. It happens later, when a tool or connection actually reaches out.
|
|
@@ -18,7 +18,7 @@ The route-auth policy lives on the HTTP channel factory (`agent/channels/eve.ts`
|
|
|
18
18
|
- `POST /eve/v1/session/:sessionId`
|
|
19
19
|
- `GET /eve/v1/session/:sessionId/stream`
|
|
20
20
|
|
|
21
|
-
These routes are protected by the channel's auth policy.
|
|
21
|
+
These routes are protected by the channel's auth policy. eve fails closed by default: production browser traffic is rejected unless you configure an authenticator that accepts it, and anonymous access requires an explicit `none()`.
|
|
22
22
|
|
|
23
23
|
`GET /eve/v1/health` is always public and skips the walk entirely, so load balancers and uptime monitors can probe it without credentials.
|
|
24
24
|
|
|
@@ -33,7 +33,7 @@ export default eveChannel({
|
|
|
33
33
|
|
|
34
34
|
## The ordered auth walk
|
|
35
35
|
|
|
36
|
-
`auth` takes a single `AuthFn` or an array that
|
|
36
|
+
`auth` takes a single `AuthFn` or an array that eve walks in order. Each entry has three possible outcomes:
|
|
37
37
|
|
|
38
38
|
- returns a `SessionAuthContext`: accept the request and stop the walk
|
|
39
39
|
- returns `null` / `undefined`: skip to the next entry
|
|
@@ -92,7 +92,7 @@ Any other thrown error follows the normal channel failure path. When building a
|
|
|
92
92
|
| `httpBasic(...)` | Operator or service access via a shared username/password. |
|
|
93
93
|
| `jwtHmac(...)` | You control a shared-secret JWT signer. |
|
|
94
94
|
| `jwtEcdsa(...)` | You verify asymmetric JWTs minted by another system. |
|
|
95
|
-
| `oidc(...)` | You want
|
|
95
|
+
| `oidc(...)` | You want eve to verify OIDC-issued tokens from an arbitrary issuer. |
|
|
96
96
|
|
|
97
97
|
Exercise caution for agents that process non-public, sensitive, regulated, or production data unless you have implemented other access controls.
|
|
98
98
|
|
|
@@ -199,7 +199,7 @@ export default eveChannel({
|
|
|
199
199
|
});
|
|
200
200
|
```
|
|
201
201
|
|
|
202
|
-
In production, `placeholderAuth()` returns a structured `401` so a generated web chat app can say "auth isn't configured yet" instead of throwing an internal error. Replace it before a browser caller submits a production request: swap in your app's `AuthFn` or one of the shipped helpers. Delete the authored channel file entirely and
|
|
202
|
+
In production, `placeholderAuth()` returns a structured `401` so a generated web chat app can say "auth isn't configured yet" instead of throwing an internal error. Replace it before a browser caller submits a production request: swap in your app's `AuthFn` or one of the shipped helpers. Delete the authored channel file entirely and eve falls back to the framework default `[localDev(), vercelOidc()]`, which also rejects production browser traffic.
|
|
203
203
|
|
|
204
204
|
Keep secret values (`ROUTE_AUTH_BASIC_PASSWORD`, signing keys) in environment variables. Route-auth secrets never land in compiled artifacts. The runtime re-materializes them from the authored channel definition at boot.
|
|
205
205
|
|
|
@@ -218,7 +218,7 @@ Route auth does not enforce session ownership. If multiple users or tenants can
|
|
|
218
218
|
|
|
219
219
|
## Tool and connection auth
|
|
220
220
|
|
|
221
|
-
Tool and connection auth is how your agent reaches an external service that wants an interactive sign-in, like an OAuth MCP server. Both a connection and an individual tool can declare an `auth` strategy;
|
|
221
|
+
Tool and connection auth is how your agent reaches an external service that wants an interactive sign-in, like an OAuth MCP server. Both a connection and an individual tool can declare an `auth` strategy; eve drives the sign-in, caches the token per step, and re-runs the call once the caller authorizes.
|
|
222
222
|
|
|
223
223
|
### On a connection
|
|
224
224
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Continuations"
|
|
3
|
-
description: "Persist and resume
|
|
3
|
+
description: "Persist and resume eve client sessions with continuation tokens, session IDs, and stream cursors."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
Every
|
|
6
|
+
Every eve client turn returns two handles, and mixing them up is a common mistake. The TypeScript client tracks both for you:
|
|
7
7
|
|
|
8
8
|
- `continuationToken`: the resume handle. Use it to send the next user turn.
|
|
9
9
|
- `sessionId`: the stream-and-inspect handle. Use it to attach to event history.
|
|
@@ -115,4 +115,4 @@ for await (const event of session.stream()) {
|
|
|
115
115
|
|
|
116
116
|
- [Streaming](./streaming): stream events and reconnect by index
|
|
117
117
|
- [Sessions, runs & streaming](../../concepts/sessions-runs-and-streaming): the raw HTTP contract
|
|
118
|
-
- [
|
|
118
|
+
- [eve channel](../../channels/eve): where continuation tokens come from
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Output Schema"
|
|
3
|
-
description: "Request structured results from
|
|
3
|
+
description: "Request structured results from eve client turns and read typed data from MessageResult."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Pass `outputSchema` on a client turn when the caller needs structured data instead of only assistant text. The runtime makes the model satisfy the schema before the turn settles, then emits the final payload as `result.completed`.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "TypeScript SDK Overview"
|
|
3
|
-
description: "Call an
|
|
3
|
+
description: "Call an eve agent from TypeScript with Client, sessions, auth, and health checks."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
The `eve/client` entrypoint is the typed client for
|
|
6
|
+
The `eve/client` entrypoint is the typed client for eve's default HTTP API. Use it from scripts, server-to-server integrations, tests, evals, backend jobs, or custom UIs that want the session protocol without hand-writing the POST and NDJSON (newline-delimited JSON) stream loop.
|
|
7
7
|
|
|
8
8
|
For browser chat UIs, start with [`useEveAgent`](../frontend/overview). For wire-level details, read [Sessions, runs & streaming](../../concepts/sessions-runs-and-streaming). The client sits between those two: lower level than the frontend hooks, higher level than raw HTTP.
|
|
9
9
|
|
|
@@ -19,7 +19,7 @@ const client = new Client({
|
|
|
19
19
|
});
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
`host` is the origin where the
|
|
22
|
+
`host` is the origin where the eve routes are mounted. In a same-origin browser integration this is often `""`; scripts and backend services usually name the full URL.
|
|
23
23
|
|
|
24
24
|
## Check health
|
|
25
25
|
|
|
@@ -34,7 +34,7 @@ Non-2xx responses throw `ClientError`, which carries the HTTP `status` and respo
|
|
|
34
34
|
|
|
35
35
|
## Authentication
|
|
36
36
|
|
|
37
|
-
Pass `auth` when the [
|
|
37
|
+
Pass `auth` when the [eve channel](../../channels/eve) route requires credentials:
|
|
38
38
|
|
|
39
39
|
```ts
|
|
40
40
|
const client = new Client({
|
|
@@ -111,6 +111,6 @@ The next pages cover the session lifecycle:
|
|
|
111
111
|
|
|
112
112
|
## What to read next
|
|
113
113
|
|
|
114
|
-
- [
|
|
114
|
+
- [eve channel](../../channels/eve): the HTTP API this client calls
|
|
115
115
|
- [Sessions, runs & streaming](../../concepts/sessions-runs-and-streaming): the raw HTTP contract
|
|
116
116
|
- [Frontend](../frontend/overview): browser UI with `useEveAgent`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Streaming"
|
|
3
|
-
description: "Consume
|
|
3
|
+
description: "Consume eve client stream events live, reconnect by event index, and aggregate turn results."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
Every `ClientSession.send()` call posts the turn, then reads the session's NDJSON (newline-delimited JSON) event stream. `MessageResponse` gives you two ways to consume that stream, aggregating it with `result()` or iterating it live.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Deployment"
|
|
3
|
-
description: "A production checklist for shipping an
|
|
3
|
+
description: "A production checklist for shipping an eve agent on Vercel, covering build output, env and secrets, sandbox backend, prewarm, auth, deploy, and verify."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
eve runs the same way locally and on Vercel, so taking an agent from `eve dev` to production is mostly mechanical. Work through this checklist in order.
|
|
7
7
|
|
|
8
8
|
## 1. Build
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@ Eve runs the same way locally and on Vercel, so taking an agent from `eve dev` t
|
|
|
13
13
|
eve build
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
When `VERCEL` is set (every hosted Vercel build sets it), `eve build` writes the Vercel output bundle under `.vercel/output`. A plain local `eve build` skips that bundle. Either way you get
|
|
16
|
+
When `VERCEL` is set (every hosted Vercel build sets it), `eve build` writes the Vercel output bundle under `.vercel/output`. A plain local `eve build` skips that bundle. Either way you get eve's compiled framework artifacts under `.eve/`, including the discovery manifest, compiled manifest, diagnostics, and module map. Open those to see which authored surface a deployment will load. For the artifact guide and what to do when `eve build` fails, see [Observability](./instrumentation).
|
|
17
17
|
|
|
18
18
|
## 2. Environment variables and secrets
|
|
19
19
|
|
|
@@ -37,11 +37,11 @@ export default defineSandbox({
|
|
|
37
37
|
});
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Leave `backend` off and
|
|
40
|
+
Leave `backend` off and eve falls back to `defaultBackend()`, which picks the Vercel backend on hosted builds and the local backend everywhere else. One definition, both environments.
|
|
41
41
|
|
|
42
42
|
## 4. Build-time sandbox prewarm
|
|
43
43
|
|
|
44
|
-
During hosted builds,
|
|
44
|
+
During hosted builds, eve prewarms reusable Vercel sandbox templates so the first session doesn't pay the cold-start cost:
|
|
45
45
|
|
|
46
46
|
- Prewarm runs only when both `VERCEL` and `VERCEL_DEPLOYMENT_ID` are present.
|
|
47
47
|
- A sandbox with no `bootstrap()` and no workspace seed files gets skipped.
|
|
@@ -103,9 +103,9 @@ Once the agent is deployed, the platform auto-detects `eve` as the framework and
|
|
|
103
103
|
|
|
104
104
|
Agent Runs is separate from the OpenTelemetry exporters configured in [Observability](./instrumentation). Those still work and are the recommended path if you want spans in Braintrust, Datadog, or another third-party backend.
|
|
105
105
|
|
|
106
|
-
## How
|
|
106
|
+
## How eve sits behind a host framework
|
|
107
107
|
|
|
108
|
-
You can deploy an
|
|
108
|
+
You can deploy an eve app on its own, or mount it inside a host web framework that owns the rest of the site (marketing pages, a dashboard, other API routes). The host keeps its own routing and serves eve's routes through the framework integration. Either way, the agent surface and HTTP contract are identical. For mounting eve in Next.js (`withEve`) and the other supported frameworks, see [Frontend](./frontend/nextjs).
|
|
109
109
|
|
|
110
110
|
## Checklist
|
|
111
111
|
|
package/docs/guides/dev-tui.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "Dev TUI"
|
|
3
|
-
description: "Drive an
|
|
3
|
+
description: "Drive an eve agent locally in an interactive terminal UI. Chat, stream, approve tools, answer questions, tune the display, and point it at a deployment."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
`eve dev` boots the local runtime and drops you into an interactive terminal UI. You chat with the agent, watch it stream, approve its tool calls, and answer the questions it asks back.
|
|
@@ -46,7 +46,7 @@ Each command echoes as an invocation line, asks through a bordered panel that ta
|
|
|
46
46
|
|
|
47
47
|
### Configure the model and provider
|
|
48
48
|
|
|
49
|
-
Bare `/model` opens the configure menu. "Change model" runs the same searchable model picker setup uses (the Vercel AI Gateway catalog, pre-selected on the model the runtime is serving). A model change is written into your agent's authored source, and the command reports success only after
|
|
49
|
+
Bare `/model` opens the configure menu. "Change model" runs the same searchable model picker setup uses (the Vercel AI Gateway catalog, pre-selected on the model the runtime is serving). A model change is written into your agent's authored source, and the command reports success only after eve confirms the new id. `/model <provider/model-id>` applies one directly, skipping the menu.
|
|
50
50
|
|
|
51
51
|
The provider row opens the provider questions: which model provider to use, and how to connect. Picking something other than Vercel AI Gateway shows wiring instructions for your own provider and stops there, leaving any existing setup untouched. For Vercel AI Gateway, you either paste your own `AI_GATEWAY_API_KEY` (saved straight to `.env.local`) or connect via a project. Connecting via a project asks for a Vercel team, opens that team's existing-project list (picking again re-links), then pulls the project's environment so an AI Gateway credential lands in `.env.local`. The dev server reloads env files automatically, with no restart needed.
|
|
52
52
|
|