eve 0.64.0 → 0.65.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 (211) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/src/channel/resolve-text.d.ts +11 -7
  3. package/dist/src/channel/resolve-text.js +1 -1
  4. package/dist/src/channel/types.d.ts +4 -5
  5. package/dist/src/chunks/{use-eve-agent-BdKlQF32.js → use-eve-agent-BIouJCii.js} +2 -10
  6. package/dist/src/chunks/{use-eve-agent-IIuxkn6y.js → use-eve-agent-BRvEh9sO.js} +2 -10
  7. package/dist/src/cli/commands/registry-pnpm-build-policy-flow.d.ts +1 -1
  8. package/dist/src/cli/commands/registry-pnpm-build-policy-flow.js +1 -1
  9. package/dist/src/cli/dev/command-options.d.ts +1 -0
  10. package/dist/src/cli/dev/command.js +2 -2
  11. package/dist/src/cli/dev/local-server-process.js +1 -1
  12. package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
  13. package/dist/src/cli/dev/tui/blocks.js +1 -1
  14. package/dist/src/cli/dev/tui/question-panel.d.ts +3 -2
  15. package/dist/src/cli/dev/tui/rail.d.ts +1 -1
  16. package/dist/src/cli/dev/tui/runner.d.ts +0 -1
  17. package/dist/src/cli/dev/tui/runner.js +2 -2
  18. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +0 -1
  19. package/dist/src/cli/dev/tui/terminal-renderer.js +11 -12
  20. package/dist/src/cli/dev/tui/theme.d.ts +1 -1
  21. package/dist/src/cli/dev/tui/tool-presentation.d.ts +4 -4
  22. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  23. package/dist/src/client/agent-info-schema.d.ts +0 -2
  24. package/dist/src/client/agent-info-schema.js +1 -1
  25. package/dist/src/compiled/.vendor-stamp.json +1 -2
  26. package/dist/src/compiler/artifacts.d.ts +2 -0
  27. package/dist/src/compiler/artifacts.js +1 -1
  28. package/dist/src/compiler/bundled-extension.d.ts +17 -0
  29. package/dist/src/compiler/bundled-extension.js +1 -0
  30. package/dist/src/compiler/compile-agent.d.ts +4 -0
  31. package/dist/src/compiler/compile-agent.js +1 -1
  32. package/dist/src/compiler/compile-from-memory.js +1 -1
  33. package/dist/src/compiler/development-extensions.d.ts +23 -0
  34. package/dist/src/compiler/development-extensions.js +1 -0
  35. package/dist/src/compiler/extension-compatibility.d.ts +2 -2
  36. package/dist/src/compiler/extension-compatibility.js +1 -1
  37. package/dist/src/compiler/load-binding-namespace.js +1 -1
  38. package/dist/src/compiler/manifest.js +1 -1
  39. package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
  40. package/dist/src/compiler/normalize-manifest-types.d.ts +23 -0
  41. package/dist/src/compiler/normalize-manifest-types.js +1 -0
  42. package/dist/src/compiler/normalize-manifest.d.ts +2 -7
  43. package/dist/src/compiler/normalize-manifest.js +1 -1
  44. package/dist/src/compiler/source-graph-paths.d.ts +2 -0
  45. package/dist/src/compiler/source-graph-paths.js +1 -0
  46. package/dist/src/compiler/source-graph.d.ts +4 -1
  47. package/dist/src/compiler/source-graph.js +1 -1
  48. package/dist/src/context/dynamic-skill-lifecycle.js +1 -1
  49. package/dist/src/discover/bundled-extension.d.ts +11 -0
  50. package/dist/src/discover/bundled-extension.js +1 -0
  51. package/dist/src/discover/discover-agent.js +1 -1
  52. package/dist/src/discover/manifest.d.ts +5 -0
  53. package/dist/src/evals/assertions/collector.js +1 -1
  54. package/dist/src/evals/cli/eval.js +2 -2
  55. package/dist/src/evals/runner/artifacts.js +1 -1
  56. package/dist/src/evals/types.d.ts +2 -0
  57. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  58. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  59. package/dist/src/execution/node-step.d.ts +2 -4
  60. package/dist/src/execution/node-step.js +1 -1
  61. package/dist/src/execution/proxied-deliver-step.js +1 -1
  62. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  63. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  64. package/dist/src/execution/sandbox/development-lazy-prewarm.d.ts +7 -0
  65. package/dist/src/execution/sandbox/development-lazy-prewarm.js +1 -0
  66. package/dist/src/execution/sandbox/ensure.js +1 -1
  67. package/dist/src/execution/sandbox/glob-tool.js +1 -1
  68. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  69. package/dist/src/execution/sandbox/prewarm.js +1 -1
  70. package/dist/src/execution/sandbox/read-file.js +1 -1
  71. package/dist/src/execution/session/turn-step.js +1 -1
  72. package/dist/src/execution/session-workflow-tool-run.js +1 -1
  73. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  74. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  75. package/dist/src/execution/tools/ask-question-workflow.d.ts +11 -0
  76. package/dist/src/execution/tools/ask-question-workflow.js +1 -0
  77. package/dist/src/execution/tools/ask-question.d.ts +20 -0
  78. package/dist/src/execution/tools/ask-question.js +2 -0
  79. package/dist/src/execution/tools/file-state.d.ts +1 -7
  80. package/dist/src/execution/tools/file-state.js +1 -1
  81. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  82. package/dist/src/execution/tools/workflow/answer.d.ts +2 -0
  83. package/dist/src/execution/tools/workflow/answer.js +1 -1
  84. package/dist/src/execution/tools/workflow/ask.d.ts +3 -2
  85. package/dist/src/execution/tools/workflow/ask.js +1 -1
  86. package/dist/src/execution/tools/workflow/body.d.ts +5 -0
  87. package/dist/src/execution/tools/workflow/body.js +1 -1
  88. package/dist/src/execution/tools/workflow/cancel.d.ts +0 -4
  89. package/dist/src/execution/tools/workflow/cancel.js +1 -1
  90. package/dist/src/execution/tools/workflow/start.d.ts +1 -0
  91. package/dist/src/execution/tools/workflow/start.js +1 -1
  92. package/dist/src/framework/sources/registry.js +1 -1
  93. package/dist/src/harness/compaction-prompt.d.ts +0 -6
  94. package/dist/src/harness/compaction-prompt.js +2 -2
  95. package/dist/src/harness/compaction.js +1 -1
  96. package/dist/src/harness/hitl/approval-input-requests.d.ts +0 -2
  97. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  98. package/dist/src/harness/input-extraction.d.ts +4 -15
  99. package/dist/src/harness/input-extraction.js +1 -1
  100. package/dist/src/harness/input-request-class.d.ts +0 -20
  101. package/dist/src/harness/input-request-class.js +1 -1
  102. package/dist/src/harness/input-requests.d.ts +1 -1
  103. package/dist/src/harness/input-requests.js +1 -1
  104. package/dist/src/harness/pending-input-batches.d.ts +1 -1
  105. package/dist/src/harness/proxy-input-requests.d.ts +9 -1
  106. package/dist/src/harness/proxy-input-requests.js +1 -1
  107. package/dist/src/harness/stale-input-responses.d.ts +1 -2
  108. package/dist/src/harness/stale-input-responses.js +1 -1
  109. package/dist/src/harness/tool-loop.js +2 -2
  110. package/dist/src/harness/tools.d.ts +0 -9
  111. package/dist/src/harness/tools.js +1 -1
  112. package/dist/src/harness/types.d.ts +2 -9
  113. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  114. package/dist/src/internal/application/optional-package-install.d.ts +3 -0
  115. package/dist/src/internal/application/optional-package-install.js +2 -2
  116. package/dist/src/internal/application/output-publication-lock.d.ts +6 -0
  117. package/dist/src/internal/application/output-publication-lock.js +1 -1
  118. package/dist/src/internal/application/output-publication.js +1 -1
  119. package/dist/src/internal/application/package.js +1 -1
  120. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  121. package/dist/src/internal/authored-module-loader.d.ts +1 -0
  122. package/dist/src/internal/authored-module-loader.js +1 -1
  123. package/dist/src/internal/authored-runtime-modules.d.ts +1 -0
  124. package/dist/src/internal/development-programmatic-source-loader.d.ts +6 -0
  125. package/dist/src/internal/development-programmatic-source-loader.js +1 -0
  126. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  127. package/dist/src/internal/nitro/development-generation.js +1 -1
  128. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  129. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.d.ts +2 -0
  130. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  131. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  132. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.d.ts +9 -0
  133. package/dist/src/internal/nitro/host/development-runtime-prune-plugin.js +2 -0
  134. package/dist/src/internal/nitro/host/prepare-application-host.d.ts +2 -0
  135. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  136. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  137. package/dist/src/internal/nitro/host/types.d.ts +3 -0
  138. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  139. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +0 -2
  140. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  141. package/dist/src/public/next/vercel-output-config.js +1 -1
  142. package/dist/src/public/tools/ask-question.d.ts +1 -1
  143. package/dist/src/public/tools/ask-question.js +1 -1
  144. package/dist/src/runtime/agent/mock-model-fixtures.js +2 -2
  145. package/dist/src/runtime/cache-key.js +1 -1
  146. package/dist/src/runtime/sandbox/prepared-artifacts.js +1 -1
  147. package/dist/src/self-modification/extension/subagents/agent/instructions.js +6 -2
  148. package/dist/src/{cli/commands/registry-pnpm-build-policy.d.ts → setup/primitives/pm/pnpm-build-policy.d.ts} +4 -0
  149. package/dist/src/setup/primitives/pm/pnpm-build-policy.js +8 -0
  150. package/dist/src/setup/scaffold/create/project.js +1 -1
  151. package/dist/src/shared/input.d.ts +1 -6
  152. package/dist/src/shared/sandbox-provider.d.ts +2 -0
  153. package/dist/src/subagents/hitl-proxy.d.ts +11 -1
  154. package/dist/src/subagents/hitl-proxy.js +1 -1
  155. package/dist/src/svelte/index.js +1 -1
  156. package/dist/src/svelte/use-eve-agent.js +1 -1
  157. package/dist/src/tools/behavior.d.ts +2 -5
  158. package/dist/src/tools/definition.d.ts +23 -5
  159. package/dist/src/tools/provided/ask-question.d.ts +18 -0
  160. package/dist/src/tools/provided/ask-question.js +1 -0
  161. package/dist/src/tools/provided/sleep.d.ts +2 -2
  162. package/dist/src/vue/index.js +1 -1
  163. package/dist/src/vue/use-eve-agent.js +1 -1
  164. package/docs/agent-config.md +11 -11
  165. package/docs/channels/slack.mdx +1 -1
  166. package/docs/concepts/built-in-tools.md +16 -66
  167. package/docs/concepts/default-harness.md +1 -3
  168. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  169. package/docs/concepts/sessions-runs-and-streaming.md +2 -2
  170. package/docs/evals/assertions.mdx +2 -2
  171. package/docs/evals/judge.mdx +3 -3
  172. package/docs/getting-started.mdx +1 -1
  173. package/docs/guides/deployment/vercel.mdx +0 -6
  174. package/docs/guides/dev-tui.md +1 -1
  175. package/docs/guides/evaluate.md +12 -9
  176. package/docs/guides/frontend/overview.mdx +1 -1
  177. package/docs/guides/instrumentation/instrumentation.mdx +1 -1
  178. package/docs/guides/instrumentation/migration.md +1 -6
  179. package/docs/guides/instrumentation/otel.mdx +15 -47
  180. package/docs/reference/cli.md +10 -7
  181. package/docs/reference/typescript-api.md +42 -41
  182. package/docs/sandbox/index.mdx +3 -1
  183. package/docs/sandbox/just-bash.mdx +6 -0
  184. package/docs/skills.mdx +2 -0
  185. package/docs/subagents/index.mdx +7 -5
  186. package/docs/tools/human-in-the-loop.md +22 -11
  187. package/docs/tools/workflows.mdx +44 -19
  188. package/docs/tutorial/guard-the-spend.mdx +1 -1
  189. package/package.json +1 -9
  190. package/dist/src/cli/commands/registry-pnpm-build-policy.js +0 -6
  191. package/dist/src/cli/dev/tui/todo-panel.d.ts +0 -44
  192. package/dist/src/cli/dev/tui/todo-panel.js +0 -1
  193. package/dist/src/compiled/@workflow/builders/LICENSE.md +0 -201
  194. package/dist/src/compiled/@workflow/builders/index.d.ts +0 -62
  195. package/dist/src/compiled/@workflow/builders/index.js +0 -1
  196. package/dist/src/execution/compaction.d.ts +0 -14
  197. package/dist/src/execution/compaction.js +0 -1
  198. package/dist/src/execution/sandbox/development-prewarm.d.ts +0 -20
  199. package/dist/src/execution/sandbox/development-prewarm.js +0 -1
  200. package/dist/src/execution/tools/todo.d.ts +0 -91
  201. package/dist/src/execution/tools/todo.js +0 -2
  202. package/dist/src/harness/hitl/question-input-requests.d.ts +0 -15
  203. package/dist/src/harness/hitl/question-input-requests.js +0 -1
  204. package/dist/src/harness/request-input-tool.d.ts +0 -4
  205. package/dist/src/harness/request-input-tool.js +0 -1
  206. package/dist/src/public/tools/todo.d.ts +0 -3
  207. package/dist/src/public/tools/todo.js +0 -1
  208. package/dist/src/tools/framework/ask-question.d.ts +0 -38
  209. package/dist/src/tools/framework/ask-question.js +0 -1
  210. package/dist/src/tools/provided/todo.d.ts +0 -8
  211. package/dist/src/tools/provided/todo.js +0 -2
