eve 0.52.2 → 0.52.4

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 (315) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/src/channel/types.d.ts +1 -0
  3. package/dist/src/chunks/{use-eve-agent-1NAM6ftx.js → use-eve-agent-BR8EpIOX.js} +27 -10
  4. package/dist/src/chunks/{use-eve-agent-BEjdhhhK.js → use-eve-agent-XnfjQt1Z.js} +27 -10
  5. package/dist/src/cli/commands/deploy.js +1 -1
  6. package/dist/src/cli/commands/extension-init.d.ts +2 -1
  7. package/dist/src/cli/commands/extension-init.js +1 -1
  8. package/dist/src/cli/commands/init.d.ts +2 -13
  9. package/dist/src/cli/commands/init.js +1 -1
  10. package/dist/src/cli/commands/registry-add-command.d.ts +3 -0
  11. package/dist/src/cli/commands/registry-add-command.js +1 -0
  12. package/dist/src/cli/commands/registry-metadata.d.ts +4 -1
  13. package/dist/src/cli/commands/registry-metadata.js +1 -1
  14. package/dist/src/cli/commands/registry.d.ts +1 -2
  15. package/dist/src/cli/commands/registry.js +1 -1
  16. package/dist/src/cli/dev/run-interactive-ui.d.ts +3 -0
  17. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  18. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  19. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  20. package/dist/src/cli/dev/tui/runner.js +1 -1
  21. package/dist/src/cli/dev/tui/setup-commands.d.ts +5 -3
  22. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  23. package/dist/src/cli/dev/tui/status-line.js +1 -1
  24. package/dist/src/cli/dev/tui/tui.d.ts +4 -0
  25. package/dist/src/cli/dev/tui/tui.js +1 -1
  26. package/dist/src/cli/run.d.ts +1 -1
  27. package/dist/src/cli/run.js +2 -2
  28. package/dist/src/cli/telemetry/index.d.ts +15 -0
  29. package/dist/src/cli/telemetry/index.js +2 -2
  30. package/dist/src/client/session.js +1 -1
  31. package/dist/src/compiled/.vendor-stamp.json +1 -1
  32. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  33. package/dist/src/compiler/compile-from-memory.js +1 -1
  34. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  35. package/dist/src/compiler/extension-compatibility.js +1 -1
  36. package/dist/src/context/build-dynamic-tools.d.ts +2 -1
  37. package/dist/src/context/build-dynamic-tools.js +1 -1
  38. package/dist/src/context/dynamic-tool-lifecycle.d.ts +3 -3
  39. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  40. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -1
  41. package/dist/src/context/hook-lifecycle.js +1 -1
  42. package/dist/src/context/keys.d.ts +2 -0
  43. package/dist/src/context/keys.js +1 -1
  44. package/dist/src/evals/reporters/index.d.ts +1 -0
  45. package/dist/src/evals/reporters/index.js +1 -1
  46. package/dist/src/evals/runner/reporters/datadog.d.ts +137 -0
  47. package/dist/src/evals/runner/reporters/datadog.js +3 -0
  48. package/dist/src/eve-channel/index.js +1 -1
  49. package/dist/src/execution/activity-events.d.ts +1 -0
  50. package/dist/src/execution/activity-events.js +1 -1
  51. package/dist/src/execution/node-step.js +1 -1
  52. package/dist/src/execution/parked-delivery-wait.js +1 -1
  53. package/dist/src/execution/sandbox/bindings/vercel-options.d.ts +10 -0
  54. package/dist/src/execution/sandbox/bindings/vercel-options.js +1 -0
  55. package/dist/src/execution/sandbox/bindings/vercel.js +2 -1
  56. package/dist/src/execution/sandbox/prewarm.js +1 -1
  57. package/dist/src/execution/sandbox/shell-quote.d.ts +1 -12
  58. package/dist/src/execution/sandbox/shell-quote.js +1 -1
  59. package/dist/src/execution/session-activity-projection.js +1 -1
  60. package/dist/src/execution/session-activity.js +1 -1
  61. package/dist/src/execution/session-command-inbox.js +1 -1
  62. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  63. package/dist/src/execution/tasks/child/workflow.js +1 -1
  64. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  65. package/dist/src/execution/tasks/parent/task-cancel.d.ts +2 -2
  66. package/dist/src/execution/tasks/parent/task-cancel.js +1 -1
  67. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  68. package/dist/src/execution/tool-auth.d.ts +4 -32
  69. package/dist/src/execution/tool-auth.js +1 -1
  70. package/dist/src/execution/tools/connection-search.js +2 -2
  71. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  72. package/dist/src/execution/tools/subagent/accept-event-step.d.ts +1 -1
  73. package/dist/src/execution/tools/subagent/accept-event-step.js +1 -1
  74. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  75. package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
  76. package/dist/src/execution/tools/workflow/ask.d.ts +3 -2
  77. package/dist/src/execution/tools/workflow/ask.js +1 -1
  78. package/dist/src/execution/tools/workflow/authorization-completion.d.ts +3 -0
  79. package/dist/src/execution/tools/workflow/authorization-completion.js +1 -0
  80. package/dist/src/execution/tools/workflow/body.d.ts +2 -0
  81. package/dist/src/execution/tools/workflow/body.js +1 -1
  82. package/dist/src/execution/tools/workflow/step-context.d.ts +31 -0
  83. package/dist/src/execution/tools/workflow/step-context.js +1 -0
  84. package/dist/src/execution/tools/workflow/step-execution.d.ts +3 -0
  85. package/dist/src/execution/tools/workflow/step-execution.js +1 -0
  86. package/dist/src/execution/tools/workflow/step.d.ts +3 -0
  87. package/dist/src/execution/tools/workflow/step.js +1 -0
  88. package/dist/src/execution/turn-workflow-tool-run.js +1 -1
  89. package/dist/src/execution/wire/session-inbox-contract.d.ts +7 -0
  90. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  91. package/dist/src/execution/wire/session-inbox-resume.d.ts +2 -0
  92. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  93. package/dist/src/execution/workflow-runtime.js +1 -1
  94. package/dist/src/execution/workflow-steps.js +1 -1
  95. package/dist/src/harness/action-presentation.d.ts +13 -0
  96. package/dist/src/harness/action-presentation.js +1 -0
  97. package/dist/src/harness/authorization.d.ts +5 -2
  98. package/dist/src/harness/authorization.js +1 -1
  99. package/dist/src/harness/compaction.js +1 -1
  100. package/dist/src/harness/coordination.js +1 -1
  101. package/dist/src/harness/emission.d.ts +1 -6
  102. package/dist/src/harness/emission.js +1 -1
  103. package/dist/src/harness/execute-tool.d.ts +2 -1
  104. package/dist/src/harness/finish-reason.d.ts +3 -0
  105. package/dist/src/harness/finish-reason.js +1 -0
  106. package/dist/src/harness/provider-tool-schemas.d.ts +1 -0
  107. package/dist/src/harness/provider-tool-schemas.js +1 -1
  108. package/dist/src/harness/step-hooks.js +1 -1
  109. package/dist/src/harness/stream-actions.d.ts +2 -2
  110. package/dist/src/harness/stream-actions.js +1 -1
  111. package/dist/src/harness/tool-call-input-errors.d.ts +4 -3
  112. package/dist/src/harness/tool-call-input-errors.js +1 -1
  113. package/dist/src/harness/tool-loop.js +2 -2
  114. package/dist/src/harness/tool-presentation.d.ts +5 -0
  115. package/dist/src/harness/tool-presentation.js +1 -0
  116. package/dist/src/harness/turn-client-context.d.ts +1 -0
  117. package/dist/src/harness/workflow-lifecycle.d.ts +2 -3
  118. package/dist/src/harness/workflow-lifecycle.js +1 -1
  119. package/dist/src/internal/application/compiled-artifacts.d.ts +3 -0
  120. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  121. package/dist/src/internal/application/package.js +1 -1
  122. package/dist/src/internal/authored-definition/connection.js +1 -1
  123. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  124. package/dist/src/internal/authored-module-conditions.d.ts +2 -0
  125. package/dist/src/internal/authored-module-conditions.js +1 -0
  126. package/dist/src/internal/authored-module-loader.d.ts +3 -0
  127. package/dist/src/internal/authored-module-loader.js +3 -3
  128. package/dist/src/internal/authored-module-map-loader.d.ts +3 -1
  129. package/dist/src/internal/authored-module-map-loader.js +1 -1
  130. package/dist/src/internal/authored-package-boundary.js +1 -1
  131. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  132. package/dist/src/internal/authored-runtime-modules.js +1 -1
  133. package/dist/src/internal/bundler/nitro-rolldown.d.ts +1 -0
  134. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  135. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  136. package/dist/src/internal/nitro/development-generation.js +1 -1
  137. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  138. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  139. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  140. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  141. package/dist/src/internal/vercel/build-command.d.ts +2 -1
  142. package/dist/src/internal/vercel/build-command.js +1 -1
  143. package/dist/src/internal/workflow-bundle/builder-support.d.ts +5 -0
  144. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  145. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  146. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  147. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  148. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  149. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +3 -5
  150. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -3
  151. package/dist/src/protocol/activity.d.ts +6 -0
  152. package/dist/src/protocol/activity.js +1 -1
  153. package/dist/src/protocol/message.d.ts +13 -1
  154. package/dist/src/protocol/message.js +1 -1
  155. package/dist/src/public/channels/github/checkout.js +1 -1
  156. package/dist/src/public/channels/slack/activity-plan.js +1 -1
  157. package/dist/src/public/channels/slack/activity.js +2 -2
  158. package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +6 -0
  159. package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -0
  160. package/dist/src/public/models/openai/chatgpt/model.d.ts +1 -1
  161. package/dist/src/public/models/openai/chatgpt/oauth.d.ts +20 -0
  162. package/dist/src/public/models/openai/chatgpt/oauth.js +1 -0
  163. package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +4 -3
  164. package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
  165. package/dist/src/public/models/openai/chatgpt/transport.d.ts +1 -2
  166. package/dist/src/public/models/openai/index.d.ts +3 -4
  167. package/dist/src/public/tools/index.d.ts +1 -1
  168. package/dist/src/runtime/authorization-context.d.ts +14 -0
  169. package/dist/src/runtime/authorization-context.js +1 -0
  170. package/dist/src/runtime/connections/mcp-client.js +1 -1
  171. package/dist/src/runtime/connections/scoped-authorization.d.ts +18 -2
  172. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  173. package/dist/src/runtime/prompt/compose.js +1 -1
  174. package/dist/src/runtime/resolve-connection.js +1 -1
  175. package/dist/src/runtime/resolve-tool.js +1 -1
  176. package/dist/src/runtime/sandbox/keys.js +1 -1
  177. package/dist/src/runtime/types.d.ts +2 -0
  178. package/dist/src/sandbox/backends/default.d.ts +2 -0
  179. package/dist/src/sandbox/backends/default.js +1 -1
  180. package/dist/src/self-modification/agent.d.ts +5 -2
  181. package/dist/src/self-modification/agent.js +1 -1
  182. package/dist/src/self-modification/config.d.ts +52 -0
  183. package/dist/src/self-modification/config.js +1 -0
  184. package/dist/src/self-modification/credentials.d.ts +18 -0
  185. package/dist/src/self-modification/credentials.js +1 -0
  186. package/dist/src/self-modification/extension/eve-add.d.ts +7 -2
  187. package/dist/src/self-modification/extension/eve-add.js +1 -1
  188. package/dist/src/self-modification/extension/extension.d.ts +46 -1
  189. package/dist/src/self-modification/extension/extension.js +1 -1
  190. package/dist/src/self-modification/extension/instructions.d.ts +1 -3
  191. package/dist/src/self-modification/extension/instructions.js +24 -8
  192. package/dist/src/self-modification/extension/production-registry-add.d.ts +42 -0
  193. package/dist/src/self-modification/extension/production-registry-add.js +1 -0
  194. package/dist/src/self-modification/extension/tools/edit_file.js +1 -1
  195. package/dist/src/self-modification/extension/tools/publish.d.ts +7 -0
  196. package/dist/src/self-modification/extension/tools/publish.js +1 -0
  197. package/dist/src/self-modification/extension/tools/registry_add.d.ts +39 -7
  198. package/dist/src/self-modification/extension/tools/registry_add.js +1 -1
  199. package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -0
  200. package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
  201. package/dist/src/self-modification/filesystem.js +1 -1
  202. package/dist/src/self-modification/git-workspace.d.ts +31 -0
  203. package/dist/src/self-modification/git-workspace.js +1 -0
  204. package/dist/src/self-modification/git.d.ts +6 -0
  205. package/dist/src/self-modification/git.js +1 -0
  206. package/dist/src/self-modification/github-publisher.d.ts +27 -0
  207. package/dist/src/self-modification/github-publisher.js +2 -0
  208. package/dist/src/self-modification/identifiers.d.ts +4 -0
  209. package/dist/src/self-modification/identifiers.js +1 -0
  210. package/dist/src/self-modification/mode.d.ts +4 -0
  211. package/dist/src/self-modification/mode.js +1 -0
  212. package/dist/src/self-modification/network-policy.d.ts +1 -0
  213. package/dist/src/self-modification/network-policy.js +1 -0
  214. package/dist/src/self-modification/proposal.d.ts +39 -0
  215. package/dist/src/self-modification/proposal.js +2 -0
  216. package/dist/src/self-modification/sandbox.d.ts +25 -1
  217. package/dist/src/self-modification/sandbox.js +1 -1
  218. package/dist/src/self-modification/setup.d.ts +34 -0
  219. package/dist/src/self-modification/setup.js +22 -0
  220. package/dist/src/self-modification/workspace-lock.d.ts +2 -0
  221. package/dist/src/self-modification/workspace-lock.js +1 -0
  222. package/dist/src/setup/flows/chatgpt-auth.d.ts +14 -2
  223. package/dist/src/setup/flows/chatgpt-auth.js +1 -1
  224. package/dist/src/setup/flows/model.d.ts +3 -2
  225. package/dist/src/setup/flows/model.js +1 -1
  226. package/dist/src/setup/flows/provider.js +1 -1
  227. package/dist/src/setup/flows/registry.d.ts +4 -0
  228. package/dist/src/setup/flows/registry.js +1 -1
  229. package/dist/src/setup/integrations/registry.js +1 -1
  230. package/dist/src/setup/integrations/runner.js +1 -1
  231. package/dist/src/setup/integrations/self-modification/setup.d.ts +29 -0
  232. package/dist/src/setup/integrations/self-modification/setup.js +1 -0
  233. package/dist/src/setup/integrations/types.d.ts +2 -0
  234. package/dist/src/setup/integrations/types.js +1 -1
  235. package/dist/src/setup/scaffold/create/project.js +1 -1
  236. package/dist/src/shared/boundary-hook-error.d.ts +4 -0
  237. package/dist/src/shared/boundary-hook-error.js +1 -0
  238. package/dist/src/shared/empty-delivery.js +1 -1
  239. package/dist/src/shared/git.d.ts +16 -0
  240. package/dist/src/shared/git.js +1 -0
  241. package/dist/src/{execution/activity-text.d.ts → shared/presentation-text.d.ts} +1 -1
  242. package/dist/src/shared/presentation-text.js +1 -0
  243. package/dist/src/shared/shell-quote.d.ts +2 -0
  244. package/dist/src/shared/shell-quote.js +1 -0
  245. package/dist/src/shared/vercel-services.js +1 -1
  246. package/dist/src/svelte/index.js +1 -1
  247. package/dist/src/svelte/use-eve-agent.js +1 -1
  248. package/dist/src/tasks/session-index.d.ts +1 -1
  249. package/dist/src/tasks/session-index.js +1 -1
  250. package/dist/src/tasks/session-task-cohorts.d.ts +10 -0
  251. package/dist/src/tasks/session-task-cohorts.js +1 -0
  252. package/dist/src/tools/definition.d.ts +21 -0
  253. package/dist/src/tools/definition.js +1 -1
  254. package/dist/src/tools/durable-callbacks.d.ts +37 -9
  255. package/dist/src/tools/durable-callbacks.js +1 -1
  256. package/dist/src/tools/dynamic.d.ts +2 -1
  257. package/dist/src/tools/framework/agent-contract.js +1 -1
  258. package/dist/src/tools/provided/bash.js +1 -1
  259. package/dist/src/tools/provided/glob.js +1 -1
  260. package/dist/src/tools/provided/grep.js +1 -1
  261. package/dist/src/tools/provided/load-skill.js +1 -1
  262. package/dist/src/tools/provided/read-file.js +1 -1
  263. package/dist/src/tools/provided/web-fetch.js +1 -1
  264. package/dist/src/tools/provided/write-file.js +1 -1
  265. package/dist/src/tools/tool-label.d.ts +1 -0
  266. package/dist/src/tools/tool-label.js +1 -0
  267. package/dist/src/tools/workflow-definition.d.ts +5 -2
  268. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  269. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  270. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  271. package/dist/src/tracing/agent-otel-provider.js +2 -2
  272. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  273. package/dist/src/tracing/agent-otel-usage.d.ts +10 -0
  274. package/dist/src/tracing/agent-otel-usage.js +1 -1
  275. package/dist/src/tracing/agent-span-naming.d.ts +1 -0
  276. package/dist/src/tracing/agent-span-naming.js +1 -0
  277. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  278. package/dist/src/vue/index.js +1 -1
  279. package/dist/src/vue/use-eve-agent.js +1 -1
  280. package/docs/concepts/default-harness.md +6 -0
  281. package/docs/concepts/sessions-runs-and-streaming.md +6 -0
  282. package/docs/connections/overview.mdx +1 -1
  283. package/docs/evals/reporters.mdx +20 -1
  284. package/docs/guides/client/continuations.mdx +11 -0
  285. package/docs/guides/dynamic-capabilities.md +4 -4
  286. package/docs/guides/hooks.md +1 -1
  287. package/docs/guides/instrumentation.md +40 -1
  288. package/docs/guides/remote-agents.md +2 -0
  289. package/docs/instructions.mdx +1 -1
  290. package/docs/memory/overview.mdx +45 -13
  291. package/docs/reference/cli.md +6 -0
  292. package/docs/reference/telemetry.md +2 -2
  293. package/docs/reference/typescript-api.md +13 -9
  294. package/docs/sandbox.mdx +16 -2
  295. package/docs/subagents/index.mdx +18 -4
  296. package/docs/tools/overview.mdx +44 -2
  297. package/docs/tools/workflows.mdx +67 -2
  298. package/docs/tutorial/connect-a-warehouse.mdx +49 -26
  299. package/docs/tutorial/first-agent.mdx +20 -19
  300. package/docs/tutorial/guard-the-spend.mdx +4 -4
  301. package/docs/tutorial/how-it-runs.mdx +2 -3
  302. package/docs/tutorial/meta.json +2 -2
  303. package/docs/tutorial/query-sample-data.mdx +30 -19
  304. package/docs/tutorial/remember-definitions.mdx +5 -5
  305. package/docs/tutorial/run-analysis.mdx +155 -18
  306. package/docs/tutorial/ship-it.mdx +71 -81
  307. package/docs/tutorial/team-playbooks.mdx +10 -10
  308. package/package.json +17 -1
  309. package/dist/src/execution/activity-text.js +0 -1
  310. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +0 -9
  311. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +0 -1
  312. package/dist/src/public/models/openai/chatgpt/codex-app-server.d.ts +0 -40
  313. package/dist/src/public/models/openai/chatgpt/codex-app-server.js +0 -1
  314. package/dist/src/self-modification/extension/source-lock.d.ts +0 -2
  315. package/dist/src/self-modification/extension/source-lock.js +0 -1
