eve 0.23.0 → 0.24.1

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 (179) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/src/channel/types.d.ts +1 -1
  3. package/dist/src/cli/run.d.ts +2 -2
  4. package/dist/src/cli/run.js +1 -1
  5. package/dist/src/compiled/.vendor-stamp.json +11 -11
  6. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +1 -1
  7. package/dist/src/compiled/@ai-sdk/anthropic/index.js +2 -2
  8. package/dist/src/compiled/@ai-sdk/google/index.d.ts +7 -0
  9. package/dist/src/compiled/@ai-sdk/google/index.js +6 -6
  10. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +42 -1
  11. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  12. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +34 -6
  13. package/dist/src/compiled/@ai-sdk/openai/index.js +2 -2
  14. package/dist/src/compiled/@ai-sdk/otel/index.js +1 -1
  15. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +245 -3
  16. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +273 -15
  17. package/dist/src/compiled/@workflow/core/index.js +1 -1
  18. package/dist/src/compiled/@workflow/core/runtime/start.d.ts +12 -0
  19. package/dist/src/compiled/@workflow/core/runtime.js +1 -1
  20. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  21. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  22. package/dist/src/compiled/@workflow/world/analytics.d.ts +56 -21
  23. package/dist/src/compiled/@workflow/world/index.d.ts +1 -1
  24. package/dist/src/compiled/@workflow/world/interfaces.d.ts +46 -0
  25. package/dist/src/compiled/@workflow/world/queue.d.ts +12 -0
  26. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  27. package/dist/src/compiled/@workflow/world-vercel/index.js +16 -16
  28. package/dist/src/compiled/_chunks/workflow/attribute-changes-MGTOG_uX.js +20 -0
  29. package/dist/src/compiled/_chunks/workflow/{dist-CQenixFf.js → dist-Blxnyb7-.js} +2 -2
  30. package/dist/src/compiled/_chunks/workflow/dist-zLevmMyU.js +77 -0
  31. package/dist/src/compiled/_chunks/workflow/{resume-hook-BH01MfRF.js → resume-hook-DHP5ql3-.js} +1 -1
  32. package/dist/src/compiled/_chunks/workflow/run-D8hv1ptT.js +1 -0
  33. package/dist/src/compiled/_chunks/workflow/{sleep-BkAHCD_s.js → sleep-uA9pS-PT.js} +1 -1
  34. package/dist/src/compiler/artifacts.d.ts +7 -6
  35. package/dist/src/compiler/artifacts.js +1 -1
  36. package/dist/src/compiler/compile-agent.d.ts +15 -2
  37. package/dist/src/compiler/compile-agent.js +3 -3
  38. package/dist/src/compiler/manifest.d.ts +12 -6
  39. package/dist/src/compiler/manifest.js +1 -1
  40. package/dist/src/compiler/normalize-agent-config.js +1 -1
  41. package/dist/src/compiler/normalize-extension.js +1 -1
  42. package/dist/src/compiler/normalize-manifest.js +2 -2
  43. package/dist/src/compiler/normalize-tool.d.ts +2 -1
  44. package/dist/src/compiler/normalize-tool.js +1 -1
  45. package/dist/src/context/build-base-tool-context.d.ts +5 -1
  46. package/dist/src/context/build-base-tool-context.js +1 -1
  47. package/dist/src/context/build-dynamic-tools.js +1 -1
  48. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  49. package/dist/src/execution/create-session-step.js +1 -1
  50. package/dist/src/execution/node-step.d.ts +2 -3
  51. package/dist/src/execution/node-step.js +1 -1
  52. package/dist/src/execution/run-session-limits.d.ts +0 -9
  53. package/dist/src/execution/run-session-limits.js +1 -1
  54. package/dist/src/execution/sandbox/prewarm.d.ts +1 -0
  55. package/dist/src/execution/sandbox/prewarm.js +1 -1
  56. package/dist/src/execution/subagent-tool.js +1 -1
  57. package/dist/src/execution/tool-auth.js +1 -1
  58. package/dist/src/harness/instrumentation-runtime-context.d.ts +1 -1
  59. package/dist/src/harness/tool-loop.js +3 -1
  60. package/dist/src/harness/types.d.ts +5 -7
  61. package/dist/src/harness/workflow-subagent-limit.d.ts +2 -2
  62. package/dist/src/internal/application/build-workspace.d.ts +36 -0
  63. package/dist/src/internal/application/build-workspace.js +1 -0
  64. package/dist/src/internal/application/compiled-artifacts.d.ts +12 -1
  65. package/dist/src/internal/application/compiled-artifacts.js +5 -4
  66. package/dist/src/internal/application/output-publication-artifacts.d.ts +7 -0
  67. package/dist/src/internal/application/output-publication-artifacts.js +1 -0
  68. package/dist/src/internal/application/output-publication-journal.d.ts +30 -0
  69. package/dist/src/internal/application/output-publication-journal.js +1 -0
  70. package/dist/src/internal/application/output-publication-lock.d.ts +10 -0
  71. package/dist/src/internal/application/output-publication-lock.js +1 -0
  72. package/dist/src/internal/application/output-publication.d.ts +33 -0
  73. package/dist/src/internal/application/output-publication.js +1 -0
  74. package/dist/src/internal/application/package.js +1 -1
  75. package/dist/src/internal/application/production-compiler-artifacts.d.ts +4 -0
  76. package/dist/src/internal/application/production-compiler-artifacts.js +1 -0
  77. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  78. package/dist/src/internal/authored-definition/core.js +1 -1
  79. package/dist/src/internal/authored-definition/schema-backed.d.ts +3 -2
  80. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  81. package/dist/src/internal/authored-directive-prologue.d.ts +4 -0
  82. package/dist/src/internal/authored-directive-prologue.js +1 -0
  83. package/dist/src/internal/authored-module-loader.d.ts +15 -5
  84. package/dist/src/internal/authored-module-loader.js +4 -2
  85. package/dist/src/internal/authored-module-map-loader.js +1 -1
  86. package/dist/src/internal/authored-module.d.ts +4 -0
  87. package/dist/src/internal/authored-module.js +1 -1
  88. package/dist/src/internal/authored-package-boundary.d.ts +25 -0
  89. package/dist/src/internal/authored-package-boundary.js +1 -0
  90. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  91. package/dist/src/internal/bundler/nitro-node-file-trace.d.ts +10 -0
  92. package/dist/src/internal/bundler/nitro-node-file-trace.js +1 -0
  93. package/dist/src/internal/materialize-authored-external-dependencies.d.ts +10 -0
  94. package/dist/src/internal/materialize-authored-external-dependencies.js +2 -0
  95. package/dist/src/internal/materialized-authored-modules.d.ts +15 -0
  96. package/dist/src/internal/materialized-authored-modules.js +1 -0
  97. package/dist/src/internal/nitro/dev-runtime-artifacts.d.ts +1 -9
  98. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  99. package/dist/src/internal/nitro/development-generation.d.ts +12 -0
  100. package/dist/src/internal/nitro/development-generation.js +1 -0
  101. package/dist/src/internal/nitro/host/artifacts-config.d.ts +9 -11
  102. package/dist/src/internal/nitro/host/artifacts-config.js +1 -1
  103. package/dist/src/internal/nitro/host/build-application.d.ts +2 -1
  104. package/dist/src/internal/nitro/host/build-application.js +1 -1
  105. package/dist/src/internal/nitro/host/build-vercel-agent-summary.d.ts +1 -7
  106. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  107. package/dist/src/internal/nitro/host/channel-routes.d.ts +3 -3
  108. package/dist/src/internal/nitro/host/configure-nitro-routes.d.ts +9 -5
  109. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  110. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +18 -10
  111. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  112. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  113. package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.d.ts +6 -1
  114. package/dist/src/internal/nitro/host/dispatch-schedule-in-dev.js +1 -1
  115. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +13 -5
  116. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  117. package/dist/src/internal/nitro/host/schedule-task-routes.d.ts +3 -3
  118. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  119. package/dist/src/internal/nitro/host/types.d.ts +4 -0
  120. package/dist/src/internal/nitro/host/vercel-build-prewarm.d.ts +2 -9
  121. package/dist/src/internal/nitro/host/vercel-build-prewarm.js +1 -1
  122. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  123. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  124. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.d.ts +3 -6
  125. package/dist/src/internal/nitro/routes/agent-info/load-agent-info-data.js +1 -1
  126. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  127. package/dist/src/internal/nitro/routes/dev-schedule-dispatch.d.ts +2 -3
  128. package/dist/src/internal/nitro/routes/dev-schedule-dispatch.js +1 -1
  129. package/dist/src/internal/nitro/routes/info.d.ts +1 -6
  130. package/dist/src/internal/nitro/routes/info.js +1 -1
  131. package/dist/src/internal/nitro/routes/runtime-artifacts.d.ts +9 -5
  132. package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
  133. package/dist/src/internal/workflow-bundle/build-queue.d.ts +1 -0
  134. package/dist/src/internal/workflow-bundle/build-queue.js +1 -0
  135. package/dist/src/internal/workflow-bundle/builder-support.d.ts +0 -1
  136. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  137. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  138. package/dist/src/internal/workflow-bundle/nitro-step-entry.d.ts +1 -0
  139. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  140. package/dist/src/public/channels/teams/api.d.ts +8 -0
  141. package/dist/src/public/channels/teams/api.js +2 -2
  142. package/dist/src/public/channels/teams/defaults.d.ts +2 -2
  143. package/dist/src/public/channels/teams/defaults.js +1 -1
  144. package/dist/src/public/channels/teams/hitl.d.ts +4 -0
  145. package/dist/src/public/channels/teams/hitl.js +1 -1
  146. package/dist/src/public/channels/teams/index.d.ts +1 -1
  147. package/dist/src/public/channels/teams/teamsChannel.d.ts +6 -0
  148. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  149. package/dist/src/public/definitions/tool.d.ts +40 -24
  150. package/dist/src/public/definitions/tool.js +1 -1
  151. package/dist/src/public/instrumentation/index.d.ts +3 -3
  152. package/dist/src/public/tools/index.d.ts +1 -1
  153. package/dist/src/public/tools/index.js +1 -1
  154. package/dist/src/runtime/resolve-agent.js +1 -1
  155. package/dist/src/runtime/types.d.ts +6 -6
  156. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  157. package/dist/src/setup/scaffold/create/project.js +2 -2
  158. package/dist/src/setup/scaffold/update/channels.js +1 -1
  159. package/dist/src/shared/agent-definition.d.ts +0 -16
  160. package/dist/src/shared/atomic-write-file.d.ts +11 -0
  161. package/dist/src/shared/atomic-write-file.js +1 -0
  162. package/dist/src/shared/dynamic-tool-definition.d.ts +2 -0
  163. package/dist/src/shared/guards.d.ts +7 -0
  164. package/dist/src/shared/guards.js +1 -1
  165. package/dist/src/shared/path-exists.d.ts +9 -0
  166. package/dist/src/shared/path-exists.js +1 -0
  167. package/docs/agent-config.md +8 -8
  168. package/docs/channels/teams.mdx +5 -1
  169. package/docs/concepts/default-harness.md +5 -3
  170. package/docs/guides/deployment.md +3 -3
  171. package/docs/guides/dynamic-workflows.md +9 -10
  172. package/docs/reference/cli.md +4 -2
  173. package/docs/reference/typescript-api.md +27 -27
  174. package/docs/subagents.mdx +1 -1
  175. package/docs/tools/overview.mdx +1 -0
  176. package/package.json +14 -14
  177. package/dist/src/compiled/_chunks/workflow/attribute-changes-Dmf_myUv.js +0 -20
  178. package/dist/src/compiled/_chunks/workflow/dist-D7CzPkf8.js +0 -77
  179. package/dist/src/compiled/_chunks/workflow/run-CL3mguvM.js +0 -1
