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
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  # eve
2
2
 
3
+ ## 0.65.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 60998d6: Remove the `todo` tool, its `eve/tools/todo` export, and the dev TUI todo panel; delete any `agent/tools/todo.ts`, including one that exports `disableTool()`, which now fails the build because there is no default `todo` tool to disable. Compaction no longer resets `write_file` read tracking, so a file read before compaction can be overwritten without re-reading it; stale-read detection still rejects the write if the file changed since that read.
8
+
9
+ `ask_question` is no longer a default tool and is now an ordinary workflow tool built on `ctx.ask()`. Add it with `eve add tool/ask_question`, or change an existing `agent/tools/ask_question.ts` to `import { askQuestion } from "eve/tools/ask_question"; export default askQuestion();`. The model now asks one `question` with up to three `{ label, description }` options, can always receive a free-text answer, and gets back `{ status: "answered", answer }` with the chosen label or the user's words. In sessions that cannot request input, the tool is still available and returns `{ status: "unavailable" }`. If you disabled `ask_question` with `disableTool()`, delete that file; it now fails the build for the same reason.
10
+
11
+ `ctx.ask()` now resolves to `{ status: "answered", optionId?, text? }`, `{ status: "dismissed" }`, or `{ status: "unavailable" }`; check `status` before reading `optionId`. It returns `unavailable` immediately when the session cannot request input. A plain-text message answers a blocking tool's `ctx.ask()` question when it is the only pending question and the message matches an option or the question allows free text. Pass `dismissible: true` to resolve the question as `dismissed` when the user sends an unrelated message instead. An `ask_question` request's `requestId` is no longer its tool call ID; use `action.callId` to relate a request to its tool call.
12
+
13
+ ### Patch Changes
14
+
15
+ - 155d24a: Make the bundled self-modification subagent scaffold an authored mount before changing its model, reasoning, or policy.
16
+ - 155d24a: `eve dev` now mounts bundled development extensions by default, including the local self-modification subagent. Pass `--no-default-extensions` to run without them; production bundles do not initialize these development-only mounts.
17
+ - ebab950: Fix subagent delegation failing with `Context key "eve.sandbox" is not set` when the parent has dynamic skills. Skill announcements are rebuilt at model preparation boundaries, so subagent notifications no longer require sandbox access.
18
+ - d2ed49e: Exclude lazy development sandbox preparation and its transitive dependencies from every production server bundle, including self-hosted builds without a Vercel preset.
19
+ - f945b80: Stop vendoring the unused `@workflow/builders` directive utilities into the published package.
20
+ - a3b795b: Export an `errored` flag on eval assertion results so scorer failures can be distinguished from legitimate zero scores.
21
+
22
+ ## 0.64.1
23
+
24
+ ### Patch Changes
25
+
26
+ - b49a598: Restore the active eve context while session-scoped dynamic tools are recovered, so resolvers that read durable state keep their callbacks after a resumed session.
27
+ - 867a6ad: Prepare pnpm's optional-dependency policy before automatically installing just-bash during development, avoiding startup failures on unapproved native codec builds. Existing package-specific build decisions are preserved.
28
+ - 867a6ad: Pin automatic microsandbox installs and manual installation guidance to the supported version so a new development server does not install an incompatible release.
29
+ - 3e2bf95: Fix background workflow tools in workspace agents to use app-relative workflow IDs so dispatch matches the registered workflow.
30
+ - 070525e: Defer sandbox environment preparation during development until the first sandbox access, so startup and rebuilds no longer wait for optional engine installation. First access prepares all environments in that compiled generation, with heartbeat-backed coordination that recovers after a development worker crash; production builds still prepare eagerly.
31
+ - 867a6ad: Serialize automatic sandbox dependency installations that share a package-manager root, preventing concurrent providers or workspace apps from racing on dependency files. Waiting installations recheck their own package and can proceed after another installation fails.
32
+ - 1a6cb88: Write fallback Vercel service configuration under the Next.js app directory in linked monorepos. This keeps generated eve services discoverable when no active build output directory is found, preventing deployments that omit the agent endpoints.
33
+
3
34
  ## 0.64.0
4
35
 
5
36
  ### Minor Changes
@@ -1,19 +1,23 @@
1
- import type { InputRequest, InputResponse } from "#shared/input.js";
1
+ import type { InputOption, InputResponse } from "#shared/input.js";
2
+ /** The request fields plain text is resolved against. */
3
+ export interface TextResolvableRequest {
4
+ readonly allowFreeform?: boolean;
5
+ readonly options?: readonly InputOption[];
6
+ readonly requestId: string;
7
+ }
2
8
  /**
3
9
  * Maps freeform text to an {@link InputResponse} for a single request.
4
10
  *
5
- * Emitters import this utility to resolve text-based user input against
6
- * pending request options. The harness and runtime do not call it.
7
- *
8
11
  * Resolution order:
9
12
  * 1. Exact option ID (case-insensitive)
10
13
  * 2. Exact option label (case-insensitive)
11
14
  * 3. 1-based numeric index into the options array
12
- * 4. Freeform text if {@link InputRequest.allowFreeform} is not `false`
15
+ * 4. Freeform text when {@link InputRequest.allowFreeform} is `true` or the
16
+ * request has no options
13
17
  */
14
- export declare function resolveTextToResponse(text: string, request: InputRequest): InputResponse | undefined;
18
+ export declare function resolveTextToResponse(text: string, request: TextResolvableRequest): InputResponse | undefined;
15
19
  /**
16
20
  * Resolves text against all pending requests, returning one
17
21
  * {@link InputResponse} for each request that could be matched.
18
22
  */
19
- export declare function resolveTextToResponses(text: string, requests: readonly InputRequest[]): readonly InputResponse[];
23
+ export declare function resolveTextToResponses(text: string, requests: readonly TextResolvableRequest[]): readonly InputResponse[];
@@ -1 +1 @@
1
- function resolveTextToResponse(e,t){let n=e.trim();if(n.length===0)return;let r=n.toLowerCase();if(t.options!==void 0&&t.options.length>0){let e=matchOption(r,t.options);if(e!==void 0)return{requestId:t.requestId,optionId:e.id}}if((t.allowFreeform===!0||t.options===void 0||t.options.length===0)&&n.length>0)return{requestId:t.requestId,text:n}}function resolveTextToResponses(e,t){let n=[];for(let r of t){let t=resolveTextToResponse(e,r);t!==void 0&&n.push(t)}return n}function matchOption(e,t){let n=t.find(t=>t.id.toLowerCase()===e);if(n!==void 0)return n;let r=t.find(t=>t.label.toLowerCase()===e);if(r!==void 0)return r;let i=Number(e);if(Number.isInteger(i)&&i>0&&i<=t.length)return t[i-1]}export{resolveTextToResponse,resolveTextToResponses};
1
+ function resolveTextToResponse(e,t){let n=e.trim();if(n.length===0)return;let r=n.toLowerCase();if(t.options!==void 0&&t.options.length>0){let e=matchOption(r,t.options);if(e!==void 0)return{requestId:t.requestId,optionId:e.id}}if(t.allowFreeform===!0||t.options===void 0||t.options.length===0)return{requestId:t.requestId,text:n}}function resolveTextToResponses(e,t){let n=[];for(let r of t){let t=resolveTextToResponse(e,r);t!==void 0&&n.push(t)}return n}function matchOption(e,t){let n=t.find(t=>t.id.toLowerCase()===e);if(n!==void 0)return n;let r=t.find(t=>t.label.toLowerCase()===e);if(r!==void 0)return r;let i=Number(e);if(Number.isInteger(i)&&i>0&&i<=t.length)return t[i-1]}export{resolveTextToResponse,resolveTextToResponses};
@@ -377,13 +377,12 @@ export interface SessionCallback {
377
377
  export interface SessionCapabilities {
378
378
  /**
379
379
  * True when the session may request input from a human (tool approvals,
380
- * `ask_question`). The runtime reads this in every HITL gate:
380
+ * `ctx.ask()`). The runtime reads this in every HITL gate:
381
381
  *
382
- * 1. `ask_question` tool registration in `buildToolSet`: the tool is hidden
383
- * from the model when the session cannot request input.
382
+ * 1. `ctx.ask()` resolves as `unavailable` instead of waiting when the
383
+ * session cannot request input.
384
384
  * 2. The pending-input park guard: scheduled task sessions without this flag
385
- * fail fast rather than waiting for a response, covering both tool
386
- * approvals and `ask_question` prompts the model has already emitted.
385
+ * fail fast rather than waiting for a response to a tool approval.
387
386
  */
388
387
  readonly requestInput?: boolean;
389
388
  }
@@ -319,16 +319,8 @@ const kernelEffect = z.object({
319
319
  "task-cancel",
320
320
  "workflow-tool-call"
321
321
  ]).optional(),
322
- audience: z.array(z.enum([
323
- "root-session",
324
- "delegated-task-child",
325
- "requires-request-input"
326
- ])),
327
- kind: z.enum([
328
- "request-input",
329
- "dispatch",
330
- "provider-tool"
331
- ]),
322
+ audience: z.array(z.enum(["root-session", "delegated-task-child"])),
323
+ kind: z.enum(["dispatch", "provider-tool"]),
332
324
  sourceId: z.string()
333
325
  }).strict();
334
326
  const compositionDiagnostic = z.object({
@@ -320,16 +320,8 @@ const kernelEffect = z.object({
320
320
  "task-cancel",
321
321
  "workflow-tool-call"
322
322
  ]).optional(),
323
- audience: z.array(z.enum([
324
- "root-session",
325
- "delegated-task-child",
326
- "requires-request-input"
327
- ])),
328
- kind: z.enum([
329
- "request-input",
330
- "dispatch",
331
- "provider-tool"
332
- ]),
323
+ audience: z.array(z.enum(["root-session", "delegated-task-child"])),
324
+ kind: z.enum(["dispatch", "provider-tool"]),
333
325
  sourceId: z.string()
334
326
  }).strict();