@@ -1 +1 @@
1
- import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.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{createRemoteConnectionController}from"./remote-connection.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{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?.()})}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;#_=!1;#v;#y;#b;#x;#S;#C;#w;#T;#E=!1;#D=new AbortController;#O=!1;#k=[];#A;#j;#M;#N;#P;#F=new Map;#I;#L=[];#R;#z=!1;#B;#V=new Map;#H=new Set;#U;#W;#G;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#G=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)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#oe(n)}),this.#B=new SubagentPump(t),this.#r=e.name??`eve`,this.#N=e.startup?.headerTip??pickAgentHeaderTip(),this.#b=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.#g=e.onboard===!0,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.#j=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#M=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#v=e.promptCommandHandler),this.#y=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#x=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.#S=e.bootDetections??BOOT_DETECTIONS,this.#C=e.getVercelAuthStatus??getVercelAuthStatus,this.#w=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#T=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#K(){if(this.#f===void 0)return this.#J(),this.#g||await this.#ce(void 0),this.#h?.finish()??this.#m;let e;if(this.#x!==void 0){let t=await this.#x.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}),this.#T);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#J();let n=this.#q(e);return this.#g||await this.#ce(n),t}#q(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#P=t;let n=this.#f;if(n===void 0||this.#_)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#N),this.#n.renderAgentHeader?.(r),t}#J(){let e=this.#T;this.#T=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#G?.signal.aborted===!0?onStop():this.#G?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#Y()}finally{this.#G?.signal.removeEventListener(`abort`,onStop),this.#E=!0,this.#D.abort(),this.#B.abortAll(),this.#W?.(),this.#W=void 0,this.#n.shutdown?.(),this.#j?.dispose(),this.#M?.dispose(),this.#x?.dispose()}}async#Y(){let e=this.#r,t,n,r=!1,i=!1,a=!1,o=await this.#K();if(this.#x?.current().connection.state===`auth-required`&&await this.#_e({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#fe(),this.#j?.refreshIdentity(),this.#M?.refresh(),this.#g&&this.#p!==void 0&&this.#v!==void 0&&this.#n.setupFlow!==void 0){o=void 0,this.#_=!0;try{await this.#ye(e)}finally{this.#_=!1}}for(;;){if(this.#G?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let s=this.#L[0];if(s!==void 0&&n===void 0&&this.#I===void 0){this.#L.shift(),this.#R=s;try{await this.#se(s)}finally{this.#R=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};o!==void 0&&(n.initialDraft=o,o=void 0);try{this.#z=!0,t=await this.#ee(n)}catch(e){if(isInterruptedError(e)){if(this.#I===void 0&&this.#L.length===0)return;a=!0,t=``}else throw e}finally{this.#z=!1}if(this.#L.length>0&&this.#I===void 0){t=void 0;continue}if(t==null&&this.#I===void 0)return}let s=this.#I===void 0?parsePromptCommand(t):null;if(s?.type===`exit`){this.#G?.requestStop();return}if(s?.type===`cancel`){if(this.#e===void 0){this.#pe(`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.#pe(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.#pe(`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(s?.type===`reset`){if(!await this.#Q()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(s?.type===`compact`){if(this.#e===void 0){this.#pe(`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.#pe(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.#pe(`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(s?.type===`clear`){if(this.#e===void 0){this.#pe(`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.#pe(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.#pe(`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(s?.type===`help`){this.#pe(formatPromptCommandHelp(this.#y)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`info`){await this.#Se(),n=void 0,a=!1,t=void 0;continue}if(s?.type===`loglevel`){this.#pe(this.#Ce(s.argument)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`traces`){await this.#xe(s.argument),n=void 0,a=!1,t=void 0;continue}if(s?.type===`extension`){try{await this.#_e(s,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let c=this.#I;this.#I=void 0;let l=c??(i?this.#ie():await(async()=>(this.#Z(),await this.#ne({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.#F.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.#F.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Oe(l)){l=this.#ie(),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.#U!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#Z(l.turnState?.aborted===!0)}}#X(){this.#B.abortAll(),this.#F.clear(),this.#V.clear(),this.#H.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#Z(e=!1){let t=this.#U;t!==void 0&&(this.#U=void 0,this.#e===t&&(this.#X(),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#Q(){if(this.#e===void 0)return this.#X(),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.#X(),this.#n.reset?.(),!0}async#$(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=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Ee()});let e=this.#P?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#Te();e!==void 0&&this.#q(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#ee(e){let t=this.#$(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#te(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#te(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#ae(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Oe(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#I={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ne(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.#Ee()}),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.#x?.reportFailure(e),this.#U=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#ae(r,()=>t.abort(),this.#e)}async#re(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}}}#ie(){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.#ae(t.stream({signal:e.signal}),()=>e.abort(),t)}#ae(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#U=n,t()},cancel:()=>{this.#re(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#F,turnState:r,onSubagentCalled:e=>this.#B.begin(e),onSubagentBackgrounded:e=>this.#B.background(e),onSubagentCompleted:e=>this.#B.settle(e),onTurnCancelled:e=>this.#B.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#De(e),onConnectionAuthCompleted:e=>this.#ke(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#oe(e),onTerminalFailure:()=>{this.#U=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#oe(e){this.#R===e||this.#L.includes(e)||(this.#L.push(e),this.#z&&this.#n.suspendPromptForInput?.())}async#se(e){await this.#_e({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#ce(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#k=await detectSetupIssues(t,this.#S),this.#n.renderSetupWarning!==void 0&&(this.#le(),this.#ue())}#le(){let e=orderedSetupIssues(this.#k,this.#A);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ue(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#C(e,{signal:this.#D.signal})}catch{return}this.#E||this.#O||(this.#A=authIssueForStatus(t),this.#le())}async#de(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#k=await detectSetupIssues(n,this.#S);let e=await this.#C(t,{signal:this.#D.signal});this.#A=authIssueForStatus(e)}catch{return}this.#E||this.#le()}#fe(){this.#p!==void 0&&this.#n.renderSandboxLog!==void 0&&this.#W===void 0&&(this.#W=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#pe(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#me(e,t){let n=this.#v;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#P?.agent.model.endpoint,i={...t,renderer:this.#n,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#x,withExclusiveTerminal:this.#b},a=this.#M?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#he(e,t,n){if(t!==`startup`)return;let r=this.#x?.current().connection.state,i=n===`error`||r===`auth-failed`||r===`unavailable`?`failed`:void 0,a=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${a}`,i)}async#ge(e){if(e?.kind===`model-access-changed`){this.#j?.applyEffect({kind:`refresh-identity`}),this.#O=!0,await this.#we();return}e!==void 0&&(this.#j?.applyEffect(e),this.#O=!0,this.#de(this.#P))}async#_e(e,t,n){let r=await this.#me(e,{...n,title:t}),i=n.suppressSuccessfulTranscript===!0&&r?.tone!==`error`||n.suppressCancelledTranscript===!0&&r?.cancelled===!0;return i||this.#he(e,n.trigger,r?.tone),i||this.#pe(r?.message,r?.tone),await this.#ge(r?.effect),this.#be(),r}#ve(e){return{kind:`planner`,activeStep:e,firstNavigableStep:1,steps:[{label:`Model`,complete:e>0},{label:`Channels`},{label:`Integrations`},{label:`Review`}]}}async#ye(e){let t={keepSetupFlowOpen:!0,setupFlowTitle:`Set up ${e}`,trigger:`startup`},n=await this.#_e({type:`extension`,name:`model`,argument:``},e,{...t,suppressSuccessfulTranscript:!0,initialModelStep:`provider`,setupFlowNavigation:this.#ve(0)});if(n?.tone===`error`||n?.cancelled===!0){this.#n.setupFlow?.end({preserveDiagnostics:n.tone===`error`});return}let r;try{r=await this.#_e({type:`extension`,name:`add`,argument:``},e,{...t,registryPlannerContext:{prefixSteps:[{label:`Model`,complete:!0}],reviewMessage:`Review your agent`,primaryActionLabel:`Install and finish setup`,emptyActionLabel:`Finish setup`}})}finally{this.#n.setupFlow?.end({preserveDiagnostics:r?.tone===`error`})}}#be(){if(this.#_)return;let e=this.#x?.current().connection;e?.state===`ready`&&e.info!==this.#P&&(this.#P=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#xe(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#pe(`/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#Se(){let e=this.#p;if(e===void 0){this.#pe(`/info is only available in local dev sessions.`);return}try{this.#pe(renderApplicationInfo(await this.#w(e)))}catch(e){this.#pe(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#Ce(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#we(){let e=this.#p;if(e===void 0)return;await loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#q(await this.#Te());this.#de(t)}async#Te(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Ee(){let e=this.#P,t=await this.#Te();t!==void 0&&this.#q(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#De(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.#V.set(e.data.name,t),this.#Ae(t)}#Oe(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#V.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#H.add(e.name),this.#Ae(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#H.size),this.#H.size>0}#ke(e){let t=this.#V.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.#V.set(e.data.name,t),this.#H.delete(e.data.name),this.#Ae(t),this.#n.setConnectionAuthPendingCount?.(this.#H.size)}#Ae(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){if(e!==`selfmod__registry_add`||typeof t!=`object`||!t)return;let n=t;return n.status===`needs-terminal`&&typeof n.address==`string`?n.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 e of t)if(g.admit(e)&&!(S&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:_+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;C=t.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,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,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.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 e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),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 t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(m,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.reasoningDelta;if(i.length===0)break;r.text+=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t),r=e.data.reasoning;if(n.completed){if(r.length===0||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text)){yield{type:`reasoning-complete`,id:i},n.generation+=1,n.text=r,n.completed=!0,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}n.completed=!0,n.completedEpoch=_,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.set(e.callId,e.toolName),!v.has(e.callId)&&(v.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(h.set(t,e.action.toolName),e.kind!==`session-limit`&&!v.has(t)&&(v.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!y.has(e.requestId)){if(y.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!v.has(n))break;switch(t.data.status){case`completed`:{let e=t.data.result.output;yield{type:`tool-result`,toolCallId:n,output:e};let r=registryHandoffAddress(h.get(n),e);r!==void 0&&await u?.(r);break}case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)}}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,b,f);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(e);let t=toFailureEvent(e,b,f);t&&(yield t),r.boundaryEvent=e.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=e.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?.(e.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e)}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};
1
+ import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.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{createRemoteConnectionController}from"./remote-connection.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{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?.()})}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;#y=!1;#b;#x;#S;#C;#w;#T;#E;#D;#O=!1;#k=new AbortController;#A=!1;#j=[];#M;#N;#P;#F;#I;#L=new Map;#R;#z=[];#B;#V=!1;#H;#U=new Map;#W=new Set;#G;#K;#q;constructor(e){this.#e=e.session,e.client!==void 0&&(this.#t=e.client),e.lifecycle!==void 0&&(this.#q=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)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#ce(n)}),this.#H=new SubagentPump(t),this.#r=e.name??`eve`,this.#F=e.startup?.headerTip??pickAgentHeaderTip(),this.#S=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.#g=e.onboard===!0,this.#_=e.onOnboardingStep,this.#v=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.#N=createVercelStatusTracker(t),e.probeMcpConnection!==void 0&&(this.#P=createMcpConnectionStatusTracker({onChange:()=>{},probe:e.probeMcpConnection}))}if(e.promptCommandHandler!==void 0&&(this.#b=e.promptCommandHandler),this.#x=e.availablePromptCommands??PROMPT_COMMANDS,e.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#C=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.#w=e.bootDetections??BOOT_DETECTIONS,this.#T=e.getVercelAuthStatus??getVercelAuthStatus,this.#E=e.inspectApplication??inspectApplication,e.onBootProgress!==void 0&&(this.#D=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#J(){if(this.#f===void 0)return this.#X(),this.#g||await this.#ue(void 0),this.#h?.finish()??this.#m;let e;if(this.#C!==void 0){let t=await this.#C.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}),this.#D);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#X();let n=this.#Y(e);return this.#g||await this.#ue(n),t}#Y(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#I=t;let n=this.#f;if(n===void 0||this.#y)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#F),this.#n.renderAgentHeader?.(r),t}#X(){let e=this.#D;this.#D=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#q?.signal.aborted===!0?onStop():this.#q?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#Z()}finally{this.#q?.signal.removeEventListener(`abort`,onStop),this.#O=!0,this.#k.abort(),this.#H.abortAll(),this.#K?.(),this.#K=void 0,this.#n.shutdown?.(),this.#N?.dispose(),this.#P?.dispose(),this.#C?.dispose()}}async#Z(){let e=this.#r,t,n,r=!1,i=!1,a=!1,o=await this.#J();if(this.#C?.current().connection.state===`auth-required`&&await this.#ye({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#me(),this.#N?.refreshIdentity(),this.#P?.refresh(),this.#g&&this.#p!==void 0&&this.#b!==void 0&&this.#n.setupFlow!==void 0){o=void 0,this.#y=!0;try{await this.#xe(e)}finally{this.#y=!1}}for(;;){if(this.#q?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let s=this.#z[0];if(s!==void 0&&n===void 0&&this.#R===void 0){this.#z.shift(),this.#B=s;try{await this.#le(s)}finally{this.#B=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};o!==void 0&&(n.initialDraft=o,o=void 0);try{this.#V=!0,t=await this.#ne(n)}catch(e){if(isInterruptedError(e)){if(this.#R===void 0&&this.#z.length===0)return;a=!0,t=``}else throw e}finally{this.#V=!1}if(this.#z.length>0&&this.#R===void 0){t=void 0;continue}if(t==null&&this.#R===void 0)return}let s=this.#R===void 0?parsePromptCommand(t):null;if(s?.type===`exit`){this.#q?.requestStop();return}if(s?.type===`cancel`){if(this.#e===void 0){this.#he(`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.#he(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.#he(`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(s?.type===`reset`){if(!await this.#ee()){n=void 0,a=!1,t=void 0;continue}n=void 0,a=!1,t=void 0;continue}if(s?.type===`compact`){if(this.#e===void 0){this.#he(`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.#he(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.#he(`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(s?.type===`clear`){if(this.#e===void 0){this.#he(`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.#he(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.#he(`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(s?.type===`help`){this.#he(formatPromptCommandHelp(this.#x)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`info`){await this.#we(),n=void 0,a=!1,t=void 0;continue}if(s?.type===`loglevel`){this.#he(this.#Te(s.argument)),n=void 0,a=!1,t=void 0;continue}if(s?.type===`traces`){await this.#Ce(s.argument),n=void 0,a=!1,t=void 0;continue}if(s?.type===`extension`){try{await this.#ye(s,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}n=void 0,t=void 0,a=!1;continue}r=!0}let c=this.#R;this.#R=void 0;let l=c??(i?this.#oe():await(async()=>(this.#$(),await this.#ie({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.#L.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.#L.delete(t.requestId)}}if(o.length===0)break;a=!0,n=o,t=void 0,f=!0;break}if(this.#Ae(l)){l=this.#oe(),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.#G!==this.#e&&(p===`session.waiting`||p===`session.completed`)&&(t=this.#n.takeQueuedPrompt?.()),this.#$(l.turnState?.aborted===!0)}}#Q(){this.#H.abortAll(),this.#L.clear(),this.#U.clear(),this.#W.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#$(e=!1){let t=this.#G;t!==void 0&&(this.#G=void 0,this.#e===t&&(this.#Q(),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#ee(){if(this.#e===void 0)return this.#Q(),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.#Q(),this.#n.reset?.(),!0}async#te(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=0,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#Oe()});let e=this.#I?.agent.model.endpoint,t=e?.kind===`chatgpt`&&(e.state===`signed-out`||e.state===`reauth-required`),r=Date.now();if(t&&r-o>=5e3){o=r;let e=await this.#De();e!==void 0&&this.#Y(e)}}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{r=!0,clearInterval(s),await a}}async#ne(e){let t=this.#te(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#re(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#re(e,t){let n=this.#e;if(n===void 0)return;let r=n.stream({signal:e})[Symbol.asyncIterator]();try{for(;!e.aborted;){let i=!1,a={async*[Symbol.asyncIterator](){for(;!e.aborted;){let e=await r.next();if(e.done===!0||(i=!0,yield e.value,isCurrentTurnBoundaryEvent(e.value)))return}}},o=this.#se(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Ae(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#R={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ie(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.#Oe()}),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.#C?.reportFailure(e),this.#G=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#se(r,()=>t.abort(),this.#e)}async#ae(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}}}#oe(){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.#se(t.stream({signal:e.signal}),()=>e.abort(),t)}#se(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#G=n,t()},cancel:()=>{this.#ae(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#L,turnState:r,onSubagentCalled:e=>this.#H.begin(e),onSubagentBackgrounded:e=>this.#H.background(e),onSubagentCompleted:e=>this.#H.settle(e),onTurnCancelled:e=>this.#H.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#ke(e),onConnectionAuthCompleted:e=>this.#je(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#ce(e),onTerminalFailure:()=>{this.#G=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#ce(e){this.#B===e||this.#z.includes(e)||(this.#z.push(e),this.#V&&this.#n.suspendPromptForInput?.())}async#le(e){await this.#ye({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#ue(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#j=await detectSetupIssues(t,this.#w),this.#n.renderSetupWarning!==void 0&&(this.#de(),this.#fe())}#de(){let e=orderedSetupIssues(this.#j,this.#M);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#fe(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#T(e,{signal:this.#k.signal})}catch{return}this.#O||this.#A||(this.#M=authIssueForStatus(t),this.#de())}async#pe(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#j=await detectSetupIssues(n,this.#w);let e=await this.#T(t,{signal:this.#k.signal});this.#M=authIssueForStatus(e)}catch{return}this.#O||this.#de()}#me(){this.#p!==void 0&&this.#n.renderSandboxLog!==void 0&&this.#K===void 0&&(this.#K=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#he(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#ge(e,t){let n=this.#b;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#I?.agent.model.endpoint,i={...t,renderer:this.#n,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#C,withExclusiveTerminal:this.#S},a=this.#P?.current(),o=a!==void 0&&Object.keys(a).length>0?{...i,disabledConnectionReasons:a}:i;return t.keepSetupFlowOpen===!0?await n.handle(e,{...o,keepSetupFlowOpen:!0}):await n.handle(e,o)}#_e(e,t,n){if(t!==`startup`)return;let r=this.#C?.current().connection.state,i=n===`error`||r===`auth-failed`||r===`unavailable`?`failed`:void 0,a=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${a}`,i)}async#ve(e){if(e?.kind===`model-access-changed`){this.#N?.applyEffect({kind:`refresh-identity`}),this.#A=!0,await this.#Ee();return}e!==void 0&&(this.#N?.applyEffect(e),this.#A=!0,this.#pe(this.#I))}async#ye(e,t,n){let r=await this.#ge(e,{...n,title:t}),i=n.suppressSuccessfulTranscript===!0&&r?.tone!==`error`||n.suppressCancelledTranscript===!0&&r?.cancelled===!0;return i||this.#_e(e,n.trigger,r?.tone),i||this.#he(r?.message,r?.tone),await this.#ve(r?.effect),this.#Se(),r}#be(e){return{kind:`planner`,activeStep:e,firstNavigableStep:1,steps:[{label:`Model`,complete:e>0},{label:`Channels`},{label:`Integrations`},{label:`Review`}]}}async#xe(e){let t={keepSetupFlowOpen:!0,setupFlowTitle:`Set up ${e}`,trigger:`startup`},n=`model_provider`,onOnboardingScreen=e=>{n=e.screen,this.#_?.({flow:`onboarding`,step:e.screen,registrySelectedCount:e.registrySelectedCount})};onOnboardingScreen({screen:`model_provider`});let r;try{r=await this.#ye({type:`extension`,name:`model`,argument:``},e,{...t,suppressSuccessfulTranscript:!0,initialModelStep:`provider`,setupFlowNavigation:this.#be(0),onOnboardingScreen})}catch(e){throw this.#v?.({flow:`onboarding`,step:n,result:`error`}),e}if(r?.tone===`error`||r?.cancelled===!0){this.#v?.({flow:`onboarding`,step:n,result:r.cancelled===!0?`cancelled`:`error`}),this.#n.setupFlow?.end({preserveDiagnostics:r.tone===`error`});return}let i;n=`registry_channels`;let onRegistryScreen=e=>{n=e.screen,this.#_?.({flow:`onboarding`,step:e.screen,registrySelectedCount:e.registrySelectedCount})};try{onRegistryScreen({screen:`registry_channels`}),i=await this.#ye({type:`extension`,name:`add`,argument:``},e,{...t,onOnboardingScreen:onRegistryScreen,registryPlannerContext:{prefixSteps:[{label:`Model`,complete:!0}],reviewMessage:`Review your agent`,primaryActionLabel:`Install and finish setup`,emptyActionLabel:`Finish setup`}})}catch(e){throw this.#v?.({flow:`onboarding`,step:n,result:`error`}),e}finally{i!==void 0&&this.#v?.({flow:`onboarding`,step:n,result:i.cancelled===!0?`cancelled`:i.tone===`error`?`error`:`completed`}),this.#n.setupFlow?.end({preserveDiagnostics:i?.tone===`error`})}}#Se(){if(this.#y)return;let e=this.#C?.current().connection;e?.state===`ready`&&e.info!==this.#I&&(this.#I=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#Ce(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#he(`/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#we(){let e=this.#p;if(e===void 0){this.#he(`/info is only available in local dev sessions.`);return}try{this.#he(renderApplicationInfo(await this.#E(e)))}catch(e){this.#he(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#Te(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#Ee(){let e=this.#p;if(e===void 0)return;await loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#Y(await this.#De());this.#pe(t)}async#De(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Oe(){let e=this.#I,t=await this.#De();t!==void 0&&this.#Y(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#ke(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.#U.set(e.data.name,t),this.#Me(t)}#Ae(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#U.values())e.state===`required`&&e.webhookUrl!==void 0&&(e.state=`pending`,this.#W.add(e.name),this.#Me(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#W.size),this.#W.size>0}#je(e){let t=this.#U.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.#U.set(e.data.name,t),this.#W.delete(e.data.name),this.#Me(t),this.#n.setConnectionAuthPendingCount?.(this.#W.size)}#Me(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){if(e!==`selfmod__registry_add`||typeof t!=`object`||!t)return;let n=t;return n.status===`needs-terminal`&&typeof n.address==`string`?n.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 e of t)if(g.admit(e)&&!(S&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:_+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;C=t.data.usage,yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`step-finish`,usage:t.data.usage};break}case`message.appended`:{let t=e,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,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`message.completed`:{let t=textPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(p,t),r=e.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 e=r.slice(n.text.length);e.length>0&&(yield{type:`assistant-delta`,id:i,delta:e}),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 t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(m,n);if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}let i=t.data.reasoningDelta;if(i.length===0)break;r.text+=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:i};break}case`reasoning.completed`:{let t=reasoningPartId(e.data.turnId,e.data.stepIndex),n=partStateFor(m,t),r=e.data.reasoning;if(n.completed){if(r.length===0||_<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}let i=partGenerationId(t,n.generation);if(n.text.length===0&&r.length>0)n.text=r,yield{type:`reasoning-delta`,id:i,delta:r};else if(r.length>0&&!r.startsWith(n.text)){yield{type:`reasoning-complete`,id:i},n.generation+=1,n.text=r,n.completed=!0,n.completedEpoch=_;let e=partGenerationId(t,n.generation);yield{type:`reasoning-delta`,id:e,delta:r},yield{type:`reasoning-complete`,id:e};break}n.completed=!0,n.completedEpoch=_,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.set(e.callId,e.toolName),!v.has(e.callId)&&(v.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(h.set(t,e.action.toolName),e.kind!==`session-limit`&&!v.has(t)&&(v.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!y.has(e.requestId)){if(y.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!v.has(n))break;switch(t.data.status){case`completed`:{let e=t.data.result.output;yield{type:`tool-result`,toolCallId:n,output:e};let r=registryHandoffAddress(h.get(n),e);r!==void 0&&await u?.(r);break}case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)}}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,b,f);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,d?.(e);let t=toFailureEvent(e,b,f);t&&(yield t),r.boundaryEvent=e.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=e.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?.(e.data.turnId),yield*closeOpenParts(p,`assistant-complete`,_),yield*closeOpenParts(m,`reasoning-complete`,_),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:{let t=e;t.data.backgroundTask===void 0?o?.(t.data.callId):a?.(t.data.callId);break}case`authorization.required`:c?.(e);break;case`authorization.completed`:l?.(e)}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};
@@ -36,8 +36,11 @@ export declare const SETUP_FLOW_CONFIG: {
36
36
  indicator: "spinner";
37
37
  };