@@ -0,0 +1 @@
1
+ import{rename,rm,writeFile}from"node:fs/promises";const REPLACE_RETRY_DELAYS_MS=[10,20,40,80,160,320,640];async function atomicWriteFile(e,r){let i=`${e}.tmp-${process.pid}-${Date.now().toString(36)}`;await writeFile(i,r);try{await renameReplacingBusyTarget(i,e)}catch(e){throw await rm(i,{force:!0}).catch(()=>void 0),e}}async function renameReplacingBusyTarget(t,n){for(let i of REPLACE_RETRY_DELAYS_MS)try{await rename(t,n);return}catch(e){if(!isBusyTargetError(e))throw e;await new Promise(e=>setTimeout(e,i))}await rename(t,n)}function isBusyTargetError(e){return e instanceof Error&&`code`in e&&(e.code===`EPERM`||e.code===`EACCES`)}export{atomicWriteFile};
@@ -7,6 +7,8 @@ import type { HandleMessageStreamEvent } from "#protocol/message.js";
7
7
  type ToolContext = SessionContext & {
8
8
  /** Aborts when the active turn is cancelled. */
9
9
  readonly abortSignal: AbortSignal;
10
+ /** Final runtime name of the current tool. */
11
+ readonly toolName: string;
10
12
  };