335
327
  const compositionDiagnostic = z.object({
@@ -1,7 +1,7 @@
1
1
  import { detectPackageManager } from "#setup/package-manager.js";
2
2
  import { type Prompter } from "#setup/prompter.js";
3
+ import { applyPnpmBuildPolicy, inspectPnpmBuildPolicy } from "#setup/primitives/pm/pnpm-build-policy.js";
3
4
  import type { RegistryCommandLogger } from "./registry-recovery.js";
4
- import { applyPnpmBuildPolicy, inspectPnpmBuildPolicy } from "./registry-pnpm-build-policy.js";
5
5
  export interface DeclaredPnpmBuildPolicy {
6
6
  readonly packages: readonly string[];
7
7
  readonly optional: true;
@@ -1 +1 @@
1
- import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{applyPnpmBuildPolicy,inspectPnpmBuildPolicy}from"./registry-pnpm-build-policy.js";import{createPrompter}from"#setup/prompter.js";import{detectPackageManager}from"#setup/package-manager.js";import{WizardCancelledError}from"#setup/step.js";const PNPM_BUILD_POLICY_ANSWER_KEY=`install.pnpm.buildScripts`,AUTO_ACCEPT_RECOMMENDED_ITEMS=new Set([`eve/self-modification`]);function pnpmBuildPolicyChoice(e){return e===`ignore-optional`||e===`allow-builds`||e===`abort`?e:void 0}async function prepareDeclaredPnpmBuildPolicy(e,t={}){if(e.policies===void 0||e.policies.length===0)return!0;let n={detectPackageManager:t.detectPackageManager??detectPackageManager,inspectPnpmBuildPolicy:t.inspectPnpmBuildPolicy??inspectPnpmBuildPolicy,applyPnpmBuildPolicy:t.applyPnpmBuildPolicy??applyPnpmBuildPolicy,createPrompter:t.createPrompter??createPrompter};if((await n.detectPackageManager(e.appRoot)).kind!==`pnpm`)return!0;for(let t of e.policies){let r=await n.inspectPnpmBuildPolicy(e.appRoot,t.packages);if(r.satisfied)continue;let i=e.options.answers?.[PNPM_BUILD_POLICY_ANSWER_KEY],a=pnpmBuildPolicyChoice(i);if(i!==void 0&&a===void 0)throw Error(`${PNPM_BUILD_POLICY_ANSWER_KEY} must be "ignore-optional", "allow-builds", or "abort".`);if(a===void 0&&AUTO_ACCEPT_RECOMMENDED_ITEMS.has(e.item)&&(a=t.recommendedAction),e.options.nonInteractive&&a===void 0&&e.options.yes!==!0){let n={key:PNPM_BUILD_POLICY_ANSWER_KEY,kind:`select`,message:`How should pnpm handle these optional packages?`,required:!0,recommended:t.recommendedAction,options:[{id:`ignore-optional`,label:`Ignore optional packages`},{id:`allow-builds`,label:`Allow build scripts`},{id:`abort`,label:`Abort add`}]};return e.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:e.item,installed:!1,completedItems:[],status:`input_required`,question:n,next:headlessSetupContinuation({item:e.item,installed:!1,question:n})})),process.exitCode=2,!1}if(a===void 0&&e.options.yes===!0&&(a=t.recommendedAction),a===void 0){let i=e.options.prompter??n.createPrompter();try{a=await i.select({message:`How should pnpm handle these optional packages?`,description:t.reason,metadata:[{label:`Packages`,value:t.packages.join(`, `)},{label:`Policy file`,value:r.filePath}],hintLayout:`inline`,initialValue:t.recommendedAction,options:[{value:`ignore-optional`,label:`Ignore optional packages (recommended)`,hint:`Add the item without installing these packages or running their build scripts.`},{value:`allow-builds`,label:`Allow build scripts`,hint:`Install these packages and allow their third-party build scripts to run.`},{value:`abort`,label:`Abort add`,hint:`Do not add this registry item.`}]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;return!1}}if(a===`abort`)return e.options.nonInteractive&&e.logger.log(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:e.item,completedItems:[]})),!1;if(a===void 0)throw Error(`pnpm build policy selection is required.`);await n.applyPnpmBuildPolicy(r,a)}return!0}export{prepareDeclaredPnpmBuildPolicy};
1
+ import{headlessSetupContinuation,serializeHeadlessSetupEvent}from"./setup-headless.js";import{createPrompter}from"#setup/prompter.js";import{detectPackageManager}from"#setup/package-manager.js";import{WizardCancelledError}from"#setup/step.js";import{applyPnpmBuildPolicy,inspectPnpmBuildPolicy}from"#setup/primitives/pm/pnpm-build-policy.js";const PNPM_BUILD_POLICY_ANSWER_KEY=`install.pnpm.buildScripts`,AUTO_ACCEPT_RECOMMENDED_ITEMS=new Set([`eve/self-modification`]);function pnpmBuildPolicyChoice(e){return e===`ignore-optional`||e===`allow-builds`||e===`abort`?e:void 0}async function prepareDeclaredPnpmBuildPolicy(e,t={}){if(e.policies===void 0||e.policies.length===0)return!0;let n={detectPackageManager:t.detectPackageManager??detectPackageManager,inspectPnpmBuildPolicy:t.inspectPnpmBuildPolicy??inspectPnpmBuildPolicy,applyPnpmBuildPolicy:t.applyPnpmBuildPolicy??applyPnpmBuildPolicy,createPrompter:t.createPrompter??createPrompter};if((await n.detectPackageManager(e.appRoot)).kind!==`pnpm`)return!0;for(let t of e.policies){let r=await n.inspectPnpmBuildPolicy(e.appRoot,t.packages);if(r.satisfied)continue;let i=e.options.answers?.[PNPM_BUILD_POLICY_ANSWER_KEY],a=pnpmBuildPolicyChoice(i);if(i!==void 0&&a===void 0)throw Error(`${PNPM_BUILD_POLICY_ANSWER_KEY} must be "ignore-optional", "allow-builds", or "abort".`);if(a===void 0&&AUTO_ACCEPT_RECOMMENDED_ITEMS.has(e.item)&&(a=t.recommendedAction),e.options.nonInteractive&&a===void 0&&e.options.yes!==!0){let n={key:PNPM_BUILD_POLICY_ANSWER_KEY,kind:`select`,message:`How should pnpm handle these optional packages?`,required:!0,recommended:t.recommendedAction,options:[{id:`ignore-optional`,label:`Ignore optional packages`},{id:`allow-builds`,label:`Allow build scripts`},{id:`abort`,label:`Abort add`}]};return e.logger.error(serializeHeadlessSetupEvent({version:1,type:`blocked`,item:e.item,installed:!1,completedItems:[],status:`input_required`,question:n,next:headlessSetupContinuation({item:e.item,installed:!1,question:n})})),process.exitCode=2,!1}if(a===void 0&&e.options.yes===!0&&(a=t.recommendedAction),a===void 0){let i=e.options.prompter??n.createPrompter();try{a=await i.select({message:`How should pnpm handle these optional packages?`,description:t.reason,metadata:[{label:`Packages`,value:t.packages.join(`, `)},{label:`Policy file`,value:r.filePath}],hintLayout:`inline`,initialValue:t.recommendedAction,options:[{value:`ignore-optional`,label:`Ignore optional packages (recommended)`,hint:`Add the item without installing these packages or running their build scripts.`},{value:`allow-builds`,label:`Allow build scripts`,hint:`Install these packages and allow their third-party build scripts to run.`},{value:`abort`,label:`Abort add`,hint:`Do not add this registry item.`}]})}catch(e){if(!(e instanceof WizardCancelledError))throw e;return!1}}if(a===`abort`)return e.options.nonInteractive&&e.logger.log(serializeHeadlessSetupEvent({version:1,type:`cancelled`,item:e.item,completedItems:[]})),!1;if(a===void 0)throw Error(`pnpm build policy selection is required.`);await n.applyPnpmBuildPolicy(r,a)}return!0}export{prepareDeclaredPnpmBuildPolicy};
@@ -4,6 +4,7 @@ export interface DevelopmentCliOptions {
4
4
  assistantResponseStats?: AssistantResponseStatsMode;
5
5
  connectionAuth?: TerminalPartDisplayMode;
6
6
  contextSize?: number;
7
+ defaultExtensions?: boolean;
7
8
  header?: DevelopmentRequestHeaders;
8
9
  host?: string;
9
10
  input?: string;
@@ -1,3 +1,3 @@
1
- import{createDevBootProgressReporter}from"./boot-progress.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"./ui-options.js";import{runInteractiveDevelopmentUi}from"./run-interactive-ui.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"./url-target.js";import{parseDevelopmentServerUrl}from"./url.js";import{waitForServerOrStop,waitForUiOrServer}from"./wait-for-ui.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode}from"../option-parsers.js";import{InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal}from"#cli/shutdown.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function registerDevelopmentCommand(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();agentCommand(r.command(`dev`),t,e=>{let t=e.opts();return resolveDevelopmentUrlTarget(t,e.processedArgs[0])===void 0}).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input`).addOption(new Option(`--onboard`,`Start fresh-agent onboarding`).hideHelp()).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
1
+ import{createDevBootProgressReporter}from"./boot-progress.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"./ui-options.js";import{runInteractiveDevelopmentUi}from"./run-interactive-ui.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"./url-target.js";import{parseDevelopmentServerUrl}from"./url.js";import{waitForServerOrStop,waitForUiOrServer}from"./wait-for-ui.js";import{parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseStatsMode}from"../option-parsers.js";import{InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal}from"#cli/shutdown.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{noDevelopmentExtensions}from"#compiler/development-extensions.js";async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function registerDevelopmentCommand(e){let{applicationContext:t,logger:n,program:r,runtime:i,telemetry:a}=e,o=createCliTheme();agentCommand(r.command(`dev`),t,e=>{let t=e.opts();return resolveDevelopmentUrlTarget(t,e.processedArgs[0])===void 0}).description(`Start the eve development server or connect to an existing URL.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 2000)`,parsePortOption).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).option(`--no-ui`,`Start the server without an interactive UI`).option(`--no-default-extensions`,`Do not mount default development extensions`).option(`--name <name>`,`Title shown in the terminal UI (defaults to the app folder name)`).option(`--input <text>`,`Pre-fill the prompt input`).addOption(new Option(`--onboard`,`Start fresh-agent onboarding`).hideHelp()).option(`--tools <mode>`,`How tool calls render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--reasoning <mode>`,`How reasoning renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--subagents <mode>`,`How subagent sections render: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--connection-auth <mode>`,`How connection authorization renders: full | collapsed | auto-collapsed | hidden`,parseDisplayMode).option(`--assistant-response-stats <mode>`,`Assistant header statistic: tokens | tokensPerSecond`,parseStatsMode).option(`--context-size <tokens>`,`Model context window size, shown as a usage percentage`,parseContextSizeOption).option(`--logs <mode>`,`Which server/agent logs to show: all | stderr | sandbox | none`,parseLogsMode).addHelpText(`after`,`
2
2
  You can also pass a bare URL, for example: eve dev https://example.com
3
- `).action(async(e,r)=>{let s=resolveDevelopmentUrlTarget(r,e),c=s?.serverUrl,l=hasInteractiveTerminal(),u=resolveDevUiMode({options:r,interactive:l});if(a.trackDevContext({target:s?`remote`:`local`,ui:u}),u===`headless`&&n.log(eveCliBanner()),r.input!==void 0&&u===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let d=!1;if(c!==void 0&&(d=await(i.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:t.root,serverUrl:c})),c){let{loadDevelopmentEnvironmentFiles:e}=await import(`#cli/dev/environment.js`);if(await e(t.root),n.log(`↗ ${d?`local`:`remote`} mode targeting ${o.info(new URL(c).host)}`),u===`headless`){n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}n.log(``);let l=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:t.root,existingLocalServer:d,lifecycle:l,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:r,remoteTarget:s,runDevelopmentTui:i.runDevelopmentTui,server:{serverUrl:c}})}finally{l.dispose()}return}let f=u===`tui`?startCliLiveRow(n,{elapsed:!0}):void 0,p=createDevBootProgressReporter(f);f?.update(`Starting your agent`);let m,h,closeServer=()=>m===void 0?Promise.resolve():(h??=m.close(),h.catch(()=>void 0),h),g=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}}),_,v=u===`tui`&&i.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(e=>(p({type:`before-first-paint`}),e.startDevelopmentTuiStartup({appRoot:t.root,initialInput:r.input,onExitRequest:g.requestStop,...resolveTuiDisplayOptions(r)}))):void 0;try{m=(i.startHost??await loadStartHost())(t.root,{existing:u===`tui`?`attach-if-unconfigured`:`reject`,host:r.host,onBootProgress:p,port:r.port});let[e,s]=await Promise.all([Promise.race([m.start().then(e=>({handle:e})),g.stopped.then(()=>({handle:void 0}))]),v]),c=e.handle;if(c===void 0){_=s,await _?.shutdown();return}if(_=s,u!==`tui`&&n.log(renderCliTaggedLine(o,{message:`server listening at ${c.url}`,tag:`dev`,tone:`success`})),u===`headless`){r.ui!==!1&&!l&&n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(m,g);return}await waitForUiOrServer({handle:c,lifecycle:g,server:m,runUi:async()=>await runInteractiveDevelopmentUi({applicationRoot:t.root,existingLocalServer:!1,lifecycle:g,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:r,report:p,runDevelopmentTui:i.runDevelopmentTui,server:{appRoot:c.appRoot,serverUrl:c.url},startup:_})})}finally{f?.stop(),_===void 0&&(_=await v?.catch(()=>void 0),await _?.shutdown()),await closeServer(),g.dispose()}})}export{registerDevelopmentCommand};
3
+ `).action(async(e,r)=>{let s=resolveDevelopmentUrlTarget(r,e),c=s?.serverUrl,l=hasInteractiveTerminal(),u=resolveDevUiMode({options:r,interactive:l});if(a.trackDevContext({target:s?`remote`:`local`,ui:u}),u===`headless`&&n.log(eveCliBanner()),r.input!==void 0&&u===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let d=!1;if(c!==void 0&&(d=await(i.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:t.root,serverUrl:c})),c){let{loadDevelopmentEnvironmentFiles:e}=await import(`#cli/dev/environment.js`);if(await e(t.root),n.log(`↗ ${d?`local`:`remote`} mode targeting ${o.info(new URL(c).host)}`),u===`headless`){n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}n.log(``);let l=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:t.root,existingLocalServer:d,lifecycle:l,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:r,remoteTarget:s,runDevelopmentTui:i.runDevelopmentTui,server:{serverUrl:c}})}finally{l.dispose()}return}let f=u===`tui`?startCliLiveRow(n,{elapsed:!0}):void 0,p=createDevBootProgressReporter(f);f?.update(`Starting your agent`);let m,h,closeServer=()=>m===void 0?Promise.resolve():(h??=m.close(),h.catch(()=>void 0),h),g=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS,onStop:()=>{closeServer()}}),_,v=u===`tui`&&i.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(e=>(p({type:`before-first-paint`}),e.startDevelopmentTuiStartup({appRoot:t.root,initialInput:r.input,onExitRequest:g.requestStop,...resolveTuiDisplayOptions(r)}))):void 0;try{m=(i.startHost??await loadStartHost())(t.root,{...r.defaultExtensions===!1?{developmentExtensions:noDevelopmentExtensions()}:{},existing:u===`tui`?`attach-if-unconfigured`:`reject`,host:r.host,onBootProgress:p,port:r.port});let[e,s]=await Promise.all([Promise.race([m.start().then(e=>({handle:e})),g.stopped.then(()=>({handle:void 0}))]),v]),c=e.handle;if(c===void 0){_=s,await _?.shutdown();return}if(_=s,u!==`tui`&&n.log(renderCliTaggedLine(o,{message:`server listening at ${c.url}`,tag:`dev`,tone:`success`})),u===`headless`){r.ui!==!1&&!l&&n.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`})),await waitForServerOrStop(m,g);return}await waitForUiOrServer({handle:c,lifecycle:g,server:m,runUi:async()=>await runInteractiveDevelopmentUi({applicationRoot:t.root,existingLocalServer:!1,lifecycle:g,onOnboardingStep:a.trackSetupStep,onOnboardingTerminal:a.trackSetupTerminal,options:r,report:p,runDevelopmentTui:i.runDevelopmentTui,server:{appRoot:c.appRoot,serverUrl:c.url},startup:_})})}finally{f?.stop(),_===void 0&&(_=await v?.catch(()=>void 0),await _?.shutdown()),await closeServer(),g.dispose()}})}export{registerDevelopmentCommand};
@@ -1 +1 @@
1
- import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{EVE_DEV_ENV_FLAG}from"#internal/application/optional-package-install.js";const childPath=fileURLToPath(new URL(`./local-server-child.js`,import.meta.url)),DEV_SERVER_CLOSE_BUDGET_MS=800;function createDevelopmentServer(e,t={}){let n,r,i=!1,a=!1,o=Promise.withResolvers(),s=Promise.withResolvers();o.promise.catch(()=>void 0);let release=()=>{let e=n;e!==void 0&&(n=void 0,e.stdout?.destroy(),e.stderr?.destroy(),e.connected&&e.disconnect(),e.unref())};return{start:async()=>{if(n!==void 0)throw Error(`DevelopmentServer.start() was already called.`);let r={...process.env};await loadDevelopmentEnvironmentFiles(e),process.env[EVE_DEV_ENV_FLAG]??=`1`;let c=fork(childPath,[JSON.stringify({existing:t.existing,host:t.host,port:t.port})],{cwd:e,detached:!0,env:{...r,[EVE_DEV_ENV_FLAG]:`1`},stdio:[`ignore`,`pipe`,`pipe`,`ipc`]});return n=c,c.stdout?.on(`data`,e=>(t.output===`stderr`?process.stderr:process.stdout).write(e)),c.stderr?.on(`data`,e=>process.stderr.write(e)),new Promise((e,n)=>{let r=!1;c.once(`error`,n),c.once(`exit`,(e,t)=>{a=!0,s.resolve(),release(),r?i?o.resolve():o.reject(Error(`Development server exited unexpectedly (${String(e)}, ${String(t)}).`)):n(Error(`Development server exited during startup (${String(e)}, ${String(t)}).`))}),c.on(`message`,a=>{if(a.type===`progress`&&t.onBootProgress?.(a.event),a.type===`started`&&!r&&(r=!0,e(a.handle),a.handle.kind===`existing`&&(i=!0,release())),a.type===`failed`&&!r){r=!0;let e=Error(a.message);a.stack!==void 0&&(e.stack=a.stack),n(e)}})})},close(){if(r!==void 0)return r;let e=n;return e===void 0?Promise.resolve():(i=!0,r=(async()=>{e.connected&&e.send({type:`shutdown`}),!await terminatesWithin(e,s.promise,()=>a,550)&&(signalProcessGroup(e,`SIGTERM`),!await terminatesWithin(e,s.promise,()=>a,150)&&(signalProcessGroup(e,`SIGKILL`),await terminatesWithin(e,s.promise,()=>a,100),release()))})(),r)},wait:()=>o.promise}}async function terminatesWithin(e,t,n,r){let i=Date.now()+r;for(await settlesOrTimesOut(t,r);!hasTerminated(e,n())&&Date.now()<i;)await sleep(Math.min(25,i-Date.now()));return hasTerminated(e,n())}async function settlesOrTimesOut(e,t){let n;try{await Promise.race([e,new Promise(e=>{n=setTimeout(e,t)})])}finally{n!==void 0&&clearTimeout(n)}}function sleep(e){return new Promise(t=>setTimeout(t,e))}function hasTerminated(e,t){return t&&!isProcessGroupAlive(e)}function isProcessGroupAlive(e){if(process.platform===`win32`||e.pid===void 0)return!1;try{return process.kill(-e.pid,0),!0}catch{return!1}}function signalProcessGroup(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{DEV_SERVER_CLOSE_BUDGET_MS,createDevelopmentServer};
1
+ import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{fork}from"node:child_process";import{fileURLToPath}from"node:url";import{EVE_DEV_ENV_FLAG}from"#internal/application/optional-package-install.js";const childPath=fileURLToPath(new URL(`./local-server-child.js`,import.meta.url)),DEV_SERVER_CLOSE_BUDGET_MS=800;function createDevelopmentServer(e,t={}){let n,r,i=!1,a=!1,o=Promise.withResolvers(),s=Promise.withResolvers();o.promise.catch(()=>void 0);let release=()=>{let e=n;e!==void 0&&(n=void 0,e.stdout?.destroy(),e.stderr?.destroy(),e.connected&&e.disconnect(),e.unref())};return{start:async()=>{if(n!==void 0)throw Error(`DevelopmentServer.start() was already called.`);let r={...process.env};await loadDevelopmentEnvironmentFiles(e),process.env[EVE_DEV_ENV_FLAG]??=`1`;let c=fork(childPath,[JSON.stringify({developmentExtensions:t.developmentExtensions,existing:t.existing,host:t.host,port:t.port})],{cwd:e,detached:!0,env:{...r,[EVE_DEV_ENV_FLAG]:`1`},stdio:[`ignore`,`pipe`,`pipe`,`ipc`]});return n=c,c.stdout?.on(`data`,e=>(t.output===`stderr`?process.stderr:process.stdout).write(e)),c.stderr?.on(`data`,e=>process.stderr.write(e)),new Promise((e,n)=>{let r=!1;c.once(`error`,n),c.once(`exit`,(e,t)=>{a=!0,s.resolve(),release(),r?i?o.resolve():o.reject(Error(`Development server exited unexpectedly (${String(e)}, ${String(t)}).`)):n(Error(`Development server exited during startup (${String(e)}, ${String(t)}).`))}),c.on(`message`,a=>{if(a.type===`progress`&&t.onBootProgress?.(a.event),a.type===`started`&&!r&&(r=!0,e(a.handle),a.handle.kind===`existing`&&(i=!0,release())),a.type===`failed`&&!r){r=!0;let e=Error(a.message);a.stack!==void 0&&(e.stack=a.stack),n(e)}})})},close(){if(r!==void 0)return r;let e=n;return e===void 0?Promise.resolve():(i=!0,r=(async()=>{e.connected&&e.send({type:`shutdown`}),!await terminatesWithin(e,s.promise,()=>a,550)&&(signalProcessGroup(e,`SIGTERM`),!await terminatesWithin(e,s.promise,()=>a,150)&&(signalProcessGroup(e,`SIGKILL`),await terminatesWithin(e,s.promise,()=>a,100),release()))})(),r)},wait:()=>o.promise}}async function terminatesWithin(e,t,n,r){let i=Date.now()+r;for(await settlesOrTimesOut(t,r);!hasTerminated(e,n())&&Date.now()<i;)await sleep(Math.min(25,i-Date.now()));return hasTerminated(e,n())}async function settlesOrTimesOut(e,t){let n;try{await Promise.race([e,new Promise(e=>{n=setTimeout(e,t)})])}finally{n!==void 0&&clearTimeout(n)}}function sleep(e){return new Promise(t=>setTimeout(t,e))}function hasTerminated(e,t){return t&&!isProcessGroupAlive(e)}function isProcessGroupAlive(e){if(process.platform===`win32`||e.pid===void 0)return!1;try{return process.kill(-e.pid,0),!0}catch{return!1}}function signalProcessGroup(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{DEV_SERVER_CLOSE_BUDGET_MS,createDevelopmentServer};
@@ -13,7 +13,7 @@ import type { ToolDetailLine } from "./line-diff.js";
13
13
  import type { Theme } from "./theme.js";
14
14
  import type { ToolGroupPresentation } from "./tool-presentation.js";
15
15
  export type ToolStatus = "running" | "done" | "error" | "denied" | "approval";
16
- export type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "flow" | "command" | "question" | "subagent" | "subagent-step" | "subagent-tool" | "subagent-close" | "connection-auth" | "sandbox" | "log" | "turn-stats" | "session-boundary" | "todo-list" | "agent-header";
16
+ export type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "flow" | "command" | "question" | "subagent" | "subagent-step" | "subagent-tool" | "subagent-close" | "connection-auth" | "sandbox" | "log" | "turn-stats" | "session-boundary" | "agent-header";
17
17
  /**
18
18
  * One renderable transcript unit. Fields are interpreted per `kind`; unset
19
19
  * fields are simply omitted from the rendered output.
@@ -1,4 +1,4 @@
1
- import{renderMarkdown}from"./markdown.js";import{isPromptControlCommand}from"./prompt-commands.js";import{elisionText}from"./rail.js";import{renderTool}from"./tool-rows.js";import{clipVisible,sliceVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderBlockLines(e,t,n,r){let i=e.depth??0,a=nestingPrefix(i,n),o=renderBody(e,Math.max(8,t-visibleLength(a)),n,r);if(e.closesRail===!0&&i>0){let e=closingPrefix(i,n);return o.map((t,n)=>`${n===o.length-1?e:a}${t}`)}return o.map(e=>`${a}${e}`)}function nestingPrefix(e,t){return e<=0?``:` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e)}`}function closingPrefix(e,t){return` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e-1)}${t.colors.dim(t.glyph.corner)} `}function renderBody(e,t,n,r){if(e.elided!==void 0&&e.kind===`subagent-step`)return[` ${elisionText(e.elided,n)}`];switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n,r);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n);case`subagent`:return renderSubagentHeader(e,t,n,r);case`subagent-close`:{let r=` ${n.colors.dim(n.glyph.corner)}`;return e.body!==void 0&&e.body.length>0?[clipVisible(`${r} ${n.colors.dim(e.body)}`,Math.max(1,t))]:[r]}case`turn-stats`:return renderTurnStats(e,t,n);case`session-boundary`:case`todo-list`:case`agent-header`:return(e.body??``).split(`
1
+ import{renderMarkdown}from"./markdown.js";import{isPromptControlCommand}from"./prompt-commands.js";import{elisionText}from"./rail.js";import{renderTool}from"./tool-rows.js";import{clipVisible,sliceVisible,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";function renderBlockLines(e,t,n,r){let i=e.depth??0,a=nestingPrefix(i,n),o=renderBody(e,Math.max(8,t-visibleLength(a)),n,r);if(e.closesRail===!0&&i>0){let e=closingPrefix(i,n);return o.map((t,n)=>`${n===o.length-1?e:a}${t}`)}return o.map(e=>`${a}${e}`)}function nestingPrefix(e,t){return e<=0?``:` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e)}`}function closingPrefix(e,t){return` ${`${t.colors.dim(t.glyph.rule)} `.repeat(e-1)}${t.colors.dim(t.glyph.corner)} `}function renderBody(e,t,n,r){if(e.elided!==void 0&&e.kind===`subagent-step`)return[` ${elisionText(e.elided,n)}`];switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n,r);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n);case`subagent`:return renderSubagentHeader(e,t,n,r);case`subagent-close`:{let r=` ${n.colors.dim(n.glyph.corner)}`;return e.body!==void 0&&e.body.length>0?[clipVisible(`${r} ${n.colors.dim(e.body)}`,Math.max(1,t))]:[r]}case`turn-stats`:return renderTurnStats(e,t,n);case`session-boundary`:case`agent-header`:return(e.body??``).split(`
2
2
  `)}}function renderUser(e,t,n){let r=e.promptOrigin===`steer`?n.colors.yellow(n.glyph.user):n.colors.cyan(n.glyph.user);return wrap(e.body??``,t-2).map(e=>`${r} ${e}`)}function renderProse(e,t,n,r){let i=[],a=e.kind===`subagent-step`;if(a&&e.collapsed===!0){let r=firstNonEmptyLine(e.body)??(e.reasoning===void 0?void 0:firstNonEmptyLine(e.reasoning));return r===void 0?[]:[n.colors.dim(sliceVisible(r,Math.max(1,t)))]}let o=r.renderMarkdown??!0,s=a?``:`${n.colors.bold(n.glyph.brand)} `,c=a?``:` `;e.reasoning&&e.reasoning.trim().length>0&&i.push(...renderReasoningLines(e.reasoning,t,n));let l=(e.body??``).trim();return l.length===0&&i.length===0?[`${s}${n.colors.dim(`thinking${n.glyph.ellipsis}`)}`]:(l.length>0&&(o?renderMarkdown(l,t-c.length):l).split(`
3
3
  `).flatMap(e=>wrapVisibleLine(e,t-c.length)).forEach((e,t)=>{t===0&&!a&&i.length===0?i.push(`${s}${e}`):i.push(`${c}${e}`)}),i.length>0?i:[`${s}`])}function renderReasoning(e,t,n){return e.collapsed?[`${n.colors.gray(n.glyph.reasoning)} ${n.colors.dim(e.title??`thinking`)}`]:renderReasoningLines(e.body??``,t,n,n.glyph.reasoning)}function renderReasoningLines(e,t,n,r){let i=r?2:0,a=wrap(e.trim(),t-i);return a.length===0?[]:a.map((e,t)=>`${r?t===0?`${n.colors.gray(r)} `:` `:``}${n.colors.dim(n.colors.italic(e))}`)}function renderError(e,t,n){let r=n.colors.red(n.colors.bold(n.glyph.error)),i=e.title??`Error`,a=[`${r} ${n.colors.red(n.colors.bold(i))}`];for(let r of wrap(e.body??``,t-2))a.push(` ${colorizeError(r,n)}`);if(e.hint!==void 0&&e.hint.trim().length>0)for(let[r,i]of wrap(e.hint,t-4).entries()){let e=r===0?`${n.glyph.arrow} `:` `;a.push(` ${n.colors.cyan(`${e}${i}`)}`)}return a.push(...renderErrorDetail(e.detail,t,n)),a}function renderErrorDetail(e,t,n){if(e===void 0||e.trim().length===0)return[];let r=e.split(`
4
4
  `),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderAttentionRows(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function renderWarning(e,t,n){return renderAttentionRows(e.body??``,t,n)}function paintCommands(e,t){return e.replace(/\/[a-z:-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t){let n=t.colors,r=e.status===`error`?`${n.red(t.glyph.error)} `:``;return[`${n.cyan(t.glyph.user)} ${r}${n.blue(e.body??``)}`]}function paintOutcomeMarker(e,t,n=e){let r=n.trimStart().slice(0,1);return r===`✓`?e.replace(r,t.colors.green(t.glyph.success)):r===`⨯`?e.replace(r,t.colors.red(t.glyph.error)):r===`–`?e.replace(r,t.colors.yellow(t.glyph.dash)):e}function renderFlow(e,t,n){let r=n.colors,i=e.title??`info`,a=i===`success`?r.green(n.glyph.success):i===`warning`?r.yellow(n.glyph.warning):i===`error`?r.red(n.glyph.error):r.dim(n.glyph.dot),o=wrap(e.body??``,t-2),paint=e=>i===`info`?r.dim(e):paintOutcomeMarker(e,n);return o.map((e,t)=>`${t===0?a:` `} ${paint(e)}`)}function renderResult(e,t,n){let r=wrap(e.body??``,t-7);if(e.status===`done`){let e=n.colors.dim(n.glyph.elbow),t=n.colors.green(n.glyph.success),i=n.colors.dim(n.glyph.rule),a=n.colors.dim(n.glyph.corner);return r.length===0?[` ${e} ${t}`]:r.map((n,o)=>o===0?` ${e} ${t} ${n}`:` ${o===r.length-1?a:i} ${n}`)}let i=n.colors.dim(n.glyph.elbow);if(r.length===0)return[` ${i}`];let dim=e=>paintOutcomeMarker(n.colors.dim(e.replaceAll(`\x1B[22m`,`\x1B[22m\x1B[2m`)),n,e);return r.map((e,t)=>t===0?` ${i} ${dim(e)}`:` ${dim(e)}`)}function renderPreformatted(e,t,n){let r=e.kind===`connection-auth`?n.colors.yellow(n.glyph.connection):n.colors.yellow(n.colors.bold(n.glyph.question)),i=e.kind===`question`?` `:` `,a=wrap(e.title??``,t-2),o=a.length===0?[`${r} `]:a.map((e,t)=>t===0?`${r} ${n.colors.bold(e)}`:` ${n.colors.bold(e)}`);for(let n of(e.body??``).split(`
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Pure rendering for the HITL question panel — the overlay the agent's
3
- * `ask_question` tool opens above the input area. A full-width rule separates
2
+ * Pure rendering for the HITL question panel — the overlay a pending question
3
+ * request (such as one from `ask_question` or `ctx.ask()`) opens above the
4
+ * input area. A full-width rule separates
4
5
  * it from the transcript, options render as numbered rows with their
5
6
  * descriptions always visible, and the trailing "Type your own answer" row
6
7
  * carries an inline elbow editor that receives focus the moment the cursor
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The shared atoms of the transcript's rail grammar. Persistent sections
3
- * (tool rows, subagent sections, the todo panel) all hang their marks at the
3
+ * (tool rows, subagent sections) all hang their marks at the
4
4
  * same two-cell tool column and elide overflow with the same counted row —
5
5
  * one definition keeps the alignment a checked fact instead of a set of
6
6
  * parallel comments.
@@ -186,7 +186,6 @@ export type AgentTUIRenderer = {
186
186
  * Commits one development sandbox lifecycle line to the transcript.
187
187
  * Optional so non-terminal renderers can ignore local prewarm progress.
188
188
  */
189
- renderSandboxLog?(text: string): void;
190
189
  renderSetupWarning?(text: string): void;
191
190
  /** Clears the setup attention line once its issue is resolved. */
192
191
  clearSetupWarning?(): void;
@@ -1,3 +1,3 @@
1
- import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{describeRemoteAuthCompletedMutations}from"./remote-auth-result.js";import{createRemoteConnectionController}from"./remote-connection.js";import{prepareRemoteTuiAccess}from"./remote-startup.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{isJsonObjectValue}from"#shared/json.js";import{SteeringStream}from"#cli/dev/tui/steering-stream.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}async function abortableDelay(e,t){t.aborted||await new Promise(n=>{let r=setTimeout(done,e);r.unref?.(),t.addEventListener(`abort`,done,{once:!0});function done(){clearTimeout(r),t.removeEventListener(`abort`,done),n()}})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v=!1;#y;#b;#x=!0;#S;#C;#w;#T;#E;#D;#O;#k;#A;#j=!1;#M=new AbortController;#N=!1;#P=0;#F=0;#I=[];#L;#R;#z;#B;#V=new Map;#H;#U=[];#W;#G=!1;#K;#q=new Map;#J=new Set;#Y;#X;#Z;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#Z=e.lifecycle),this.#n=createRenderer(e);let t={formatActionResultError};if(this.#t!==void 0&&(t.client=this.#t),this.#n.subagents!==void 0&&(t.view=this.#n.subagents),e.appRoot!==void 0&&(t.onToolCompleted=async(e,t,n)=>{let r=registryHandoffAddress(e,t,n);r!==void 0&&this.#pe(r)}),this.#K=new SubagentPump(t),this.#r=e.name??`eve`,this.#w=e.withExclusiveTerminal,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.initialInput!==void 0&&(this.#m=e.initialInput),e.startup!==void 0&&(this.#h=e.startup),this.#_=e.onboard===!0,this.#y=e.onOnboardingStep,this.#b=e.onOnboardingTerminal,e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#R=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#z=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#S=e.promptCommandHandler),this.#C=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#E=e.remote.runAuthFlow,this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#T=createRemoteConnectionController({client:this.#t,credentials:e.remote.credentials,target:e.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:e.remote.resolveOidcToken,resolveDeployment:e.remote.resolveDeployment})}this.#D=e.bootDetections??BOOT_DETECTIONS,this.#O=e.getVercelAuthStatus??getVercelAuthStatus,this.#k=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#A=e.onBootProgress),e.serverUrl!==void 0&&(this.#f=e.serverUrl),e.serverUrl!==void 0&&e.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:e.serverUrl}))}async#Q(){if(this.#f===void 0){this.#te(),this.#_||await this.#he(void 0);return}let e;if(this.#T!==void 0){let t=await this.#T.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t,timeoutMs:2e3}),this.#A);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}this.#te();let t=this.#ee(e);this.#_||await this.#he(t)}#$(){let e=this.#h?.finish();return this.#g=e?.queuedPrompt,e?.draft??this.#m}#ee(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#B=t;let n=this.#f;if(n===void 0||this.#x)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#n.renderAgentHeader?.(r),t}#te(){let e=this.#A;this.#A=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#Z?.signal.aborted===!0?onStop():this.#Z?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#ne()}finally{this.#Z?.signal.removeEventListener(`abort`,onStop),this.#j=!0,this.#M.abort(),this.#K.abortAll(),this.#X?.(),this.#X=void 0,this.#n.shutdown?.(),this.#R?.dispose(),this.#z?.dispose(),this.#T?.dispose()}}async#ne(){let e=this.#r,t,n,r=!1,i=!1,a=!1;this.#n.setStartupPhase?.(`starting`),await this.#Q(),this.#ye(),this.#R?.refreshIdentity(),this.#z?.refresh();let o=(this.#_||this.#B?.agent.model.endpoint?.kind===`gateway`&&!this.#B.agent.model.endpoint.connected)&&this.#p!==void 0&&this.#S!==void 0&&this.#n.setupFlow!==void 0,s;if(this.#T!==void 0&&this.#n.setupFlow!==void 0){let e=await prepareRemoteTuiAccess({connection:this.#T,renderer:this.#n.setupFlow,signal:this.#Z?.signal,runAuthFlow:this.#E});if(e?.kind===`authenticated`){let e=this.#T.current().connection;e.state===`ready`&&this.#ee(e.info)}else e?.kind===`failed`||e?.kind===`unavailable`?s={tone:`error`,message:e.kind===`failed`?e.message:e.failure.message}:e?.kind===`cancelled`&&(s={cancelled:!0},e.completedMutations.length>0&&(s.message=`Completed before cancellation: ${describeRemoteAuthCompletedMutations(e.completedMutations).join(`, `)}.`))}o&&(this.#n.setStartupPhase?.(`connecting`),s=await this.#Te(e));let c=this.#$();for(s?.cancelled||s?.tone===`error`?c=[this.#g,c].filter(Boolean).join(`
1
+ import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{describeRemoteAuthCompletedMutations}from"./remote-auth-result.js";import{createRemoteConnectionController}from"./remote-connection.js";import{prepareRemoteTuiAccess}from"./remote-startup.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,normalizeLocalModelEndpoint,orderedSetupIssues}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import"#client/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{inspectApplication}from"#services/inspect-application.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{toErrorMessage}from"#shared/errors.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{isJsonObjectValue}from"#shared/json.js";import{SteeringStream}from"#cli/dev/tui/steering-stream.js";import{renderApplicationInfo}from"#cli/commands/info.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}async function abortableDelay(e,t){t.aborted||await new Promise(n=>{let r=setTimeout(done,e);r.unref?.(),t.addEventListener(`abort`,done,{once:!0});function done(){clearTimeout(r),t.removeEventListener(`abort`,done),n()}})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v=!1;#y;#b;#x=!0;#S;#C;#w;#T;#E;#D;#O;#k;#A;#j=!1;#M=new AbortController;#N=!1;#P=0;#F=0;#I=[];#L;#R;#z;#B;#V=new Map;#H;#U=[];#W;#G=!1;#K;#q=new Map;#J=new Set;#Y;#X;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#X=e.lifecycle),this.#n=createRenderer(e);let t={formatActionResultError};if(this.#t!==void 0&&(t.client=this.#t),this.#n.subagents!==void 0&&(t.view=this.#n.subagents),e.appRoot!==void 0&&(t.onToolCompleted=async(e,t,n)=>{let r=registryHandoffAddress(e,t,n);r!==void 0&&this.#fe(r)}),this.#K=new SubagentPump(t),this.#r=e.name??`eve`,this.#w=e.withExclusiveTerminal,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.initialInput!==void 0&&(this.#m=e.initialInput),e.startup!==void 0&&(this.#h=e.startup),this.#_=e.onboard===!0,this.#y=e.onOnboardingStep,this.#b=e.onOnboardingTerminal,e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#R=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#z=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#S=e.promptCommandHandler),this.#C=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#E=e.remote.runAuthFlow,this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#T=createRemoteConnectionController({client:this.#t,credentials:e.remote.credentials,target:e.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:e.remote.resolveOidcToken,resolveDeployment:e.remote.resolveDeployment})}this.#D=e.bootDetections??BOOT_DETECTIONS,this.#O=e.getVercelAuthStatus??getVercelAuthStatus,this.#k=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#A=e.onBootProgress),e.serverUrl!==void 0&&(this.#f=e.serverUrl),e.serverUrl!==void 0&&e.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:e.serverUrl}))}async#Z(){if(this.#f===void 0){this.#ee(),this.#_||await this.#me(void 0);return}let e;if(this.#T!==void 0){let t=await this.#T.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t,timeoutMs:2e3}),this.#A);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}this.#ee();let t=this.#$(e);this.#_||await this.#me(t)}#Q(){let e=this.#h?.finish();return this.#g=e?.queuedPrompt,e?.draft??this.#m}#$(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#B=t;let n=this.#f;if(n===void 0||this.#x)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#n.renderAgentHeader?.(r),t}#ee(){let e=this.#A;this.#A=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#X?.signal.aborted===!0?onStop():this.#X?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#te()}finally{this.#X?.signal.removeEventListener(`abort`,onStop),this.#j=!0,this.#M.abort(),this.#K.abortAll(),this.#n.shutdown?.(),this.#R?.dispose(),this.#z?.dispose(),this.#T?.dispose()}}async#te(){let e=this.#r,t,n,r=!1,i=!1,a=!1;this.#n.setStartupPhase?.(`starting`),await this.#Z(),this.#R?.refreshIdentity(),this.#z?.refresh();let o=(this.#_||this.#B?.agent.model.endpoint?.kind===`gateway`&&!this.#B.agent.model.endpoint.connected)&&this.#p!==void 0&&this.#S!==void 0&&this.#n.setupFlow!==void 0,s;if(this.#T!==void 0&&this.#n.setupFlow!==void 0){let e=await prepareRemoteTuiAccess({connection:this.#T,renderer:this.#n.setupFlow,signal:this.#X?.signal,runAuthFlow:this.#E});if(e?.kind===`authenticated`){let e=this.#T.current().connection;e.state===`ready`&&this.#$(e.info)}else e?.kind===`failed`||e?.kind===`unavailable`?s={tone:`error`,message:e.kind===`failed`?e.message:e.failure.message}:e?.kind===`cancelled`&&(s={cancelled:!0},e.completedMutations.length>0&&(s.message=`Completed before cancellation: ${describeRemoteAuthCompletedMutations(e.completedMutations).join(`, `)}.`))}o&&(this.#n.setStartupPhase?.(`connecting`),s=await this.#Ce(e));let c=this.#Q();for(s?.cancelled||s?.tone===`error`?c=[this.#g,c].filter(Boolean).join(`
2
2
 
3
- `)||void 0:t=this.#g,this.#x=!1,this.#ee(this.#B),this.#ge(),this.#n.setStartupPhase?.(void 0),(!o||s?.cancelled||s?.tone===`error`)&&this.#be(s?.message,s?.tone);;){if(this.#Z?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let o=this.#U[0];if(o!==void 0&&n===void 0&&this.#H===void 0){this.#U.shift(),this.#W=o;try{await this.#me(o)}finally{this.#W=void 0}i=!1,a=!1,t=void 0;continue}if(!a){if(t==null){if(!this.#n.readPrompt){if(r)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let n={title:e};c!==void 0&&(n.initialDraft=c,c=void 0);try{this.#G=!0,t=await this.#se(n)}catch(e){if(isInterruptedError(e)){if(this.#H===void 0&&this.#U.length===0)return;a=!0,t=``}else throw e}finally{this.#G=!1}if(this.#U.length>0&&this.#H===void 0){t=void 0;continue}if(t==null&&this.#H===void 0)return}let o=this.#H===void 0?parsePromptCommand(t):null;if(o?.type===`exit`){this.#Z?.requestStop();return}if(o?.type===`cancel`){if(this.#e===void 0){this.#be(`No active turn to cancel.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.cancel();if(this.#be(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#be(`Couldn't cancel the turn: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`reset`){if(!await this.#ae()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(o?.type===`compact`){if(this.#e===void 0){this.#be(`No active session to compact.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.compact();if(this.#be(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#be(`Couldn't compact the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`clear`){if(this.#e===void 0){this.#be(`No active session to clear.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.clear();if(this.#be(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#be(`Couldn't clear the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`help`){this.#be(formatPromptCommandHelp(this.#C)),n=void 0,a=!1,t=void 0;continue}if(o?.type===`info`){await this.#Oe(),n=void 0,a=!1,t=void 0;continue}if(o?.type===`loglevel`){this.#be(this.#ke(o.argument)),n=void 0,a=!1,t=void 0;continue}if(o?.type===`traces`){await this.#De(o.argument),n=void 0,a=!1,t=void 0;continue}if(o?.type===`extension`){try{await this.#we(o,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let s=this.#H;this.#H=void 0;let l=s??(i?this.#de():await(async()=>(this.#ie(),await this.#le({prompt:a?void 0:t,inputResponses:n})))()),u=this.#e?.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=t,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let r=l.turnState?.pendingApprovals??[],i=l.turnState?.pendingQuestions??[];if(r.length>0||i.length>0){let o=[];if(r.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let t of r){let n=await this.#n.readToolApproval(t,{title:e});o.push({requestId:t.approvalId,optionId:n.approved?`approve`:`cancel`}),this.#V.delete(t.approvalId)}}if(i.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of i){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),o.push(i),this.#V.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Fe(l)){l=this.#de(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0&&!l.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;i=!1,a=!1,n=void 0,t=void 0;let p=l.turnState?.boundaryEvent;this.#Y!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#ie(l.turnState?.aborted===!0)}}#re(){this.#K.abortAll(),this.#V.clear(),this.#q.clear(),this.#J.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#ie(e=!1){let t=this.#Y;t!==void 0&&(this.#Y=void 0,this.#e===t&&(this.#re(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#ae(){if(this.#e===void 0)return this.#re(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#re(),this.#n.reset?.(),!0}async#oe(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=!1,s=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Ne()}),this.#p!==void 0&&this.#B===void 0&&!o&&(o=!0,this.#je().finally(()=>{o=!1}));let e=this.#B?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();t&&r-s>=5e3&&(s=r,this.#je())}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let c=setInterval(()=>{startRefresh()},500);c.unref?.();try{return await t}finally{r=!0,clearInterval(c),await a}}async#se(e){let t=this.#oe(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#ce(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#ce(e,t){let n=this.#e;if(n===void 0)return;let r=100;for(;!e.aborted;){let i=n.stream({signal:e})[Symbol.asyncIterator](),a=!1;try{for(;!e.aborted;){let r=!1,o={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await i.next();if(e.done===!0||(r=!0,a=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},s=this.#fe(o,()=>{},n);if(await this.#n.renderIdleStream(s,{...t,continueSession:!0}),this.#Fe(s),(s.turnState?.pendingApprovals.length??0)>0||(s.turnState?.pendingQuestions.length??0)>0){this.#H={events:(async function*(){})(),turnState:s.turnState},this.#n.suspendPromptForInput?.();return}if(s.turnState?.boundaryEvent===`session.completed`||s.turnState?.boundaryEvent===`session.failed`)return;if(!r)break}}finally{await i.return?.()}r=a?100:Math.min(r*2,2e3),e.aborted||await abortableDelay(r,e)}}async#le(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#Ne()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#T?.reportFailure(e),this.#Y=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#fe(r,()=>t.abort(),this.#e)}async#ue(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#de(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#fe(t.stream({signal:e.signal}),()=>e.abort(),t)}#fe(e,t,n){let r=createTurnState(),i=n===void 0?void 0:new SteeringStream(e,n);return{steer:i===void 0?void 0:e=>i.send(e),abort:()=>{r.aborted=!0,this.#Y=n,i?.abort(),t()},cancel:()=>{this.#ue(r,n)},events:eveEventsToTUIStream({onAssistantResponse:()=>{this.#_&&!this.#v&&(this.#v=!0,this.#y?.({flow:`onboarding`,step:`first_response`}))},events:i??e,pendingInputRequests:this.#V,turnState:r,onSubagentCalled:e=>this.#K.begin(e),onSubagentBackgrounded:e=>this.#K.background(e),onSubagentCompleted:e=>this.#K.settle(e),onTurnCancelled:e=>this.#K.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#Pe(e),onConnectionAuthCompleted:e=>this.#Ie(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#pe(e),onTerminalFailure:()=>{this.#Y=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#pe(e){this.#W===e||this.#U.includes(e)||(this.#U.push(e),this.#G&&this.#n.suspendPromptForInput?.())}async#me(e){await this.#we({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#he(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#I=await detectSetupIssues(t,this.#D),this.#n.renderSetupWarning!==void 0&&(this.#ge(),this.#_e())}#ge(){if(this.#x)return;let e=orderedSetupIssues(this.#I,this.#L);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#_e(){let e=this.#p;if(e===void 0||process.env.EVE_MODEL_CONNECTION!==`ai-gateway-project`)return;let t;try{t=await this.#O(e,{signal:this.#M.signal})}catch{return}this.#j||this.#N||(this.#L=authIssueForStatus(t),this.#ge())}async#ve(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n=++this.#P,r={appRoot:t,env:process.env};e!==void 0&&(r.info=e);try{let[e,i]=await Promise.all([detectSetupIssues(r,this.#D),process.env.EVE_MODEL_CONNECTION===`ai-gateway-project`?this.#O(t,{signal:this.#M.signal}):void 0]);if(this.#j||n!==this.#P)return;this.#I=e,this.#L=i===void 0?void 0:authIssueForStatus(i),this.#ge()}catch{return}}#ye(){this.#p!==void 0&&this.#n.renderSandboxLog!==void 0&&this.#X===void 0&&(this.#X=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#be(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#xe(e,t){let n=this.#S;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#B?.agent.model.endpoint,i={...t,renderer:this.#n,settleOutcome:e=>this.#Ce(e),chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,withExclusiveTerminal:this.#w},a=this.#z?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return await n.handle(e,o)}async#Se(e){if(e?.kind===`model-access-changed`){this.#R?.applyEffect({kind:`refresh-identity`}),this.#N=!0,await this.#Ae(e);return}e!==void 0&&(this.#R?.applyEffect(e),this.#N=!0,this.#ve(this.#B))}async#Ce(e){if(e.effect===void 0)return e;let t=e.effect.kind===`model-access-changed`&&e.effect.reload?setTimeout(()=>{this.#x&&this.#n.setStartupPhase?.(`updating`),this.#n.setupFlow?.setStatus(`Loading selected model…`)},150):void 0;try{await this.#Se(e.effect);let{effect:t,...n}=e;return n}catch{return{tone:`error`,message:`Settings were saved, but the agent could not reload. Retry the command or restart eve dev.`}}finally{clearTimeout(t)}}async#we(e,t,n){let r=await this.#xe(e,{...n,title:t}),i=r===void 0?void 0:await this.#Ce(r);return!(n.suppressSuccessfulTranscript===!0&&i?.tone!==`error`||n.suppressCancelledTranscript===!0&&i?.cancelled===!0)&&n.trigger!==`startup`&&this.#be(i?.message,i?.tone),this.#Ee(),i}async#Te(e){this.#y?.({flow:`onboarding`,step:`model_provider`});let t=await this.#we({type:`extension`,name:`login`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`});return!t?.cancelled&&t?.tone!==`error`&&this.#y?.({flow:`onboarding`,step:`connection_ready`}),this.#b?.({flow:`onboarding`,step:`model_provider`,result:t?.cancelled?`cancelled`:t?.tone===`error`?`error`:`completed`}),t}#Ee(){if(this.#x)return;let e=this.#T?.current().connection;e?.state===`ready`&&e.info!==this.#B&&(this.#B=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#De(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#be(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#Oe(){let e=this.#p;if(e===void 0){this.#be(`/info is only available in local dev sessions.`);return}try{this.#be(renderApplicationInfo(await this.#k(e)))}catch(e){this.#be(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#ke(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#Ae(e){let t=this.#p;t!==void 0&&(++this.#F,++this.#P,await loadDevelopmentEnvironmentFiles(t),e.reload&&await this.#d?.refreshAfterSourceChange({}),e.model&&this.#B?this.#ee({...this.#B,agent:{...this.#B.agent,model:{...this.#B.agent.model,...e.model}}}):this.#ee(this.#B),this.#I=[],this.#L=void 0,this.#ge(),this.#je())}async#je(e=!1){let t=this.#B,n=++this.#F,r=await this.#Me();this.#j||n!==this.#F||r===void 0||(this.#ee(r),e&&!this.#n.renderAgentHeader&&this.#n.renderNotice?.(formatAgentUpdateNotice(t,r)),this.#ve(this.#B))}async#Me(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}#Ne(){this.#je(!0)}#Pe(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#q.set(e.data.name,t),this.#Le(t)}#Fe(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#q.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#J.add(e.name),this.#Le(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#J.size),this.#J.size>0}#Ie(e){let t=this.#q.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#q.set(e.data.name,t),this.#J.delete(e.data.name),this.#Le(t),this.#n.setConnectionAuthPendingCount?.(this.#J.size)}#Le(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}function registryHandoffAddress(e,t,n){if((e!==`self-modification__agent`||t!==`registry_add`)&&(e!==void 0||t!==`selfmod__registry_add`)||typeof n!=`object`||!n)return;let r=n;return r.status===`needs-terminal`&&typeof r.address==`string`?r.address:void 0}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onRegistryHandoff:u,onTerminalFailure:d,failureHintOverride:f}=e,p=new Map,m=new Map,h=new Map,g=createEventDeduper(),_=0,v=new Set,y=new Set,b=new Set,x=!1,S=!1,C;for await(let w of t)if(g.admit(w)&&!(S&&isPostTurnVisibleEvent(w)))switch(w.type){case`session.started`:case`message.received`:break;case`turn.started`:w.data.turnId!==r.turnId&&(S=!1),r.turnId=w.data.turnId,yield{type:`turn-start`,turnId:w.data.turnId};break;case`step.started`:_+=1,yield{type:`step-start`,modelId:w.data.modelId};break;case`step.completed`:{let e=w;C=e.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:e.data.usage};break}case`message.appended`:{let t=w,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.messageDelta;if(i.length===0)break;r.text+=i,i&&e.onAssistantResponse?.(),yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(w.data.turnId,w.data.stepIndex),n=partStateFor(p,t),r=w.data.message;if(n.completed){if(r===null||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let t=r.slice(n.text.length);t.length>0&&(t&&e.onAssistantResponse?.(),yield{type:`assistant-delta`,id:i,delta:t}),n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i}}else n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let e=w,t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t);if(n.completed){if(_<=n.completedEpoch)break;n.generation+=1,n.text=``,n.completed=!1}let r=e.data.reasoningDelta;if(r.length===0)break;n.text+=r,yield{type:`reasoning-delta`,id:partGenerationId(t,n.generation),delta:r};break}case`reasoning.completed`:{let e=reasoningPartId(w.data.turnId,w.data.stepIndex),t=partStateFor(m,e),n=w.data.reasoning;if(t.completed){if(n.length===0||_<=t.completedEpoch)break;t.generation+=1,t.text=n,t.completedEpoch=_;let r=partGenerationId(e,t.generation);yield{type:`reasoning-delta`,id:r,delta:n},yield{type:`reasoning-complete`,id:r};break}let r=partGenerationId(e,t.generation);if(t.text.length===0&&n.length>0)t.text=n,yield{type:`reasoning-delta`,id:r,delta:n};else if(n.length>0&&!n.startsWith(t.text)){yield{type:`reasoning-complete`,id:r},t.generation+=1,t.text=n,t.completed=!0,t.completedEpoch=_;let i=partGenerationId(e,t.generation);yield{type:`reasoning-delta`,id:i,delta:n},yield{type:`reasoning-complete`,id:i};break}t.completed=!0,t.completedEpoch=_,yield{type:`reasoning-complete`,id:r};break}case`actions.requested`:{let e=w.data.actions.filter(e=>e.kind===`tool-call`);if(e.length===0)break;for(let t of e)h.set(t.callId,t.toolName),!v.has(t.callId)&&(v.add(t.callId),yield{type:`tool-call`,toolCallId:t.callId,toolName:t.toolName,input:t.input});break}case`input.requested`:{let e=w.data.requests.filter(e=>e.action.kind===`tool-call`);if(e.length===0)break;for(let t of e){let e=t.action.callId;if(h.set(e,t.action.toolName),t.kind!==`session-limit`&&!v.has(e)&&(v.add(e),yield{type:`tool-call`,toolCallId:e,toolName:t.action.toolName,input:t.action.input}),!y.has(t.requestId)){if(y.add(t.requestId),n.set(t.requestId,t),t.kind!==`tool-approval`){upsertPendingQuestion(r,t);continue}upsertPendingApproval(r,t),yield{type:`tool-approval-request`,approvalId:t.requestId,toolCallId:e}}}break}case`action.result`:{let e=w,t=e.data.result,n=`output`in t?t.output:void 0;if(e.data.status===`completed`&&isJsonObjectValue(n)&&n.status===`working`&&typeof n.taskId==`string`&&typeof n.agentId==`string`&&a?.(t.callId),e.data.result.kind!==`tool-result`)break;let r=e.data.result.callId;if(!v.has(r))break;switch(e.data.status){case`completed`:{let t=e.data.result.output;yield{type:`tool-result`,toolCallId:r,output:t};let n=registryHandoffAddress(void 0,h.get(r),t);n!==void 0&&await u?.(n);break}case`failed`:yield{type:`tool-error`,toolCallId:r,errorText:formatActionResultError(e)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:r,reason:formatActionResultError(e)}}break}case`step.failed`:case`turn.failed`:{let e=toFailureEvent(w,b,f);e&&(yield e);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(w);let e=toFailureEvent(w,b,f);e&&(yield e),r.boundaryEvent=w.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=w.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return;case`turn.completed`:S=!0,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_);break;case`turn.cancelled`:s?.(w.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(w);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let e=w;e.data.backgroundTask===void 0?o?.(e.data.callId):a?.(e.data.callId);break}case`authorization.required`:c?.(w);break;case`authorization.completed`:l?.(w)}x||(yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let i={type:`error`,errorText:formatFailureMessage(e)},a=n?.(e)??formatFailureHint(e);a!==void 0&&(i.hint=a);let o=formatFailureDetail(e);return o!==void 0&&(i.detail=o),i}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand,registryHandoffAddress};
3
+ `)||void 0:t=this.#g,this.#x=!1,this.#$(this.#B),this.#he(),this.#n.setStartupPhase?.(void 0),(!o||s?.cancelled||s?.tone===`error`)&&this.#ve(s?.message,s?.tone);;){if(this.#X?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let o=this.#U[0];if(o!==void 0&&n===void 0&&this.#H===void 0){this.#U.shift(),this.#W=o;try{await this.#pe(o)}finally{this.#W=void 0}i=!1,a=!1,t=void 0;continue}if(!a){if(t==null){if(!this.#n.readPrompt){if(r)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let n={title:e};c!==void 0&&(n.initialDraft=c,c=void 0);try{this.#G=!0,t=await this.#oe(n)}catch(e){if(isInterruptedError(e)){if(this.#H===void 0&&this.#U.length===0)return;a=!0,t=``}else throw e}finally{this.#G=!1}if(this.#U.length>0&&this.#H===void 0){t=void 0;continue}if(t==null&&this.#H===void 0)return}let o=this.#H===void 0?parsePromptCommand(t):null;if(o?.type===`exit`){this.#X?.requestStop();return}if(o?.type===`cancel`){if(this.#e===void 0){this.#ve(`No active turn to cancel.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.cancel();if(this.#ve(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#ve(`Couldn't cancel the turn: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`reset`){if(!await this.#ie()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(o?.type===`compact`){if(this.#e===void 0){this.#ve(`No active session to compact.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.compact();if(this.#ve(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#ve(`Couldn't compact the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`clear`){if(this.#e===void 0){this.#ve(`No active session to clear.`),n=void 0,i=!1,a=!1,t=void 0;continue}try{let e=await this.#e.clear();if(this.#ve(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){n=void 0,i=!1,a=!1,t=void 0;continue}}catch(e){this.#ve(`Couldn't clear the session: ${toErrorMessage(e)}`),n=void 0,i=!1,a=!1,t=void 0;continue}n=void 0,i=!0,a=!1,t=void 0}if(o?.type===`help`){this.#ve(formatPromptCommandHelp(this.#C)),n=void 0,a=!1,t=void 0;continue}if(o?.type===`info`){await this.#Ee(),n=void 0,a=!1,t=void 0;continue}if(o?.type===`loglevel`){this.#ve(this.#De(o.argument)),n=void 0,a=!1,t=void 0;continue}if(o?.type===`traces`){await this.#Te(o.argument),n=void 0,a=!1,t=void 0;continue}if(o?.type===`extension`){try{await this.#Se(o,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let s=this.#H;this.#H=void 0;let l=s??(i?this.#ue():await(async()=>(this.#re(),await this.#ce({prompt:a?void 0:t,inputResponses:n})))()),u=this.#e?.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=t,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let r=l.turnState?.pendingApprovals??[],i=l.turnState?.pendingQuestions??[];if(r.length>0||i.length>0){let o=[];if(r.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let t of r){let n=await this.#n.readToolApproval(t,{title:e});o.push({requestId:t.approvalId,optionId:n.approved?`approve`:`cancel`}),this.#V.delete(t.approvalId)}}if(i.length>0){if(!this.#n.readInputQuestion)throw Error(`An interactive question was requested, but the renderer does not support input questions.`);for(let t of i){let n=toAgentTUIInputQuestion(t),r=await this.#n.readInputQuestion(n,{title:e});if(r===void 0)continue;let i={requestId:t.requestId};r.optionId!==void 0&&(i.optionId=r.optionId),r.text!==void 0&&(i.text=r.text),o.push(i),this.#V.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Ne(l)){l=this.#ue(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0&&!l.turnState.aborted){let e=this.#e?.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;i=!1,a=!1,n=void 0,t=void 0;let p=l.turnState?.boundaryEvent;this.#Y!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#re(l.turnState?.aborted===!0)}}#ne(){this.#K.abortAll(),this.#V.clear(),this.#q.clear(),this.#J.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#re(e=!1){let t=this.#Y;t!==void 0&&(this.#Y=void 0,this.#e===t&&(this.#ne(),e?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary()))}async#ie(){if(this.#e===void 0)return this.#ne(),this.#n.reset?.(),!0;try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#ne(),this.#n.reset?.(),!0}async#ae(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,o=!1,s=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#je()}),this.#p!==void 0&&this.#B===void 0&&!o&&(o=!0,this.#ke().finally(()=>{o=!1}));let e=this.#B?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();t&&r-s>=5e3&&(s=r,this.#ke())}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let c=setInterval(()=>{startRefresh()},500);c.unref?.();try{return await t}finally{r=!0,clearInterval(c),await a}}async#oe(e){let t=this.#ae(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#se(n.signal,e).catch(e=>{n.signal.aborted||this.#n.renderNotice?.(`Stopped following session updates: ${toErrorMessage(e)}`)});try{return await t}finally{n.abort(),await r}}async#se(e,t){let n=this.#e;if(n===void 0)return;let r=100;for(;!e.aborted;){let i=n.stream({signal:e})[Symbol.asyncIterator](),a=!1;try{for(;!e.aborted;){let r=!1,o={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await i.next();if(e.done===!0||(r=!0,a=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},s=this.#de(o,()=>{},n);if(await this.#n.renderIdleStream(s,{...t,continueSession:!0}),this.#Ne(s),(s.turnState?.pendingApprovals.length??0)>0||(s.turnState?.pendingQuestions.length??0)>0){this.#H={events:(async function*(){})(),turnState:s.turnState},this.#n.suspendPromptForInput?.();return}if(s.turnState?.boundaryEvent===`session.completed`||s.turnState?.boundaryEvent===`session.failed`)return;if(!r)break}}finally{await i.return?.()}r=a?100:Math.min(r*2,2e3),e.aborted||await abortableDelay(r,e)}}async#ce(e){let t=new AbortController,n={signal:t.signal};e.prompt!==void 0&&(n.message=e.prompt),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses);let r,i=this.#e;try{if(this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#je()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),this.#e===void 0){if(this.#t===void 0)throw Error(`Cannot create a session without an eve client.`);if(n.message===void 0)throw Error(`Cannot answer an input request before the session starts.`);let e=await this.#t.sessions.create({...n,message:n.message});this.#e=e.session,r=e.response}else r=n.inputResponses===void 0?await this.#e.send(n.message,{signal:n.signal,turnPolicy:`queue`}):await this.#e.respond(n.inputResponses,{signal:n.signal})}catch(e){if(isInterruptedError(e))throw e;return this.#T?.reportFailure(e),this.#Y=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#de(r,()=>t.abort(),this.#e)}async#le(e,t){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let n=0;n<8;n+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let n=e.turnId;try{if((await t?.cancel(n===void 0?void 0:{turnId:n}))?.status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#ue(){if(this.#e===void 0)throw Error(`Cannot stream a session before its first turn is accepted.`);let e=new AbortController,t=this.#e;return this.#de(t.stream({signal:e.signal}),()=>e.abort(),t)}#de(e,t,n){let r=createTurnState(),i=n===void 0?void 0:new SteeringStream(e,n);return{steer:i===void 0?void 0:e=>i.send(e),abort:()=>{r.aborted=!0,this.#Y=n,i?.abort(),t()},cancel:()=>{this.#le(r,n)},events:eveEventsToTUIStream({onAssistantResponse:()=>{this.#_&&!this.#v&&(this.#v=!0,this.#y?.({flow:`onboarding`,step:`first_response`}))},events:i??e,pendingInputRequests:this.#V,turnState:r,onSubagentCalled:e=>this.#K.begin(e),onSubagentBackgrounded:e=>this.#K.background(e),onSubagentCompleted:e=>this.#K.settle(e),onTurnCancelled:e=>this.#K.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#Me(e),onConnectionAuthCompleted:e=>this.#Pe(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#fe(e),onTerminalFailure:()=>{this.#Y=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#fe(e){this.#W===e||this.#U.includes(e)||(this.#U.push(e),this.#G&&this.#n.suspendPromptForInput?.())}async#pe(e){await this.#Se({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#me(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#I=await detectSetupIssues(t,this.#D),this.#n.renderSetupWarning!==void 0&&(this.#he(),this.#ge())}#he(){if(this.#x)return;let e=orderedSetupIssues(this.#I,this.#L);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ge(){let e=this.#p;if(e===void 0||process.env.EVE_MODEL_CONNECTION!==`ai-gateway-project`)return;let t;try{t=await this.#O(e,{signal:this.#M.signal})}catch{return}this.#j||this.#N||(this.#L=authIssueForStatus(t),this.#he())}async#_e(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n=++this.#P,r={appRoot:t,env:process.env};e!==void 0&&(r.info=e);try{let[e,i]=await Promise.all([detectSetupIssues(r,this.#D),process.env.EVE_MODEL_CONNECTION===`ai-gateway-project`?this.#O(t,{signal:this.#M.signal}):void 0]);if(this.#j||n!==this.#P)return;this.#I=e,this.#L=i===void 0?void 0:authIssueForStatus(i),this.#he()}catch{return}}#ve(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#ye(e,t){let n=this.#S;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#B?.agent.model.endpoint,i={...t,renderer:this.#n,settleOutcome:e=>this.#xe(e),chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,withExclusiveTerminal:this.#w},a=this.#z?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return await n.handle(e,o)}async#be(e){if(e?.kind===`model-access-changed`){this.#R?.applyEffect({kind:`refresh-identity`}),this.#N=!0,await this.#Oe(e);return}e!==void 0&&(this.#R?.applyEffect(e),this.#N=!0,this.#_e(this.#B))}async#xe(e){if(e.effect===void 0)return e;let t=e.effect.kind===`model-access-changed`&&e.effect.reload?setTimeout(()=>{this.#x&&this.#n.setStartupPhase?.(`updating`),this.#n.setupFlow?.setStatus(`Loading selected model…`)},150):void 0;try{await this.#be(e.effect);let{effect:t,...n}=e;return n}catch{return{tone:`error`,message:`Settings were saved, but the agent could not reload. Retry the command or restart eve dev.`}}finally{clearTimeout(t)}}async#Se(e,t,n){let r=await this.#ye(e,{...n,title:t}),i=r===void 0?void 0:await this.#xe(r);return!(n.suppressSuccessfulTranscript===!0&&i?.tone!==`error`||n.suppressCancelledTranscript===!0&&i?.cancelled===!0)&&n.trigger!==`startup`&&this.#ve(i?.message,i?.tone),this.#we(),i}async#Ce(e){this.#y?.({flow:`onboarding`,step:`model_provider`});let t=await this.#Se({type:`extension`,name:`login`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`});return!t?.cancelled&&t?.tone!==`error`&&this.#y?.({flow:`onboarding`,step:`connection_ready`}),this.#b?.({flow:`onboarding`,step:`model_provider`,result:t?.cancelled?`cancelled`:t?.tone===`error`?`error`:`completed`}),t}#we(){if(this.#x)return;let e=this.#T?.current().connection;e?.state===`ready`&&e.info!==this.#B&&(this.#B=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#Te(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#ve(`/traces is only available in local dev sessions.`);return}try{await this.#n.traceViewer.open({appRoot:this.#p,sessionId:this.#e?.state.sessionId,reference:e===``?void 0:e})}catch(e){if(isInterruptedError(e))return;throw e}}async#Ee(){let e=this.#p;if(e===void 0){this.#ve(`/info is only available in local dev sessions.`);return}try{this.#ve(renderApplicationInfo(await this.#k(e)))}catch(e){this.#ve(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#De(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#Oe(e){let t=this.#p;t!==void 0&&(++this.#F,++this.#P,await loadDevelopmentEnvironmentFiles(t),e.reload&&await this.#d?.refreshAfterSourceChange({}),e.model&&this.#B?this.#$({...this.#B,agent:{...this.#B.agent,model:{...this.#B.agent.model,...e.model}}}):this.#$(this.#B),this.#I=[],this.#L=void 0,this.#he(),this.#ke())}async#ke(e=!1){let t=this.#B,n=++this.#F,r=await this.#Ae();this.#j||n!==this.#F||r===void 0||(this.#$(r),e&&!this.#n.renderAgentHeader&&this.#n.renderNotice?.(formatAgentUpdateNotice(t,r)),this.#_e(this.#B))}async#Ae(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}#je(){this.#ke(!0)}#Me(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#q.set(e.data.name,t),this.#Fe(t)}#Ne(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#q.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#J.add(e.name),this.#Fe(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#J.size),this.#J.size>0}#Pe(e){let t=this.#q.get(e.data.name)??{name:e.data.name,description:``,state:e.data.outcome};t.state=e.data.outcome,e.data.reason!==void 0&&(t.reason=e.data.reason),this.#q.set(e.data.name,t),this.#J.delete(e.data.name),this.#Fe(t),this.#n.setConnectionAuthPendingCount?.(this.#J.size)}#Fe(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}function registryHandoffAddress(e,t,n){if((e!==`self-modification__agent`||t!==`registry_add`)&&(e!==void 0||t!==`selfmod__registry_add`)||typeof n!=`object`||!n)return;let r=n;return r.status===`needs-terminal`&&typeof r.address==`string`?r.address:void 0}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentBackgrounded:a,onSubagentCompleted:o,onTurnCancelled:s,onConnectionAuthRequired:c,onConnectionAuthCompleted:l,onRegistryHandoff:u,onTerminalFailure:d,failureHintOverride:f}=e,p=new Map,m=new Map,h=new Map,g=createEventDeduper(),_=0,v=new Set,y=new Set,b=new Set,x=!1,S=!1,C;for await(let w of t)if(g.admit(w)&&!(S&&isPostTurnVisibleEvent(w)))switch(w.type){case`session.started`:case`message.received`:break;case`turn.started`:w.data.turnId!==r.turnId&&(S=!1),r.turnId=w.data.turnId,yield{type:`turn-start`,turnId:w.data.turnId};break;case`step.started`:_+=1,yield{type:`step-start`,modelId:w.data.modelId};break;case`step.completed`:{let e=w;C=e.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:e.data.usage};break}case`message.appended`:{let t=w,n=textPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(p,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.messageDelta;if(i.length===0)break;r.text+=i,i&&e.onAssistantResponse?.(),yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(w.data.turnId,w.data.stepIndex),n=partStateFor(p,t),r=w.data.message;if(n.completed){if(r===null||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_,yield{type:`assistant-complete`,id:partGenerationId(t,n.generation),text:r};break}let i=partGenerationId(t,n.generation);if(r!==null){if(n.text.length===0)n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r};else if(r.startsWith(n.text)){let t=r.slice(n.text.length);t.length>0&&(t&&e.onAssistantResponse?.(),yield{type:`assistant-delta`,id:i,delta:t}),n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i}}else n.text=r,n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i,text:r}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=_,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let e=w,t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t);if(n.completed){if(_<=n.completedEpoch)break;n.generation+=1,n.text=``,n.completed=!1}let r=e.data.reasoningDelta;if(r.length===0)break;n.text+=r,yield{type:`reasoning-delta`,id:partGenerationId(t,n.generation),delta:r};break}case`reasoning.completed`:{let e=reasoningPartId(w.data.turnId,w.data.stepIndex),t=partStateFor(m,e),n=w.data.reasoning;if(t.completed){if(n.length===0||_<=t.completedEpoch)break;t.generation+=1,t.text=n,t.completedEpoch=_;let r=partGenerationId(e,t.generation);yield{type:`reasoning-delta`,id:r,delta:n},yield{type:`reasoning-complete`,id:r};break}let r=partGenerationId(e,t.generation);if(t.text.length===0&&n.length>0)t.text=n,yield{type:`reasoning-delta`,id:r,delta:n};else if(n.length>0&&!n.startsWith(t.text)){yield{type:`reasoning-complete`,id:r},t.generation+=1,t.text=n,t.completed=!0,t.completedEpoch=_;let i=partGenerationId(e,t.generation);yield{type:`reasoning-delta`,id:i,delta:n},yield{type:`reasoning-complete`,id:i};break}t.completed=!0,t.completedEpoch=_,yield{type:`reasoning-complete`,id:r};break}case`actions.requested`:{let e=w.data.actions.filter(e=>e.kind===`tool-call`);if(e.length===0)break;for(let t of e)h.set(t.callId,t.toolName),!v.has(t.callId)&&(v.add(t.callId),yield{type:`tool-call`,toolCallId:t.callId,toolName:t.toolName,input:t.input});break}case`input.requested`:{let e=w.data.requests.filter(e=>e.action.kind===`tool-call`);if(e.length===0)break;for(let t of e){let e=t.action.callId;if(h.set(e,t.action.toolName),t.kind!==`session-limit`&&!v.has(e)&&(v.add(e),yield{type:`tool-call`,toolCallId:e,toolName:t.action.toolName,input:t.action.input}),!y.has(t.requestId)){if(y.add(t.requestId),n.set(t.requestId,t),t.kind!==`tool-approval`){upsertPendingQuestion(r,t);continue}upsertPendingApproval(r,t),yield{type:`tool-approval-request`,approvalId:t.requestId,toolCallId:e}}}break}case`action.result`:{let e=w,t=e.data.result,n=`output`in t?t.output:void 0;if(e.data.status===`completed`&&isJsonObjectValue(n)&&n.status===`working`&&typeof n.taskId==`string`&&typeof n.agentId==`string`&&a?.(t.callId),e.data.result.kind!==`tool-result`)break;let r=e.data.result.callId;if(!v.has(r))break;switch(e.data.status){case`completed`:{let t=e.data.result.output;yield{type:`tool-result`,toolCallId:r,output:t};let n=registryHandoffAddress(void 0,h.get(r),t);n!==void 0&&await u?.(n);break}case`failed`:yield{type:`tool-error`,toolCallId:r,errorText:formatActionResultError(e)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:r,reason:formatActionResultError(e)}}break}case`step.failed`:case`turn.failed`:{let e=toFailureEvent(w,b,f);e&&(yield e);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(w);let e=toFailureEvent(w,b,f);e&&(yield e),r.boundaryEvent=w.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=w.type,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C},x=!0;return;case`turn.completed`:S=!0,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_);break;case`turn.cancelled`:s?.(w.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(w);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let e=w;e.data.backgroundTask===void 0?o?.(e.data.callId):a?.(e.data.callId);break}case`authorization.required`:c?.(w);break;case`authorization.completed`:l?.(w)}x||(yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`finish`,usage:C})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let i={type:`error`,errorText:formatFailureMessage(e)},a=n?.(e)??formatFailureHint(e);a!==void 0&&(i.hint=a);let o=formatFailureDetail(e);return o!==void 0&&(i.detail=o),i}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand,registryHandoffAddress};
@@ -145,7 +145,6 @@ export declare class TerminalRenderer implements AgentTUIRenderer {
145
145
  * text is blank.
146
146
  */
147
147
  renderNotice(text: string): void;
148
- renderSandboxLog(text: string): void;
149
148
  /**
150
149
  * Sets the setup attention line (yellow `⚠`, commands blue) as a live footer
151
150
  * element above the prompt. Unlike committed scrollback, it can be cleared: