eve 0.67.2 → 0.68.0

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.
Files changed (116) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/src/channel/types.d.ts +3 -0
  3. package/dist/src/cli/dev/command-options.d.ts +1 -0
  4. package/dist/src/cli/dev/command.js +1 -1
  5. package/dist/src/cli/dev/local-server-process.js +1 -1
  6. package/dist/src/cli/dev/tui/tui.js +1 -1
  7. package/dist/src/compiled/.vendor-stamp.json +1 -1
  8. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +55 -55
  9. package/dist/src/compiled/@vercel/blob/index.js +1 -1
  10. package/dist/src/compiled/@vercel/oidc/index.js +1 -1
  11. package/dist/src/compiled/@workflow/world-vercel/index.js +1 -1
  12. package/dist/src/compiler/extension-compatibility.d.ts +6 -6
  13. package/dist/src/compiler/extension-compatibility.js +1 -1
  14. package/dist/src/computer-use/extension/extension.d.ts +2 -0
  15. package/dist/src/computer-use/extension/extension.js +1 -0
  16. package/dist/src/computer-use/extension/lib/command-failure.d.ts +7 -0
  17. package/dist/src/computer-use/extension/lib/command-failure.js +2 -0
  18. package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-sandbox.js +1 -1
  19. package/dist/src/computer-use/extension/lib/sandbox.d.ts +1 -0
  20. package/dist/src/computer-use/extension/lib/sandbox.js +1 -0
  21. package/dist/src/computer-use/extension/lib/shell.d.ts +1 -0
  22. package/dist/src/computer-use/extension/lib/shell.js +1 -0
  23. package/dist/src/computer-use/tools.d.ts +1 -0
  24. package/dist/src/computer-use/tools.js +1 -0
  25. package/dist/src/context/dynamic-tool-lifecycle.d.ts +1 -1
  26. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  27. package/dist/src/context/hook-lifecycle.d.ts +4 -3
  28. package/dist/src/context/hook-lifecycle.js +1 -1
  29. package/dist/src/execution/continuation-conflict-step.js +1 -1
  30. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  31. package/dist/src/execution/proxied-deliver-step.js +1 -1
  32. package/dist/src/execution/publish-channel-event.js +1 -1
  33. package/dist/src/execution/session/timeout-steps.js +1 -1
  34. package/dist/src/execution/session/turn-event-handler.d.ts +27 -0
  35. package/dist/src/execution/session/turn-event-handler.js +1 -0
  36. package/dist/src/execution/session/turn-step.js +1 -1
  37. package/dist/src/execution/task-input-response-route.js +1 -1
  38. package/dist/src/execution/tasks/child/notify.js +1 -1
  39. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  40. package/dist/src/execution/tools/ask-question-workflow.js +1 -1
  41. package/dist/src/execution/tools/connection-search.js +1 -1
  42. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  43. package/dist/src/execution/tools/subagent/emit-event-step.js +1 -1
  44. package/dist/src/execution/tools/workflow/answer.d.ts +4 -1
  45. package/dist/src/execution/tools/workflow/answer.js +1 -1
  46. package/dist/src/execution/workflow-runtime.js +1 -1
  47. package/dist/src/extensions/code/extension/lib/sandbox.d.ts +3 -2
  48. package/dist/src/extensions/code/extension/lib/sandbox.js +1 -1
  49. package/dist/src/extensions/code/extension/lib/signed-commit.d.ts +1 -1
  50. package/dist/src/extensions/code/extension/lib/signed-commit.js +2 -2
  51. package/dist/src/extensions/code/tools.d.ts +2 -1
  52. package/dist/src/extensions/code/tools.js +1 -1
  53. package/dist/src/harness/tool-loop.js +2 -2
  54. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  55. package/dist/src/instrumentation/lifecycle.d.ts +2 -2
  56. package/dist/src/instrumentation/lifecycle.js +1 -1
  57. package/dist/src/internal/application/package.js +1 -1
  58. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.d.ts +2 -2
  59. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  60. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +2 -4
  61. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  62. package/dist/src/internal/nitro/dev-runtime-generation-metadata.d.ts +13 -0
  63. package/dist/src/internal/nitro/dev-runtime-generation-metadata.js +1 -0
  64. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  65. package/dist/src/internal/nitro/development-generation.js +1 -1
  66. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +1 -0
  67. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  68. package/dist/src/internal/nitro/host/dev-workflow-world-setup.d.ts +1 -0
  69. package/dist/src/internal/nitro/host/dev-workflow-world-setup.js +1 -1
  70. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  71. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  72. package/dist/src/internal/workflow/cancel-expired-development-run.d.ts +2 -0
  73. package/dist/src/internal/workflow/cancel-expired-development-run.js +1 -0
  74. package/dist/src/internal/workflow/development-runtime-compatibility.d.ts +12 -0
  75. package/dist/src/internal/workflow/development-runtime-compatibility.js +1 -0
  76. package/dist/src/internal/workflow/development-world-client.js +1 -1
  77. package/dist/src/internal/workflow/development-world-protocol.d.ts +9 -0
  78. package/dist/src/internal/workflow/development-world-server.d.ts +2 -0
  79. package/dist/src/internal/workflow/development-world-server.js +1 -1
  80. package/dist/src/internal/workflow/is-inactive-workflow-run-error.d.ts +2 -0
  81. package/dist/src/internal/workflow/is-inactive-workflow-run-error.js +1 -0
  82. package/dist/src/public/definitions/hook.d.ts +12 -0
  83. package/dist/src/runtime/connections/mcp-client.d.ts +7 -0
  84. package/dist/src/runtime/connections/mcp-client.js +1 -1
  85. package/dist/src/self-modification/extension/subagents/agent/tools/search_traces.js +1 -1
  86. package/dist/src/setup/boxes/model-capabilities.d.ts +2 -2
  87. package/dist/src/setup/boxes/model-capabilities.js +1 -1
  88. package/dist/src/setup/integrations/web/setup.d.ts +0 -2
  89. package/dist/src/setup/integrations/web/setup.js +3 -3
  90. package/dist/src/setup/scaffold/create/project.js +1 -1
  91. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  92. package/dist/src/setup/scaffold/create/web-template.js +1 -1
  93. package/dist/src/shared/connection-types.d.ts +5 -0
  94. package/dist/src/shared/gateway-model-catalog.d.ts +25 -2
  95. package/dist/src/shared/gateway-model-catalog.js +1 -1
  96. package/dist/src/subagents/parent-notification.js +1 -1
  97. package/dist/src/tasks/types.d.ts +2 -0
  98. package/dist/src/tools/definition.d.ts +8 -0
  99. package/docs/concepts/project-structure.mdx +1 -1
  100. package/docs/guides/auth-and-route-protection.md +1 -1
  101. package/docs/guides/deployment/vercel.mdx +1 -1
  102. package/docs/guides/dynamic-capabilities.md +10 -7
  103. package/docs/guides/hooks.md +34 -2
  104. package/docs/install-integrations.mdx +1 -1
  105. package/docs/reference/cli.md +36 -15
  106. package/docs/tools/human-in-the-loop.md +2 -0
  107. package/package.json +24 -3
  108. package/dist/src/shared/boundary-hook-error.d.ts +0 -4
  109. package/dist/src/shared/boundary-hook-error.js +0 -1
  110. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-driver-source.d.ts +0 -0
  111. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-driver-source.js +0 -0
  112. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use-sandbox.d.ts +0 -0
  113. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use.d.ts +0 -0
  114. /package/dist/src/{extensions/code → computer-use}/extension/lib/computer-use.js +0 -0
  115. /package/dist/src/{extensions/code → computer-use}/extension/tools/computer_use.d.ts +0 -0
  116. /package/dist/src/{extensions/code → computer-use}/extension/tools/computer_use.js +0 -0
@@ -88,6 +88,12 @@ export interface ToolInputRequest {
88
88
  readonly options?: readonly InputOption[];
89
89
  readonly prompt: string;
90
90
  }
91
+ /** Public identity fields for the authenticated person who answered a question. */
92
+ export interface ToolInputResponseResponder {
93
+ readonly authenticator: string;
94
+ readonly principalId: string;
95
+ readonly principalType: string;
96
+ }
91
97
  /**
92
98
  * The outcome of a {@link ToolInputRequest}.
93
99
  *
@@ -100,6 +106,8 @@ export type ToolInputResponse = {
100
106
  readonly status: "answered";
101
107
  /** The selected option's `id`, when the user picked one. */
102
108
  readonly optionId?: string;
109
+ /** Authenticated identity of the responder, without channel attributes. */
110
+ readonly responder?: ToolInputResponseResponder;
103
111
  /** Free text, when the user typed an answer. */
104
112
  readonly text?: string;
105
113
  } | {
@@ -79,7 +79,7 @@ Choose how the frontend and agents run together independently of how many agents
79
79
 
80
80
  `apps/web/` is an organizational convention, not an eve filesystem slot. Deployment configuration owns peer services; eve discovers only the agents. Both Vercel integrations deploy the services together, not as independent releases.
81
81
 
82
- Run `eve add channel/web` from a standalone agent or select a workspace agent with `--agent <name>`. The installer creates a Next.js frontend under `apps/web/`. Choose **Vercel** to configure separate Vercel services and run them with `pnpm dev:services`, or **Other** to let Next.js host the agents and run the application with `pnpm dev:web`. Use `pnpm dev` or `pnpm dev:eve` when you only want one agent and the eve terminal UI.
82
+ Run `eve add channel/web` from a standalone agent or select a workspace agent with `--agent <name>`. The installer creates a Next.js frontend under `apps/web/`. Choose **Vercel** to configure separate Vercel services and run them with `pnpm dev:all`; you don't need to link a Vercel project to run them locally. Choose **Other** to let Next.js host the agents and run the application with `pnpm dev:web`. Use `pnpm dev` or `pnpm dev:eve` when you only want one agent and the eve terminal UI.
83
83
 
84
84
  ## Add a second root agent
85
85
 
@@ -292,7 +292,7 @@ Inside runtime code, `ctx.session.auth` carries the result of the channel's rout
292
292
  - `auth.current`: the caller on the active inbound turn.
293
293
  - `auth.initiator`: the caller that started the durable session.
294
294
  - A follow-up message updates `auth.current` but leaves `auth.initiator` alone. When a different caller follows up on the same session, `auth.current` tracks the new caller for that turn while `auth.initiator` stays pinned to whoever started it.
295
- - Both are `null` only on internal runtime paths (subagents, for instance) that never went through an authored route. HTTP traffic always populates `auth.current`, since the walk either accepts with a `SessionAuthContext` or returns `401`.
295
+ - `auth.current` is whatever the channel passed as `auth` when it dispatched the message. Route auth either accepts the request or returns `401`, but a route handler or channel hook can still dispatch with `auth: null`, such as `source.send(message, { auth: null })` or a Slack `onMessage` hook that returns `{ auth: null }`. On a new session, both values are then `null`. On a continuation, `auth.current` is `null` while `auth.initiator` stays pinned to the session's original caller. Internal runtime paths, such as subagents, can also have no caller auth.
296
296
 
297
297
  Use the principal on `auth.current` (or `auth.initiator`) to scope tools, resolve [dynamic capabilities](./dynamic-capabilities) per principal, or enforce tenant boundaries. There's no second per-session ownership ACL stacked on top of route auth. Access is decided at the HTTP boundary, and the durable session carries the caller snapshot forward into your runtime code.
298
298
 
@@ -82,7 +82,7 @@ Vercel evaluates `vercel.ts` before resolving the service graph. `withEve` adds
82
82
 
83
83
  The Web Chat installer can generate this composition for a standalone agent or a selected workspace agent. Configure authentication for every exposed agent. To self-host the same source layout, replace Vercel composition with your own [process and proxy configuration](./self-hosting#run-workspace-members).
84
84
 
85
- Run Vercel CLI 59.16.0 or newer with `vercel dev` to start the complete service graph locally. A generated Vercel Web Chat project exposes this as `pnpm dev:services`; the first run links the directory when needed and linked projects load their development environment and settings. Use `pnpm dev` or `pnpm dev:eve` when you want one agent and the eve terminal UI, or `pnpm dev:web` when you want the frontend without its agent services. Named agents use the same `/eve/<name>/v1/*` routes in development, and default `defineWorkspaceAgent` transports can call peers without deployment credentials.
85
+ Run Vercel CLI 59.16.0 or newer with `vercel dev --local` to start the complete service graph locally without linking a Vercel project. A generated Vercel Web Chat project exposes this as `pnpm dev:all`. When the directory is linked, Vercel also loads its development environment and settings. Use `pnpm dev` or `pnpm dev:eve` when you want one agent and the eve terminal UI, or `pnpm dev:web` when you want the frontend without its agent services. Named agents use the same `/eve/<name>/v1/*` routes in development, and default `defineWorkspaceAgent` transports can call peers without deployment credentials.
86
86
 
87
87
  Generated transport routes are inserted before a filesystem handler or, when no filesystem handler exists, before authored routes. `withEve` throws instead of overwriting an authored service key or exact transport route that belongs to a generated agent. Remove the authored route, and remove or rename the authored service; `withEve` adds both automatically. Names in the array form of `services` must also be unique. Other service names, routes, bindings, and Cron Jobs remain authored in `vercel.ts`.
88
88
 
@@ -330,7 +330,10 @@ A parked call binds to its callback within its session, lifecycle scope, and res
330
330
 
331
331
  - Editing a callback body while keeping its resolver entry and tool names is safe: replaying a parked call runs the latest deployed code with the closure values snapshotted when the call was made.
332
332
  - If a persisted session-scoped callback has no registered implementation (a fresh process, a redeploy, or an expired in-process binding), eve re-runs `session.started` resolvers once to rebind it, then replays.
333
- - If the owning resolver no longer returns that tool, replay fails closed with an explicit error instead of invoking something else. Ordinary turn-scoped and step-scoped tools are not rebound; a parked call to a missing one errors. Framework-provided resolvers such as memory provider-tool wrappers opt into the same generic missing-callback rebind while preserving their locked scope.
333
+ - If an active turn resumes without a registered turn-scoped callback, eve re-runs the owning `turn.started` resolver to restore the callback while preserving the tool set and closure captured earlier in that turn. If an authored resolver no longer returns the tool, the turn can continue, but calling that tool fails closed. Framework-provided resolvers such as memory provider-tool wrappers require all of their callbacks to be restored and fail the continuation if their locked tool set changed.
334
+ - Step-scoped callbacks are restored from the persisted step immediately before eve replays that step.
335
+
336
+ A recovery rebind is not a new lifecycle event, but it can run resolver code again. Keep `session.started` and `turn.started` resolvers idempotent and return the same tool identities for the same persisted scope.
334
337
 
335
338
  ### Naming
336
339
 
@@ -347,13 +350,13 @@ A dynamic connection, tool, or skill whose name matches an **authored** one **ov
347
350
 
348
351
  ### Events
349
352
 
350
- | Event | Resolver runs | Tools available for |
351
- | ----------------- | ----------------------------------------------------- | ------------------------------- |
352
- | `session.started` | At session start; may be redelivered during recovery¹ | Every model call in the session |
353
- | `turn.started` | Once per turn | Every model call in the turn |
354
- | `step.started` | Before each model call | That model call |
353
+ | Event | Resolver runs | Tools available for |
354
+ | ----------------- | -------------------------------------------------------- | ------------------------------- |
355
+ | `session.started` | At session start; may be redelivered during recovery¹ | Every model call in the session |
356
+ | `turn.started` | Once per turn; may re-run to restore a missing callback¹ | Every model call in the turn |
357
+ | `step.started` | Before each model call | That model call |
355
358
 
356
- ¹ Workflow recovery can redeliver a resolver event, so keep resolvers idempotent. Replaying a parked callback does not depend on running the resolver again — except for the one-shot rebind described under [Identity and redeploys](#identity-and-redeploys).
359
+ ¹ Workflow recovery can redeliver an event or re-run a resolver to restore a missing callback, so keep resolvers idempotent. Rebinding restores the persisted tool set; it does not make newly returned tools available in the active turn.
357
360
 
358
361
  At `turn.started`, model, tool, skill, and subagent resolvers receive the visible conversation history and incoming message in `ctx.messages`, oldest first. Request context is included, and history projection still applies. Read these messages from the handler's second argument; the event itself contains turn metadata. Instruction resolvers use the separate snapshot described under [Dynamic instructions](#dynamic-instructions).
359
362
 
@@ -61,6 +61,7 @@ helpers documented in [Session context](./session-context):
61
61
  interface HookContext extends SessionContext {
62
62
  readonly agent: { readonly name: string; readonly nodeId?: string };
63
63
  readonly channel: { readonly kind?: string; readonly continuationToken?: string };
64
+ cancel(): void;
64
65
  }
65
66
  ```
66
67
 
@@ -181,9 +182,40 @@ Hooks always run after the event is durably recorded, so if a hook throws, the s
181
182
 
182
183
  ## What happens when a hook throws
183
184
 
184
- A thrown handler during a model turn propagates through turn execution and surfaces as `turn.failed`. This includes handlers for `turn.started` and the first `step.started` of a model call: the failed turn ends with `session.waiting`, and the next message can start another turn. If a hook subscribed to a failure-cascade event also throws, it escalates to `session.failed`. For belt-and-suspenders semantics inside a hook, wrap the body in `try`/`catch`. eve treats a thrown hook as a real failure.
185
+ eve logs a thrown or rejected handler with the hook slug, subscription, event type, event ID, and session ID, then runs the remaining subscribers in order. The current turn, subagent notification, and session continue. This applies to every stream-event hook, including `turn.started`, `step.started`, and failure events. Throwing from a hook does not reject work or veto a turn. To stop the running turn, call [`ctx.cancel()`](#cancel-the-running-turn-from-a-hook).
185
186
 
186
- For `subagent.called`, `subagent.completed`, and events proxied from a child, a thrown handler fails the publishing step and follows the workflow runtime's step retry policy. A retry can publish the event again before rerunning its hooks. Parent execution waits for the publishing step to finish or exhaust its retries. Exhausting retries fails the session.
187
+ A hook failure does not trigger a retry. State changes and external side effects made before the exception are not rolled back. If a side effect needs retries or compensation, handle that inside the hook. Runtime failures outside the authored handler, such as failures setting up context or persisting state, still propagate. If persisting state after a subagent notification fails, the workflow runtime retries the notification step, which can publish the event again.
188
+
189
+ ## Cancel the running turn from a hook
190
+
191
+ Call `ctx.cancel()` when a hook finds that the turn cannot proceed. For example, a `turn.started` hook that cannot load the caller's credentials can stop the turn before the model runs, instead of letting every tool call fail:
192
+
193
+ ```ts title="agent/hooks/require-credentials.ts"
194
+ import { defineHook } from "eve/hooks";
195
+ import { loadWorkspaceCredentials } from "../lib/credentials";
196
+
197
+ export default defineHook({
198
+ events: {
199
+ async "turn.started"(_event, ctx) {
200
+ try {
201
+ await loadWorkspaceCredentials(ctx.session.auth.current);
202
+ } catch (error) {
203
+ console.warn("cancelling turn: workspace credentials unavailable", {
204
+ error,
205
+ sessionId: ctx.session.id,
206
+ });
207
+ ctx.cancel();
208
+ }
209
+ },
210
+ },
211
+ });
212
+ ```
213
+
214
+ The remaining subscribers for the event still run. Then eve cancels the turn the same way [`session.cancel()`](./client/streaming) does: in-flight model and tool work is aborted, delegated child turns are cancelled, and the turn ends with `turn.cancelled` followed by `session.waiting`. No failure event is emitted. A cancel from `turn.started` or `step.started` takes effect before that model call. In a conversation, the next message starts a new turn. A delegated task reports the cancellation to its caller.
215
+
216
+ `ctx.cancel()` returns `void` rather than a promise. The turn stops after the hook returns, so there is nothing to await. Call it before the handler's promise settles: eve ignores a call from work the handler does not await and logs a warning.
217
+
218
+ `ctx.cancel()` only stops a running turn. eve logs a warning and ignores the call on `step.failed`, `turn.completed`, `turn.failed`, `turn.cancelled`, `session.waiting`, `session.completed`, `session.failed`, `context.cleared`, and `subagent.*` events, and during clear or compact requests.
187
219
 
188
220
  ## Subagent isolation
189
221
 
@@ -19,7 +19,7 @@ eve add memory/file
19
19
 
20
20
  If an item is not found, `eve add` searches the available catalogs and prints close matches without installing anything.
21
21
 
22
- Web Chat installs a shared Next.js application at `apps/web` for either a standalone agent or a selected member of an agent workspace. Choose **Vercel services** (recommended) to deploy Web Chat and agents as separate services, or **Next.js** to serve Web Chat and route agent requests through one Next.js app. Existing authored Next.js or Vercel configuration is preserved, and eve stops with manual composition guidance instead of overwriting it. See [Project Structure](./concepts/project-structure) for browser-app placement and [Next.js](./guides/frontend/nextjs) for Next.js-owned integration.
22
+ Web Chat installs a shared Next.js application at `apps/web` for either a standalone agent or a selected member of an agent workspace. Choose **Vercel services** (recommended) to deploy Web Chat and agents as separate services, or **Next.js** to serve Web Chat and route agent requests through one Next.js app. Vercel services run locally without a linked Vercel project; link one when you are ready to deploy. Existing authored Next.js or Vercel configuration is preserved, and eve stops with manual composition guidance instead of overwriting it. See [Project Structure](./concepts/project-structure) for browser-app placement and [Next.js](./guides/frontend/nextjs) for Next.js-owned integration.
23
23
 
24
24
  If you do not know an item name yet, run `eve add` without an argument. Its help output shows how to search the registry with `eve registry search <query>`.
25
25
 
@@ -208,26 +208,29 @@ eve dev [options]
208
208
 
209
209
  Starts a local development server and terminal UI. To connect the UI to an existing agent, use `eve remote connect --url <url>`.
210
210
 
211
- | Flag | Type | Default | Description |
212
- | ----------------------------------- | ------ | ------------------ | ------------------------------------------- |
213
- | `--host <host>` | string | all interfaces | Host interface to bind |
214
- | `--port <port>` | number | `$PORT`, then 2000 | Port to listen on |
215
- | `--no-ui` | flag | UI on | Start the server without an interactive UI |
216
- | `--no-default-extensions` | flag | extensions on | Do not mount bundled development extensions |
217
- | `--name <name>` | string | app folder name | Title shown in the terminal UI |
218
- | `--input <text>` | string | none | Pre-fill the prompt input |
219
- | `--tools <mode>` | enum | `auto-collapsed` | Tool-call rendering |
220
- | `--reasoning <mode>` | enum | `full` | Reasoning rendering |
221
- | `--subagents <mode>` | enum | `auto-collapsed` | Subagent-section rendering |
222
- | `--connection-auth <mode>` | enum | `full` | Connection-authorization rendering |
223
- | `--assistant-response-stats <mode>` | enum | `tokensPerSecond` | Assistant header statistic |
224
- | `--context-size <tokens>` | number | none | Model context window size |
225
- | `--logs <mode>` | enum | `stderr` | Server and agent logs to show |
211
+ | Flag | Type | Default | Description |
212
+ | ----------------------------------- | ------ | ------------------ | --------------------------------------------------------------- |
213
+ | `--host <host>` | string | all interfaces | Host interface to bind |
214
+ | `--port <port>` | number | `$PORT`, then 2000 | Port to listen on |
215
+ | `--no-ui` | flag | UI on | Start the server without an interactive UI |
216
+ | `--resume` | flag | off | Attempt recovery of retained runs from previous dev invocations |
217
+ | `--no-default-extensions` | flag | extensions on | Do not mount bundled development extensions |
218
+ | `--name <name>` | string | app folder name | Title shown in the terminal UI |
219
+ | `--input <text>` | string | none | Pre-fill the prompt input |
220
+ | `--tools <mode>` | enum | `auto-collapsed` | Tool-call rendering |
221
+ | `--reasoning <mode>` | enum | `full` | Reasoning rendering |
222
+ | `--subagents <mode>` | enum | `auto-collapsed` | Subagent-section rendering |
223
+ | `--connection-auth <mode>` | enum | `full` | Connection-authorization rendering |
224
+ | `--assistant-response-stats <mode>` | enum | `tokensPerSecond` | Assistant header statistic |
225
+ | `--context-size <tokens>` | number | none | Model context window size |
226
+ | `--logs <mode>` | enum | `stderr` | Server and agent logs to show |
226
227
 
227
228
  Local development mounts bundled development extensions without adding files to your project. Pass `--no-default-extensions` to disable them. See [Self-Modification](../guides/self-modification) for details.
228
229
 
229
230
  A fresh `eve init` opens the TUI and reuses an available model connection or opens `/login`. No Vercel project, channels, integrations, or review step is required before chat. Use `/model` to change models and settings, and `/add` to install an addition. Other `--input` text stays editable in the prompt. See [Terminal UI](../guides/dev-tui) for credential precedence and login options.
230
231
 
232
+ ### Local development lifecycle
233
+
231
234
  Local dev records the last ready URL per resolved app root in `.eve/dev-server-state.v1.json`. A second interactive `eve dev` reconnects only when that URL is loopback and healthy; each terminal UI creates a fresh client session while sharing the server process. A stale or malformed record is replaced when eve starts a new server. Passing `--host`, `--port`, or a `PORT` environment value skips reconnection and reports a healthy recorded server instead.
232
235
 
233
236
  Local dev keeps immutable runtime generations under `.eve/dev-runtime/snapshots/` so in-flight turns hold a consistent code revision while new turns pick up rebuilds. Each generation contains the compiled authored module graph and runtime resources rather than a recursive copy of the app or workspace. The terminal REPL keeps its logical session across successful rebuilds, so the next turn continues the conversation on the latest generation; `/new` terminally retires that session before clearing the transcript, and the next prompt starts a fresh session with a new session-scoped sandbox on first sandbox use. After a generation is superseded, `eve dev` retains it for at least 30 minutes and also retains the five most recently superseded generations, regardless of the configured Workflow World. The active generation is never pruned. Old runtime snapshots and local sandbox templates are pruned in the background. For manual cleanup, stop `eve dev` before deleting `.eve/dev-runtime/snapshots/` or `.eve/sandbox-cache/local/templates/`. A turn that remains unfinished beyond the automatic retention window can no longer resume after its generation is pruned.
@@ -236,6 +239,24 @@ Local development records traces under `.eve/traces/` by default and bounds that
236
239
 
237
240
  `eve acp` reserves stdin and stdout for newline-delimited JSON-RPC and sends diagnostics to stderr. Without a URL, it supervises an isolated local development server. With a URL, it bridges ACP to that server's existing eve HTTP API. See [Agent Client Protocol (ACP)](../protocols/acp) for client configuration and capability limits.
238
241
 
242
+ ### Local workflow recovery
243
+
244
+ With the built-in local Workflow World, a new `eve dev` server leaves previous invocations' runs dormant by default, including deliveries triggered by timers or hooks. A new message or control request addressed to a dormant conversation fails instead of being accepted without a response; the HTTP channel reports its usual request failure. Start a new conversation, or restart `eve dev` with `--resume` to attempt recovery. Already-open event streams are not changed by this request guard. Source-watcher rebuilds and worker restarts within the same server retain current runs' eligibility.
245
+
246
+ Pass `eve dev --resume` to attempt recovery of unfinished runs from previous invocations. Recovery requires a retained snapshot with readable generation metadata. Snapshots from older eve versions with a valid `runtimeAppRoot` remain eligible. Changes to the eve framework or authored workflow sources do not prevent the attempt, but replay can fail and leave the run terminally failed after executing some work. Use `--resume` only when you want to try continuing those previous runs.
247
+
248
+ Runs with malformed generation metadata remain stored and dormant for that server invocation, including later timer and hook deliveries. Startup with `--resume` reports why recovery was skipped without blocking other eligible runs. Restore malformed snapshot metadata from a backup or start a new session.
249
+
250
+ Recovery eligibility is decided before startup queue delivery begins. Hot reload does not recheck admitted runs against the latest workflow sources, so follow-up turns, cancellation, and `/new` retain their existing behavior. Changing an authored workflow body while it is running can likewise cause replay failure.
251
+
252
+ With the built-in local Workflow World, `eve dev` cancels unfinished runs whose runtime snapshots are missing, at startup and after snapshot pruning. This includes waiting conversations and session timeout workflows. Cancellation records the reason in the run history without a terminal warning; normal run-data retention still applies. Stopping `eve dev` does not cancel runs whose snapshots remain available, but recovering them on the next start requires `--resume`.
253
+
254
+ Recovery limits:
255
+
256
+ - Custom Workflow Worlds do not use this cleanup and recovery policy; `eve dev --resume` rejects them.
257
+ - `eve dev --resume` refuses to attach to an already running local server. The flag requires starting a server.
258
+ - `eve dev --resume` recovers workflows, not the terminal transcript or a particular TUI conversation.
259
+
239
260
  ## `eve remote`
240
261
 
241
262
  Use `eve remote` only with an explicit existing agent URL:
@@ -169,6 +169,8 @@ export default askQuestion();
169
169
 
170
170
  `ask_question` is an ordinary [workflow tool](/docs/tools/workflows) built on `ctx.ask()`. Write your own workflow tool with `ctx.ask()` when you need a different schema or want to act on the answer in the same call. Without any asking tool, the model asks in its reply text and the user's next message carries the answer.
171
171
 
172
+ In a custom workflow tool, an answered `ctx.ask()` returns the authenticated responder's `authenticator`, `principalId`, and `principalType` when that identity is available. It does not include channel attributes. `ctx.session.auth.current` remains the run's auth snapshot; use the response's `responder` to identify who answered.
173
+
172
174
  ## How pause and resume works
173
175
 
174
176
  Approvals and questions share one protocol:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.67.2",
3
+ "version": "0.68.0",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [
@@ -368,6 +368,24 @@
368
368
  "import": "./dist/src/extensions/code/extension/lib/prwatch.js",
369
369
  "default": "./dist/src/extensions/code/extension/lib/prwatch.js"
370
370
  },
371
+ "./computer-use": {
372
+ "eve-source": "./dist/src/computer-use/extension/extension.js",
373
+ "types": "./dist/src/computer-use/extension/extension.d.ts",
374
+ "import": "./dist/src/computer-use/extension/extension.js",
375
+ "default": "./dist/src/computer-use/extension/extension.js"
376
+ },
377
+ "./computer-use/tools": {
378
+ "eve-source": "./dist/src/computer-use/tools.js",
379
+ "types": "./dist/src/computer-use/tools.d.ts",
380
+ "import": "./dist/src/computer-use/tools.js",
381
+ "default": "./dist/src/computer-use/tools.js"
382
+ },
383
+ "./computer-use/sandbox": {
384
+ "eve-source": "./dist/src/computer-use/extension/lib/sandbox.js",
385
+ "types": "./dist/src/computer-use/extension/lib/sandbox.d.ts",
386
+ "import": "./dist/src/computer-use/extension/lib/sandbox.js",
387
+ "default": "./dist/src/computer-use/extension/lib/sandbox.js"
388
+ },
371
389
  "./extension": {
372
390
  "types": "./dist/src/public/extension/index.d.ts",
373
391
  "import": "./dist/src/public/extension/index.js",
@@ -553,8 +571,8 @@
553
571
  "shadcn": "4.18.0",
554
572
  "svelte": "^5.0.0",
555
573
  "turndown": "7.2.4",
556
- "vite": "^8.1.5",
557
- "vitest": "4.1.10",
574
+ "vite": "^8.3.1",
575
+ "vitest": "5.0.2",
558
576
  "vue": "^3.5.0",
559
577
  "zod": "4.5.4",
560
578
  "zod-validation-error": "5.0.0"
@@ -598,6 +616,9 @@
598
616
  },
599
617
  "./extensions/code": {
600
618
  "dist": "./dist/src/extensions/code/extension"
619
+ },
620
+ "./computer-use": {
621
+ "dist": "./dist/src/computer-use/extension"
601
622
  }
602
623
  }
603
624
  },
@@ -1,4 +0,0 @@
1
- /** Distinguishes authored admission failures from failed runtime lifecycle work. */
2
- export declare class BoundaryHookError extends Error {
3
- constructor(cause: unknown);
4
- }
@@ -1 +0,0 @@
1
- import{toErrorMessage}from"#shared/errors.js";var BoundaryHookError=class extends Error{constructor(e){super(toErrorMessage(e),{cause:e}),this.name=`BoundaryHookError`}};export{BoundaryHookError};