38
38
  };
39
- /** The prompter surface plus the working-state interrupt trap a command races against. */
40
39
  export type TuiSetupCommandRenderer = TuiPrompterRenderer & Pick<SetupFlowRenderer, "readProviderPicker" | "readModelEditor" | "setNavigation" | "waitForInterrupt">;
40
+ export type OnboardingScreenEvent = {
41
+ screen: "model_provider" | "model_settings" | "registry_channels" | "registry_integrations" | "registry_review" | "registry_install";
42
+ registrySelectedCount?: number;
43
+ };
41
44
  export interface TuiSetupCommandInput {
42
45
  command: TuiSetupCommand;
43
46
  /** Project root for setup that changes shared dependencies, links, or environment files. */
@@ -52,16 +55,15 @@ export interface TuiSetupCommandInput {
52
55
  initialRegistryAddress?: string;
53
56
  /** Presentation and navigation supplied by an enclosing setup journey. */
54
57
  registryPlannerContext?: RegistryPlannerContext;
58
+ onOnboardingScreen?: (input: OnboardingScreenEvent) => void;
55
59
  /** Live ChatGPT identity shown only inside model configuration UI. */
56
60
  chatGptAccountLabel?: string;
57
61
  /** Suspends development runtime artifacts while registry installation and setup mutate them. */
58
62
  withExclusiveTerminal?<T>(task: () => Promise<T>): Promise<T>;
59
- /** Test seam; defaults to the real TUI-native prompter over `renderer`. */
60
63
  createPrompter?: (renderer: TuiPrompterRenderer) => Prompter;
61
64
  /** Test seam; defaults to the real setup flows. */
62
65
  flows?: Partial<TuiSetupFlows>;
63
66
  }
64
- /** The flow entry points the commands dispatch to, injectable for tests. */
65
67
  export interface TuiSetupFlows {
66
68
  runInstallVercelCliFlow: typeof runInstallVercelCliFlow;
67
69
  runLoginFlow: typeof runLoginFlow;
@@ -1,2 +1,2 @@
1
- import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,r=new AbortController,i=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),a=(e.createPrompter??createTuiPrompter)(i),cancelActiveRegistryItem,runRegistryItem=async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([r.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}},o=e.renderer.waitForInterrupt(),s=executeSetupCommand(e,a,i,r.signal,runRegistryItem),c=s.then(e=>({kind:`outcome`,value:e}));try{for(;;){let i=!1;try{let e=await Promise.race([c,o.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0)cancelActiveRegistryItem(),i=!0;else{n=!0,r.abort(new WizardCancelledError);let e=await s;return e.partial===!0?e:{...e,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}}finally{o.dispose()}i&&(o=e.renderer.waitForInterrupt())}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(e,t,n,r,i){let{command:a,appRoot:o}=e,s={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...e.flows};try{switch(a){case`vc:install`:return installVercelCliResultMessage(await s.runInstallVercelCliFlow({appRoot:o,prompter:t,signal:r}));case`vc:login`:return loginResultMessage(await s.runLoginFlow({appRoot:o,prompter:t,signal:r}));case`model`:{let pickProvider=e=>n.readProviderPicker(e),i={appRoot:e.agentRoot??o,environmentRoot:o,prompter:t,signal:r,chatGptAccountLabel:e.chatGptAccountLabel,deps:{pickModelSettings:e=>n.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,s,{appRoot:o,prompter:t,signal:r})})}};e.initialModelStep!==void 0&&(i.initialStep=e.initialModelStep),i.withExclusiveTerminal=t=>n.withInheritedStdio(()=>e.withExclusiveTerminal?.(t)??t());let a=await s.runModelFlow(i);if(a.kind===`cancelled`)return{message:a.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let c=[];a.modelMessage!==void 0&&c.push(a.modelMessage),a.providerSelection!==void 0&&c.push(providerSelectionMessage(a.providerSelection));let l={message:c.join(`
2
- `),preserveFlowDiagnostics:!1};return a.accessChanged&&(l.effect={kind:`model-access-changed`}),l}case`add`:{let a=await s.runRegistryFlow({appRoot:o,prompter:t,signal:r,initialAddress:e.initialRegistryAddress,plannerContext:e.registryPlannerContext,onItemStart:registryItemProgress(n),runItem:i});if(a.kind===`cancelled`)return{message:`/add dismissed.`,cancelled:!0,preserveFlowDiagnostics:!0};let c=a.result,l=registryResultTone(c),u=c.items.length>0||c.failures.length>0||c.outcomes!==void 0?formatRegistrySessionResult(c):`No integrations selected.`,d={message:l===`error`?`/add failed — ${u}`:u,preserveFlowDiagnostics:!0};return c.cancelled===!0?(d.partial=!0,d.tone=`error`):l!==void 0&&(d.tone=l),c.deployed===`production`&&(d.effect={kind:`deployed`}),d}case`deploy`:{let e=await s.runDeployFlow({appRoot:o,prompter:t,interactive:!0,signal:r});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:e.kind===`local-model`?{message:`ChatGPT subscription models are local-only. Switch to an AI Gateway or server-authenticated model before deploying.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(e){if(e instanceof WizardCancelledError)return{message:`/${a} dismissed.`,cancelled:!0,preserveFlowDiagnostics:a!==`model`};let n=e instanceof RegistryFlowFailedError?e.cause:e,i=await vercelCliUpgradeOutcome(n,a,s,{appRoot:o,prompter:t,signal:r});if(i!==void 0)return withRegistryResults(i,e);let c=vercelActionOutcome(n,a);return c===void 0?e instanceof RegistryFlowFailedError?{message:`${formatRegistrySessionResult(e.completed)}\n\n${e.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:{message:`/${a} failed: ${e instanceof Error?e.message:String(e)}`,tone:`error`,preserveFlowDiagnostics:!0}:withRegistryResults(c,e)}}async function recoverVercelHumanAction(e,t,n){let r=e.action.kind;if(r!==`vercel-cli-missing`&&r!==`vercel-cli-upgrade`&&r!==`vercel-login`&&r!==`vercel-forbidden`)throw e;let i=r===`vercel-cli-missing`?{label:`Install Vercel CLI`,message:`The Vercel CLI is required. Install it now?`}:r===`vercel-cli-upgrade`?{label:`Upgrade Vercel CLI`,message:`Your Vercel CLI needs an update. Upgrade it now?`}:{label:r===`vercel-forbidden`?`Re-authenticate with Vercel`:`Log in to Vercel`,message:r===`vercel-forbidden`?`Vercel denied access to that team. Re-authenticate and continue?`:`You need to log in to Vercel to continue.`},a;try{a=await n.prompter.select({message:i.message,options:[{value:`repair`,label:`${i.label} and continue`},{value:`cancel`,label:`Choose another option`}],initialValue:`repair`})}catch{return`cancel`}if(a===`cancel`)return`cancel`;if(r===`vercel-cli-missing`||r===`vercel-cli-upgrade`){let e=await t.runInstallVercelCliFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,upgrade:r===`vercel-cli-upgrade`});return e.kind===`installed`||e.kind===`already`?`retry`:(n.prompter.log.warning(e.kind===`failed`&&e.reason!==void 0?`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI: ${e.reason}`:`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI.`),`cancel`)}let o=await t.runLoginFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,force:r===`vercel-forbidden`});return n.prompter.replaceContent?.(),o.kind===`logged-in`||o.kind===`already`?`retry`:`cancel`}function withRegistryResults(e,t){return t instanceof RegistryFlowFailedError?{...e,message:`${formatRegistrySessionResult(t.completed)}\n\n${e.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:e}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let i;try{i=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{i=`later`}if(i===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};let a;try{a=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),tone:`error`,preserveFlowDiagnostics:!0}}switch(a.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,a.reason),tone:`error`,preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,tone:`error`,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function providerSelectionMessage(e){return e===`chatgpt`?`ChatGPT subscription selected.`:e===`ai-gateway-project`?`AI Gateway via Project selected.`:`AI Gateway via API key selected.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};
1
+ import{formatRegistrySessionResult,registryItemProgress,registryResultTone}from"./registry-result-message.js";import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{RegistryFlowFailedError,runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setNavigation:n=>{t()||e.setNavigation?.(n)},setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},replaceContent:n=>{t()||e.replaceContent?.(n)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(e){let{command:t}=e,n=!1,r=new AbortController,i=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),a=(e.createPrompter??createTuiPrompter)(i),cancelActiveRegistryItem,runRegistryItem=async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([r.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}},o=e.renderer.waitForInterrupt(),s=executeSetupCommand(e,a,i,r.signal,runRegistryItem),c=s.then(e=>({kind:`outcome`,value:e}));try{for(;;){let i=!1;try{let e=await Promise.race([c,o.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0)cancelActiveRegistryItem(),i=!0;else{n=!0,r.abort(new WizardCancelledError);let e=await s;return e.partial===!0?e:{...e,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}}finally{o.dispose()}i&&(o=e.renderer.waitForInterrupt())}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(e,t,n,r,i){let{command:a,appRoot:o}=e,s={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...e.flows};try{switch(a){case`vc:install`:return installVercelCliResultMessage(await s.runInstallVercelCliFlow({appRoot:o,prompter:t,signal:r}));case`vc:login`:return loginResultMessage(await s.runLoginFlow({appRoot:o,prompter:t,signal:r}));case`model`:{let pickProvider=e=>n.readProviderPicker(e),i={appRoot:e.agentRoot??o,environmentRoot:o,prompter:t,signal:r,chatGptAccountLabel:e.chatGptAccountLabel,deps:{pickModelSettings:e=>n.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,s,{appRoot:o,prompter:t,signal:r})})}};e.initialModelStep!==void 0&&(i.initialStep=e.initialModelStep),e.onOnboardingScreen!==void 0&&(i.onScreen=t=>e.onOnboardingScreen?.({screen:t})),i.withExclusiveTerminal=t=>n.withInheritedStdio(()=>e.withExclusiveTerminal?.(t)??t());let a=await s.runModelFlow(i);if(a.kind===`cancelled`)return{message:a.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let c=[];a.modelMessage!==void 0&&c.push(a.modelMessage),a.providerSelection!==void 0&&c.push(providerSelectionMessage(a.providerSelection));let l={message:c.join(`
2
+ `),preserveFlowDiagnostics:!1};return a.accessChanged&&(l.effect={kind:`model-access-changed`}),l}case`add`:{let a=await s.runRegistryFlow({appRoot:o,prompter:t,signal:r,initialAddress:e.initialRegistryAddress,plannerContext:e.registryPlannerContext,onScreen:e.onOnboardingScreen,onItemStart:registryItemProgress(n),runItem:i});if(a.kind===`cancelled`)return{message:`/add dismissed.`,cancelled:!0,preserveFlowDiagnostics:!0};let c=a.result,l=registryResultTone(c),u=c.items.length>0||c.failures.length>0||c.outcomes!==void 0?formatRegistrySessionResult(c):`No integrations selected.`,d={message:l===`error`?`/add failed — ${u}`:u,preserveFlowDiagnostics:!0};return c.cancelled===!0?(d.partial=!0,d.tone=`error`):l!==void 0&&(d.tone=l),c.deployed===`production`&&(d.effect={kind:`deployed`}),d}case`deploy`:{let e=await s.runDeployFlow({appRoot:o,prompter:t,interactive:!0,signal:r});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:e.kind===`local-model`?{message:`ChatGPT subscription models are local-only. Switch to an AI Gateway or server-authenticated model before deploying.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(e){if(e instanceof WizardCancelledError)return{message:`/${a} dismissed.`,cancelled:!0,preserveFlowDiagnostics:a!==`model`};let n=e instanceof RegistryFlowFailedError?e.cause:e,i=await vercelCliUpgradeOutcome(n,a,s,{appRoot:o,prompter:t,signal:r});if(i!==void 0)return withRegistryResults(i,e);let c=vercelActionOutcome(n,a);return c===void 0?e instanceof RegistryFlowFailedError?{message:`${formatRegistrySessionResult(e.completed)}\n\n${e.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:{message:`/${a} failed: ${e instanceof Error?e.message:String(e)}`,tone:`error`,preserveFlowDiagnostics:!0}:withRegistryResults(c,e)}}async function recoverVercelHumanAction(e,t,n){let r=e.action.kind;if(r!==`vercel-cli-missing`&&r!==`vercel-cli-upgrade`&&r!==`vercel-login`&&r!==`vercel-forbidden`)throw e;let i=r===`vercel-cli-missing`?{label:`Install Vercel CLI`,message:`The Vercel CLI is required. Install it now?`}:r===`vercel-cli-upgrade`?{label:`Upgrade Vercel CLI`,message:`Your Vercel CLI needs an update. Upgrade it now?`}:{label:r===`vercel-forbidden`?`Re-authenticate with Vercel`:`Log in to Vercel`,message:r===`vercel-forbidden`?`Vercel denied access to that team. Re-authenticate and continue?`:`You need to log in to Vercel to continue.`},a;try{a=await n.prompter.select({message:i.message,options:[{value:`repair`,label:`${i.label} and continue`},{value:`cancel`,label:`Choose another option`}],initialValue:`repair`})}catch{return`cancel`}if(a===`cancel`)return`cancel`;if(r===`vercel-cli-missing`||r===`vercel-cli-upgrade`){let e=await t.runInstallVercelCliFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,upgrade:r===`vercel-cli-upgrade`});return e.kind===`installed`||e.kind===`already`?`retry`:(n.prompter.log.warning(e.kind===`failed`&&e.reason!==void 0?`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI: ${e.reason}`:`Couldn't ${r===`vercel-cli-upgrade`?`upgrade`:`install`} the Vercel CLI.`),`cancel`)}let o=await t.runLoginFlow({appRoot:n.appRoot,prompter:n.prompter,signal:n.signal,force:r===`vercel-forbidden`});return n.prompter.replaceContent?.(),o.kind===`logged-in`||o.kind===`already`?`retry`:`cancel`}function withRegistryResults(e,t){return t instanceof RegistryFlowFailedError?{...e,message:`${formatRegistrySessionResult(t.completed)}\n\n${e.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:e}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let i;try{i=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{i=`later`}if(i===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};let a;try{a=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),tone:`error`,preserveFlowDiagnostics:!0}}switch(a.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,a.reason),tone:`error`,preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,tone:`error`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,tone:`error`,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function providerSelectionMessage(e){return e===`chatgpt`?`ChatGPT subscription selected.`:e===`ai-gateway-project`?`AI Gateway via Project selected.`:`AI Gateway via API key selected.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};
@@ -1 +1 @@
1
- import{remoteHost}from"./target.js";import{clipVisible,stripAnsi,visibleLength}from"#cli/ui/terminal-text.js";import{formatModelSummary}from"#shared/model-summary.js";function formatDevBuildStatus(e,t){let n=e.phase===`complete`;return`${n?t.glyph.success:t.glyph.validating} ${n?e.summary.replace(/ changed$/u,` updated`):`${e.summary.replace(/ (?:added|changed|removed)$/u,``)} updating…`}`}function renderModel(e){if(e.model===void 0)return;let t=e.theme.colors,n={model:e.model};if(e.reasoning!==void 0&&(n.reasoning=e.reasoning),e.fastMode===!0&&(n.fastGlyph=e.theme.glyph.fast),e.remote!==void 0){n.model=stripAnsi(e.model).replace(/\s+/gu,` `).trim();let r=stripAnsi(formatModelSummary(n)).replace(/\s+/gu,` `).trim();return t.dim(r)}return t.dim(formatModelSummary(n))}function renderServerPort(e){if(e.remote!==void 0||e.serverPort===void 0)return;let t=e.theme.colors;return t.inverse(t.gray(` :${e.serverPort} `))}const EXTERNAL_PROVIDER_DISPLAY_NAMES={codex:`chatgpt-sub`};function renderEndpoint(e){if(e.remote!==void 0||e.endpoint===void 0)return;let t=e.theme.colors,n=e.theme.glyph,clause=(e,n)=>`${t.dim(`via `)}${e}${t.dim(n)}`;if(e.endpoint.kind===`external`){let r=EXTERNAL_PROVIDER_DISPLAY_NAMES[e.endpoint.provider]??e.endpoint.provider;return{text:`${t.dim(`via ${r}`)}${n.external}`,standalone:!1}}if(e.endpoint.kind===`chatgpt`)switch(e.endpoint.state){case`ready`:return{text:`${t.dim(`via chatgpt-sub`)}${n.external}`,standalone:!1};case`checking`:return{text:t.dim(`chatgpt-sub checking…`),standalone:!0};case`signed-out`:case`reauth-required`:return{text:t.yellow(`${n.warning} chatgpt-sub login · codex login`),standalone:!0};case`unavailable`:return{text:t.yellow(`${n.warning} chatgpt-sub unavailable`),standalone:!0}}if(!e.endpoint.connected)return{text:t.yellow(`${n.warning} ai-gateway`),standalone:!0};if(e.endpoint.credential===`api-key`)return{text:clause(`ai-gateway`,`(api-key)`),standalone:!1};let r=e.vercel?.identity?.projectName;return{text:clause(`ai-gateway`,`(${r===void 0?`oidc`:`oidc:${r}`})`),standalone:!1}}function buildStatusLine(e){let{theme:t,width:n}=e,r=t.colors,i=e.devBuild===void 0?void 0:formatDevBuildStatus(e.devBuild,t),a=e.logLevel===void 0?void 0:r.cyan(`logs: ${e.logLevel}`),o=renderServerPort(e),s=renderModel(e),c=e.remote===void 0?void 0:formatRemoteStatus(e.remote,t),l=renderEndpoint(e),u=c?.full??o,d=c?.badge??o,f=l!==void 0&&!l.standalone&&s!==void 0,p=f?`${s} ${l.text}`:s,m=l===void 0||f?void 0:l.text,compose=(e,t)=>{let n=t.filter(e=>e!==void 0).join(` `);return e===void 0||n.length===0?e??n:`${e} ${n}`},h=[compose(u,[a,p,m]),compose(u,[a,s]),compose(u,[a]),compose(d,[a]),compose(d,[])];if(i!==void 0){for(let e of h){let t=visibleLength(e),r=visibleLength(i);if(!(t+(t>0?2:0)+r>n))return`${e}${` `.repeat(n-t-r)}${i}`}return clipVisible(i,n)}if(h[0].length===0)return;for(let e of h)if(e.length>0&&visibleLength(e)<=n)return e;let g=h.findLast(e=>e.length>0);return clipVisible(g,n)}function formatRemoteStatus(e,t){let n=t.colors,r=e.deployment===void 0?remoteHost(e.target):`${e.deployment.projectName} (${e.deployment.environment})`,i=formatRemoteBadge(` ${t.unicode?`↗`:`->`} ${r} `,e.connection.state,t),a;switch(e.connection.state){case`checking`:a=n.dim(`Checking access…`);break;case`ready`:break;case`auth-required`:a=n.yellow(`Authenticate via OIDC`);break;case`authenticating`:a=n.dim(`Authenticating via OIDC…`);break;case`auth-failed`:a=n.yellow(`Authentication failed`);break;case`unavailable`:a=n.yellow(`Remote unavailable`)}return{badge:i,full:a===void 0?i:`${i} ${a}`}}function formatRemoteBadge(e,t,n){let r=n.colors;switch(t){case`checking`:return r.inverse(r.gray(e));case`ready`:return r.inverse(r.blue(e));case`unavailable`:case`auth-required`:case`authenticating`:case`auth-failed`:return r.inverse(r.yellow(e))}}export{buildStatusLine};
1
+ import{remoteHost}from"./target.js";import{clipVisible,stripAnsi,visibleLength}from"#cli/ui/terminal-text.js";import{formatModelSummary}from"#shared/model-summary.js";function formatDevBuildStatus(e,t){let n=e.phase===`complete`;return`${n?t.glyph.success:t.glyph.validating} ${n?e.summary.replace(/ changed$/u,` updated`):`${e.summary.replace(/ (?:added|changed|removed)$/u,``)} updating…`}`}function renderModel(e){if(e.model===void 0)return;let t=e.theme.colors,n={model:e.model};if(e.reasoning!==void 0&&(n.reasoning=e.reasoning),e.fastMode===!0&&(n.fastGlyph=e.theme.glyph.fast),e.remote!==void 0){n.model=stripAnsi(e.model).replace(/\s+/gu,` `).trim();let r=stripAnsi(formatModelSummary(n)).replace(/\s+/gu,` `).trim();return t.dim(r)}return t.dim(formatModelSummary(n))}function renderServerPort(e){if(e.remote!==void 0||e.serverPort===void 0)return;let t=e.theme.colors;return t.inverse(t.gray(` :${e.serverPort} `))}const EXTERNAL_PROVIDER_DISPLAY_NAMES={codex:`chatgpt-sub`};function renderEndpoint(e){if(e.remote!==void 0||e.endpoint===void 0)return;let t=e.theme.colors,n=e.theme.glyph,clause=(e,n)=>`${t.dim(`via `)}${e}${t.dim(n)}`;if(e.endpoint.kind===`external`){let r=EXTERNAL_PROVIDER_DISPLAY_NAMES[e.endpoint.provider]??e.endpoint.provider;return{text:`${t.dim(`via ${r}`)}${n.external}`,standalone:!1}}if(e.endpoint.kind===`chatgpt`)switch(e.endpoint.state){case`ready`:return{text:`${t.dim(`via chatgpt-sub`)}${n.external}`,standalone:!1};case`checking`:return{text:t.dim(`chatgpt-sub checking…`),standalone:!0};case`signed-out`:case`reauth-required`:return{text:t.yellow(`${n.warning} chatgpt-sub login · /model`),standalone:!0};case`unavailable`:return{text:t.yellow(`${n.warning} chatgpt-sub unavailable`),standalone:!0}}if(!e.endpoint.connected)return{text:t.yellow(`${n.warning} ai-gateway`),standalone:!0};if(e.endpoint.credential===`api-key`)return{text:clause(`ai-gateway`,`(api-key)`),standalone:!1};let r=e.vercel?.identity?.projectName;return{text:clause(`ai-gateway`,`(${r===void 0?`oidc`:`oidc:${r}`})`),standalone:!1}}function buildStatusLine(e){let{theme:t,width:n}=e,r=t.colors,i=e.devBuild===void 0?void 0:formatDevBuildStatus(e.devBuild,t),a=e.logLevel===void 0?void 0:r.cyan(`logs: ${e.logLevel}`),o=renderServerPort(e),s=renderModel(e),c=e.remote===void 0?void 0:formatRemoteStatus(e.remote,t),l=renderEndpoint(e),u=c?.full??o,d=c?.badge??o,f=l!==void 0&&!l.standalone&&s!==void 0,p=f?`${s} ${l.text}`:s,m=l===void 0||f?void 0:l.text,compose=(e,t)=>{let n=t.filter(e=>e!==void 0).join(` `);return e===void 0||n.length===0?e??n:`${e} ${n}`},h=[compose(u,[a,p,m]),compose(u,[a,s]),compose(u,[a]),compose(d,[a]),compose(d,[])];if(i!==void 0){for(let e of h){let t=visibleLength(e),r=visibleLength(i);if(!(t+(t>0?2:0)+r>n))return`${e}${` `.repeat(n-t-r)}${i}`}return clipVisible(i,n)}if(h[0].length===0)return;for(let e of h)if(e.length>0&&visibleLength(e)<=n)return e;let g=h.findLast(e=>e.length>0);return clipVisible(g,n)}function formatRemoteStatus(e,t){let n=t.colors,r=e.deployment===void 0?remoteHost(e.target):`${e.deployment.projectName} (${e.deployment.environment})`,i=formatRemoteBadge(` ${t.unicode?`↗`:`->`} ${r} `,e.connection.state,t),a;switch(e.connection.state){case`checking`:a=n.dim(`Checking access…`);break;case`ready`:break;case`auth-required`:a=n.yellow(`Authenticate via OIDC`);break;case`authenticating`:a=n.dim(`Authenticating via OIDC…`);break;case`auth-failed`:a=n.yellow(`Authentication failed`);break;case`unavailable`:a=n.yellow(`Remote unavailable`)}return{badge:i,full:a===void 0?i:`${i} ${a}`}}function formatRemoteBadge(e,t,n){let r=n.colors;switch(t){case`checking`:return r.inverse(r.gray(e));case`ready`:return r.inverse(r.blue(e));case`unavailable`:case`auth-required`:case`authenticating`:case`auth-failed`:return r.inverse(r.yellow(e))}}export{buildStatusLine};
@@ -1,3 +1,4 @@
1
+ import type { EveCliSetupStepEvent, EveCliSetupTerminalEvent } from "#cli/telemetry/index.js";
1
2
  import type { DevBootProgressReporter } from "#internal/dev-boot-progress.js";
2
3
  import type { CommandLifecycle } from "#cli/shutdown.js";
3
4
  import { type DevDiagnostics } from "../diagnostics.js";
@@ -14,6 +15,9 @@ export interface RunDevelopmentTuiInput extends TuiDisplayOptions {
14
15
  readonly initialInput?: string;
15
16
  /** Explicit fresh-agent onboarding handoff from `eve init`. */
16
17
  readonly onboard?: boolean;
18
+ /** Reports timestamped steps and terminal result for fresh-agent onboarding. */
19
+ readonly onOnboardingStep?: (input: EveCliSetupStepEvent) => void;
20
+ readonly onOnboardingTerminal?: (input: EveCliSetupTerminalEvent) => void;
17
21
  /** Reports local CLI boot phases. Omitted for remote and programmatic TUI runs. */
18
22
  readonly onBootProgress?: DevBootProgressReporter;
19
23
  /** Gives setup subprocesses exclusive terminal and development-host ownership. */
@@ -1 +1 @@
1
- import{createDevDiagnostics}from"../diagnostics.js";import{remoteHost}from"./target.js";import{promptCommandsFor}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";async function startDevelopmentTuiStartup(e){let t=await createDevDiagnostics(e.appRoot).catch(()=>void 0),n=pickAgentHeaderTip(),r=new TerminalRenderer({...e,diagnostics:t,onExitRequest:e.onExitRequest});return r.beginStartupDraft({initialDraft:e.initialInput,tip:n,title:e.name??`eve`}),{diagnostics:t,headerTip:n,renderer:r,finish:()=>r.finishStartupDraft(),async shutdown(){r.shutdown(),await t?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(e){let{target:t,headers:n,initialInput:r,onboard:i,onBootProgress:a,lifecycle:o,startup:s,withExclusiveTerminal:c,...l}=e,u=prepareDevelopmentTarget(t),{serverUrl:d}=t,f={headers:withTuiUserAgent(n)},p=new Client(u.kind===`local`?resolveLocalDevelopmentClientOptions({...f,interactiveClient:!0,serverUrl:d,token:()=>resolveLinkedDevelopmentOidcToken(u.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...f,serverUrl:d,credentials:u.remote.credentials})),m={...l,client:p,serverUrl:d,promptCommandHandler:createPromptCommandHandler({target:t}),availablePromptCommands:promptCommandsFor(t.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(d):toErrorMessage(e)};u.kind===`local`?(m.appRoot=u.target.workspaceRoot,m.probeMcpConnection=probeMcpConnection):m.remote=u.remote,r!==void 0&&(m.initialInput=r),s!==void 0&&(m.renderer=s.renderer,m.startup=s),i!==void 0&&(m.onboard=i),a!==void 0&&(m.onBootProgress=a),o!==void 0&&(m.lifecycle=o),c!==void 0&&(m.withExclusiveTerminal=c);let h=s?.diagnostics??(u.kind===`local`?await createDevDiagnostics(u.target.workspaceRoot).catch(()=>void 0):void 0);h!==void 0&&(m.diagnostics=h);try{await new EveTUIRunner(m).run()}finally{await h?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
1
+ import{createDevDiagnostics}from"../diagnostics.js";import{remoteHost}from"./target.js";import{promptCommandsFor}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";async function startDevelopmentTuiStartup(e){let t=await createDevDiagnostics(e.appRoot).catch(()=>void 0),n=pickAgentHeaderTip(),r=new TerminalRenderer({...e,diagnostics:t,onExitRequest:e.onExitRequest});return r.beginStartupDraft({initialDraft:e.initialInput,tip:n,title:e.name??`eve`}),{diagnostics:t,headerTip:n,renderer:r,finish:()=>r.finishStartupDraft(),async shutdown(){r.shutdown(),await t?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(e){let{target:t,headers:n,initialInput:r,onboard:i,onOnboardingStep:a,onOnboardingTerminal:o,onBootProgress:s,lifecycle:c,startup:l,withExclusiveTerminal:u,...d}=e,f=prepareDevelopmentTarget(t),{serverUrl:p}=t,m={headers:withTuiUserAgent(n)},h=new Client(f.kind===`local`?resolveLocalDevelopmentClientOptions({...m,interactiveClient:!0,serverUrl:p,token:()=>resolveLinkedDevelopmentOidcToken(f.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...m,serverUrl:p,credentials:f.remote.credentials})),g={...d,client:h,serverUrl:p,promptCommandHandler:createPromptCommandHandler({target:t}),availablePromptCommands:promptCommandsFor(t.kind),formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(p):toErrorMessage(e)};f.kind===`local`?(g.appRoot=f.target.workspaceRoot,g.probeMcpConnection=probeMcpConnection):g.remote=f.remote,r!==void 0&&(g.initialInput=r),l!==void 0&&(g.renderer=l.renderer,g.startup=l),i!==void 0&&(g.onboard=i),a!==void 0&&(g.onOnboardingStep=a),o!==void 0&&(g.onOnboardingTerminal=o),s!==void 0&&(g.onBootProgress=s),c!==void 0&&(g.lifecycle=c),u!==void 0&&(g.withExclusiveTerminal=u);let _=l?.diagnostics??(f.kind===`local`?await createDevDiagnostics(f.target.workspaceRoot).catch(()=>void 0):void 0);_!==void 0&&(g.diagnostics=_);try{await new EveTUIRunner(g).run()}finally{await _?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
@@ -38,6 +38,6 @@ interface CliRuntimeDependencies {
38
38
  }): Promise<ProductionServerHandle>;
39
39
  }
40
40
  type CliRuntimeOverrides = Partial<CliRuntimeDependencies>;
41
- export declare function createCliProgram(logger: CliLogger, runtime: CliRuntimeOverrides, applicationContext: CliApplicationContext, telemetry: Pick<EveCliTelemetry, "trackDevContext">): Command;
41
+ export declare function createCliProgram(logger: CliLogger, runtime: CliRuntimeOverrides, applicationContext: CliApplicationContext, telemetry: Pick<EveCliTelemetry, "trackDevContext" | "trackSetupStep" | "trackSetupTerminal">): Command;
42
42
  /** Runs the eve CLI entrypoint. */
43
43
  export declare function runCli(argv?: string[], logger?: CliLogger, runtime?: CliRuntimeOverrides): Promise<void>;
@@ -1,4 +1,4 @@
1
- import{Command,CommanderError,InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{findEveProjectContext,resolveEveProjectContext}from"#internal/project-context.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{findCliApplicationRoot,resolveCliApplicationProject}from"#cli/application-root.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{runInteractiveDevelopmentUi}from"#cli/dev/run-interactive-ui.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseAgentNamesOption,parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseReasoningOption,parseStatsMode}from"#cli/option-parsers.js";import{createDevBootProgressReporter}from"#cli/dev/boot-progress.js";import{registerEveTelemetryCommands}from"#cli/telemetry/command.js";import{canonicalCommand,createEveCliTelemetry}from"#cli/telemetry/index.js";async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,t,n,r){let i=resolveInstalledPackageInfo().version,a=new Command,o=createCliTheme();a.name(`eve`).description(`Build and run an eve application.`).version(i).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{let{json:r}=n.opts();[`info`,`init`].includes(n.name())&&!r&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),agentCommand(a.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`),n).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:r}=await import(`#cli/commands/channels.js`);await r(e,n.project,t)}),registerEveTelemetryCommands(a,e),registerIntegrationCommands({program:a,logger:e,applicationContext:n});let s=a.command(`extension`).description(`Create and build reusable eve extension packages.`);s.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,r)=>{r.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:i}=await import(`#cli/commands/extension-init.js`);await i(e,n.root,t)}),s.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);await t(n.root);let{runExtensionBuildCommand:r}=await import(`#cli/commands/extension-build.js`);await r(e,n.root)}),registerRegistryCommands({program:a,logger:e,applicationContext:n}),a.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`--agents <names>`,`Create an agents/ workspace with comma-separated agent names`,parseAgentNamesOption).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,r)=>{r.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:i}=await import(`#cli/commands/init.js`);await i(e,n.root,t,{agents:r.agents,channelWebNextjs:r.channelWebNextjs,model:r.model,reasoning:r.reasoning})}),agentCommand(a.command(`set`),n).description(`Change root agent model settings.`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).action(async t=>{let{runSetCommand:r}=await import(`#cli/commands/set.js`);await r(e,n.root,t)}),registerProjectCommands({program:a,logger:e,applicationContext:n}),registerBuildCommand({applicationContext:n,buildHost:t.buildHost,logger:e,program:a}),agentCommand(a.command(`start`),n).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async r=>{let{loadDevelopmentEnvironmentFiles:i}=await import(`#cli/dev/environment.js`);await i(n.root);let a=await(t.startProductionHost??await loadStartProductionHost())(n.root,{host:r.host,port:r.port});e.log(renderCliTaggedLine(o,{message:`server listening at ${a.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>a.close(),wait:()=>a.wait()})}),registerRuntimeInvokeCommand({applicationContext:n,logger:e,program:a,runtime:t}),registerAcpCommand({applicationContext:n,eveVersion:i,program:a,resolveVerifiedRemoteDevelopmentClient:t.resolveVerifiedRemoteDevelopmentClient,runAcpServer:t.runAcpServer,startHost:t.startHost}),agentCommand(a.command(`dev`),n,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{Command,CommanderError,InvalidArgumentError,Option}from"#compiled/commander/index.js";import{agentCommand}from"#cli/agent-command.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal,waitForShutdownSignal}from"#cli/shutdown.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createCliTheme,renderCliTaggedLine}from"#cli/ui/output.js";import{findEveProjectContext,resolveEveProjectContext}from"#internal/project-context.js";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{eveCliBanner}from"#cli/banner.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{registerBuildCommand}from"#cli/commands/build.js";import{resolveApplicationRoot}from"#internal/application/paths.js";import{findCliApplicationRoot,resolveCliApplicationProject}from"#cli/application-root.js";import{registerIntegrationCommands}from"#cli/commands/register-integration-commands.js";import{registerProjectCommands}from"#cli/commands/register-project-commands.js";import{registerRegistryCommands}from"#cli/commands/register-registry-commands.js";import{runInteractiveDevelopmentUi}from"#cli/dev/run-interactive-ui.js";import{resolveDevUiMode,resolveTuiDisplayOptions}from"#cli/dev/ui-options.js";import{registerAcpCommand}from"#cli/acp/command.js";import{waitForServerOrStop,waitForUiOrServer}from"#cli/dev/wait-for-ui.js";import{registerRuntimeInvokeCommand}from"#cli/invoke/command.js";import{parseAgentNamesOption,parseContextSizeOption,parseDisplayMode,parseLogsMode,parsePortOption,parseReasoningOption,parseStatsMode}from"#cli/option-parsers.js";import{createDevBootProgressReporter}from"#cli/dev/boot-progress.js";import{registerEveTelemetryCommands}from"#cli/telemetry/command.js";import{canonicalCommand,createEveCliTelemetry}from"#cli/telemetry/index.js";async function loadPrintApplicationInfo(){return(await import(`#cli/commands/info.js`)).printApplicationInfo}async function loadDevelopmentTuiModule(){return await import(`#cli/dev/tui/tui.js`)}async function loadRunEvalCommand(){return(await import(`#evals/cli/eval.js`)).runEvalCommand}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}const loadIsActiveDevelopmentServerForApp=async()=>(await import(`#internal/nitro/host.js`)).isActiveDevelopmentServerForApp;async function loadStartProductionHost(){return(await import(`#internal/nitro/host.js`)).startProductionServer}function hasInteractiveTerminal(){return!!(process.stdin.isTTY&&process.stdout.isTTY)}function createCliProgram(e,t,n,r){let i=resolveInstalledPackageInfo().version,a=new Command,o=createCliTheme();a.name(`eve`).description(`Build and run an eve application.`).version(i).showHelpAfterError().exitOverride().hook(`preAction`,(t,n)=>{let{json:r}=n.opts();[`info`,`init`].includes(n.name())&&!r&&e.log(eveCliBanner())}).configureOutput({writeErr:t=>{e.error(t.trimEnd())},writeOut:t=>{e.log(t.trimEnd())}}),agentCommand(a.command(`channels`).description(`Manage user-authored channels in the current project.`).command(`list`),n).description(`List user-authored channels in the current project.`).option(`--json`,`Output as JSON`).action(async t=>{let{runChannelsListCommand:r}=await import(`#cli/commands/channels.js`);await r(e,n.project,t)}),registerEveTelemetryCommands(a,e),registerIntegrationCommands({program:a,logger:e,applicationContext:n});let s=a.command(`extension`).description(`Create and build reusable eve extension packages.`);s.command(`init [target]`).description(`Create a new eve extension package.`).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,i)=>{i.yes&&e.error(`warning: --yes has no effect for eve extension init.`);let{runExtensionInitCommand:a}=await import(`#cli/commands/extension-init.js`);await a(e,n.root,t,void 0,e=>{r.trackSetupStep({flow:`extension_init`,step:e})})}),s.command(`build`).description(`Build the current package as an eve extension.`).action(async()=>{let{loadDevelopmentEnvironmentFiles:t}=await import(`#cli/dev/environment.js`);await t(n.root);let{runExtensionBuildCommand:r}=await import(`#cli/commands/extension-build.js`);await r(e,n.root)}),registerRegistryCommands({program:a,logger:e,applicationContext:n}),a.command(`init [target]`).description(`Create a new eve agent, or add one to an existing project directory.`).option(`--channel-web-nextjs`,`Add the Web Chat application (Next.js)`).option(`--agents <names>`,`Create an agents/ workspace with comma-separated agent names`,parseAgentNamesOption).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).option(`-y, --yes`,`Accepted for compatibility; has no effect`).action(async(t,i)=>{i.yes&&e.error(`warning: --yes has no effect for eve init.`);let{runInitCommand:a}=await import(`#cli/commands/init.js`);await a(e,n.root,t,{agents:i.agents,channelWebNextjs:i.channelWebNextjs,model:i.model,reasoning:i.reasoning},void 0,e=>{r.trackSetupStep({flow:`init`,step:e})},(e,t)=>{r.trackSetupTerminal({flow:`init`,step:e,result:t})})}),agentCommand(a.command(`set`),n).description(`Change root agent model settings.`).option(`--model <model>`,`Set the agent model (provider/model-id)`).option(`--reasoning <effort>`,`Set reasoning (provider-default|none|minimal|low|medium|high|xhigh)`,parseReasoningOption).action(async t=>{let{runSetCommand:r}=await import(`#cli/commands/set.js`);await r(e,n.root,t)}),registerProjectCommands({program:a,logger:e,applicationContext:n}),registerBuildCommand({applicationContext:n,buildHost:t.buildHost,logger:e,program:a}),agentCommand(a.command(`start`),n).description(`Start a built eve application.`).option(`--host <host>`,`Host interface to bind`).option(`--port <port>`,`Port to listen on (defaults to $PORT, then 3000)`,parsePortOption).action(async r=>{let{loadDevelopmentEnvironmentFiles:i}=await import(`#cli/dev/environment.js`);await i(n.root);let a=await(t.startProductionHost??await loadStartProductionHost())(n.root,{host:r.host,port:r.port});e.log(renderCliTaggedLine(o,{message:`server listening at ${a.url}`,tag:`start`,tone:`success`})),await waitForShutdownSignal({close:()=>a.close(),wait:()=>a.wait()})}),registerRuntimeInvokeCommand({applicationContext:n,logger:e,program:a,runtime:t}),registerAcpCommand({applicationContext:n,eveVersion:i,program:a,resolveVerifiedRemoteDevelopmentClient:t.resolveVerifiedRemoteDevelopmentClient,runAcpServer:t.runAcpServer,startHost:t.startHost}),agentCommand(a.command(`dev`),n,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`,`
2
2
  You can also pass a bare URL, for example: eve dev https://example.com
3
- `).action(async(i,a)=>{let s=resolveDevelopmentUrlTarget(a,i),c=s?.serverUrl,l=hasInteractiveTerminal(),u=resolveDevUiMode({options:a,interactive:l});if(r.trackDevContext({target:s?`remote`:`local`,ui:u}),u===`headless`&&e.log(eveCliBanner()),a.input!==void 0&&u===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let d=!1;if(c!==void 0&&(d=await(t.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:n.root,serverUrl:c})),c){let{loadDevelopmentEnvironmentFiles:r}=await import(`#cli/dev/environment.js`);if(await r(n.root),e.log(`↗ ${d?`local`:`remote`} mode targeting ${o.info(new URL(c).host)}`),u===`headless`){e.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let i=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:n.root,existingLocalServer:d,lifecycle:i,options:a,remoteTarget:s,runDevelopmentTui:t.runDevelopmentTui,server:{serverUrl:c}})}finally{i.dispose()}return}let f=u===`tui`?startCliLiveRow(e):void 0,p=createDevBootProgressReporter(f);f?.update(`Building 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`&&a.onboard!==!0&&t.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(e=>(p({type:`before-first-paint`}),e.startDevelopmentTuiStartup({appRoot:n.root,initialInput:a.input,onExitRequest:g.requestStop,...resolveTuiDisplayOptions(a)}))):void 0;try{m=(t.startHost??await loadStartHost())(n.root,{existing:u===`tui`?`attach-if-unconfigured`:`reject`,host:a.host,onBootProgress:p,port:a.port});let[r,i]=await Promise.all([Promise.race([m.start().then(e=>({handle:e})),g.stopped.then(()=>({handle:void 0}))]),v]),s=r.handle;if(s===void 0){_=i,await _?.shutdown();return}if(_=i,u!==`tui`&&e.log(renderCliTaggedLine(o,{message:`server listening at ${s.url}`,tag:`dev`,tone:`success`})),u===`headless`){a.ui!==!1&&!l&&e.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:s,lifecycle:g,server:m,runUi:async()=>await runInteractiveDevelopmentUi({applicationRoot:n.root,existingLocalServer:!1,lifecycle:g,options:a,report:p,runDevelopmentTui:t.runDevelopmentTui,server:{appRoot:s.appRoot,serverUrl:s.url},startup:_})})}finally{f?.stop(),_===void 0&&(_=await v?.catch(()=>void 0),await _?.shutdown()),await closeServer(),g.dispose()}});let c=a.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return agentCommand(c.command(`show [logid]`,{isDefault:!0}),n).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,r)=>{let{runLogsShowCommand:i}=await import(`#cli/commands/logs.js`);await i(e,n.root,t,r)}),agentCommand(c.command(`ls`),n).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:r}=await import(`#cli/commands/logs.js`);await r(e,n.root,t)}),agentCommand(a.command(`traces [trace]`),n).usage(`[options] [trace]
3
+ `).action(async(i,a)=>{let s=resolveDevelopmentUrlTarget(a,i),c=s?.serverUrl,l=hasInteractiveTerminal(),u=resolveDevUiMode({options:a,interactive:l});if(r.trackDevContext({target:s?`remote`:`local`,ui:u}),u===`headless`&&e.log(eveCliBanner()),a.input!==void 0&&u===`headless`)throw new InvalidArgumentError(`--input requires the interactive UI.`);let d=!1;if(c!==void 0&&(d=await(t.isActiveDevelopmentServerForApp??await loadIsActiveDevelopmentServerForApp())({appRoot:n.root,serverUrl:c})),c){let{loadDevelopmentEnvironmentFiles:i}=await import(`#cli/dev/environment.js`);if(await i(n.root),e.log(`↗ ${d?`local`:`remote`} mode targeting ${o.info(new URL(c).host)}`),u===`headless`){e.log(renderCliTaggedLine(o,{message:`Interactive UI disabled because the current terminal is not a TTY.`,tag:`dev`,tone:`warning`}));return}e.log(``);let l=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});try{await runInteractiveDevelopmentUi({applicationRoot:n.root,existingLocalServer:d,lifecycle:l,onOnboardingStep:r.trackSetupStep,onOnboardingTerminal:r.trackSetupTerminal,options:a,remoteTarget:s,runDevelopmentTui:t.runDevelopmentTui,server:{serverUrl:c}})}finally{l.dispose()}return}let f=u===`tui`?startCliLiveRow(e):void 0,p=createDevBootProgressReporter(f);f?.update(`Building 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`&&a.onboard!==!0&&t.runDevelopmentTui===void 0?loadDevelopmentTuiModule().then(e=>(p({type:`before-first-paint`}),e.startDevelopmentTuiStartup({appRoot:n.root,initialInput:a.input,onExitRequest:g.requestStop,...resolveTuiDisplayOptions(a)}))):void 0;try{m=(t.startHost??await loadStartHost())(n.root,{existing:u===`tui`?`attach-if-unconfigured`:`reject`,host:a.host,onBootProgress:p,port:a.port});let[i,s]=await Promise.all([Promise.race([m.start().then(e=>({handle:e})),g.stopped.then(()=>({handle:void 0}))]),v]),c=i.handle;if(c===void 0){_=s,await _?.shutdown();return}if(_=s,u!==`tui`&&e.log(renderCliTaggedLine(o,{message:`server listening at ${c.url}`,tag:`dev`,tone:`success`})),u===`headless`){a.ui!==!1&&!l&&e.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:n.root,existingLocalServer:!1,lifecycle:g,onOnboardingStep:r.trackSetupStep,onOnboardingTerminal:r.trackSetupTerminal,options:a,report:p,runDevelopmentTui:t.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()}});let c=a.command(`logs`).description("Inspect local `eve dev` diagnostic logs (.eve/logs).");return agentCommand(c.command(`show [logid]`,{isDefault:!0}),n).description(`Print a diagnostic log (the most recent when logid is omitted).`).option(`--dump`,`Prepend the log's environment dump (.dump sibling)`).option(`--events`,`Interleave session events from the local workflow store`).action(async(t,r)=>{let{runLogsShowCommand:i}=await import(`#cli/commands/logs.js`);await i(e,n.root,t,r)}),agentCommand(c.command(`ls`),n).description(`List diagnostic logs, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runLogsListCommand:r}=await import(`#cli/commands/logs.js`);await r(e,n.root,t)}),agentCommand(a.command(`traces [trace]`),n).usage(`[options] [trace]
4
4
  eve traces ls [options]`).description("Show a local `eve dev` trace (the most recent when trace is omitted).").option(`--verbose`,`Expand every span with all attributes and events`).option(`--json`,`Output as JSON`).action(async(t,r)=>{let{runTraceShowCommand:i}=await import(`#cli/commands/trace.js`);await i(e,n.root,t,r)}).command(`ls`).description(`List local traces, most recent first.`).option(`--json`,`Output as JSON`).action(async t=>{let{runTraceListCommand:r}=await import(`#cli/commands/trace.js`);await r(e,n.root,t)}),agentCommand(a.command(`info`),n).description(`Print resolved application information.`).option(`--json`,`Output as JSON`).action(async r=>{await(t.printApplicationInfo??await loadPrintApplicationInfo())(e,n.root,r)}),agentCommand(a.command(`eval`),n,e=>e.opts().url===void 0).description(`Run evals against an eve agent.`).argument(`[evalIds...]`,`Eval ids (or directory prefixes) to run (all discovered evals when omitted)`).option(`--url <url>`,`Remote agent URL (skip local host startup)`,parseDevelopmentServerUrl).option(`--tag <tag...>`,`Run only evals carrying a tag`).option(`--exclude-tag <tag...>`,`Skip evals carrying a tag`).option(`--strict`,`Fail the exit code when any score falls below its threshold`).option(`--list`,`Print discovered evals without running them`).option(`--timeout <ms>`,`Per-eval timeout in milliseconds`).option(`--max-concurrency <n>`,`Max concurrent eval executions`).option(`--json`,`Output results as JSON`).option(`--junit <path>`,`Write JUnit XML results to a file`).option(`--skip-report`,`Skip eval-defined reporters (e.g. Braintrust)`).option(`--verbose`,`Stream per-eval t.log lines to stdout`).action(async(r,i)=>{await(t.runEvalCommand??await loadRunEvalCommand())(r,i,e,n.root)}),a}async function runCli(e=process.argv.slice(2),t=console,n={}){let r={root:resolveApplicationRoot(),async resolve(){let e=await(n.resolveApplicationProject??resolveCliApplicationProject)(r.root);r.project=e,r.root=e.appRoot},async resolveAgent(){return resolveEveProjectContext(r.root)}},i=createEveCliTelemetry(resolveInstalledPackageInfo().version),a=createCliProgram(t,n,r,i),o=e;if(o.length===0){let e=await(n.findApplicationRoot??findCliApplicationRoot)(r.root);e===void 0?o=(await findEveProjectContext(r.root))?.kind===`workspace`?[`dev`]:[`init`]:(r.root=e,o=[`dev`])}let s=canonicalCommand(o);i.trackCommand(s),s!==`telemetry`&&await i.notify(t);try{await a.parseAsync(o,{from:`user`}),i.trackOutcome(`success`)}catch(e){if(e instanceof CommanderError&&e.exitCode===0){i.trackOutcome(`success`);return}if(i.trackOutcome(e instanceof CommanderError?`usage_error`:`error`),e instanceof CommanderError){let r=await(n.isCodingAgentLaunch??isCodingAgentLaunch)();if(o[0]===`init`&&r){let{initAgentInstructions:e}=await import(`#cli/commands/agent-instructions.js`);t.log(e())}throw Error(e.message)}throw e}finally{await i.flush()}}export{createCliProgram,resolveDevUiMode,resolveTuiDisplayOptions,runCli};
@@ -4,12 +4,27 @@ export type EveCliTelemetryEvent = {
4
4
  readonly key: string;
5
5
  readonly value: string;
6
6
  };
7
+ export type EveCliSetupFlow = "init" | "extension_init" | "onboarding";
8
+ export type EveCliSetupStep = "resolve_target" | "scaffold" | "install_dependencies" | "initialize_git" | "handoff" | "model_provider" | "model_settings" | "registry_channels" | "registry_integrations" | "registry_review" | "registry_install";
9
+ export type EveCliSetupTerminalResult = "completed" | "cancelled" | "error";
10
+ export type EveCliSetupStepEvent = {
11
+ flow: EveCliSetupFlow;
12
+ step: EveCliSetupStep;
13
+ registrySelectedCount?: number;
14
+ };
15
+ export type EveCliSetupTerminalEvent = {
16
+ flow: EveCliSetupFlow;
17
+ step: EveCliSetupStep;
18
+ result: EveCliSetupTerminalResult;
19
+ };
7
20
  export type EveCliTelemetry = {
8
21
  trackCommand(command: string): void;
9
22
  trackDevContext(context: {
10
23
  target: "local" | "remote";
11
24
  ui: "tui" | "headless";
12
25
  }): void;
26
+ trackSetupStep(input: EveCliSetupStepEvent): void;
27
+ trackSetupTerminal(input: EveCliSetupTerminalEvent): void;
13
28
  trackOutcome(outcome: "success" | "usage_error" | "error"): void;
14
29
  notify(logger: {
15
30
  error(message: string): void;
@@ -1,3 +1,3 @@
1
- import{randomUUID}from"node:crypto";import{spawn}from"node:child_process";import{markEveTelemetryNotified,readEveTelemetryPreference,readOrCreateEveTelemetryIdentity}from"#cli/telemetry/preference.js";import os from"node:os";import{createEveTelemetryIdentity,isEphemeralEveTelemetryEnvironment,resolveEveTelemetryProjectId}from"#cli/telemetry/identity.js";async function isEnabled(){return process.env.NODE_ENV!==`test`&&!process.env.EVE_TELEMETRY_DISABLED&&(await readEveTelemetryPreference()).enabled}function event(e,t){return{id:randomUUID(),event_time:Date.now(),key:e,value:t}}const CLI_TELEMETRY_COMMANDS=new Map([[`acp`,`acp`],[`add`,`add`],[`build`,`build`],[`channels`,`channels`],[`channels:list`,`channels:list`],[`deploy`,`deploy`],[`dev`,`dev`],[`eval`,`eval`],[`extension`,`extension`],[`extension:build`,`extension:build`],[`extension:init`,`extension:init`],[`info`,`info`],[`init`,`init`],[`integration`,`integration`],[`integration:connect`,`integration:connect`],[`integration:setup`,`integration:setup`],[`invoke`,`invoke`],[`link`,`link`],[`logs`,`logs:show`],[`logs:ls`,`logs:ls`],[`logs:show`,`logs:show`],[`registry`,`registry`],[`registry:add`,`registry:add`],[`registry:list`,`registry:list`],[`registry:search`,`registry:search`],[`registry:view`,`registry:view`],[`set`,`set`],[`start`,`start`],[`telemetry`,`telemetry`],[`telemetry:disable`,`telemetry:disable`],[`telemetry:enable`,`telemetry:enable`],[`telemetry:status`,`telemetry:status`],[`traces`,`traces:show`],[`traces:ls`,`traces:ls`]]),cliTelemetryCommandPaths=new Set(CLI_TELEMETRY_COMMANDS.keys()),internalCliCommandPaths=new Set([`telemetry:flush`]);function canonicalCommand(e){let t=e[0];if(t===`--help`||t===`-h`)return`help`;if(t===`--version`||t===`-V`)return`version`;let n=e.findIndex(e=>!e.startsWith(`-`)),r=e[n];if(r===void 0||/^https?:\/\//.test(r))return`dev`;let i=e.slice(n+1).find(e=>!e.startsWith(`-`));if(i!==void 0){let e=CLI_TELEMETRY_COMMANDS.get(`${r}:${i}`);if(e!==void 0)return e}return CLI_TELEMETRY_COMMANDS.get(r)??`unknown`}function createEveCliTelemetry(e){let t=[event(`version`,e),event(`platform`,os.platform()),event(`arch`,os.arch()),event(`stdin_is_tty`,process.stdin.isTTY?`true`:`false`)],n=randomUUID();return{trackCommand(e){t.push(event(`command`,e))},trackDevContext(e){t.push(event(`target`,e.target),event(`ui`,e.ui))},trackOutcome(e){t.push(event(`outcome`,e))},async notify(e){let t=await readEveTelemetryPreference();if(process.env.NODE_ENV!==`test`&&!process.env.EVE_TELEMETRY_DISABLED&&t.enabled&&!t.notified&&process.stderr.isTTY){e.error(`Attention: eve collects CLI telemetry to improve the command-line interface.
1
+ import{randomUUID}from"node:crypto";import{spawn}from"node:child_process";import{markEveTelemetryNotified,readEveTelemetryPreference,readOrCreateEveTelemetryIdentity}from"#cli/telemetry/preference.js";import os from"node:os";import{createEveTelemetryIdentity,isEphemeralEveTelemetryEnvironment,resolveEveTelemetryProjectId}from"#cli/telemetry/identity.js";async function isEnabled(){return process.env.NODE_ENV!==`test`&&!process.env.EVE_TELEMETRY_DISABLED&&(await readEveTelemetryPreference()).enabled}function event(e,t){return{id:randomUUID(),event_time:Date.now(),key:e,value:t}}const CLI_TELEMETRY_COMMANDS=new Map([[`acp`,`acp`],[`add`,`add`],[`build`,`build`],[`channels`,`channels`],[`channels:list`,`channels:list`],[`deploy`,`deploy`],[`dev`,`dev`],[`eval`,`eval`],[`extension`,`extension`],[`extension:build`,`extension:build`],[`extension:init`,`extension:init`],[`info`,`info`],[`init`,`init`],[`integration`,`integration`],[`integration:connect`,`integration:connect`],[`integration:setup`,`integration:setup`],[`invoke`,`invoke`],[`link`,`link`],[`logs`,`logs:show`],[`logs:ls`,`logs:ls`],[`logs:show`,`logs:show`],[`registry`,`registry`],[`registry:add`,`registry:add`],[`registry:list`,`registry:list`],[`registry:search`,`registry:search`],[`registry:view`,`registry:view`],[`set`,`set`],[`start`,`start`],[`telemetry`,`telemetry`],[`telemetry:disable`,`telemetry:disable`],[`telemetry:enable`,`telemetry:enable`],[`telemetry:status`,`telemetry:status`],[`traces`,`traces:show`],[`traces:ls`,`traces:ls`]]),cliTelemetryCommandPaths=new Set(CLI_TELEMETRY_COMMANDS.keys()),internalCliCommandPaths=new Set([`telemetry:flush`]);function canonicalCommand(e){let t=e[0];if(t===`--help`||t===`-h`)return`help`;if(t===`--version`||t===`-V`)return`version`;let n=e.findIndex(e=>!e.startsWith(`-`)),r=e[n];if(r===void 0||/^https?:\/\//.test(r))return`dev`;let i=e.slice(n+1).find(e=>!e.startsWith(`-`));if(i!==void 0){let e=CLI_TELEMETRY_COMMANDS.get(`${r}:${i}`);if(e!==void 0)return e}return CLI_TELEMETRY_COMMANDS.get(r)??`unknown`}function createEveCliTelemetry(e){let t=[event(`version`,e),event(`platform`,os.platform()),event(`arch`,os.arch()),event(`stdin_is_tty`,process.stdin.isTTY?`true`:`false`)],n=randomUUID(),r=[],i,a=!1;return{trackCommand(e){t.push(event(`command`,e))},trackDevContext(e){t.push(event(`target`,e.target),event(`ui`,e.ui))},trackSetupStep(e){i={flow:e.flow,step:e.step},r.push(event(`setup_flow`,e.flow),event(`setup_step`,e.step)),e.registrySelectedCount!==void 0&&r.push(event(`registry_selected_count`,String(e.registrySelectedCount)))},trackSetupTerminal(e){a=!0,r.push(event(`setup_flow`,e.flow),event(`setup_terminal_step`,e.step),event(`setup_terminal_result`,e.result))},trackOutcome(e){i!==void 0&&!a&&this.trackSetupTerminal({...i,result:e===`success`?`completed`:`error`}),t.push(event(`outcome`,e))},async notify(e){let t=await readEveTelemetryPreference();if(process.env.NODE_ENV!==`test`&&!process.env.EVE_TELEMETRY_DISABLED&&t.enabled&&!t.notified&&process.stderr.isTTY){e.error(`Attention: eve collects CLI telemetry to improve the command-line interface.
2
2
  Disable it with \`eve telemetry disable\`, or for one command set EVE_TELEMETRY_DISABLED=1.
3
- Learn more: https://eve.dev/docs/reference/telemetry`);try{await markEveTelemetryNotified()}catch{}}},async flush(){if(await isEnabled()&&t.length!==0){try{let e=isEphemeralEveTelemetryEnvironment()?createEveTelemetryIdentity():await readOrCreateEveTelemetryIdentity();t.push(event(`installation_id`,e.installationId),event(`project_id`,await resolveEveTelemetryProjectId({identity:e})))}catch{return}if(process.env.EVE_TELEMETRY_DEBUG){process.stderr.write(`[eve telemetry] ${JSON.stringify(t)}\n`);return}try{let e=spawn(process.execPath,[process.argv[1]??``,`telemetry`,`flush`,JSON.stringify({events:t,sessionId:n})],{detached:!0,env:{...process.env,EVE_TELEMETRY_DISABLED:`1`},stdio:`ignore`,windowsHide:!0});e.on(`error`,()=>{}),e.unref()}catch{}}}}}export{canonicalCommand,cliTelemetryCommandPaths,createEveCliTelemetry,internalCliCommandPaths};
3
+ Learn more: https://eve.dev/docs/reference/telemetry`);try{await markEveTelemetryNotified()}catch{}}},async flush(){if(await isEnabled()&&t.length!==0){try{let e=isEphemeralEveTelemetryEnvironment(),n=e?createEveTelemetryIdentity():await readOrCreateEveTelemetryIdentity();t.push(event(`identity_kind`,e?`ephemeral`:`persistent`),event(`installation_id`,n.installationId),event(`project_id`,await resolveEveTelemetryProjectId({identity:n}))),t.push(...r)}catch{return}if(process.env.EVE_TELEMETRY_DEBUG){process.stderr.write(`[eve telemetry] ${JSON.stringify(t)}\n`);return}try{let e=spawn(process.execPath,[process.argv[1]??``,`telemetry`,`flush`,JSON.stringify({events:t,sessionId:n})],{detached:!0,env:{...process.env,EVE_TELEMETRY_DISABLED:`1`},stdio:`ignore`,windowsHide:!0});e.on(`error`,()=>{}),e.unref()}catch{}}}}}export{canonicalCommand,cliTelemetryCommandPaths,createEveCliTelemetry,internalCliCommandPaths};
@@ -1 +1 @@
1
- import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{ClientError}from"#client/client-error.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0),r=await readSessionId(n),i=new ClientSession(e,{sessionId:r,streamIndex:0});return{response:i.#r(n,t,0),session:i}}get state(){return this.#t}async snapshot(e){e?.signal?.throwIfAborted();let t=[];for await(let n of this.#o({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return e?.signal?.throwIfAborted(),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),i=t?await postSessionSend(this.#e,r,e):await postTurn(this.#e,r,e,!1);if(await readSessionId(i,this.#t.sessionId)!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);return this.#r(i,e,n)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}#r(e,t,n){return e.body?.cancel().catch(()=>{}),new MessageResponse({cancelTurn:async e=>await this.cancel({turnId:e}),createStream:()=>this.#i(n,t),sessionId:this.#t.sessionId})}async*#i(e,t){let n=0,r=new Set;try{for await(let i of this.#o({headers:t.headers,keepAlive:shouldKeepActiveTurnAlive(t.streamReconnectPolicy),signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy}))if(n+=1,i.type===`authorization.required`&&i.data.webhookUrl!==void 0?r.add(i.data.name):i.type===`authorization.completed`&&r.delete(i.data.name),yield i,isCurrentTurnBoundaryEvent(i)&&(i.type!==`session.waiting`||r.size===0))break}finally{this.#t={sessionId:this.#t.sessionId,streamIndex:e+n}}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;try{for await(let r of this.#o({follow:e?.follow,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,yield r}finally{t>=0&&(this.#t={sessionId:this.#t.sessionId,streamIndex:t+n})}}#o(e){return followStreamIterable({follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.headers),redirect:this.#e.redirect,sessionId:this.#t.sessionId,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy})}};async function postSessionSend(e,t,n){let r=250;for(let i=0;;i+=1){try{return await postTurn(e,t,n,!1)}catch(e){if(!isSessionNotActive(e)||i>=3)throw e}await sleep(r,n.signal),n.signal?.throwIfAborted(),r*=2}}function isSessionNotActive(e){return e instanceof ClientError&&e.status===409&&e.code===`session_not_active`}function shouldKeepActiveTurnAlive(e){return e&&`reconnect`in e?!1:e?.streamIdleReconnectPolicy?.maxAttempts===void 0}async function postTurn(e,t,n,r){let i=createMessageBody(n,r);if(i===null)throw Error(r?`Creating a session requires a non-empty message.`:`A session turn requires a non-empty message or inputResponses.`);let a=await e.resolveHeaders(n.headers);a.set(`content-type`,`application/json`);let o=await fetch(createClientUrl(e.host,t),{body:JSON.stringify(i),headers:a,method:`POST`,redirect:e.redirect,signal:n.signal??null});if(!o.ok){let e=await o.text();throw new ClientError(o.status,e,o.headers)}return o}async function readSessionId(e,t){let n=await e.json(),r=(typeof n.sessionId==`string`?n.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!r)throw Error(`Message route did not return a session id.`);return r}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!t&&e.message!==void 0&&e.turnPolicy!==void 0&&(n.turnPolicy=e.turnPolicy),e.clientContext!==void 0&&(n.clientContext=e.clientContext);let r=serializeOutputSchema(e.outputSchema);return r!==void 0&&(n.outputSchema=r),t&&n.message===void 0||n.message===void 0&&n.inputResponses===void 0?null:n}export{ClientSession};
1
+ import{EVE_SESSION_ROUTE_PATH,createEveSessionRoutePath}from"#protocol/routes.js";import{EVE_SESSION_ID_HEADER,isCurrentTurnBoundaryEvent}from"#protocol/message.js";import{ClientError}from"#client/client-error.js";import{createClientUrl}from"#client/url.js";import{MessageResponse}from"#client/message-response.js";import{followStreamIterable,sleep}from"#client/open-stream.js";import{cancelClientSession,clearClientSession,compactClientSession,resetClientSession}from"#client/session-controls.js";import{serializeOutputSchema}from"#tools/schema.js";var ClientSession=class ClientSession{#e;#t;constructor(e,t){this.#e=e,this.#t=t}static async create(e,t){let n=await postTurn(e,EVE_SESSION_ROUTE_PATH,t,!0),{sessionId:r}=await readAcceptedMessage(n),i=new ClientSession(e,{sessionId:r,streamIndex:0});return{response:i.#r(n,t,0),session:i}}get state(){return this.#t}async snapshot(e){e?.signal?.throwIfAborted();let t=[];for await(let n of this.#o({follow:!1,signal:e?.signal,startIndex:0}))t.push(n);return e?.signal?.throwIfAborted(),{events:t,session:{sessionId:this.#t.sessionId,streamIndex:t.length}}}async send(e,t={}){return await this.#n({...t,message:e},!0)}async respond(e,t={}){if(e.length===0)throw Error(`ClientSession.respond() requires at least one input response.`);return await this.#n({...t,inputResponses:e},!1)}async#n(e,t){let n=this.#t.streamIndex,r=createEveSessionRoutePath(this.#t.sessionId),i=t?await postSessionSend(this.#e,r,e):await postTurn(this.#e,r,e,!1),{sessionId:a,deliveryId:o}=await readAcceptedMessage(i,this.#t.sessionId);if(a!==this.#t.sessionId)throw Error(`Message route returned a different session id.`);if(e.message!==void 0&&o===void 0)throw Error(`Message route did not return a delivery id. Update the server before sending with this client.`);return this.#r(i,e,n,e.message===void 0?void 0:o)}async cancel(e){return await cancelClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}async clear(){return await clearClientSession({context:this.#e,sessionId:this.#t.sessionId})}async compact(){return await compactClientSession({context:this.#e,sessionId:this.#t.sessionId})}async reset(e){return await resetClientSession({context:this.#e,options:e,sessionId:this.#t.sessionId})}stream(e){if(e?.follow===!1&&(e.startIndex??this.#t.streamIndex)<0)throw Error(`stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.`);return this.#a(e)}#r(e,t,n,r){return e.body?.cancel().catch(()=>{}),new MessageResponse({cancelTurn:async e=>await this.cancel({turnId:e}),createStream:()=>this.#i(n,t,r),sessionId:this.#t.sessionId})}async*#i(e,t,n){let r=0,i=n===void 0,a=!1,o=new Set;try{for await(let s of this.#o({headers:t.headers,keepAlive:shouldKeepActiveTurnAlive(t.streamReconnectPolicy),signal:t.signal,startIndex:e,streamReconnectPolicy:t.streamReconnectPolicy})){if(r+=1,n!==void 0){let e=s.meta?.deliveryIds?.includes(n)===!0,t=s.type===`session.failed`||s.type===`session.completed`;if(!e&&t&&(!i||s.type===`session.completed`))throw Error(`The session ended before the accepted message reached its turn boundary.`);if(!i&&!e||!t&&s.meta?.deliveryIds!==void 0&&!e)continue;i=!0}if(s.type===`authorization.required`&&s.data.webhookUrl!==void 0?o.add(s.data.name):s.type===`authorization.completed`&&o.delete(s.data.name),a=isCurrentTurnBoundaryEvent(s)&&(s.type!==`session.waiting`||o.size===0),yield s,a)break}if(n!==void 0&&!a&&!t.signal?.aborted)throw Error(`The response stream ended before the accepted message reached its turn boundary.`)}finally{this.#t={sessionId:this.#t.sessionId,streamIndex:Math.max(this.#t.streamIndex,e+r)}}}async*#a(e){let t=e?.startIndex??this.#t.streamIndex,n=0;try{for await(let r of this.#o({follow:e?.follow,signal:e?.signal,startIndex:t,streamReconnectPolicy:e?.streamReconnectPolicy}))n+=1,yield r}finally{t>=0&&(this.#t={sessionId:this.#t.sessionId,streamIndex:t+n})}}#o(e){return followStreamIterable({follow:e.follow,host:this.#e.host,keepAlive:e.keepAlive,resolveHeaders:()=>this.#e.resolveHeaders(e.headers),redirect:this.#e.redirect,sessionId:this.#t.sessionId,signal:e.signal,startIndex:e.startIndex,streamReconnectPolicy:e.streamReconnectPolicy})}};async function postSessionSend(e,t,n){let r=250;for(let i=0;;i+=1){try{return await postTurn(e,t,n,!1)}catch(e){if(!isSessionNotActive(e)||i>=3)throw e}await sleep(r,n.signal),n.signal?.throwIfAborted(),r*=2}}function isSessionNotActive(e){return e instanceof ClientError&&e.status===409&&e.code===`session_not_active`}function shouldKeepActiveTurnAlive(e){return e&&`reconnect`in e?!1:e?.streamIdleReconnectPolicy?.maxAttempts===void 0}async function postTurn(e,t,n,r){let i=createMessageBody(n,r);if(i===null)throw Error(r?`Creating a session requires a non-empty message.`:`A session turn requires a non-empty message or inputResponses.`);let a=await e.resolveHeaders(n.headers);a.set(`content-type`,`application/json`);let o=await fetch(createClientUrl(e.host,t),{body:JSON.stringify(i),headers:a,method:`POST`,redirect:e.redirect,signal:n.signal??null});if(!o.ok){let e=await o.text();throw new ClientError(o.status,e,o.headers)}return o}async function readAcceptedMessage(e,t){let n=await e.json(),r=(typeof n.sessionId==`string`?n.sessionId:void 0)??e.headers.get(EVE_SESSION_ID_HEADER)?.trim()??t;if(!r)throw Error(`Message route did not return a session id.`);return{sessionId:r,deliveryId:typeof n.deliveryId==`string`&&n.deliveryId.length>0?n.deliveryId:void 0}}function createMessageBody(e,t){let n={};e.message!==void 0&&(n.message=e.message),e.inputResponses!==void 0&&e.inputResponses.length>0&&(n.inputResponses=e.inputResponses),!t&&e.message!==void 0&&e.turnPolicy!==void 0&&(n.turnPolicy=e.turnPolicy),e.clientContext!==void 0&&(n.clientContext=e.clientContext);let r=serializeOutputSchema(e.outputSchema);return r!==void 0&&(n.outputSchema=r),t&&n.message===void 0||n.message===void 0&&n.inputResponses===void 0?null:n}export{ClientSession};
@@ -53,7 +53,7 @@
53
53
  "zod": "4.5.4",
54
54
  "zod-validation-error": "5.0.0"
55
55
  },
56
- "scriptHash": "69ca09113e7432756592e5287bb0545a8306f8dd8d739b6738e04394e4e34d07",
56
+ "scriptHash": "e740f8c7ef9c2c6d66093b6e5f205d1f44d5c5ef5a04ddd68197b03c79cbe8e8",
57
57
  "toolVersions": {
58
58
  "rolldown": "1.2.7",
59
59
  "typescript": "7.0.2"
@@ -28,6 +28,7 @@ export interface CompileFromMemoryToolInput {
28
28
  readonly inputSchema?: JsonObject | null;
29
29
  readonly outputSchema?: JsonObject;
30
30
  readonly execute?: ToolDefinition["execute"];
31
+ readonly label?: ToolDefinition["label"];
31
32
  readonly approval?: ToolDefinition["approval"];
32
33
  readonly toModelOutput?: ToolDefinition["toModelOutput"];
33
34
  }
@@ -1 +1 @@
1
- import{randomUUID}from"node:crypto";import{createProgrammaticCompiledModuleMap}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{createAgentSourceManifest}from"#discover/manifest.js";import{defineAgent}from"#public/definitions/agent.js";import{defineSkill}from"#public/definitions/skill.js";import{defineTool}from"#tools/definition.js";import{createAgentSourceRegistry,defineProgrammaticAgentSource}from"#compiler/source-graph.js";import{frameworkAgentSourceRegistry}from"#framework/sources/registry.js";async function compileFromMemory(e){let t=e.appRoot??`/virtual/eve-memory-app`,n=e.agentRoot??`${t}/agent`,r=`memory:${e.name??`memory-agent`}`,i=defineAgent(e.agent??{limits:e.limits,model:e.model,outputSchema:e.outputSchema}),a=[{loadNamespace:async()=>({default:i}),logicalPath:`agent.ts`},...e.modules??[],...(e.tools??[]).map(e=>({loadNamespace:async()=>({default:createMemoryToolDefinition(e)}),logicalPath:`tools/${e.name}.ts`})),...(e.skills??[]).map(e=>({loadNamespace:async()=>({default:defineSkill({description:e.description,markdown:e.markdown??`# ${e.name}\n`})}),logicalPath:`skills/${e.name}.ts`}))],o=createAgentSourceRegistry([{applyTo:`root`,source:defineProgrammaticAgentSource({id:r,modules:a,revision:e.revision??`memory-generation:${randomUUID()}`})}]),s=createAgentSourceManifest({agentId:e.name??`memory-agent`,agentRoot:n,appRoot:t}),c=await compileAgentManifest(s,{sourceRegistries:[o]});return{manifest:c,moduleMap:await createProgrammaticCompiledModuleMap(c,[frameworkAgentSourceRegistry,o])}}function createMemoryToolDefinition(e){return defineTool({approval:e.approval,description:e.description??`${e.name} test tool.`,execute:e.execute??(()=>{throw Error(`Memory tool "${e.name}" has no installed executor.`)}),inputSchema:e.inputSchema??{additionalProperties:!0,type:`object`},outputSchema:e.outputSchema,toModelOutput:e.toModelOutput})}export{compileFromMemory};
1
+ import{randomUUID}from"node:crypto";import{createProgrammaticCompiledModuleMap}from"#compiler/module-map.js";import{compileAgentManifest}from"#compiler/normalize-manifest.js";import{createAgentSourceManifest}from"#discover/manifest.js";import{defineAgent}from"#public/definitions/agent.js";import{defineSkill}from"#public/definitions/skill.js";import{defineTool}from"#tools/definition.js";import{createAgentSourceRegistry,defineProgrammaticAgentSource}from"#compiler/source-graph.js";import{frameworkAgentSourceRegistry}from"#framework/sources/registry.js";async function compileFromMemory(e){let t=e.appRoot??`/virtual/eve-memory-app`,n=e.agentRoot??`${t}/agent`,r=`memory:${e.name??`memory-agent`}`,i=defineAgent(e.agent??{limits:e.limits,model:e.model,outputSchema:e.outputSchema}),a=[{loadNamespace:async()=>({default:i}),logicalPath:`agent.ts`},...e.modules??[],...(e.tools??[]).map(e=>({loadNamespace:async()=>({default:createMemoryToolDefinition(e)}),logicalPath:`tools/${e.name}.ts`})),...(e.skills??[]).map(e=>({loadNamespace:async()=>({default:defineSkill({description:e.description,markdown:e.markdown??`# ${e.name}\n`})}),logicalPath:`skills/${e.name}.ts`}))],o=createAgentSourceRegistry([{applyTo:`root`,source:defineProgrammaticAgentSource({id:r,modules:a,revision:e.revision??`memory-generation:${randomUUID()}`})}]),s=createAgentSourceManifest({agentId:e.name??`memory-agent`,agentRoot:n,appRoot:t}),c=await compileAgentManifest(s,{sourceRegistries:[o]});return{manifest:c,moduleMap:await createProgrammaticCompiledModuleMap(c,[frameworkAgentSourceRegistry,o])}}function createMemoryToolDefinition(e){return defineTool({label:e.label,approval:e.approval,description:e.description??`${e.name} test tool.`,execute:e.execute??(()=>{throw Error(`Memory tool "${e.name}" has no installed executor.`)}),inputSchema:e.inputSchema??{additionalProperties:!0,type:`object`},outputSchema:e.outputSchema,toModelOutput:e.toModelOutput})}export{compileFromMemory};
@@ -11,8 +11,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
11
11
  readonly dropped: {};
12
12
  };
13
13
  readonly tool: {
14
- readonly current: 30;
15
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 28, 29, 30];
14
+ readonly current: 33;
15
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 28, 29, 30, 31, 32, 33];
16
16
  readonly dropped: {
17
17
  readonly 14: "TaskExec.delegated was removed; migrate to workflow-backed background tools";
18
18
  readonly 15: "TaskExec replaces stageEffect with send";
@@ -31,8 +31,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
31
31
  };
32
32
  };
33
33
  readonly dynamicTool: {
34
- readonly current: 29;
35
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 28, 29];
34
+ readonly current: 31;
35
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 28, 29, 30, 31];
36
36
  readonly dropped: {
37
37
  readonly 21: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
38
38
  readonly 23: "TaskExec.delegated was removed; migrate to workflow-backed background tools";
@@ -43,22 +43,22 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
43
43
  };
44
44
  };
45
45
  readonly channel: {
46
- readonly current: 17;
47
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17];
46
+ readonly current: 19;
47
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19];
48
48
  readonly dropped: {
49
49
  readonly 12: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
50
50
  };
51
51
  };
52
52
  readonly schedule: {
53
- readonly current: 9;
54
- readonly supported: readonly [1, 2, 3, 4, 6, 7, 8, 9];
53
+ readonly current: 11;
54
+ readonly supported: readonly [1, 2, 3, 4, 6, 7, 8, 9, 10, 11];
55
55
  readonly dropped: {
56
56
  readonly 5: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
57
57
  };
58
58
  };
59
59
  readonly subagent: {
60
- readonly current: 9;
61
- readonly supported: readonly [3, 4, 6, 7, 8, 9];
60
+ readonly current: 10;
61
+ readonly supported: readonly [3, 4, 6, 7, 8, 9, 10];
62
62
  readonly dropped: {
63
63
  readonly 1: "Persistent subagent sessions are now the default and the experimental opt-in was removed";
64
64
  readonly 2: "Persistent subagent sessions are now the default and the experimental opt-in was removed";
@@ -66,16 +66,16 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
66
66
  };
67
67
  };
68
68
  readonly connection: {
69
- readonly current: 14;
70
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14];
69
+ readonly current: 15;
70
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15];
71
71
  readonly dropped: {
72
72
  readonly 9: "Dynamic connection resolvers no longer receive conversation or channel continuation data";
73
73
  readonly 10: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
74
74
  };
75
75
  };
76
76
  readonly hook: {
77
- readonly current: 20;
78
- readonly supported: readonly [10, 11, 12, 13, 14, 15, 17, 18, 19, 20];
77
+ readonly current: 22;
78
+ readonly supported: readonly [10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22];
79
79
  readonly dropped: {
80
80
  readonly 1: "Model identity moved from session.started runtime metadata to step.started call attribution.";
81
81
  readonly 2: "Model identity moved from session.started runtime metadata to step.started call attribution.";
@@ -95,8 +95,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
95
95
  readonly dropped: {};
96
96
  };
97
97
  readonly dynamicSkill: {
98
- readonly current: 16;
99
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16];
98
+ readonly current: 17;
99
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17];
100
100
  readonly dropped: {
101
101
  readonly 13: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
102
102
  };
@@ -107,8 +107,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
107
107
  readonly dropped: {};
108
108
  };
109
109
  readonly dynamicInstructions: {
110
- readonly current: 17;
111
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17];
110
+ readonly current: 18;
111
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18];
112
112
  readonly dropped: {
113
113
  readonly 14: "Message and reasoning append events now expose deltas instead of cumulative snapshots.";
114
114
  };