11
13
  /**
12
14
  * Stream event types allowed for dynamic tool resolvers. Dispatch
@@ -35,6 +35,13 @@ export declare function isNonEmptyString(value: unknown): value is string;
35
35
  * that accidentally return a Promise instead of a plain record.
36
36
  */
37
37
  export declare function isThenable(value: unknown): value is PromiseLike<unknown>;
38
+ /**
39
+ * Returns `true` when `error` is an `Error` carrying the given Node.js
40
+ * `errno` code (`"ENOENT"`, `"EEXIST"`, ...). Filesystem control flow
41
+ * routinely branches on these codes; this guard keeps the
42
+ * `"code" in error` duck-typing in one place.
43
+ */
44
+ export declare function isErrnoCode(error: unknown, code: string): boolean;
38
45
  /**
39
46
  * Returns `true` when `value` is a plain object record — `{}`,
40
47
  * `Object.create(null)`, or an object whose prototype is
@@ -1 +1 @@
1
- function isObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isNonEmptyString(e){return typeof e==`string`&&e.length>0}function isThenable(e){return isObject(e)&&typeof e.then==`function`}function isPlainRecord(e){if(!isObject(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}export{isNonEmptyString,isObject,isPlainRecord,isThenable};
1
+ function isObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isNonEmptyString(e){return typeof e==`string`&&e.length>0}function isThenable(e){return isObject(e)&&typeof e.then==`function`}function isErrnoCode(e,t){return e instanceof Error&&`code`in e&&e.code===t}function isPlainRecord(e){if(!isObject(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}export{isErrnoCode,isNonEmptyString,isObject,isPlainRecord,isThenable};
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Returns `true` when `path` exists, `false` when it does not, and
3
+ * rethrows every other filesystem error (`EACCES`, `EIO`, ...).
4
+ *
5
+ * Distinct from `#setup/path-exists.js`, which swallows all errors:
6
+ * callers here make crash-recovery decisions, so a permission failure
7
+ * must surface rather than masquerade as "does not exist".
8
+ */
9
+ export declare function pathExists(path: string): Promise<boolean>;
@@ -0,0 +1 @@
1
+ import{stat}from"node:fs/promises";import{isErrnoCode}from"#shared/guards.js";async function pathExists(t){try{return await stat(t),!0}catch(e){if(isErrnoCode(e,`ENOENT`))return!1;throw e}}export{pathExists};
@@ -203,14 +203,14 @@ installed package must stay external in hosted output, list it in
203
203
 