@@ -1 +1 @@
1
- import{readFile,writeFile}from"node:fs/promises";import{createSandboxPreparedArtifactsManifest,sandboxPreparedArtifactsManifestSchema}from"#shared/sandbox-prepared-artifacts.js";import{resolveRuntimeCompilerArtifactPaths}from"#runtime/loaders/artifact-paths.js";import{readBundledCompiledArtifacts}from"#runtime/loaders/bundled-artifacts.js";async function writeSandboxPreparedArtifactsManifest(e){if(e.entries.length===0)return;let t=`${e.compileDirectoryPath}/sandbox-prepared-artifacts.json`,n=null;try{n=sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(t,`utf8`)))}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let r=new Map(n?.entries.map(e=>[e.nodeId,e]));for(let t of e.entries)r.set(t.nodeId,t);await writeFile(t,`${JSON.stringify(createSandboxPreparedArtifactsManifest([...r.values()]),null,2)}\n`)}async function loadSandboxPreparedArtifact(e){let t=(await loadSandboxPreparedArtifactsManifest(e.compiledArtifactsSource))?.entries.find(t=>t.nodeId===e.nodeId);if(t!==void 0&&t.providerName!==e.providerName)throw Error(`Prepared sandbox artifact for node "${e.nodeId}" belongs to provider "${t.providerName}", not "${e.providerName}".`);return t?.artifact}async function loadSandboxPreparedArtifactsManifest(e){if(e.kind===`bundled`)return readBundledCompiledArtifacts()?.sandboxPreparedArtifacts??null;let t=resolveRuntimeCompilerArtifactPaths(e.appRoot).sandboxPreparedArtifactsPath;try{return sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(t,`utf8`)))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return null;throw e}}export{loadSandboxPreparedArtifact,loadSandboxPreparedArtifactsManifest,writeSandboxPreparedArtifactsManifest};
1
+ import{randomUUID}from"node:crypto";import{readFile,rename,rm,writeFile}from"node:fs/promises";import{createSandboxPreparedArtifactsManifest,sandboxPreparedArtifactsManifestSchema}from"#shared/sandbox-prepared-artifacts.js";import{resolveRuntimeCompilerArtifactPaths}from"#runtime/loaders/artifact-paths.js";import{readBundledCompiledArtifacts}from"#runtime/loaders/bundled-artifacts.js";async function writeSandboxPreparedArtifactsManifest(e){if(e.entries.length===0)return;let t=`${e.compileDirectoryPath}/sandbox-prepared-artifacts.json`,n=null;try{n=sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(t,`utf8`)))}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let r=new Map(n?.entries.map(e=>[e.nodeId,e]));for(let t of e.entries)r.set(t.nodeId,t);let i=`${t}.${randomUUID()}.tmp`;try{await writeFile(i,`${JSON.stringify(createSandboxPreparedArtifactsManifest([...r.values()]),null,2)}\n`),await rename(i,t)}finally{await rm(i,{force:!0})}}async function loadSandboxPreparedArtifact(e){let t=(await loadSandboxPreparedArtifactsManifest(e.compiledArtifactsSource))?.entries.find(t=>t.nodeId===e.nodeId);if(t!==void 0&&t.providerName!==e.providerName)throw Error(`Prepared sandbox artifact for node "${e.nodeId}" belongs to provider "${t.providerName}", not "${e.providerName}".`);return t?.artifact}async function loadSandboxPreparedArtifactsManifest(e){if(e.kind===`bundled`)return readBundledCompiledArtifacts()?.sandboxPreparedArtifacts??null;let t=resolveRuntimeCompilerArtifactPaths(e.appRoot).sandboxPreparedArtifactsPath;try{return sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(t,`utf8`)))}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return null;throw e}}export{loadSandboxPreparedArtifact,loadSandboxPreparedArtifactsManifest,writeSandboxPreparedArtifactsManifest};
@@ -1,4 +1,4 @@
1
- import{resolveSelfModificationConfig}from"../../../config.js";import extension_default from"../../extension.js";import{resolveSelfModificationMode}from"../../../mode.js";import{defineDynamic,defineInstructions}from"eve/instructions";function packagedSubagentGuidance(e){return e.data?.invocation?.kind===`subagent`?`This self-modification subagent is implemented by the eve package, not an authored directory under /source. Configure its model, reasoning, and policy in /source/extensions/self-modification/extension.ts; do not search for or edit a child implementation directory.`:``}function readTrace(e){return e.data?.trace}function localTraceGuidance(e){let t=readTrace(e);return t===void 0?``:`The invoking trace has ID ${t.traceId}. ${(t.traceFlags&1)==1?`If local segments were captured,`:`This trace was not sampled, so local segments may be absent. If any are present,`} inspect them at /traces/${t.traceId}.`}function renderInstructions(e){return e.filter(e=>e.length>0).join(`
1
+ import{resolveSelfModificationConfig}from"../../../config.js";import extension_default from"../../extension.js";import{resolveSelfModificationMode}from"../../../mode.js";import{defineDynamic,defineInstructions}from"eve/instructions";function readTrace(e){return e.data?.trace}function localTraceGuidance(e){let t=readTrace(e);return t===void 0?``:`The invoking trace has ID ${t.traceId}. ${(t.traceFlags&1)==1?`If local segments were captured,`:`This trace was not sampled, so local segments may be absent. If any are present,`} inspect them at /traces/${t.traceId}.`}function renderInstructions(e){return e.filter(e=>e.length>0).join(`
2
2
 
3
3
  `)}var instructions_default=defineDynamic({events:{"session.started":e=>{let t=resolveSelfModificationMode(resolveSelfModificationConfig(extension_default.config));return t!==`local`&&t!==`deployed`?null:defineInstructions({markdown:renderInstructions([`## Role
4
4
 
@@ -6,7 +6,11 @@ You are an expert coding assistant operating inside of an eve agent. You help us
6
6
 
7
7
  The source code of the eve agent is mounted read-write at /source. /source is the authored agent directory. Locate source files with bash. Read source contents with read_file, not shell commands. Before generating an overwrite, ensure read_file has succeeded for that path. Shell reads do not satisfy write_file's read-before-write requirement. edit_file instead validates exact matches against current contents. Never modify source files with bash, sed, awk, redirection, or scripting.
8
8
 
9
- Resolve named tools by filename under /source/tools before searching contents. Tool identifiers derive from filenames and may not occur in the implementation.`,packagedSubagentGuidance(e),`## Implement changes
9
+ Resolve named tools by filename under /source/tools before searching contents. Tool identifiers derive from filenames and may not occur in the implementation.`,`## Configure this subagent
10
+
11
+ Configure this self-modification subagent's model, reasoning, and policy only through its authored mount. Check /source/extensions/self-modification.ts and /source/extensions/self-modification/extension.ts; modify whichever exists. If neither file exists, this subagent is the bundled eve development default and is using the default settings: first call registry_add with the exact address eve/self-modification to scaffold the authored mount. This known scaffold does not require search_registry.
12
+
13
+ After registry_add reports successful installation, try to read /source/extensions/self-modification.ts and /source/extensions/self-modification/extension.ts. If either is available, modify it. If neither is yet available, you may need to wait for the next turn, by asking the requester to confirm.`,`## Implement changes
10
14
 
11
15
  Use edit_file for localized changes; include only the unique matching text. For a complete rewrite, use read_file then write_file; do not encode the whole old file as one replacement. If tool arguments fail argument parsing, retry the same tool with corrected encoding.
12
16
 
@@ -6,6 +6,10 @@ export interface PnpmBuildPolicyContext {
6
6
  }
7
7
  /** Applies one explicit pnpm build policy while preserving unrelated workspace settings. */
8
8
  export declare function withPnpmBuildPolicy(source: string, packages: readonly string[], action: PnpmBuildPolicyAction): string;
9
+ /** Adds optional-package defaults without replacing the application's explicit decisions. */
10
+ export declare function withPnpmOptionalDependencyDefaults(source: string, packages: readonly string[]): string;
11
+ /** Prepares defaults in the owning workspace before installing an optional engine. */
12
+ export declare function ensurePnpmOptionalDependencyDefaults(appRoot: string, packages: readonly string[]): Promise<void>;
9
13
  /** Resolves whether every package already has an explicit non-blocking pnpm policy. */
10
14
  export declare function inspectPnpmBuildPolicy(appRoot: string, packages: readonly string[]): Promise<PnpmBuildPolicyContext>;
11
15
  /** Persists the policy selected before the registry installation transaction begins. */
@@ -0,0 +1,8 @@
1
+ import{PNPM_WORKSPACE_PATH,findClaimingAncestorPnpmWorkspaceRoot}from"./pnpm.js";import{access,readFile,writeFile}from"node:fs/promises";import{join}from"node:path";function blockRange(e,t){let n=e.findIndex(e=>RegExp(`^${t}:`).test(e));if(n<0)return;if(!RegExp(`^${t}:\\s*(?:#.*)?$`).test(e[n]??``))throw Error(`Cannot safely update ${t} because it does not use block-style YAML in ${PNPM_WORKSPACE_PATH}.`);let r=n+1;for(;r<e.length&&!/^\S/u.test(e[r]??``);)r+=1;return{start:n,end:r}}function unquoteYamlScalar(e){let t=e.trim();if(t.startsWith(`"`)&&t.endsWith(`"`))try{let e=JSON.parse(t);if(typeof e==`string`)return e}catch{return t}return t.startsWith(`'`)&&t.endsWith(`'`)?t.slice(1,-1).replaceAll(`''`,`'`):t}function mappingEntry(e){let t=/^\s+("(?:[^"\\]|\\.)*"|'(?:[^']|'')*'|[^:#][^:]*?):\s*(true|false)\s*(?:#.*)?$/u.exec(e);if(t!==null)return{key:unquoteYamlScalar(t[1]),value:t[2]===`true`}}function sequenceEntry(e){let t=/^\s+-\s+(.*?)(?:\s+#.*)?$/u.exec(e);return t===null?void 0:unquoteYamlScalar(t[1])}function policyEntries(e,t,n){let r=blockRange(e,t),i=new Map;if(r===void 0)return i;for(let t of e.slice(r.start+1,r.end))if(n===`mapping`){let e=mappingEntry(t);e!==void 0&&i.set(e.key,e.value)}else{let e=sequenceEntry(t);e!==void 0&&i.set(e,!0)}return i}function removePolicyEntries(e,t,n,r){let i=blockRange(e,t);if(i===void 0)return;for(let t=i.end-1;t>i.start;--t){let i=n===`mapping`?mappingEntry(e[t]??``)?.key:sequenceEntry(e[t]??``);i!==void 0&&r.has(i)&&e.splice(t,1)}let a=blockRange(e,t);if(a!==void 0&&!e.slice(a.start+1,a.end).some(e=>(n===`mapping`?mappingEntry(e):sequenceEntry(e))!==void 0)){let t=e.slice(a.start+1,a.end).filter(e=>e.trimStart().startsWith(`#`));e.splice(a.start,a.end-a.start,...t)}}function appendPolicyEntries(e,t,n,r){let i=blockRange(e,t);if(i===void 0){for(;e.at(-1)===``;)e.pop();e.length>0&&e.push(``),e.push(`${t}:`),i={start:e.length-1,end:e.length}}let a=policyEntries(e,t,n),o=r.filter(e=>!a.has(e));if(o.length===0)return;let s=o.map(e=>n===`mapping`?` ${JSON.stringify(e)}: true`:` - ${JSON.stringify(e)}`);e.splice(i.end,0,...s)}function withPnpmBuildPolicy(e,t,n){let r=[...new Set(t)].sort(),i=new Set(r),a=e.replace(/\r\n/gu,`
2
+ `).split(`
3
+ `);for(removePolicyEntries(a,`allowBuilds`,`mapping`,i),removePolicyEntries(a,`ignoredOptionalDependencies`,`sequence`,i),n===`allow-builds`?appendPolicyEntries(a,`allowBuilds`,`mapping`,r):appendPolicyEntries(a,`ignoredOptionalDependencies`,`sequence`,r);a.at(-1)===``;)a.pop();return`${a.join(`
4
+ `)}\n`}function withPnpmOptionalDependencyDefaults(e,t){let n=e.replace(/\r\n/gu,`
5
+ `).split(`
6
+ `),r=[policyEntries(n,`allowBuilds`,`mapping`),policyEntries(n,`ignoredOptionalDependencies`,`sequence`),policyEntries(n,`onlyBuiltDependencies`,`sequence`),policyEntries(n,`ignoredBuiltDependencies`,`sequence`)],i=t.filter(e=>!r.some(t=>t.has(e)));return i.length===0?e:withPnpmBuildPolicy(e,i,`ignore-optional`)}async function ensurePnpmOptionalDependencyDefaults(e,t){let n=join(await owningPnpmWorkspaceRoot(e),PNPM_WORKSPACE_PATH),r=await readWorkspacePolicy(n),i=withPnpmOptionalDependencyDefaults(r,t);i!==r&&(await writeFile(n,i,`utf8`),console.info(`[eve:dev] updated optional dependency defaults in "${n}".`))}async function readWorkspacePolicy(e){try{return await readFile(e,`utf8`)}catch(e){if(e.code===`ENOENT`)return``;throw e}}async function owningPnpmWorkspaceRoot(e){try{return await access(join(e,PNPM_WORKSPACE_PATH)),e}catch(e){if(e.code!==`ENOENT`)throw e}return findClaimingAncestorPnpmWorkspaceRoot(e)??e}async function inspectPnpmBuildPolicy(e,t){let n=await owningPnpmWorkspaceRoot(e),r=join(n,PNPM_WORKSPACE_PATH),i=(await readWorkspacePolicy(r)).replace(/\r\n/gu,`
7
+ `).split(`
8
+ `),a=policyEntries(i,`allowBuilds`,`mapping`),o=policyEntries(i,`ignoredOptionalDependencies`,`sequence`);return{filePath:r,packages:t,satisfied:t.every(e=>a.get(e)===!0||o.has(e))}}async function applyPnpmBuildPolicy(e,t){let n=await readWorkspacePolicy(e.filePath);await writeFile(e.filePath,withPnpmBuildPolicy(n,e.packages,t),`utf8`)}export{applyPnpmBuildPolicy,ensurePnpmOptionalDependencyDefaults,inspectPnpmBuildPolicy,withPnpmBuildPolicy,withPnpmOptionalDependencyDefaults};
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.105`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.64.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{parseChatGptModelSelection}from"../../../shared/chatgpt-model.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{DEFAULT_CONNECT_PACKAGE_VERSION,resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.105`,DEFAULT_ZOD_PACKAGE_VERSION=`4.5.4`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.65.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":renderAgentTemplate(e,t),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderAgentTemplate(e,t){let n=parseChatGptModelSelection(e);return n===void 0?BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)):`import { defineAgent } from "eve";\nimport { chatgpt } from "eve/models/openai";\n\nexport default defineAgent({\n model: chatgpt(${JSON.stringify(n)}),\n${reasoningTemplateLine(t)}});\n`}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e===BASE_AGENT_TEMPLATE&&parseChatGptModelSelection(t.model)!==void 0?renderAgentTemplate(t.model,t.reasoning):e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -3,12 +3,7 @@ import { z } from "#compiled/zod/index.js";
3
3
  * One selectable option presented to the user in an input request.