204
204
  `defineAgent` takes a few more fields, all optional. For the exported types, see the [TypeScript API](./reference/typescript-api).
205
205
 
206
- | Field | Type | Default | Description |
207
- | -------------- | --------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208
- | `reasoning` | `AgentReasoningDefinition` | provider default | Provider-agnostic reasoning effort forwarded to the agent's turn model calls. |
209
- | `modelOptions` | `AgentModelOptionsDefinition` | none | Provider option overrides forwarded to the model call. |
210
- | `limits` | `AgentLimitsDefinition` | field-specific | Framework-owned runtime limits. `maxInputTokensPerSession` defaults to `40_000_000` for root sessions, and delegated subagent sessions inherit the parent's remaining quota; `maxOutputTokensPerSession` is unset unless configured; `false` uncaps a session token limit. `maxSubagents` limits calls made by one `Workflow` invocation. |
211
- | `experimental` | `{ workflow?: { world?: string } }` | unset | Opt-in settings that can change or disappear in any release. Treat them as unstable. `workflow.world` selects the Workflow world package backing session state, queues, hooks, and streams on the root agent. |
212
- | `outputSchema` | Standard Schema or a JSON Schema object | none | Structured return type for task-mode runs (a subagent, schedule, or remote job). Interactive conversation turns ignore it unless the client supplies a per-message schema. |
213
- | `build` | `{ externalDependencies?: string[] }` | none | Hosted-build packaging controls. `externalDependencies` keeps listed packages external while eve compiles authored modules such as tools and channels, and traces those packages into the hosted output. |
206
+ | Field | Type | Default | Description |
207
+ | -------------- | --------------------------------------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208
+ | `reasoning` | `AgentReasoningDefinition` | provider default | Provider-agnostic reasoning effort forwarded to the agent's turn model calls. |
209
+ | `modelOptions` | `AgentModelOptionsDefinition` | none | Provider option overrides forwarded to the model call. |
210
+ | `limits` | `AgentLimitsDefinition` | field-specific | Framework-owned runtime limits. `maxInputTokensPerSession` defaults to `40_000_000` for root sessions, and delegated subagent sessions inherit the parent's remaining quota; `maxOutputTokensPerSession` is unset unless configured; `false` uncaps a session token limit. |
211
+ | `experimental` | `{ workflow?: { world?: string } }` | unset | Opt-in settings that can change or disappear in any release. Treat them as unstable. `workflow.world` selects the Workflow world package backing session state, queues, hooks, and streams on the root agent. |
212
+ | `outputSchema` | Standard Schema or a JSON Schema object | none | Structured return type for task-mode runs (a subagent, schedule, or remote job). Interactive conversation turns ignore it unless the client supplies a per-message schema. |
213
+ | `build` | `{ externalDependencies?: string[] }` | none | Hosted-build packaging controls. `externalDependencies` keeps listed packages external while eve compiles authored modules such as tools and channels, and traces those packages into the hosted output. |
214
214
 
215
215
  `externalDependencies` is a packaging control only. It keeps selected packages as runtime dependencies in the hosted output; it does not authorize, configure, or review any third-party service those packages may call.
216
216
 
@@ -45,7 +45,11 @@ Replies post as Markdown (`textFormat: "markdown"`), with oversized text split a
45
45
 
46
46
  ### Human-in-the-loop (HITL)
47
47
 
48
- A human-in-the-loop (HITL) `input.requested` event renders as an Adaptive Card. Buttons and options map to `Action.Submit`, selects to `Input.ChoiceSet`, and freeform to `Input.Text`. When the user submits, the activity converts to eve `inputResponses` for you. For invokes that aren't HITL, handle them in `onInvoke(ctx, activity)`.
48
+ A human-in-the-loop (HITL) `input.requested` event renders as an Adaptive Card. Approval cards show the tool input in the card and fallback text. Buttons and options map to `Action.Submit`, selects to `Input.ChoiceSet`, and freeform to `Input.Text`. Teams may return a submission as a message or invoke; eve handles both before the normal message mention gate and resumes the thread recorded in the card.
49
+
50
+ By default, submissions use the Teams identity of the user who clicked the card. If you customize `onMessage` for an allowlist, configure the same policy in `onInputResponse`; eve otherwise rejects HITL submissions rather than bypassing the message gate.
51
+
52
+ For invokes that aren't HITL, handle them in `onInvoke(ctx, activity)`.
49
53
 
50
54
  ### Proactive sessions
51
55
 
@@ -91,13 +91,15 @@ Three moves shape the harness. The right one depends on whether the model should
91
91
 
92
92
  ## The opt-in `Workflow` tool
93
93
 
94
- An experimental `Workflow` tool ships but stays off by default. To turn it on, re-export the opt-in marker from `agent/tools/workflow.ts`:
94
+ An experimental `Workflow` tool ships but stays off by default. To turn it on, export its definition from `agent/tools/workflow.ts`:
95
95
 
96
96
  ```ts
97
- export { ExperimentalWorkflow as default } from "eve/tools";
97
+ import { experimental_workflow } from "eve/tools";
98
+
99
+ export default experimental_workflow({ maxSubagents: 100 });
98
100
  ```
99
101
 
100
- With it on, the model can orchestrate the agent's own subagents from model-authored JavaScript, all as one durable step. The tool is root-only — delegated subagent sessions never see it — and one program may dispatch at most `limits.maxSubagents` subagent calls (default 100). See [Dynamic workflows](../guides/dynamic-workflows).
102
+ With it on, the model can orchestrate the agent's own subagents from model-authored JavaScript, all as one durable step. The tool is root-only — delegated subagent sessions never see it — and one program may dispatch at most the configured `maxSubagents` calls (default 100). See [Dynamic workflows](../guides/dynamic-workflows).
101
103
 
102
104
  ## What to read next
103
105
 
@@ -99,9 +99,9 @@ For a self-deployed process, leave `defaultBackend()` in place or choose an expl
99
99
 
100
100
  ## 5. Build-time sandbox prewarm
101
101
 
102
- During hosted builds, eve prewarms reusable Vercel sandbox templates so the first session doesn't pay the cold-start cost:
102
+ During Vercel-targeted builds, eve prewarms reusable Vercel sandbox templates so the first session doesn't pay the cold-start cost. This includes hosted builds and local `vercel build` runs:
103
103
 
104
- - Prewarm runs only when both `VERCEL` and `VERCEL_DEPLOYMENT_ID` are present.
104
+ - Prewarm runs for hosted Vercel builds and linked local `vercel build` runs.
105
105
  - A sandbox with no `bootstrap()` and no workspace seed files gets skipped.
106
106
  - Seed-only templates are keyed by skills and workspace file contents, so unchanged seeds reuse a template across deploys.
107
107
  - Templates with a `bootstrap()` are keyed by the optional resolved `revalidationKey()` plus the authored sandbox source and seed contents, so matching inputs reuse a template across deploys.
@@ -109,7 +109,7 @@ During hosted builds, eve prewarms reusable Vercel sandbox templates so the firs
109
109
  - Prewarming only covers template construction. `onSession()` still runs at runtime, once per session.
110
110
  - **If build-time prewarm fails, the build fails.**
111
111
 
112
- If `VERCEL` is set but `VERCEL_DEPLOYMENT_ID` is missing, eve warns that it skipped prewarming. Do not deploy that build with `vercel deploy --prebuilt`; its output may reference sandbox templates that were never provisioned. Run `vercel deploy` instead so Vercel builds the source in its hosted build environment.
112
+ Local builds must be linked to a Vercel project with credentials that can provision Vercel Sandbox templates. If authentication or template provisioning fails, eve fails the build rather than emitting output that would fail after deployment.
113
113
 
114
114
  ## 6. Auth
115
115
 
@@ -9,10 +9,12 @@ A single turn can already call several subagents, and parallel tool calls dispat
9
9
 
10
10
  ## Enable the Workflow tool
11
11
 
12
- Re-export the opt-in marker as the default export of `agent/tools/workflow.ts`. The marker name carries the "experimental" warning, but the tool the model actually sees is named `Workflow`.
12
+ Export the experimental Workflow definition from `agent/tools/workflow.ts`. The helper name carries the "experimental" warning, but the tool the model actually sees is named `Workflow`.
13
13
 
14
14
  ```ts title="agent/tools/workflow.ts"
15
- export { ExperimentalWorkflow as default } from "eve/tools";
15
+ import { experimental_workflow } from "eve/tools";
16
+
17
+ export default experimental_workflow();
16
18
  ```
17
19
 
18
20
  Without that file, the `Workflow` tool stays off. It earns its keep only when the agent has subagents (or the built-in `agent`) worth coordinating:
@@ -55,15 +57,12 @@ A workflow reaches only this agent's own agents: the built-in `agent` (a copy of
55
57
 
56
58
  Workflow orchestration is capped in two independent ways.
57
59
 
58
- **Per-program call budget.** One Workflow program may dispatch at most `limits.maxSubagents` subagent calls in total, counted across the whole program — sequential and parallel calls alike. The default is 100. Calls beyond the budget do not start a child session; they resolve inside the program with a `WORKFLOW_SUBAGENT_LIMIT_REACHED` error result, and the budget is stated in the tool's description so the model sizes its fan-out to fit.
60
+ **Per-program call budget.** One Workflow program may dispatch at most `maxSubagents` subagent calls in total, counted across the whole program — sequential and parallel calls alike. Configure it on `experimental_workflow`; the default is 100. Calls beyond the budget do not start a child session; they resolve inside the program with a `WORKFLOW_SUBAGENT_LIMIT_REACHED` error result, and the budget is stated in the tool's description so the model sizes its fan-out to fit.
59
61
 
60
- ```ts title="agent/agent.ts"
61
- export default defineAgent({
62
- model: "anthropic/claude-sonnet-5",
63
- limits: {
64
- maxSubagents: 4,
65
- },
66
- });
62
+ ```ts title="agent/tools/workflow.ts"
63
+ import { experimental_workflow } from "eve/tools";
64
+
65
+ export default experimental_workflow({ maxSubagents: 4 });
67
66
  ```
68
67
 
69
68
  **Root-only orchestration.** Only the root session receives `Workflow`. Children started by a workflow receive neither `Workflow` nor the built-in `agent`, so Workflow programs cannot recurse. A declared child can still call subagents defined in its own directory (see [Subagents](../subagents)).
@@ -93,9 +93,11 @@ Run this first when something behaves unexpectedly. It confirms a file was disco
93
93
  eve build
94
94
  ```
95
95
 
96
- No flags. Compiles to `.eve/` and builds the host output, then prints the built output path.
96
+ Compiles and bundles in an invocation-owned directory under `.eve/builds/`, then publishes the completed host output and prints its path. Scratch workspaces are removed after success or failure.
97
97
 
98
- Useful artifacts written under `.eve/` (preserved even on partial failure):
98
+ Production builds do not write through the stable compiler, host, Nitro, or Workflow files owned by `eve dev`, so builds can run while a local dev server is active. A failed build leaves the last successful `.output/` and agent summary untouched. Concurrent completed builds serialize only the final publication window.
99
+
100
+ Useful stable artifacts written by inspection and development flows under `.eve/` include:
99
101
 
100
102
  | Artifact | Description |
101
103
  | ---------------------------------------------- | ---------------------------------------------------- |