4
4
  */
5
5
  export type InputOption = z.infer<typeof inputOptionSchema>;
6
- /**
7
- * Zod schema for one input option.
8
- *
9
- * Includes descriptions because the `ask_question` tool input embeds this
10
- * schema and exposes it directly to the model.
11
- */
6
+ /** Zod schema for one input option. */
12
7
  export declare const inputOptionSchema: z.ZodObject<{
13
8
  description: z.ZodOptional<z.ZodString>;
14
9
  id: z.ZodString;
@@ -50,6 +50,8 @@ export interface SandboxProviderHost {
50
50
  loadOptionalPackage<T>(input: {
51
51
  readonly autoInstall: boolean;
52
52
  readonly importModule: () => Promise<T>;
53
+ readonly installPackageName?: string;
54
+ readonly ignoredOptionalDependencies?: readonly string[];
53
55
  readonly missingMessage: string;
54
56
  readonly packageName: string;
55
57
  }): Promise<T>;
@@ -24,6 +24,8 @@ export interface RoutedChildDelivery {
24
24
  readonly childContinuationToken: string;
25
25
  readonly childSessionInbox?: SessionInboxAddress;
26
26
  readonly childResponseUrl?: string;
27
+ /** Answer-hook requests the user moved past; each hook resumes as `dismissed`. */
28
+ readonly dismissedRequestIds?: readonly string[];
27
29
  readonly payload: {
28
30
  readonly inputResponses: readonly InputResponse[];
29
31
  };
@@ -44,9 +46,17 @@ export interface RoutedDeliverPayload {
44
46
  readonly kind: "cancel-turn";
45
47
  } | undefined;
46
48
  }
47
- /** Splits a deliver payload into parent-local and proxied-child buckets. */
49
+ /**
50
+ * Splits a deliver payload into parent-local and proxied-child buckets.
51
+ *
52
+ * With `resolveMessage`, a plain-text message is also resolved against pending
53
+ * `ctx.ask()` questions: when exactly one question is pending, a matching option or
54
+ * permitted free text answers it and consumes the message. Otherwise the
55
+ * message dismisses every `dismissible` question and stays with the parent.
56
+ */
48
57
  export declare function routeDeliverPayload(input: {
49
58
  readonly allowRoute?: (requestId: string, route: ProxyInputRequest) => boolean;
50
59
  readonly payload: DeliverPayload;
60
+ readonly resolveMessage?: boolean;
51
61
  readonly state: SessionStateMap | undefined;
52
62
  }): RoutedDeliverPayload;
@@ -1 +1 @@
1
- import{createInputRequestedEvent}from"#protocol/message.js";import{emitTurnEpilogue,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{getProxyInputRequests,toProxyInputRequestEntries}from"#harness/proxy-input-requests.js";import{SESSION_LIMIT_STOP_OPTION_ID}from"#harness/session-limit-continuation.js";async function emitProxiedInputRequest(e){await e.emit(createInputRequestedEvent({requests:e.hookPayload.event.requests,sequence:e.hookPayload.event.sequence,stepIndex:e.hookPayload.event.stepIndex,turnId:e.hookPayload.event.turnId}));let t=e.session;if(e.mode===`conversation`){let n=getHarnessEmissionState(e.session.state),r=await emitTurnEpilogue(e.emit,n,e.mode);t=setHarnessEmissionState(e.session,r)}return{entries:toProxyInputRequestEntries(e.hookPayload),session:t}}function routeDeliverPayload(e){let t=getProxyInputRequests(e.state),n=e.payload.inputResponses??[],r=new Map,i=[],a;for(let o of n){let n=t.get(o.requestId);if(n===void 0||e.allowRoute?.(o.requestId,n)===!1){i.push(o);continue}n.kind===`session-limit`&&o.optionId===SESSION_LIMIT_STOP_OPTION_ID&&(a={kind:`cancel-turn`});let s=[n.childContinuationToken,n.childSessionInbox?.sessionId??``,n.childResponseUrl??`local`,n.taskId??``].join(`\0`),c=r.get(s);c===void 0?r.set(s,{childContinuationToken:n.childContinuationToken,parentRequestIds:[o.requestId],responses:[toChildInputResponse(o,n)],routes:[n],...n.childSessionInbox!==void 0&&{childSessionInbox:n.childSessionInbox},...n.answerHook!==void 0&&{answerHook:n.answerHook},...n.childResponseUrl!==void 0&&{childResponseUrl:n.childResponseUrl},...n.taskId!==void 0&&{taskId:n.taskId}}):(c.parentRequestIds.push(o.requestId),c.responses.push(toChildInputResponse(o,n)),c.routes.push(n))}let o=[...r.values()].map(({answerHook:e,childContinuationToken:n,childSessionInbox:r,childResponseUrl:i,parentRequestIds:a,responses:o,routes:s,taskId:c})=>{let l=new Set(a),u=new Set(l);for(let e of s)if(e.batch!==void 0&&batchResolves({batch:e.batch,childContinuationToken:n,entries:t,responseIds:l}))for(let t of e.batch.requestIds)u.add(t);return{childContinuationToken:n,payload:{inputResponses:o},retireRequestIds:[...u],...r!==void 0&&{childSessionInbox:r},...e!==void 0&&{answerHook:e},...i!==void 0&&{childResponseUrl:i},...c!==void 0&&{taskId:c}}}),s={};for(let[t,n]of Object.entries(e.payload))t!==`inputResponses`&&n!==void 0&&(s[t]=n);return i.length>0&&(s.inputResponses=i),{forChildren:o,forSelf:Object.keys(s).length>0?s:void 0,parentAction:a}}function batchResolves(e){return e.batch.approvalRequestIds.length===0||e.batch.approvalRequestIds.every(t=>{let n=e.entries.get(t);return n===void 0||!sameBatch(n,e)||e.responseIds.has(t)})}function sameBatch(e,t){return e.childContinuationToken===t.childContinuationToken&&e.batch?.requestIds.length===t.batch.requestIds.length&&e.batch.requestIds.every((e,n)=>e===t.batch.requestIds[n])}function toChildInputResponse(e,t){return t.childRequestId===void 0?e:{...e,requestId:t.childRequestId}}export{emitProxiedInputRequest,routeDeliverPayload};
1
+ import{createInputRequestedEvent}from"#protocol/message.js";import{resolveTextToResponse}from"#channel/resolve-text.js";import{emitTurnEpilogue,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{getProxyInputRequests,toProxyInputRequestEntries}from"#harness/proxy-input-requests.js";import{SESSION_LIMIT_STOP_OPTION_ID}from"#harness/session-limit-continuation.js";async function emitProxiedInputRequest(e){await e.emit(createInputRequestedEvent({requests:e.hookPayload.event.requests,sequence:e.hookPayload.event.sequence,stepIndex:e.hookPayload.event.stepIndex,turnId:e.hookPayload.event.turnId}));let t=e.session;if(e.mode===`conversation`){let n=getHarnessEmissionState(e.session.state),r=await emitTurnEpilogue(e.emit,n,e.mode);t=setHarnessEmissionState(e.session,r)}return{entries:toProxyInputRequestEntries(e.hookPayload),session:t}}function routeDeliverPayload(e){let t=getProxyInputRequests(e.state),routable=(t,n)=>n!==void 0&&e.allowRoute?.(t,n)!==!1,n=resolveMessageAgainstQuestions({enabled:e.resolveMessage===!0,entries:t,payload:e.payload,routable}),r=[...e.payload.inputResponses??[],...n.responses],i=new Map,a=[],o,bucketFor=e=>{let t=[e.childContinuationToken,e.childSessionInbox?.sessionId??``,e.childResponseUrl??`local`,e.taskId??``].join(`\0`),n=i.get(t);if(n!==void 0)return n;let r={childContinuationToken:e.childContinuationToken,dismissedRequestIds:[],parentRequestIds:[],responses:[],routes:[],...e.childSessionInbox!==void 0&&{childSessionInbox:e.childSessionInbox},...e.answerHook!==void 0&&{answerHook:e.answerHook},...e.childResponseUrl!==void 0&&{childResponseUrl:e.childResponseUrl},...e.taskId!==void 0&&{taskId:e.taskId}};return i.set(t,r),r},s=new Set;for(let e of r){let n=t.get(e.requestId);if(n===void 0||!routable(e.requestId,n)){a.push(e);continue}if(s.has(e.requestId))continue;s.add(e.requestId),n.kind===`session-limit`&&e.optionId===SESSION_LIMIT_STOP_OPTION_ID&&(o={kind:`cancel-turn`});let r=bucketFor(n);r.parentRequestIds.push(e.requestId),r.responses.push(toChildInputResponse(e,n)),r.routes.push(n)}for(let e of n.dismissedRequestIds){let n=t.get(e);n!==void 0&&bucketFor(n).dismissedRequestIds.push(e)}let c=[...i.values()].map(({answerHook:e,childContinuationToken:n,childSessionInbox:r,childResponseUrl:i,dismissedRequestIds:a,parentRequestIds:o,responses:s,routes:c,taskId:l})=>{let u=new Set(o),d=new Set([...u,...a]);for(let e of c)if(e.batch!==void 0&&batchResolves({batch:e.batch,childContinuationToken:n,entries:t,responseIds:u}))for(let t of e.batch.requestIds)d.add(t);return{childContinuationToken:n,payload:{inputResponses:s},retireRequestIds:[...d],...a.length>0&&{dismissedRequestIds:a},...r!==void 0&&{childSessionInbox:r},...e!==void 0&&{answerHook:e},...i!==void 0&&{childResponseUrl:i},...l!==void 0&&{taskId:l}}}),l={};for(let[t,r]of Object.entries(e.payload))t!==`inputResponses`&&r!==void 0&&(t===`message`&&n.consumed||(l[t]=r));return a.length>0&&(l.inputResponses=a),{forChildren:c,forSelf:Object.keys(l).length>0?l:void 0,parentAction:o}}function resolveMessageAgainstQuestions(e){let t={consumed:!1,dismissedRequestIds:[],responses:[]};if(!e.enabled||(e.payload.inputResponses?.length??0)>0||e.payload.message===void 0)return t;let n=[...e.entries].filter(([t,n])=>n.kind===`question`&&e.routable(t,n)),r=n.flatMap(([e,t])=>{let n=t.answerHook?.question;return n===void 0?[]:[{requestId:e,...n}]});if(r.length===0)return t;let[i]=r,a=n.length===1&&i!==void 0&&typeof e.payload.message==`string`?resolveTextToResponse(e.payload.message,i):void 0;return a===void 0?{consumed:!1,dismissedRequestIds:r.filter(e=>e.dismissible===!0).map(e=>e.requestId),responses:[]}:{consumed:!0,dismissedRequestIds:[],responses:[a]}}function batchResolves(e){return e.batch.approvalRequestIds.length===0||e.batch.approvalRequestIds.every(t=>{let n=e.entries.get(t);return n===void 0||!sameBatch(n,e)||e.responseIds.has(t)})}function sameBatch(e,t){return e.childContinuationToken===t.childContinuationToken&&e.batch?.requestIds.length===t.batch.requestIds.length&&e.batch.requestIds.every((e,n)=>e===t.batch.requestIds[n])}function toChildInputResponse(e,t){return t.childRequestId===void 0?e:{...e,requestId:t.childRequestId}}export{emitProxiedInputRequest,routeDeliverPayload};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-IIuxkn6y.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BRvEh9sO.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-IIuxkn6y.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-BRvEh9sO.js";
2
2
 
3
3
  export { useEveAgent };
@@ -1,6 +1,6 @@
1
1
  import type { WebSearchProvider } from "#shared/web-search.js";
2
2
  /** Session facts that can hide a selected tool without changing source composition. */
3
- export type ToolAvailabilityCondition = "delegated-task-child" | "requires-request-input" | "root-session";
3
+ export type ToolAvailabilityCondition = "delegated-task-child" | "root-session";
4
4
  /** Native behavior declared by a selected compiled tool. */
5
5
  export type CompiledToolHandling = {
6
6
  readonly kind: "dispatch";
@@ -8,9 +8,6 @@ export type CompiledToolHandling = {
8
8
  } | {
9
9
  readonly kind: "provider-tool";
10
10
  readonly provider: WebSearchProvider;
11
- } | {
12
- readonly kind: "request-input";
13
- readonly request: "question";
14
11
  } | {
15
12
  readonly kind: "workflow-tool";
16
13
  readonly workflowId: string;
@@ -50,7 +47,7 @@ export type PreparedToolHandling = {
50
47
  readonly kind: "dispatch";
51
48
  readonly target: PreparedDispatchTarget;
52
49
  } | Extract<CompiledToolHandling, {
53
- readonly kind: "provider-tool" | "request-input";
50
+ readonly kind: "provider-tool";
54
51
  }>;
55
52
  /** Runtime-prepared behavior carried by one harness-visible tool. */
56
53
  export interface PreparedToolBehavior {
@@ -70,8 +70,8 @@ export interface PublicToolDefinitionWithExecuteFn<TInput = unknown, TOutput = u
70
70
  }
71
71
  /**
72
72
  * A question a workflow tool asks the human on the session's channel, sent
73
- * with `ctx.ask` from a `defineWorkflowTool` executor. Channels render it the way they render
74
- * `ask_question` and tool approvals.
73
+ * with `ctx.ask` from a `defineWorkflowTool` executor. Channels render it the
74
+ * way they render tool approvals.
75
75
  */
76
76
  export interface ToolInputRequest {
77
77
  /**
@@ -79,19 +79,37 @@ export interface ToolInputRequest {
79
79
  * {@link options}.
80
80
  */
81
81
  readonly allowFreeform?: boolean;
82
+ /**
83
+ * Whether the user's next message may skip the question. When `true`, a
84
+ * message that does not answer it resolves the request as `dismissed`, and
85
+ * the message reaches the agent as usual.
86
+ */
87
+ readonly dismissible?: boolean;
82
88
  /** Rendering hint: confirmation buttons, a selection list, or a text field. */
83
89
  readonly display?: "confirmation" | "select" | "text";
84
90
  /** Selectable answers. */
85
91
  readonly options?: readonly InputOption[];
86
92
  readonly prompt: string;
87
93
  }
88
- /** The human's answer to a {@link ToolInputRequest}. */
89
- export interface ToolInputResponse {
94
+ /**
95
+ * The outcome of a {@link ToolInputRequest}.
96
+ *
97
+ * - `answered`: the user picked an option or typed an answer.
98
+ * - `dismissed`: the user moved on without answering a `dismissible` request.
99
+ * - `unavailable`: the session cannot reach a human, such as a scheduled run,
100
+ * so the request resolved immediately without being shown.
101
+ */
102
+ export type ToolInputResponse = {
103
+ readonly status: "answered";
90
104
  /** The selected option's `id`, when the user picked one. */
91
105
  readonly optionId?: string;
92
106
  /** Free text, when the user typed an answer. */
93
107
  readonly text?: string;
94
- }
108
+ } | {
109
+ readonly status: "dismissed";
110
+ } | {
111
+ readonly status: "unavailable";
112
+ };
95
113
  /**
96
114
  * Authored tool context. Passed as the last argument to
97
115
  * {@link ToolDefinition.execute}.
@@ -0,0 +1,18 @@
1
+ import { type WorkflowToolDefinition } from "#tools/workflow-definition.js";
2
+ import { type AskQuestionInput, type AskQuestionOutput } from "#execution/tools/ask-question.js";
3
+ export type { AskQuestionInput, AskQuestionOutput };
4
+ /**
5
+ * Defines the opt-in `ask_question` tool.
6
+ *
7
+ * Export it from `agent/tools/ask_question.ts`:
8
+ *
9
+ * ```ts
10
+ * import { askQuestion } from "eve/tools/ask_question";
11
+ *
12
+ * export default askQuestion();
13
+ * ```
14
+ *
15
+ * Each call runs as a durable workflow that asks through `ctx.ask()`, so the
16
+ * turn waits for the answer without holding an application runtime open.
17
+ */
18
+ export declare function askQuestion(): WorkflowToolDefinition<AskQuestionInput, AskQuestionOutput>;
@@ -0,0 +1 @@
1
+ import{defineWorkflowTool}from"#tools/workflow-definition.js";import{ASK_QUESTION_INPUT_SCHEMA,ASK_QUESTION_OUTPUT_SCHEMA,ASK_QUESTION_TOOL_DESCRIPTION,executeAskQuestionTool}from"#execution/tools/ask-question.js";function askQuestion(){return defineWorkflowTool({description:ASK_QUESTION_TOOL_DESCRIPTION,execute:executeAskQuestionTool,inputSchema:ASK_QUESTION_INPUT_SCHEMA,outputSchema:ASK_QUESTION_OUTPUT_SCHEMA})}export{askQuestion};
@@ -1,4 +1,4 @@
1
- import { type BlockingWorkflowToolDefinition } from "#tools/workflow-definition.js";
1
+ import { type WorkflowToolDefinition } from "#tools/workflow-definition.js";
2
2
  import { type SleepToolInput, type SleepToolOutput } from "#execution/tools/sleep.js";
3
3
  export type { SleepToolInput, SleepToolOutput };
4
4
  /**
@@ -15,4 +15,4 @@ export type { SleepToolInput, SleepToolOutput };
15
15
  * Each call runs as a durable workflow, so the wait does not hold an
16
16
  * application runtime open.
17
17
  */
18
- export declare function sleep(): BlockingWorkflowToolDefinition<SleepToolInput, SleepToolOutput>;
18
+ export declare function sleep(): WorkflowToolDefinition<SleepToolInput, SleepToolOutput>;
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BdKlQF32.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BIouJCii.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-BdKlQF32.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-BIouJCii.js";
2
2
 
3
3
  export { useEveAgent };
@@ -13,13 +13,13 @@ A typical config selects a model:
13
13
  import { defineAgent } from "eve";
14
14
 
15
15
  export default defineAgent({
16
- model: "anthropic/claude-opus-4.8",
16
+ model: "anthropic/claude-opus-5.5",
17
17
  });
18
18
  ```
19
19
 
20
20
  For a static AI Gateway model ID, you can make the same source change from the
21
- project root with `eve set --model anthropic/claude-opus-4.8` or from the local
22
- dev TUI with `/model anthropic/claude-opus-4.8`.
21
+ project root with `eve set --model anthropic/claude-opus-5.5` or from the local
22
+ dev TUI with `/model anthropic/claude-opus-5.5`.
23
23
 
24
24
  The root `agent.ts` can be omitted when no runtime config is needed. eve then selects its default `agent.ts` source at the same slot, configured with `spacexai/grok-4.7`; authoring the file replaces that source.
25
25
  When `agent.ts` is present, `model` is required.
@@ -39,9 +39,9 @@ export default defineAgent({
39
39
  });
40
40
  ```
41
41
 
42
- `openai()` from `eve/models/openai` defaults to `gpt-5.6-luna-fast`. Both helpers accept an optional native provider model ID and use `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`. During local development they can also use credentials saved through `/login`. Deployments require their API key in the server environment.
42
+ `openai()` from `eve/models/openai` defaults to `gpt-6-luna-fast`. Both helpers accept an optional native provider model ID and use `OPENAI_API_KEY` or `ANTHROPIC_API_KEY`. During local development they can also use credentials saved through `/login`. Deployments require their API key in the server environment.
43
43
 
44
- For a local ChatGPT subscription, use `chatgpt()` from `eve/models/openai` and sign in with `/login`. It defaults to `gpt-5.6-luna-fast` and cannot run in a deployment.
44
+ For a local ChatGPT subscription, use `chatgpt()` from `eve/models/openai` and sign in with `/login`. It defaults to `gpt-6-luna-fast` and cannot run in a deployment.
45
45
 
46
46
  `/login` can switch a static Gateway string to an eve helper and manage its import. `/model` changes the selected model and settings immediately. Custom provider SDK calls and dynamic expressions retain their authored behavior and require manual source edits. You can still install an AI SDK provider package and pass its `LanguageModel` when you need provider-specific configuration.
47
47
 
@@ -77,7 +77,7 @@ export default defineAgent({
77
77
  events: {
78
78
  "session.started": (_event, ctx) => {
79
79
  if (ctx.session.auth.initiator?.attributes.plan === "enterprise") {
80
- return "anthropic/claude-opus-4.8";
80
+ return "anthropic/claude-opus-5.5";
81
81
  }
82
82
 
83
83
  return "anthropic/claude-sonnet-5";
@@ -141,7 +141,7 @@ Compaction summarizes older turns as you approach the context window. It's on by
141
141
 
142
142
  ```ts title="agent/agent.ts"
143
143
  export default defineAgent({
144
- model: "anthropic/claude-opus-4.8",
144
+ model: "anthropic/claude-opus-5.5",
145
145
  compaction: {
146
146
  thresholdPercent: 0.75, // default 0.9
147
147
  },
@@ -158,7 +158,7 @@ provider-reported tokens or model token cost reaches a configured limit:
158
158
 
159
159
  ```ts title="agent/agent.ts"
160
160
  export default defineAgent({
161
- model: "anthropic/claude-opus-4.8",
161
+ model: "anthropic/claude-opus-5.5",
162
162
  limits: {
163
163
  maxInputTokensPerSession: 200_000,
164
164
  maxOutputTokensPerSession: 20_000,
@@ -228,7 +228,7 @@ root `agent.ts`:
228
228
  import { defineAgent } from "eve";
229
229
 
230
230
  export default defineAgent({
231
- model: "anthropic/claude-opus-4.8",
231
+ model: "anthropic/claude-opus-5.5",
232
232
  experimental: {
233
233
  workflow: {
234
234
  world: "@workflow/world-postgres",
@@ -264,7 +264,7 @@ sequential model calls:
264
264
  import { defineAgent } from "eve";
265
265
 
266
266
  export default defineAgent({
267
- model: "anthropic/claude-opus-4.8",
267
+ model: "anthropic/claude-opus-5.5",
268
268
  experimental: {
269
269
  workflow: {
270
270
  modelCallsPerStep: 4,
@@ -302,7 +302,7 @@ finishes instead:
302
302
  import { defineAgent } from "eve";
303
303
 
304
304
  export default defineAgent({
305
- model: "anthropic/claude-opus-4.8",
305
+ model: "anthropic/claude-opus-5.5",
306
306
  experimental: {
307
307
  workflow: {
308
308
  retention: 0,
@@ -135,7 +135,7 @@ Check the delivery path in order so you can identify where a Slack event stops:
135
135
  | Mentions work but DMs or thread replies do not | Check the Slack app's Event Subscriptions and OAuth scopes. DMs require `message.im` and `im:history`; channel replies require the matching message event and history scope. | Add the missing events or scopes, then reinstall the Slack app if Slack requires it. |
136
136
  | A long response cannot be uploaded as a snippet | Check whether the installed Slack app has the `files:write` bot scope. | Add `files:write`, then reinstall the Slack app so the new scope takes effect. |
137
137
  | A preview request receives an authentication page or protection error | Check whether the branch domain is exempt or the direct Slack request URL includes `x-vercel-protection-bypass`. Slack cannot complete an interactive Vercel Authentication challenge. | Add a Deployment Protection Exception for the branch domain, or add the automation bypass query parameter to a Slack app that uses environment-variable credentials. |
138
- | The webhook reaches the deployment but the agent does not reply | Open the project's Vercel runtime logs, then inspect the session in **Agent Runs** when your team has access. | Use the first missing or failed stage to narrow the issue to channel dispatch, the agent run, or outbound Slack delivery. |
138
+ | The webhook reaches the deployment but the agent does not reply | Open the project's Vercel runtime logs and locate the request for the inbound Slack event. | Use the first missing or failed stage to narrow the issue to channel dispatch, model or tool execution, or outbound Slack delivery. |
139
139
 
140
140
  ## Audience
141
141
 
@@ -213,72 +213,6 @@ import { disableTool } from "eve/tools";
213
213
  export default disableTool();
214
214
  ```
215
215
 
216
- ### `todo`
217
-
218
- `todo` maintains a durable todo list for the session.
219
-
220
- ```sh
221
- eve add tool/todo
222
- ```
223
-
224
- ```ts title="agent/tools/todo.ts"
225
- export { default } from "eve/tools/todo";
226
- ```
227
-
228
- Override it. Spreading the definition preserves its durable state key:
229
-
230
- ```ts title="agent/tools/todo.ts"
231
- import { defineTool } from "eve/tools";
232
- import { todo } from "eve/tools/todo";
233
-
234
- export default defineTool({
235
- ...todo,
236
- description: "Track the current implementation plan.",
237
- });
238
- ```
239
-
240
- Disable it:
241
-
242
- ```ts title="agent/tools/todo.ts"
243
- import { disableTool } from "eve/tools";
244
-
245
- export default disableTool();
246
- ```
247
-
248
- ### `ask_question`
249
-
250
- `ask_question` asks the user for clarification or a choice, then parks the turn until they answer. It appears only when the session can request user input. See [Human-in-the-loop](/docs/human-in-the-loop).
251
-
252
- ```sh
253
- eve add tool/ask_question
254
- ```
255
-
256
- ```ts title="agent/tools/ask_question.ts"
257
- export { default } from "eve/tools/ask_question";
258
- ```
259
-
260
- Replace its request-input behavior with an ordinary authored tool:
261
-
262
- ```ts title="agent/tools/ask_question.ts"
263
- import { defineTool } from "eve/tools";
264
-
265
- export default defineTool({
266
- description: "Record a clarification request.",
267
- inputSchema: { type: "object" },
268
- async execute(input) {
269
- return { recorded: input };
270
- },
271
- });
272
- ```
273
-
274
- Disable it:
275
-
276
- ```ts title="agent/tools/ask_question.ts"
277
- import { disableTool } from "eve/tools";
278
-
279
- export default disableTool();
280
- ```
281
-
282
216
  ### `agent`
283
217
 
284
218
  `agent` delegates a subtask to a fresh copy of the root agent. It is root-only, always runs in the background, and returns a task receipt immediately. The child receives the root's instructions, tools, connections, and sandbox, but starts with fresh conversation history and [state](./state). See [Subagents](../subagents).
@@ -365,6 +299,22 @@ You can also add the opt-in framework tools described below.
365
299
 
366
300
  These framework-provided tools are not added by default. Add only the ones the agent needs.
367
301
 
302
+ ### `ask_question`
303
+
304
+ `ask_question` lets the model ask the user one question, then waits for the answer. The model can offer two or three options, each with a label and a short description, and the user can always type their own answer instead. Channels render the options as native UI, such as Slack select menus. Without the tool, the model can still ask in its reply text and the user answers with their next message. See [Human-in-the-loop](/docs/human-in-the-loop). Add it:
305
+
306
+ ```sh
307
+ eve add tool/ask_question
308
+ ```
309
+
310
+ ```ts title="agent/tools/ask_question.ts"
311
+ import { askQuestion } from "eve/tools/ask_question";
312
+
313
+ export default askQuestion();
314
+ ```
315
+
316
+ `ask_question` is a [workflow tool](/docs/tools/workflows) that calls `ctx.ask()`. The model receives `{ status: "answered", answer }`, where `answer` is the chosen option's label or the user's own words. A plain follow-up message answers the question too when it is the only pending question. When other questions are also pending, a message does not answer any of them: `ask_question` resolves as `{ status: "dismissed" }` and the message reaches the model normally. In a session that cannot request input, such as a scheduled run, the result is `{ status: "unavailable" }` and the model continues on its own judgment. Remove the file to remove the tool.
317
+
368
318
  ### `glob`
369
319
 
370
320
  `glob` finds sandbox files by glob pattern. Add it:
@@ -11,7 +11,7 @@ The harness keeps a long session from overflowing the model's context window. Be
11
11
 
12
12
  ```ts title="agent/agent.ts"
13
13
  export default defineAgent({
14
- model: "anthropic/claude-opus-4.8",
14
+ model: "anthropic/claude-opus-5.5",
15
15
  compaction: {
16
16
  thresholdPercent: 0.75,
17
17
  },
@@ -24,8 +24,6 @@ input token count plus an estimate of new messages. A smaller character estimate
24
24
  alone cannot satisfy compaction triggered by a higher provider count. If trimming
25
25
  cannot free enough space, eve summarizes the older history.
26
26
 
27
- Compaction also preserves the framework's own tool state automatically. It resets read-before-write tracking (so a write afterward re-reads the file whose read evidence was summarized away) and re-injects the active todo list, so the model keeps its task list across the summary. There is no per-tool hook to configure.
28
-
29
27
  First-class [memory](../memory) participates in a separate lifecycle. eve asks
30
28
  providers to capture before compaction, excludes attributed recalled records
31
29
  from the summarizer, keeps their canonical latest values, and recalls again
@@ -64,7 +64,7 @@ For advanced self-hosted deployments, the root `agent.ts` can select the install
64
64
  import { defineAgent } from "eve";
65
65
 
66
66
  export default defineAgent({
67
- model: "anthropic/claude-opus-4.8",
67
+ model: "anthropic/claude-opus-5.5",
68
68
  experimental: {
69
69
  workflow: {
70
70
  world: "@workflow/world-postgres",
@@ -77,7 +77,7 @@ The stream is newline-delimited JSON (NDJSON), one event per line:
77
77
  | `actions.requested` | The model requested one or more actions, including tool calls; calls stream before execution. |
78
78
  | `action.partial` | A locally executed tool generator yielded a preliminary output snapshot. |
79
79
  | `action.result` | A tool call returned. |
80
- | `input.requested` | The run paused for human input ([HITL](/docs/human-in-the-loop) approval or `ask_question`); carries `requests`. |
80
+ | `input.requested` | The run paused for human input ([HITL](/docs/human-in-the-loop) approval or a `ctx.ask()` question); carries `requests`. |
81
81
  | `input.resolved` | The server accepted terminal human-input outcomes; carries `resolutions` with responses when provided. |
82
82
  | `subagent.called` | A subagent was delegated; carries `childSessionId` to attach to. |
83
83
  | `subagent.completed` | The parent recorded a successful subagent invocation result; carries the actual output. |
@@ -210,7 +210,7 @@ Message sends default to `"steer"`. Before assistant output begins, eve interrup
210
210
 
211
211
  If the session is waiting on a human-in-the-loop approval, respond with the channel’s Approve or Cancel controls. Text messages do not decide an approval; unrelated text starts an ordinary turn while the approval stays pending and answerable. A later structured `inputResponses` answer keyed by its `requestId` still resumes the original tool call, even after intervening turns.
212
212
 
213
- With one question-only batch, an exact option match or permitted freeform response answers `ask_question`. Any other follow-up marks the question unanswered and starts the new turn. With several approval or question batches pending, eve does not guess which batch plain text addresses: the message starts an ordinary turn and the batches stay open. Use structured responses to target requests unambiguously.
213
+ A pending `ctx.ask()` question from a blocking tool, such as `ask_question`, can be answered with plain text. When it is the only pending question, a message that matches an option answers it, and so does any message when the question allows free text. Otherwise eve does not guess which question the text addresses: the message follows the normal `turnPolicy`, questions created with `dismissible: true` resolve as `dismissed`, and other questions stay open. Questions from background tools and subagents always need a structured response. Use structured responses to target requests unambiguously.
214
214
 
215
215
  A structured response matches any currently pending request by ID, not only the newest batch. It becomes stale only after that request was answered, cleared, or cancelled. eve delivers a stale response to the model as a new user message, and the model decides whether the old selection still matters. A stale approval never authorizes the earlier tool call; the model must request the action and approval again if they are still needed.
216
216
 
@@ -111,8 +111,8 @@ t.calledSubagent("weather", {
111
111
 
112
112
  ```ts
113
113
  const request = session.requireInputRequest({
114
- toolName: "ask_question",
115
- optionIds: ["red", "blue"],
114
+ toolName: "confirm_deploy",
115
+ optionIds: ["approve", "cancel"],
116
116
  });
117
117
  ```
118
118
 
@@ -3,7 +3,7 @@ title: "Judge"
3
3
  description: "Grade evals with evaluation models using criteria, typed questions, or batches, and set thresholds on each assertion."
4
4
  ---
5
5
 
6
- Use `t.judge(...)` when a deterministic [assertion](./assertions) cannot capture what a good response looks like. It calls [`evaluate` from `eve/ai`](../guides/evaluate#evaluate-inside-a-tool) and defaults to `typesafe-ai/jev`. The judge is separate from the agent under test and is used only for scoring.
6
+ Use `t.judge(...)` when a deterministic [assertion](./assertions) cannot capture what a good response looks like. It calls [`evaluate` from `eve/ai`](../guides/evaluate#evaluate-inside-a-tool) and defaults to `typesafe-ai/jev`, TypeSafe AI's [Jev evaluation model](https://vercel.com/i/what-is-jev). The judge is separate from the agent under test and is used only for scoring.
7
7
 
8
8
  ```ts
9
9
  import { defineEval } from "eve/evals";
@@ -138,14 +138,14 @@ String IDs resolve through the AI SDK default provider, or Vercel AI Gateway whe
138
138
  import { openai } from "@ai-sdk/openai";
139
139
 
140
140
  t.judge("The response addresses the request.", {
141
- model: openai.evaluationModel("gpt-5.6-luna"),
141
+ model: openai.evaluationModel("gpt-6-luna"),
142
142
  modelOptions: { providerOptions: { openai: { reasoningEffort: "high" } } },
143
143
  });
144
144
  ```
145
145
 
146
146
  Use the provider's `evaluationModel` factory, not a language model instance. AI SDK supplies evaluation adapters for supported language models. Provider support and the evaluation contract are experimental; see [AI SDK evaluation](https://ai-sdk.dev/docs/ai-sdk-core/evaluation).
147
147
 
148
- String model IDs resolve through the default provider's evaluation API. Gateway accepts native evaluation models such as `typesafe-ai/jev`; passing a language model ID such as `openai/gpt-5.6-luna` does not automatically select the OpenAI adapter. Use an evaluation-model instance as shown above for language models.
148
+ String model IDs resolve through the default provider's evaluation API. Gateway accepts native evaluation models such as `typesafe-ai/jev`; passing a language model ID such as `openai/gpt-6-luna` does not automatically select the OpenAI adapter. Use an evaluation-model instance as shown above for language models.
149
149
 
150
150
  Missing credentials, invalid answers, unsupported question types, and provider errors become failed gates even for tracked-only judgments. They do not silently skip the eval or select another model. Validation, authentication, and retries use the shared `evaluate` implementation.
151
151
 
@@ -45,7 +45,7 @@ eve adds the missing `eve`, `ai`, and `zod` dependencies without changing files
45
45
  To initialize the agent with a different AI Gateway model or reasoning effort, pass `--model` or `--reasoning`:
46
46
 
47
47
  ```bash
48
- npx eve@latest init my-agent --model openai/gpt-5.6-terra --reasoning high
48
+ npx eve@latest init my-agent --model openai/gpt-6-luna --reasoning high
49
49
  ```
50
50
 
51
51
  ## Run the agent
@@ -155,12 +155,6 @@ eve dev https://your_agent.vercel.app/eve/support
155
155
 
156
156
  Set `VERCEL_AUTOMATION_BYPASS_SECRET` locally before connecting if the deployment uses Deployment Protection.
157
157
 
158
- ## Inspect agent runs
159
-
160
- Vercel detects eve and can add an **Agent Runs** tab under the project’s **Observability** view. Use it to browse sessions and inspect each conversation trace.
161
-
162
- The Agent Runs tab requires enablement for your Vercel team. Contact your Vercel representative if the tab doesn’t appear. For third-party tracing backends, configure [OpenTelemetry instrumentation](../../observability/instrumentation).
163
-
164
158
  ## Continue configuring production
165
159
 
166
160
  Use these guides to secure and observe the deployed agent:
@@ -71,7 +71,7 @@ Changes apply together after the final choice, then the picker returns to chat.
71
71
 
72
72
  A successful login or model change takes effect on the next prompt.
73
73
 
74
- Gateway connections default to `spacexai/grok-4.7`; OpenAI and ChatGPT default to `gpt-5.6-luna-fast`; Anthropic defaults to `claude-sonnet-5`. An explicitly authored compatible model stays selected. If a new default is unavailable, eve offers the connection's available models. Dynamic or custom model expressions must be edited in `agent.ts`.
74
+ Gateway connections default to `spacexai/grok-4.7`; OpenAI and ChatGPT default to `gpt-6-luna-fast`; Anthropic defaults to `claude-sonnet-5`. An explicitly authored compatible model stays selected. If a new default is unavailable, eve offers the connection's available models. Dynamic or custom model expressions must be edited in `agent.ts`.
75
75
 
76
76
  ## Add an integration
77
77