@@ -52,7 +52,7 @@ export default defineTool({
52
52
  | `mockModel` | `eve/evals` | Deterministic fixture agent models | [Evals](../evals/overview) |
53
53
  | `useEveAgent` | `eve/react`, `eve/vue`, `eve/svelte` | frontend | [Frontend](../guides/frontend/overview) |
54
54
 
55
- A few non-`define*` helpers round out the set: `disableTool` and `ExperimentalWorkflow` from `eve/tools` (see [Default harness](../concepts/default-harness)), the route verbs `GET`/`POST`/`PUT`/`PATCH`/`DELETE`/`WS` from `eve/channels`, the approval policies `always`/`once`/`never` from `eve/tools/approval`, and the channel auth helpers `localDev`/`vercelOidc`/`placeholderAuth` from `eve/channels/auth`. To wrap a built-in tool, import its default value from `eve/tools/defaults` (`bash`, `readFile`, `writeFile`, `glob`, `grep`, `webFetch`, `webSearch`, `todo`, `loadSkill`). `AgentReasoningDefinition` is exported from `eve` for the top-level `defineAgent({ reasoning })` setting. `AgentLimitsDefinition` is exported for `defineAgent({ limits })`. `AgentWorkflowDefinition` and `AgentWorkflowWorldDefinition` are exported from `eve` for the `defineAgent({ experimental: { workflow } })` config shape.
55
+ A few non-`define*` helpers round out the set: `disableTool` and `experimental_workflow` from `eve/tools` (see [Default harness](../concepts/default-harness)), the route verbs `GET`/`POST`/`PUT`/`PATCH`/`DELETE`/`WS` from `eve/channels`, the approval policies `always`/`once`/`never` from `eve/tools/approval`, and the channel auth helpers `localDev`/`vercelOidc`/`placeholderAuth` from `eve/channels/auth`. To wrap a built-in tool, import its default value from `eve/tools/defaults` (`bash`, `readFile`, `writeFile`, `glob`, `grep`, `webFetch`, `webSearch`, `todo`, `loadSkill`). `AgentReasoningDefinition` is exported from `eve` for the top-level `defineAgent({ reasoning })` setting. `AgentLimitsDefinition` is exported for `defineAgent({ limits })`. `AgentWorkflowDefinition` and `AgentWorkflowWorldDefinition` are exported from `eve` for the `defineAgent({ experimental: { workflow } })` config shape. `ExperimentalWorkflowToolInput` is exported from `eve/tools` for the `experimental_workflow(...)` config shape.
56
56
 
57
57
  ## Runtime context (`ctx`)
58
58
 
@@ -68,32 +68,32 @@ A few non-`define*` helpers round out the set: `disableTool` and `ExperimentalWo
68
68
 
69
69
  ## Imports at a glance
70
70
 
71
- | Import | Holds |
72
- | ----------------------------------------------------------- | -------------------------------------------------------------------- |
73
- | `eve` | `defineAgent`, `defineRemoteAgent`, agent config types |
74
- | `eve/tools` | `defineTool`, `defineDynamic`, `disableTool`, `ExperimentalWorkflow` |
75
- | `eve/tools/defaults` | the built-in tools as plain values |
76
- | `eve/tools/approval` | `always`, `once`, `never` |
77
- | `eve/connections` | `defineMcpClientConnection`, `defineOpenAPIConnection` |
78
- | `eve/channels` | `defineChannel`, route verbs |
79
- | `eve/channels/eve` | `eveChannel` |
80
- | `eve/channels/auth` | `localDev`, `vercelOidc`, `placeholderAuth` |
81
- | `eve/channels/{slack,discord,teams,telegram,twilio,github}` | platform channel factories |
82
- | `eve/hooks` | `defineHook` |
83
- | `eve/schedules` | `defineSchedule` |
84
- | `eve/skills` | `defineSkill`, `defineDynamic` |
85
- | `eve/instructions` | `defineInstructions`, `defineDynamic` |
86
- | `eve/context` | `defineState`, session and state types |
87
- | `eve/sandbox` | `defineSandbox`, backends |
88
- | `eve/instrumentation` | `defineInstrumentation`, `isChannel` |
89
- | `eve/models/openai` | `experimental_chatgpt` |
90
- | `eve/evals` | `defineEval`, `defineEvalConfig`, `mockModel`, eval types |
91
- | `eve/evals/expect` | `includes`, `equals`, `matches`, `similarity` |
92
- | `eve/evals/reporters` | `Braintrust`, `JUnit`, `EvalReporter` |
93
- | `eve/evals/loaders` | `loadJson`, `loadYaml` |
94
- | `eve/react`, `eve/vue`, `eve/svelte` | `useEveAgent` |
95
- | `eve/next`, `eve/nuxt`, `eve/sveltekit` | framework bundler plugins |
96
- | [`eve/client`](../guides/client/overview) | `Client`, `ClientSession` |
71
+ | Import | Holds |
72
+ | ----------------------------------------------------------- | --------------------------------------------------------------------- |
73
+ | `eve` | `defineAgent`, `defineRemoteAgent`, agent config types |
74
+ | `eve/tools` | `defineTool`, `defineDynamic`, `disableTool`, `experimental_workflow` |
75
+ | `eve/tools/defaults` | the built-in tools as plain values |
76
+ | `eve/tools/approval` | `always`, `once`, `never` |
77
+ | `eve/connections` | `defineMcpClientConnection`, `defineOpenAPIConnection` |
78
+ | `eve/channels` | `defineChannel`, route verbs |
79
+ | `eve/channels/eve` | `eveChannel` |
80
+ | `eve/channels/auth` | `localDev`, `vercelOidc`, `placeholderAuth` |
81
+ | `eve/channels/{slack,discord,teams,telegram,twilio,github}` | platform channel factories |
82
+ | `eve/hooks` | `defineHook` |
83
+ | `eve/schedules` | `defineSchedule` |
84
+ | `eve/skills` | `defineSkill`, `defineDynamic` |
85
+ | `eve/instructions` | `defineInstructions`, `defineDynamic` |
86
+ | `eve/context` | `defineState`, session and state types |
87
+ | `eve/sandbox` | `defineSandbox`, backends |
88
+ | `eve/instrumentation` | `defineInstrumentation`, `isChannel` |
89
+ | `eve/models/openai` | `experimental_chatgpt` |
90
+ | `eve/evals` | `defineEval`, `defineEvalConfig`, `mockModel`, eval types |
91
+ | `eve/evals/expect` | `includes`, `equals`, `matches`, `similarity` |
92
+ | `eve/evals/reporters` | `Braintrust`, `JUnit`, `EvalReporter` |
93
+ | `eve/evals/loaders` | `loadJson`, `loadYaml` |
94
+ | `eve/react`, `eve/vue`, `eve/svelte` | `useEveAgent` |
95
+ | `eve/next`, `eve/nuxt`, `eve/sveltekit` | framework bundler plugins |
96
+ | [`eve/client`](../guides/client/overview) | `Client`, `ClientSession` |
97
97
 
98
98
  Exported types ship from the same entrypoint as the helper they describe (for example `ToolDefinition` and `ToolContext` from `eve/tools`). For the exhaustive list, read `packages/eve/src/public/index.ts`.
99
99
 
@@ -81,7 +81,7 @@ eve lowers every subagent visible to the current agent (the root built-in copy,
81
81
 
82
82
  Declared subagents can call nested subagents defined under their own directories. eve does not apply a separate depth limit; nesting ends where the authored directory tree ends. The built-in `agent` follows the stricter root-only rule above, so `limits.maxSubagentDepth` no longer exists.
83
83
 
84
- `Workflow` is also root-only. Child sessions can still call their own declared or remote subagents, but they receive neither `Workflow` nor the built-in `agent`. `limits.maxSubagents` separately caps the number of calls made by one Workflow program (default 100); see [Dynamic workflows](./guides/dynamic-workflows).
84
+ `Workflow` is also root-only. Child sessions can still call their own declared or remote subagents, but they receive neither `Workflow` nor the built-in `agent`. The Workflow tool's `maxSubagents` option caps the number of calls made by one program (default 100); see [Dynamic workflows](./guides/dynamic-workflows).
85
85
 
86
86
  A declared subagent's tool name is the bare path-derived name, with no prefix. `agent/subagents/researcher/` registers as the tool `researcher`. Unlike connection tools (`<connection>__<tool>`), it carries no namespace, so the model, approvals, logs, and evals all reference it by that name. Its input schema is:
87
87
 
@@ -38,6 +38,7 @@ When a tool returns structured data, add an optional `outputSchema`. With Zod or
38
38
 
39
39
  - `ctx.session`: session metadata, turn, auth, parent lineage.
40
40
  - `ctx.callId`: the id of the current tool call, carried by the call's [stream events](/docs/concepts/sessions-runs-and-streaming) and approval context.
41
+ - `ctx.toolName`: the final runtime name the model called, including any namespace qualification.
41
42
  - `ctx.abortSignal`: aborts when the active turn is cancelled. Pass it to cancellation-aware work; sandbox sessions from `ctx.getSandbox()` are already bound to it.
42
43
  - `ctx.getSandbox()`: the live [sandbox](/docs/sandbox) handle.
43
44
  - `ctx.getSkill(id)`: read a packaged [skill](/docs/skills)'s metadata and files.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.23.0",
3
+ "version": "0.24.1",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [
@@ -282,13 +282,13 @@
282
282
  "nitro": "3.0.260610-beta"
283
283
  },
284
284
  "devDependencies": {
285
- "@ai-sdk/anthropic": "^4.0.0",
286
- "@ai-sdk/google": "^4.0.0",
287
- "@ai-sdk/mcp": "^2.0.1",
288
- "@ai-sdk/openai": "^4.0.0",
289
- "@ai-sdk/otel": "^1.0.0",
290
- "@ai-sdk/provider": "^4.0.0",
291
- "@ai-sdk/provider-utils": "^5.0.0",
285
+ "@ai-sdk/anthropic": "^4.0.14",
286
+ "@ai-sdk/google": "^4.0.14",
287
+ "@ai-sdk/mcp": "^2.0.12",
288
+ "@ai-sdk/openai": "^4.0.13",
289
+ "@ai-sdk/otel": "^1.0.26",
290
+ "@ai-sdk/provider": "^4.0.3",
291
+ "@ai-sdk/provider-utils": "^5.0.9",
292
292
  "@chat-adapter/slack": "4.31.0",
293
293
  "@chat-adapter/state-memory": "4.31.0",
294
294
  "@chat-adapter/twilio": "4.31.0",
@@ -303,14 +303,14 @@
303
303
  "@vercel/oidc": "3.5.0",
304
304
  "@vercel/sandbox": "2.3.0",
305
305
  "@vercel/sdk": "1.28.1",
306
- "@workflow/core": "5.0.0-beta.31",
306
+ "@workflow/core": "5.0.0-beta.34",
307
307
  "@workflow/errors": "5.0.0-beta.10",
308
308
  "@workflow/serde": "5.0.0-beta.2",
309
309
  "@workflow/utils": "5.0.0-beta.6",
310
- "@workflow/world": "5.0.0-beta.19",
311
- "@workflow/world-local": "5.0.0-beta.27",
312
- "@workflow/world-vercel": "5.0.0-beta.27",
313
- "ai": "^7.0.0",
310
+ "@workflow/world": "5.0.0-beta.20",
311
+ "@workflow/world-local": "5.0.0-beta.28",
312
+ "@workflow/world-vercel": "5.0.0-beta.30",
313
+ "ai": "^7.0.26",
314
314
  "autoevals": "0.0.132",
315
315
  "chat": "4.31.0",
316
316
  "chokidar": "5.0.0",
@@ -339,7 +339,7 @@
339
339
  },
340
340
  "peerDependencies": {
341
341
  "@opentelemetry/api": "^1.0.0",
342
- "ai": "^7.0.0",
342
+ "ai": "^7.0.26",
343
343
  "braintrust": "^3.0.0",
344
344
  "just-bash": "^3.0.0",
345
345
  "microsandbox": "^0.5.0"