eve 0.47.7 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/src/channel/delivery-metadata.d.ts +1 -0
  3. package/dist/src/channel/delivery-metadata.js +1 -1
  4. package/dist/src/channel/types.d.ts +10 -8
  5. package/dist/src/chunks/{use-eve-agent-Dg5S44kG.js → use-eve-agent-BZnOzAVd.js} +25 -5
  6. package/dist/src/chunks/{use-eve-agent-B5zw1dwj.js → use-eve-agent-Bgp6INfi.js} +25 -5
  7. package/dist/src/cli/commands/init.js +1 -1
  8. package/dist/src/cli/commands/integration-connect.d.ts +2 -1
  9. package/dist/src/cli/commands/integration-connect.js +1 -1
  10. package/dist/src/cli/commands/register-integration-commands.d.ts +3 -1
  11. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  12. package/dist/src/cli/dev/command-options.d.ts +2 -0
  13. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  14. package/dist/src/cli/dev/tui/blocks.js +1 -1
  15. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  16. package/dist/src/cli/dev/tui/registry-result-message.d.ts +17 -0
  17. package/dist/src/cli/dev/tui/registry-result-message.js +3 -0
  18. package/dist/src/cli/dev/tui/runner.d.ts +11 -4
  19. package/dist/src/cli/dev/tui/runner.js +1 -1
  20. package/dist/src/cli/dev/tui/setup-commands.d.ts +9 -3
  21. package/dist/src/cli/dev/tui/setup-commands.js +2 -3
  22. package/dist/src/cli/dev/tui/setup-flow.d.ts +15 -5
  23. package/dist/src/cli/dev/tui/setup-panel.d.ts +6 -1
  24. package/dist/src/cli/dev/tui/setup-panel.js +4 -4
  25. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +1 -0
  26. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -1
  27. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  28. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  29. package/dist/src/cli/dev/tui/tui.d.ts +3 -4
  30. package/dist/src/cli/dev/tui/tui.js +1 -1
  31. package/dist/src/cli/run.js +2 -2
  32. package/dist/src/client/agent-info-schema.d.ts +1 -0
  33. package/dist/src/client/agent-info-schema.js +1 -1
  34. package/dist/src/client/open-stream.d.ts +1 -0
  35. package/dist/src/client/open-stream.js +1 -1
  36. package/dist/src/client/session.js +1 -1
  37. package/dist/src/compiled/.vendor-stamp.json +2 -1
  38. package/dist/src/compiled/@opentelemetry/api/index.d.ts +6 -0
  39. package/dist/src/compiled/@workflow/builders/LICENSE.md +201 -0
  40. package/dist/src/compiled/@workflow/builders/index.d.ts +62 -0
  41. package/dist/src/compiled/@workflow/builders/index.js +1 -0
  42. package/dist/src/compiler/extension-compatibility.d.ts +2 -2
  43. package/dist/src/compiler/extension-compatibility.js +1 -1
  44. package/dist/src/compiler/manifest.d.ts +2 -2
  45. package/dist/src/compiler/manifest.js +1 -1
  46. package/dist/src/compiler/normalize-tool.js +1 -1
  47. package/dist/src/context/keys.d.ts +3 -8
  48. package/dist/src/eve-channel/index.js +1 -1
  49. package/dist/src/eve-channel/types.d.ts +7 -7
  50. package/dist/src/execution/accepted-delivery-deployment.d.ts +7 -0
  51. package/dist/src/execution/accepted-delivery-deployment.js +1 -0
  52. package/dist/src/execution/cancel-descendant-turns-step.d.ts +4 -1
  53. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  54. package/dist/src/execution/delegation-tool.js +1 -1
  55. package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +7 -2
  56. package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
  57. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  58. package/dist/src/execution/dispatch-turn-step.js +1 -1
  59. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.d.ts +2 -0
  60. package/dist/src/execution/durable-session-migrations/turn-workflow-v1-to-v2.js +1 -0
  61. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +25 -3
  62. package/dist/src/execution/durable-session-migrations/turn-workflow.js +1 -1
  63. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  64. package/dist/src/execution/finalize-terminal-session.d.ts +17 -0
  65. package/dist/src/execution/finalize-terminal-session.js +1 -0
  66. package/dist/src/execution/inline-turn.d.ts +29 -0
  67. package/dist/src/execution/inline-turn.js +1 -0
  68. package/dist/src/execution/next-driver-action.d.ts +4 -0
  69. package/dist/src/execution/node-step.js +1 -1
  70. package/dist/src/execution/parked-delivery-wait.js +1 -1
  71. package/dist/src/execution/pending-turn-state.d.ts +1 -0
  72. package/dist/src/execution/pending-turn-state.js +1 -1
  73. package/dist/src/execution/proxied-deliver-step.js +1 -1
  74. package/dist/src/execution/remote-agent-dispatch.d.ts +2 -0
  75. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  76. package/dist/src/execution/session-command-token.d.ts +2 -0
  77. package/dist/src/execution/session-command-token.js +1 -1
  78. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  79. package/dist/src/execution/stable-workflow-names.d.ts +12 -0
  80. package/dist/src/execution/stable-workflow-names.js +1 -0
  81. package/dist/src/execution/subagent-event-proxy-step.d.ts +3 -0
  82. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  83. package/dist/src/execution/subagent-hitl-proxy.d.ts +2 -1
  84. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  85. package/dist/src/execution/subagent-start-remote.d.ts +2 -0
  86. package/dist/src/execution/subagent-start-remote.js +1 -1
  87. package/dist/src/execution/tasks/child/steps.d.ts +2 -0
  88. package/dist/src/execution/tasks/child/steps.js +1 -1
  89. package/dist/src/execution/tasks/child/workflow.js +1 -1
  90. package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
  91. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  92. package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
  93. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  94. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  95. package/dist/src/execution/terminal-session-event.d.ts +13 -0
  96. package/dist/src/execution/terminal-session-event.js +1 -0
  97. package/dist/src/execution/terminal-session-failure-step.d.ts +1 -0
  98. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  99. package/dist/src/execution/tool-run/answer.d.ts +3 -0
  100. package/dist/src/execution/tool-run/answer.js +1 -0
  101. package/dist/src/execution/tool-run/background.d.ts +14 -0
  102. package/dist/src/execution/tool-run/background.js +1 -0
  103. package/dist/src/execution/tool-run/cancel.d.ts +7 -0
  104. package/dist/src/execution/tool-run/cancel.js +1 -0
  105. package/dist/src/execution/tool-run/dispatch.d.ts +24 -0
  106. package/dist/src/execution/tool-run/dispatch.js +1 -0
  107. package/dist/src/execution/tool-run/emit-run-report-step.d.ts +7 -0
  108. package/dist/src/execution/tool-run/emit-run-report-step.js +1 -0
  109. package/dist/src/execution/tool-run/messages.d.ts +70 -0
  110. package/dist/src/execution/tool-run/messages.js +1 -0
  111. package/dist/src/execution/tool-run/owner-channels.d.ts +29 -0
  112. package/dist/src/execution/tool-run/owner-channels.js +1 -0
  113. package/dist/src/execution/tool-run/owner-inbox.d.ts +11 -0
  114. package/dist/src/execution/tool-run/owner-inbox.js +1 -0
  115. package/dist/src/execution/tool-run/owner.d.ts +13 -0
  116. package/dist/src/execution/tool-run/owner.js +1 -0
  117. package/dist/src/execution/tool-run/resume-hook-step.d.ts +4 -0
  118. package/dist/src/execution/tool-run/resume-hook-step.js +1 -0
  119. package/dist/src/execution/tool-run/run-control.d.ts +18 -0
  120. package/dist/src/execution/tool-run/run-control.js +1 -0
  121. package/dist/src/execution/tool-run/start.d.ts +11 -0
  122. package/dist/src/execution/tool-run/start.js +1 -0
  123. package/dist/src/execution/tool-run/types.d.ts +21 -0
  124. package/dist/src/execution/tool-run/types.js +1 -0
  125. package/dist/src/execution/tool-run/workflow.d.ts +9 -0
  126. package/dist/src/execution/tool-run/workflow.js +1 -0
  127. package/dist/src/execution/tools/subagent/local.js +1 -1
  128. package/dist/src/execution/turn-cancellation-control.d.ts +2 -0
  129. package/dist/src/execution/turn-cancellation-control.js +1 -1
  130. package/dist/src/execution/turn-control-receiver.js +1 -1
  131. package/dist/src/execution/turn-dispatch.d.ts +4 -2
  132. package/dist/src/execution/turn-dispatch.js +1 -1
  133. package/dist/src/execution/turn-execution-cursor.js +1 -1
  134. package/dist/src/execution/turn-workflow.js +1 -1
  135. package/dist/src/execution/wire/session-inbox-contract.d.ts +2 -2
  136. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  137. package/dist/src/execution/wire/session-inbox-encoder.d.ts +6 -2
  138. package/dist/src/execution/wire/session-inbox-encoder.js +1 -1
  139. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  140. package/dist/src/execution/wire/session-inbox-wire.js +1 -1
  141. package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
  142. package/dist/src/execution/wire/session-inbox-wire.v2-migration.d.ts +0 -2
  143. package/dist/src/execution/wire/session-inbox-wire.v2-migration.js +1 -1
  144. package/dist/src/execution/wire/session-inbox-wire.v2.migration.d.ts +3 -0
  145. package/dist/src/execution/wire/session-inbox-wire.v2.migration.js +1 -0
  146. package/dist/src/execution/wire/session-inbox-wire.v3.d.ts +480 -0
  147. package/dist/src/execution/wire/session-inbox-wire.v3.js +1 -0
  148. package/dist/src/execution/wire/session-inbox-wire.v3.migration.d.ts +3 -0
  149. package/dist/src/execution/wire/session-inbox-wire.v3.migration.js +1 -0
  150. package/dist/src/execution/workflow-entry-finalization.js +1 -1
  151. package/dist/src/execution/workflow-entry.js +1 -1
  152. package/dist/src/execution/workflow-registry.d.ts +5 -0
  153. package/dist/src/execution/workflow-registry.js +1 -0
  154. package/dist/src/execution/workflow-runtime.d.ts +9 -11
  155. package/dist/src/execution/workflow-runtime.js +1 -1
  156. package/dist/src/execution/workflow-steps.js +1 -1
  157. package/dist/src/execution/workflow-webhook-route.d.ts +4 -0
  158. package/dist/src/execution/workflow-webhook-route.js +1 -0
  159. package/dist/src/harness/attachment-staging.js +1 -1
  160. package/dist/src/harness/emission.js +1 -1
  161. package/dist/src/harness/proxy-input-requests.d.ts +10 -0
  162. package/dist/src/harness/proxy-input-requests.js +1 -1
  163. package/dist/src/harness/runtime-actions.d.ts +2 -0
  164. package/dist/src/harness/runtime-actions.js +1 -1
  165. package/dist/src/harness/session-limit-enforcement.js +1 -1
  166. package/dist/src/harness/tool-loop.js +2 -2
  167. package/dist/src/harness/tool-runs.d.ts +21 -0
  168. package/dist/src/harness/tool-runs.js +1 -0
  169. package/dist/src/harness/tools.js +1 -1
  170. package/dist/src/instrumentation/content-policy.d.ts +3 -1
  171. package/dist/src/instrumentation/content-policy.js +1 -1
  172. package/dist/src/instrumentation/runtime.d.ts +2 -2
  173. package/dist/src/instrumentation/runtime.js +1 -1
  174. package/dist/src/internal/application/package.js +1 -1
  175. package/dist/src/internal/attachments/errors.d.ts +3 -0
  176. package/dist/src/internal/authored-module-loader.d.ts +7 -1
  177. package/dist/src/internal/authored-module-loader.js +3 -3
  178. package/dist/src/internal/authored-package-boundary.js +1 -1
  179. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  180. package/dist/src/internal/authored-runtime-modules.js +1 -1
  181. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  182. package/dist/src/internal/nitro/development-generation.js +1 -1
  183. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  184. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  185. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  186. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  187. package/dist/src/internal/workflow-bundle/authored-workflow-directives.d.ts +17 -0
  188. package/dist/src/internal/workflow-bundle/authored-workflow-directives.js +1 -0
  189. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +19 -0
  190. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -0
  191. package/dist/src/internal/workflow-bundle/builder-support.d.ts +17 -2
  192. package/dist/src/internal/workflow-bundle/builder-support.js +4 -3
  193. package/dist/src/internal/workflow-bundle/builder.d.ts +2 -2
  194. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  195. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.d.ts +2 -0
  196. package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.js +1 -1
  197. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +3 -0
  198. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  199. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  200. package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +6 -2
  201. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  202. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +3 -0
  203. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  204. package/dist/src/internal/workflow-bundle/workflow-directive-ast.d.ts +7 -0
  205. package/dist/src/internal/workflow-bundle/workflow-directive-ast.js +1 -0
  206. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +15 -1
  207. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -4
  208. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  209. package/dist/src/protocol/baggage.d.ts +6 -0
  210. package/dist/src/protocol/baggage.js +1 -0
  211. package/dist/src/public/channels/slack/attachments.js +1 -1
  212. package/dist/src/public/channels/teams/attachments.d.ts +2 -2
  213. package/dist/src/public/channels/teams/attachments.js +1 -1
  214. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  215. package/dist/src/public/channels/telegram/attachments.js +1 -1
  216. package/dist/src/public/definitions/remote-agent.d.ts +6 -3
  217. package/dist/src/public/workflow/index.d.ts +3 -0
  218. package/dist/src/public/workflow/index.js +1 -0
  219. package/dist/src/public/workflow-modules.d.js +1 -0
  220. package/dist/src/public/workflow-modules.d.ts +11 -0
  221. package/dist/src/runtime/actions/keys.js +1 -1
  222. package/dist/src/runtime/tools/registry.js +1 -1
  223. package/dist/src/setup/connection-connector.d.ts +4 -2
  224. package/dist/src/setup/connection-connector.js +2 -2
  225. package/dist/src/setup/flows/login.js +1 -1
  226. package/dist/src/setup/flows/model.js +1 -1
  227. package/dist/src/setup/flows/provider.d.ts +5 -0
  228. package/dist/src/setup/flows/provider.js +4 -4
  229. package/dist/src/setup/flows/registry-session.d.ts +24 -7
  230. package/dist/src/setup/flows/registry-session.js +1 -1
  231. package/dist/src/setup/flows/registry.d.ts +35 -29
  232. package/dist/src/setup/flows/registry.js +2 -1
  233. package/dist/src/setup/integrations/web/setup.d.ts +0 -2
  234. package/dist/src/setup/integrations/web/setup.js +1 -1
  235. package/dist/src/setup/prompter.d.ts +24 -4
  236. package/dist/src/setup/prompter.js +1 -1
  237. package/dist/src/setup/scaffold/create/project.js +2 -2
  238. package/dist/src/setup/vercel-project.js +0 -0
  239. package/dist/src/shared/dispatch-action.d.ts +6 -0
  240. package/dist/src/shared/forwarded-trace-policy.d.ts +28 -0
  241. package/dist/src/shared/forwarded-trace-policy.js +1 -0
  242. package/dist/src/shared/instrumentation-decision.d.ts +3 -0
  243. package/dist/src/shared/instrumentation-decision.js +1 -1
  244. package/dist/src/svelte/index.js +1 -1
  245. package/dist/src/svelte/use-eve-agent.js +1 -1
  246. package/dist/src/tools/behavior.d.ts +6 -0
  247. package/dist/src/tools/definition.d.ts +39 -3
  248. package/dist/src/tracing/agent-otel-provider.js +2 -2
  249. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  250. package/dist/src/tracing/agent-trace-context-store.d.ts +1 -1
  251. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  252. package/dist/src/tracing/otel-declaration.d.ts +5 -3
  253. package/dist/src/tracing/otel-registration.d.ts +1 -1
  254. package/dist/src/tracing/otel-registration.js +1 -1
  255. package/dist/src/vue/index.js +1 -1
  256. package/dist/src/vue/use-eve-agent.js +1 -1
  257. package/docs/channels/custom.mdx +2 -0
  258. package/docs/channels/eve.mdx +5 -1
  259. package/docs/channels/teams.mdx +6 -1
  260. package/docs/concepts/sessions-runs-and-streaming.md +4 -2
  261. package/docs/guides/auth-and-route-protection.md +5 -1
  262. package/docs/guides/client/messages.mdx +6 -0
  263. package/docs/guides/dev-tui.md +30 -18
  264. package/docs/guides/remote-agents.md +25 -0
  265. package/docs/reference/cli.md +2 -2
  266. package/docs/tools/meta.json +1 -1
  267. package/docs/tools/overview.mdx +7 -0
  268. package/docs/tools/workflows.mdx +288 -0
  269. package/package.json +12 -1
  270. package/dist/src/internal/authored-directive-prologue.d.ts +0 -4
  271. package/dist/src/internal/authored-directive-prologue.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;#_;#v;#y;#b;#x;#S;#C;#w=!1;#T=new AbortController;#E=!1;#D=[];#O;#k;#A;#j;#M;#N=new Map;#P;#F=[];#I;#L=!1;#R;#z=new Map;#B=new Set;#V;#H;#U;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#U=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),t.appRoot!==void 0&&(n.onToolCompleted=async(e,t)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#ie(n)}),this.#R=new SubagentPump(n),this.#r=t.name??`eve`,this.#j=t.startup?.headerTip??pickAgentHeaderTip(),this.#v=t.withExclusiveTerminal,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.startup!==void 0&&(this.#h=t.startup),t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#k=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#A=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#g=t.promptCommandHandler),this.#_=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#y=createRemoteConnectionController({client:this.#t,credentials:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#b=t.bootDetections??BOOT_DETECTIONS,this.#x=t.getVercelAuthStatus??getVercelAuthStatus,this.#S=t.inspectApplication??inspectApplication,t.onBootProgress!==void 0&&(this.#C=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.serverUrl}))}async#W(){if(this.#f===void 0)return this.#K(),await this.#oe(void 0),this.#h?.finish()??this.#m;let e;if(this.#y!==void 0){let t=await this.#y.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.#C);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}let t=this.#h?.finish()??this.#m;this.#K();let n=this.#G(e);return await this.#oe(n),t}#G(e){let t=this.#p===void 0?e:normalizeLocalModelEndpoint(e,process.env);this.#M=t;let n=this.#f;if(n===void 0)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#j),this.#n.renderAgentHeader?.(r),t}#K(){let e=this.#C;this.#C=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#U?.signal.aborted===!0?onStop():this.#U?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#q()}finally{this.#U?.signal.removeEventListener(`abort`,onStop),this.#w=!0,this.#T.abort(),this.#R.abortAll(),this.#H?.(),this.#H=void 0,this.#n.shutdown?.(),this.#k?.dispose(),this.#A?.dispose(),this.#y?.dispose()}}async#q(){let e=this.#r,r,i,a=!1,o=!1,s=!1,l=await this.#W();this.#y?.current().connection.state===`auth-required`&&await this.#he({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#ue(),this.#k?.refreshIdentity(),this.#A?.refresh();let u=this.#m===void 0?void 0:parsePromptCommand(this.#m);for(u?.type===`extension`&&u.name===`model`&&u.argument===``&&this.#p!==void 0&&this.#g!==void 0&&this.#n.setupFlow!==void 0&&(l=void 0,await this.#ge(e));;){if(this.#U?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;let u=this.#F[0];if(u!==void 0&&i===void 0&&this.#P===void 0){this.#F.shift(),this.#I=u;try{await this.#ae(u)}finally{this.#I=void 0}o=!1,s=!1,r=void 0;continue}if(!s){if(r==null){if(!this.#n.readPrompt){if(a)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let t={title:e};l!==void 0&&(t.initialDraft=l,l=void 0);try{this.#L=!0,r=await this.#Q(t)}catch(e){if(isInterruptedError(e)){if(this.#P===void 0&&this.#F.length===0)return;s=!0,r=``}else throw e}finally{this.#L=!1}if(this.#F.length>0&&this.#P===void 0){r=void 0;continue}if(r==null&&this.#P===void 0)return}let u=this.#P===void 0?parsePromptCommand(r):null;if(u?.type===`exit`){this.#U?.requestStop();return}if(u?.type===`cancel`){if(this.#e===void 0){this.#de(`No active turn to cancel.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.cancel();if(this.#de(e.status===`accepted`?`Turn cancellation requested.`:`No active turn to cancel.`),e.status===`no_active_turn`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't cancel the turn: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`reset`){if(!await this.#X()){i=void 0,s=!1,r=void 0;continue}i=void 0,s=!1,r=void 0;continue}if(u?.type===`compact`){if(this.#e===void 0){this.#de(`No active session to compact.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.compact();if(this.#de(e.status===`accepted`?`Compaction requested.`:`No active session to compact.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't compact the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`clear`){if(this.#e===void 0){this.#de(`No active session to clear.`),i=void 0,o=!1,s=!1,r=void 0;continue}try{let e=await this.#e.clear();if(this.#de(e.status===`accepted`?`Context clear requested.`:`No active session to clear.`),e.status===`no_active_session`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#de(`Couldn't clear the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`help`){this.#de(formatPromptCommandHelp(this.#_)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`info`){await this.#ye(),i=void 0,s=!1,r=void 0;continue}if(u?.type===`loglevel`){this.#de(this.#be(u.argument)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`traces`){await this.#ve(u.argument),i=void 0,s=!1,r=void 0;continue}if(u?.type===`extension`){try{await this.#he(u,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,s=!1;continue}a=!0}let d=this.#P;this.#P=void 0;let f=d??(o?this.#ne():await(async()=>(this.#Y(),await this.#ee({prompt:s?void 0:r,inputResponses:i})))()),p=this.#e?.state.sessionId;p!==void 0&&this.#n.setSessionId?.(p);let m=r,h=!1;try{for(;;){await this.#n.renderStream(f,{title:e,submittedPrompt:m,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=f.turnState?.pendingApprovals??[],n=f.turnState?.pendingQuestions??[];if(t.length>0||n.length>0){let a=[];if(t.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let n of t){let t=await this.#n.readToolApproval(n,{title:e});a.push({requestId:n.approvalId,optionId:t.approved?`approve`:`cancel`}),this.#N.delete(n.approvalId)}}if(n.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 n){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),a.push(i),this.#N.delete(t.requestId)}}if(a.length===0)break;s=!0,i=a,r=void 0,h=!0;break}if(this.#Te(f)){f=this.#ne(),m=void 0;continue}if(f.turnState&&f.turnState.boundaryEvent===void 0&&!f.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(h)continue;o=!1,s=!1,i=void 0,r=void 0;let g=f.turnState?.boundaryEvent;this.#V!==this.#e&&(g===`session.waiting`||g===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#Y(f.turnState?.aborted===!0)}}#J(){this.#R.abortAll(),this.#N.clear(),this.#z.clear(),this.#B.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#e=void 0,this.#d?.clear()}#Y(e=!1){let t=this.#V;t!==void 0&&(this.#V=void 0,this.#e===t&&(this.#J(),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#X(){if(this.#e===void 0)return this.#J(),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.#J(),this.#n.reset?.(),!0}async#Z(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.#Ce()});let e=this.#M?.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.#Se();e!==void 0&&this.#G(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#Q(e){let t=this.#Z(e);if(this.#n.renderIdleStream===void 0||this.#e?.state.sessionId===void 0)return await t;let n=new AbortController,r=this.#$(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#$(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.#re(a,()=>{},n);if(await this.#n.renderIdleStream(o,{...t,continueSession:!0}),this.#Te(o),(o.turnState?.pendingApprovals.length??0)>0||(o.turnState?.pendingQuestions.length??0)>0){this.#P={events:(async function*(){})(),turnState:o.turnState},this.#n.suspendPromptForInput?.();return}if(!i)return}}finally{await r.return?.()}}async#ee(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.#Ce()}),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.#y?.reportFailure(e),this.#V=i,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#re(r,()=>t.abort(),this.#e)}async#te(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}}}#ne(){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.#re(t.stream({signal:e.signal}),()=>e.abort(),t)}#re(e,t,n){let r=createTurnState();return{abort:()=>{r.aborted=!0,this.#V=n,t()},cancel:()=>{this.#te(r,n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#N,turnState:r,onSubagentCalled:e=>this.#R.begin(e),onSubagentBackgrounded:e=>this.#R.background(e),onSubagentCompleted:e=>this.#R.settle(e),onTurnCancelled:e=>this.#R.settleCancelledTurn(e),onConnectionAuthRequired:e=>this.#we(e),onConnectionAuthCompleted:e=>this.#Ee(e),onRegistryHandoff:this.#p===void 0?void 0:async e=>this.#ie(e),onTerminalFailure:()=>{this.#V=n},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:r}}#ie(e){this.#I===e||this.#F.includes(e)||(this.#F.push(e),this.#L&&this.#n.suspendPromptForInput?.())}async#ae(e){await this.#he({type:`extension`,name:`add`,argument:e},`Add to your agent`,{trigger:`command`})}async#oe(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#D=await detectSetupIssues(t,this.#b),this.#n.renderSetupWarning!==void 0&&(this.#se(),this.#ce())}#se(){let e=orderedSetupIssues(this.#D,this.#O);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#ce(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#x(e,{signal:this.#T.signal})}catch{return}this.#w||this.#E||(this.#O=authIssueForStatus(t),this.#se())}async#le(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.#D=await detectSetupIssues(n,this.#b);let e=await this.#x(t,{signal:this.#T.signal});this.#O=authIssueForStatus(e)}catch{return}this.#w||this.#se()}#ue(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#H===void 0&&(this.#H=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#de(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#fe(e,t){let n=this.#g;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r=this.#M?.agent.model.endpoint,i={renderer:this.#n,title:t.title,initialModelStep:t.initialModelStep,chatGptAccountLabel:r?.kind===`chatgpt`&&r.state===`ready`?r.accountLabel:void 0,remoteConnection:this.#y,withExclusiveTerminal:this.#v},a=this.#A?.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)}#pe(e,t){if(t!==`startup`)return;let n=this.#y?.current().connection.state,r=n===`auth-failed`||n===`unavailable`?`failed`:void 0,i=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${i}`,r)}async#me(e){if(e?.kind===`model-access-changed`){this.#k?.applyEffect({kind:`refresh-identity`}),this.#E=!0,await this.#xe();return}e!==void 0&&(this.#k?.applyEffect(e),this.#E=!0,this.#le(this.#M))}async#he(e,t,n){let r=await this.#fe(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#pe(e,n.trigger),this.#de(r?.message,r?.tone),await this.#me(r?.effect),this.#_e()}async#ge(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#x(t,{signal:this.#T.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#he({type:`extension`,name:`vc:install`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`)){this.#n.setupFlow?.end();return}if(n===`logged-out`&&(await this.#he({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`||n===`logged-out`)){this.#n.setupFlow?.end();return}await this.#he({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`}),await this.#he({type:`extension`,name:`add`,argument:``},e,{trigger:`startup`})}#_e(){let e=this.#y?.current().connection;e?.state!==`ready`||e.info===this.#M||(this.#M=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}async#ve(e){if(this.#p===void 0||this.#n.traceViewer===void 0){this.#de(`/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#ye(){let e=this.#p;if(e===void 0){this.#de(`/info is only available in local dev sessions.`);return}try{this.#de(renderApplicationInfo(await this.#S(e)))}catch(e){this.#de(`Couldn't inspect the application: ${toErrorMessage(e)}`,`error`)}}#be(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#xe(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e),await this.#d?.refreshAfterSourceChange({});let t=this.#G(await this.#Se());this.#le(t)}async#Se(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#Ce(){let e=this.#M,t=await this.#Se();t!==void 0&&this.#G(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#we(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.#z.set(e.data.name,t),this.#De(t)}#Te(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#z.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#B.add(e.name),this.#De(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#B.size),this.#B.size>0}#Ee(e){let t=this.#z.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.#z.set(e.data.name,t),this.#B.delete(e.data.name),this.#De(t),this.#n.setConnectionAuthPendingCount?.(this.#B.size)}#De(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),i=t.data.messageSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:a};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.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),i=t.data.reasoningSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:a};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))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}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);break;default:break}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 c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}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;#_=!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(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#G=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),t.appRoot!==void 0&&(n.onToolCompleted=async(e,t)=>{let n=registryHandoffAddress(e,t);n!==void 0&&this.#oe(n)}),this.#B=new SubagentPump(n),this.#r=t.name??`eve`,this.#N=t.startup?.headerTip??pickAgentHeaderTip(),this.#b=t.withExclusiveTerminal,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.startup!==void 0&&(this.#h=t.startup),this.#g=t.onboard===!0,t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#j=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#M=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#v=t.promptCommandHandler),this.#y=t.availablePromptCommands??PROMPT_COMMANDS,t.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:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#S=t.bootDetections??BOOT_DETECTIONS,this.#C=t.getVercelAuthStatus??getVercelAuthStatus,this.#w=t.inspectApplication??inspectApplication,t.onBootProgress!==void 0&&(this.#T=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.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,r,i,a=!1,o=!1,s=!1,l=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){l=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 u=this.#L[0];if(u!==void 0&&i===void 0&&this.#I===void 0){this.#L.shift(),this.#R=u;try{await this.#se(u)}finally{this.#R=void 0}o=!1,s=!1,r=void 0;continue}if(!s){if(r==null){if(!this.#n.readPrompt){if(a)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}let t={title:e};l!==void 0&&(t.initialDraft=l,l=void 0);try{this.#z=!0,r=await this.#ee(t)}catch(e){if(isInterruptedError(e)){if(this.#I===void 0&&this.#L.length===0)return;s=!0,r=``}else throw e}finally{this.#z=!1}if(this.#L.length>0&&this.#I===void 0){r=void 0;continue}if(r==null&&this.#I===void 0)return}let u=this.#I===void 0?parsePromptCommand(r):null;if(u?.type===`exit`){this.#G?.requestStop();return}if(u?.type===`cancel`){if(this.#e===void 0){this.#pe(`No active turn to cancel.`),i=void 0,o=!1,s=!1,r=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`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#pe(`Couldn't cancel the turn: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`reset`){if(!await this.#Q()){i=void 0,s=!1,r=void 0;continue}i=void 0,s=!1,r=void 0;continue}if(u?.type===`compact`){if(this.#e===void 0){this.#pe(`No active session to compact.`),i=void 0,o=!1,s=!1,r=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`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#pe(`Couldn't compact the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`clear`){if(this.#e===void 0){this.#pe(`No active session to clear.`),i=void 0,o=!1,s=!1,r=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`){i=void 0,o=!1,s=!1,r=void 0;continue}}catch(e){this.#pe(`Couldn't clear the session: ${toErrorMessage(e)}`),i=void 0,o=!1,s=!1,r=void 0;continue}i=void 0,o=!0,s=!1,r=void 0}if(u?.type===`help`){this.#pe(formatPromptCommandHelp(this.#y)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`info`){await this.#Se(),i=void 0,s=!1,r=void 0;continue}if(u?.type===`loglevel`){this.#pe(this.#Ce(u.argument)),i=void 0,s=!1,r=void 0;continue}if(u?.type===`traces`){await this.#xe(u.argument),i=void 0,s=!1,r=void 0;continue}if(u?.type===`extension`){try{await this.#_e(u,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,s=!1;continue}a=!0}let d=this.#I;this.#I=void 0;let f=d??(o?this.#ie():await(async()=>(this.#Z(),await this.#ne({prompt:s?void 0:r,inputResponses:i})))()),p=this.#e?.state.sessionId;p!==void 0&&this.#n.setSessionId?.(p);let m=r,h=!1;try{for(;;){await this.#n.renderStream(f,{title:e,submittedPrompt:m,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=f.turnState?.pendingApprovals??[],n=f.turnState?.pendingQuestions??[];if(t.length>0||n.length>0){let a=[];if(t.length>0){if(!this.#n.readToolApproval)throw Error(`Tool approval was requested, but the renderer does not support tool approval input.`);for(let n of t){let t=await this.#n.readToolApproval(n,{title:e});a.push({requestId:n.approvalId,optionId:t.approved?`approve`:`cancel`}),this.#F.delete(n.approvalId)}}if(n.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 n){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),a.push(i),this.#F.delete(t.requestId)}}if(a.length===0)break;s=!0,i=a,r=void 0,h=!0;break}if(this.#Oe(f)){f=this.#ie(),m=void 0;continue}if(f.turnState&&f.turnState.boundaryEvent===void 0&&!f.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(h)continue;o=!1,s=!1,i=void 0,r=void 0;let g=f.turnState?.boundaryEvent;this.#U!==this.#e&&(g===`session.waiting`||g===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#Z(f.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;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),i=t.data.messageSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`assistant-delta`,id:partGenerationId(n,r.generation),delta:a};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.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),i=t.data.reasoningSoFar;if(r.completed){if(_<=r.completedEpoch)break;r.generation+=1,r.text=``,r.completed=!1}if(!i.startsWith(r.text)||i.length<=r.text.length)break;let a=i.slice(r.text.length);r.text=i,yield{type:`reasoning-delta`,id:partGenerationId(n,r.generation),delta:a};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))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}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);break;default:break}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 c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}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};
@@ -2,7 +2,7 @@ import { runDeployFlow } from "#setup/flows/deploy.js";
2
2
  import { runInstallVercelCliFlow } from "#setup/flows/install-vercel-cli.js";
3
3
  import { runLoginFlow } from "#setup/flows/login.js";
4
4
  import { runModelFlow } from "#setup/flows/model.js";
5
- import { runRegistryFlow } from "#setup/flows/registry.js";
5
+ import { runRegistryFlow, type RegistryPlannerContext } from "#setup/flows/registry.js";
6
6
  import type { Prompter } from "#setup/prompter.js";
7
7
  import { type TuiPrompterRenderer } from "./tui-prompter.js";
8
8
  import type { PromptCommandExtensionName } from "./prompt-commands.js";
@@ -37,7 +37,7 @@ export declare const SETUP_FLOW_CONFIG: {
37
37
  };
38
38
  };
39
39
  /** The prompter surface plus the working-state interrupt trap a command races against. */
40
- export type TuiSetupCommandRenderer = TuiPrompterRenderer & Pick<SetupFlowRenderer, "readProviderPicker" | "readModelEditor" | "waitForInterrupt">;
40
+ export type TuiSetupCommandRenderer = TuiPrompterRenderer & Pick<SetupFlowRenderer, "readProviderPicker" | "readModelEditor" | "setNavigation" | "waitForInterrupt">;
41
41
  export interface TuiSetupCommandInput {
42
42
  command: TuiSetupCommand;
43
43
  /** The local project the in-process dev server is running. */
@@ -46,8 +46,10 @@ export interface TuiSetupCommandInput {
46
46
  renderer: TuiSetupCommandRenderer;
47
47
  /** Initial model-flow step authorized by the runner's boot evidence. */
48
48
  initialModelStep?: "provider";
49
- /** Registry address from `/add <item>`, opening that item instead of the browser. */
49
+ /** Registry address supplied by `/add <item>`, confirmed and installed directly. */
50
50
  initialRegistryAddress?: string;
51
+ /** Presentation and navigation supplied by an enclosing setup journey. */
52
+ registryPlannerContext?: RegistryPlannerContext;
51
53
  /** Live ChatGPT identity shown only inside model configuration UI. */
52
54
  chatGptAccountLabel?: string;
53
55
  /** Suspends development runtime artifacts while registry installation and setup mutate them. */
@@ -67,6 +69,10 @@ export interface TuiSetupFlows {
67
69
  }
68
70
  export interface TuiSetupCommandResult {
69
71
  message: string;
72
+ /** The user dismissed this setup step without completing it. */
73
+ cancelled?: true;
74
+ /** Keep settled batch results instead of replacing them with an interrupt notice. */
75
+ partial?: true;
70
76
  /** Promotes an outcome to a top-level status. */
71
77
  tone?: "success" | "error";
72
78
  /** Keep warning/error lines after the bordered panel closes. */
@@ -1,3 +1,2 @@
1
- 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 joinedTitles(e){return e.length===0?``:e.length===1?e[0]:e.length===2?`${e[0]} and ${e[1]}`:`${e.slice(0,-1).join(`, `)}, and ${e.at(-1)}`}function registryResultMessage(e){let t=[`Added ${joinedTitles(e.items.map(e=>e.title))}`];for(let n of e.items){if(n.facts.length===0&&n.output.length===0)continue;t.push(``,n.title);let e=Math.max(0,...n.facts.map(e=>e.label.length));for(let r of n.facts)t.push(` ${r.label.padEnd(e)} ${r.value}`);for(let e of n.output)t.push(` ${e}`)}return t.join(`
2
- `)}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),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(t){let{command:r}=t,i=!1,a=new AbortController,o=muteableRenderer(t.renderer,()=>i,t.withExclusiveTerminal),s=(t.createPrompter??createTuiPrompter)(o),c=t.renderer.waitForInterrupt(),l=Symbol(`interrupted`),u=executeSetupCommand(t,s,o,a.signal);try{let e=await Promise.race([u,c.promise.then(()=>l)]);return e===l?(i=!0,a.abort(new WizardCancelledError),{...await u,message:`/${r} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}):e}finally{c.dispose(),t.renderer.setStatus(void 0)}}async function executeSetupCommand(e,i,u,d){let{command:f,appRoot:p}=e,m={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...e.flows};try{switch(f){case`vc:install`:return installVercelCliResultMessage(await m.runInstallVercelCliFlow({appRoot:p,prompter:i,signal:d}));case`vc:login`:return loginResultMessage(await m.runLoginFlow({appRoot:p,prompter:i,signal:d}));case`model`:{let pickProvider=e=>u.readProviderPicker(e),t={appRoot:p,prompter:i,signal:d,chatGptAccountLabel:e.chatGptAccountLabel,deps:{pickModelSettings:e=>u.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider})}};e.initialModelStep!==void 0&&(t.initialStep=e.initialModelStep),t.withExclusiveTerminal=t=>u.withInheritedStdio(()=>e.withExclusiveTerminal?.(t)??t());let n=await m.runModelFlow(t);if(n.kind===`cancelled`)return{message:n.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,preserveFlowDiagnostics:!1};let r=[];n.modelMessage!==void 0&&r.push(n.modelMessage),n.providerSelection!==void 0&&r.push(providerSelectionMessage(n.providerSelection));let a={message:r.join(`
3
- `),preserveFlowDiagnostics:!1};return n.accessChanged&&(a.effect={kind:`model-access-changed`}),a}case`add`:{let t={appRoot:p,prompter:i,signal:d};e.initialRegistryAddress!==void 0&&(t.initialAddress=e.initialRegistryAddress);let n=await m.runRegistryFlow(t);if(n.kind===`cancelled`)return{message:`/add dismissed.`,preserveFlowDiagnostics:!0};let r={message:n.addedItems.length>0?registryResultMessage(n):`No registry items added.`,preserveFlowDiagnostics:!0};return n.addedItems.length>0&&(r.tone=`success`),n.deployed===`production`&&(r.effect={kind:`deployed`}),r}case`deploy`:{let e=await m.runDeployFlow({appRoot:p,prompter:i,interactive:!0,signal:d});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){let t=await vercelCliUpgradeOutcome(e instanceof RegistryFlowFailedError?e.cause:e,f,m,{appRoot:p,prompter:i,signal:d});if(t!==void 0)return t;if(e instanceof RegistryFlowFailedError){let t=e.completed;return{message:`${registryResultMessage(t)}\n\n${e.message}`,tone:`error`,preserveFlowDiagnostics:!0}}if(e instanceof WizardCancelledError)return{message:`/${f} dismissed.`,preserveFlowDiagnostics:f!==`model`};let r=vercelActionOutcome(e,f);return r===void 0?{message:`/${f} failed: ${e instanceof Error?e.message:String(e)}`,tone:`error`,preserveFlowDiagnostics:!0}:r}}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let a;try{a=await r.prompter.select({message:`Your Vercel CLI needs an update to continue setup. 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{a=`later`}if(a===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};let o;try{o=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),preserveFlowDiagnostics:!0}}switch(o.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,o.reason),preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,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,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,i=new AbortController,o=muteableRenderer(e.renderer,()=>n,e.withExclusiveTerminal),s=(e.createPrompter??createTuiPrompter)(o),cancelActiveRegistryItem,c=executeSetupCommand(e,s,o,i.signal,async e=>{let t=new AbortController;cancelActiveRegistryItem=()=>t.abort(new WizardCancelledError);try{return await e(AbortSignal.any([i.signal,t.signal]))}finally{cancelActiveRegistryItem=void 0}}),l=c.then(e=>({kind:`outcome`,value:e}));try{for(;;){let r=e.renderer.waitForInterrupt();try{let e=await Promise.race([l,r.promise.then(e=>({kind:`interrupt`,interrupt:e}))]);if(e.kind===`outcome`)return e.value;if(t===`add`&&e.interrupt===`escape`&&cancelActiveRegistryItem!==void 0){cancelActiveRegistryItem();continue}n=!0,i.abort(new WizardCancelledError);let o=await c;return o.partial===!0?o:{...o,message:`/${t} interrupted.`,tone:`error`,preserveFlowDiagnostics:!0}}finally{r.dispose()}}}finally{e.renderer.setStatus(void 0)}}async function executeSetupCommand(r,s,u,d,f){let{command:p,appRoot:m}=r,h={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...r.flows};try{switch(p){case`vc:install`:return installVercelCliResultMessage(await h.runInstallVercelCliFlow({appRoot:m,prompter:s,signal:d}));case`vc:login`:return loginResultMessage(await h.runLoginFlow({appRoot:m,prompter:s,signal:d}));case`model`:{let pickProvider=e=>u.readProviderPicker(e),e={appRoot:m,prompter:s,signal:d,chatGptAccountLabel:r.chatGptAccountLabel,deps:{pickModelSettings:e=>u.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider,recoverHumanAction:e=>recoverVercelHumanAction(e,h,{appRoot:m,prompter:s,signal:d})})}};r.initialModelStep!==void 0&&(e.initialStep=r.initialModelStep),e.withExclusiveTerminal=e=>u.withInheritedStdio(()=>r.withExclusiveTerminal?.(e)??e());let t=await h.runModelFlow(e);if(t.kind===`cancelled`)return{message:t.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,cancelled:!0,preserveFlowDiagnostics:!1};let n=[];t.modelMessage!==void 0&&n.push(t.modelMessage),t.providerSelection!==void 0&&n.push(providerSelectionMessage(t.providerSelection));let i={message:n.join(`
2
+ `),preserveFlowDiagnostics:!1};return t.accessChanged&&(i.effect={kind:`model-access-changed`}),i}case`add`:{let i=await h.runRegistryFlow({appRoot:m,prompter:s,signal:d,initialAddress:r.initialRegistryAddress,plannerContext:r.registryPlannerContext,onItemStart:registryItemProgress(u),runItem:f});if(i.kind===`cancelled`)return{message:`/add dismissed.`,cancelled:!0,preserveFlowDiagnostics:!0};let a=i.result,o=registryResultTone(a),c=a.items.length>0||a.failures.length>0||a.outcomes!==void 0?formatRegistrySessionResult(a):`No integrations selected.`,l={message:o===`error`?`/add failed — ${c}`:c,preserveFlowDiagnostics:!0};return a.cancelled===!0?(l.partial=!0,l.tone=`error`):o!==void 0&&(l.tone=o),a.deployed===`production`&&(l.effect={kind:`deployed`}),l}case`deploy`:{let e=await h.runDeployFlow({appRoot:m,prompter:s,interactive:!0,signal:d});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(t){if(t instanceof WizardCancelledError)return{message:`/${p} dismissed.`,cancelled:!0,preserveFlowDiagnostics:p!==`model`};let n=t instanceof RegistryFlowFailedError?t.cause:t,r=await vercelCliUpgradeOutcome(n,p,h,{appRoot:m,prompter:s,signal:d});if(r!==void 0)return withRegistryResults(r,t);let i=vercelActionOutcome(n,p);return i===void 0?t instanceof RegistryFlowFailedError?{message:`${formatRegistrySessionResult(t.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:{message:`/${p} failed: ${t instanceof Error?t.message:String(t)}`,tone:`error`,preserveFlowDiagnostics:!0}:withRegistryResults(i,t)}}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(t,n){return n instanceof RegistryFlowFailedError?{...t,message:`${formatRegistrySessionResult(n.completed)}\n\n${t.message}`,partial:!0,tone:`error`,preserveFlowDiagnostics:!0}:t}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};
@@ -2,7 +2,7 @@ import type { ChannelSetupChoice, ChannelSetupChoiceOptions } from "#setup/cli/i
2
2
  import type { SearchActionOption } from "#setup/cli/select-state.js";
3
3
  import type { ModelSettingsRequest, ModelSettingsResult } from "#setup/flows/model.js";
4
4
  import type { ProviderPickerChoice, ProviderPickerRequest } from "#setup/flows/provider.js";
5
- import type { SelectMetadata, SelectNotice } from "#setup/prompter.js";
5
+ import type { PlannerNavigation, SelectMetadata, SelectNotice } from "#setup/prompter.js";
6
6
  import type { SetupPanelOption } from "./setup-panel.js";
7
7
  export type SetupEditableSelectResult = {
8
8
  kind: "selected";
@@ -26,6 +26,7 @@ interface SetupSelectRequestBase {
26
26
  metadata?: readonly SelectMetadata[];
27
27
  options: readonly SetupPanelOption[];
28
28
  notices?: readonly SelectNotice[];
29
+ navigation?: PlannerNavigation;
29
30
  }
30
31
  interface SetupSingleSelectRequest extends SetupSelectRequestBase {
31
32
  kind: "single" | "stacked" | "task-list";
@@ -48,22 +49,31 @@ interface SetupMultiSelectRequest extends SetupSelectRequestBase {
48
49
  }
49
50
  interface SetupSearchableMultiSelectRequest extends SetupSelectRequestBase {
50
51
  kind: "searchable-multi";
52
+ layout?: "stacked";
51
53
  initialValues?: readonly string[];
52
54
  placeholder?: string;
53
55
  required: boolean;
54
56
  }
55
57
  /**
56
58
  * A setup select's complete interaction grammar. The discriminant prevents
57
- * callers from combining incompatible modes such as multi-select plus a
58
- * single-select layout.
59
+ * callers from combining incompatible modes; searchable multi-select supports
60
+ * the stable stacked checklist layout but not single-select task actions.
59
61
  */
60
62
  export type SetupSelectRequest = SetupSingleSelectRequest | SetupSearchSelectRequest | SetupMultiSelectRequest | SetupSearchableMultiSelectRequest;
63
+ export type SetupSelectResult = readonly string[] | {
64
+ kind: "navigate";
65
+ direction: "back" | "forward";
66
+ values: readonly string[];
67
+ } | undefined;
68
+ export type SetupFlowInterrupt = "escape" | "ctrl-c";
61
69
  export interface SetupFlowRenderer {
62
70
  begin(title: string, indicator?: SetupFlowIndicator): void;
71
+ /** Sets progress owned by an enclosing setup journey, independent of its active question. */
72
+ setNavigation?(navigation: PlannerNavigation | undefined): void;
63
73
  end(options?: {
64
74
  preserveDiagnostics?: boolean;
65
75
  }): void;
66
- readSelect(options: SetupSelectRequest): Promise<readonly string[] | undefined>;
76
+ readSelect(options: SetupSelectRequest): Promise<SetupSelectResult>;
67
77
  readEditableSelect(options: {
68
78
  message: string;
69
79
  options: readonly SetupPanelOption[];
@@ -125,7 +135,7 @@ export interface SetupFlowRenderer {
125
135
  waitForInterrupt(options?: {
126
136
  interruptible?: boolean;
127
137
  }): {
128
- promise: Promise<void>;
138
+ promise: Promise<SetupFlowInterrupt>;
129
139
  dispose(): void;
130
140
  };
131
141
  }
@@ -15,7 +15,7 @@
15
15
  */
16
16
  import type { ChannelSetupAction, PromptOption } from "#setup/cli/index.js";
17
17
  import { type SearchActionOption, type SelectState } from "#setup/cli/select-state.js";
18
- import type { SelectMetadata, SelectNotice } from "#setup/prompter.js";
18
+ import type { PlannerNavigation, SelectMetadata, SelectNotice } from "#setup/prompter.js";
19
19
  import type { ModelSettingsRequest } from "#setup/flows/model.js";
20
20
  import { type ModelEditorState } from "./model-editor.js";
21
21
  import type { ProviderPickerPhase } from "./provider-picker.js";
@@ -32,6 +32,8 @@ interface SetupQuestionPanelBase {
32
32
  error?: string;
33
33
  /** Outcome lines from earlier menu laps, shown beneath the options. */
34
34
  notices?: readonly SelectNotice[];
35
+ /** Optional batch-planner navigation grammar. */
36
+ navigation?: PlannerNavigation;
35
37
  }
36
38
  interface SetupSelectPanelBase extends SetupQuestionPanelBase {
37
39
  options: readonly SetupPanelOption[];
@@ -79,6 +81,7 @@ type SetupOptionSelectPanelState = (SetupSelectPanelBase & {
79
81
  kind: "multi";
80
82
  }) | (SetupSelectPanelBase & {
81
83
  kind: "searchable-multi";
84
+ layout?: "stacked";
82
85
  placeholder?: string;
83
86
  }) | (SetupSelectPanelBase & {
84
87
  kind: "stacked";
@@ -160,6 +163,8 @@ export type FlowPanelContent = {
160
163
  export interface FlowPanelState {
161
164
  /** The invoked command, e.g. "/deploy". Empty renders no title row. */
162
165
  title: string;
166
+ /** Progress owned by an enclosing journey, visible through nested questions and waits. */
167
+ navigation?: PlannerNavigation;
163
168
  lines: readonly FlowPanelLine[];
164
169
  content: FlowPanelContent;
165
170
  }
@@ -1,7 +1,7 @@
1
- import{maskLine,visibleLine}from"./line-editor.js";import{modelEditorMenuRows,reasoningPositions}from"./model-editor.js";import{clipVisible,renderInputText,renderInputWithBlockCursor,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{renderCursorRow,renderOptionRow,renderOptionRowContinuation,resolveOptionRowState}from"#setup/cli/option-row.js";import{filterOptions,submitRowIndex}from"#setup/cli/select-state.js";function clip(e,t){return clipVisible(e,t)}function questionFooter(e,t){let n=t.colors;return[``,` ${n.dim(n.italic(e.join(` ${t.glyph.dot} `)))}`]}const BOLD_OR_DIM_CLOSE=`\x1B[22m`,DIM_OPEN=`\x1B[2m`,ANSI_FOREGROUND_COLOR=RegExp(`\x1B\\[(?:3[0-9]|9[0-7])m`,`g`);function dimWithEmphasis(e,t){return t.colors.dim(e.replaceAll(BOLD_OR_DIM_CLOSE,`${BOLD_OR_DIM_CLOSE}${DIM_OPEN}`))}function solidWithinDim(e,t){return t.color?`${BOLD_OR_DIM_CLOSE}${e}${DIM_OPEN}`:e}function foregroundWithEmphasis(e){let t=!1;return e.replaceAll(DIM_OPEN,``).replace(ANSI_FOREGROUND_COLOR,e=>e===`\x1B[34m`?(t=!0,e):e===`\x1B[39m`&&t?(t=!1,e):``)}function toneGlyph(e,t){let n=t.colors;switch(e){case`success`:return n.green(t.glyph.success);case`warning`:return n.yellow(t.glyph.warning);case`error`:return n.red(t.glyph.error);case`info`:return n.dim(t.glyph.dot)}}function renderIndicator(e,t){return e.color===`green`?t.colors.green(e.glyph):t.colors.yellow(e.glyph)}function renderStatusText(e,t){if(e.kind===`progress`)return t.colors.dim(e.text);let n=e.text.indexOf(e.emphasis);if(n===-1)return t.colors.dim(e.text);let r=n+e.emphasis.length;return`${t.colors.dim(e.text.slice(0,n))}${t.colors.yellow(e.text.slice(n,r))}${t.colors.dim(e.text.slice(r))}`}function renderFlowPanelStatus(e,t){return`${renderIndicator(e.indicator,t)} ${renderStatusText(e,t)}`}function renderFlowPanel(e,t,n){let r=t.colors,i=[r.dim(t.glyph.hrule.repeat(Math.max(1,n-1)))];e.title.length>0&&i.push(` ${r.bold(e.title)}`),i.push(``);let a=e.lines.slice(-6);for(let e of a){let n=e.text.split(`
1
+ import{maskLine,visibleLine}from"./line-editor.js";import{modelEditorMenuRows,reasoningPositions}from"./model-editor.js";import{clipVisible,renderInputText,renderInputWithBlockCursor,visibleLength,wrapVisibleLine}from"#cli/ui/terminal-text.js";import{renderCursorRow,renderOptionRow,renderOptionRowContinuation,resolveOptionRowState}from"#setup/cli/option-row.js";import{filterOptions,submitRowIndex}from"#setup/cli/select-state.js";function clip(e,t){return clipVisible(e,t)}function questionFooter(e,t){let n=t.colors;return[``,` ${n.dim(n.italic(e.join(` ${t.glyph.dot} `)))}`]}const BOLD_OR_DIM_CLOSE=`\x1B[22m`,DIM_OPEN=`\x1B[2m`,ANSI_FOREGROUND_COLOR=RegExp(`\x1B\\[(?:3[0-9]|9[0-7])m`,`g`);function dimWithEmphasis(e,t){return t.colors.dim(e.replaceAll(BOLD_OR_DIM_CLOSE,`${BOLD_OR_DIM_CLOSE}${DIM_OPEN}`))}function solidWithinDim(e,t){return t.color?`${BOLD_OR_DIM_CLOSE}${e}${DIM_OPEN}`:e}function foregroundWithEmphasis(e){let t=!1;return e.replaceAll(DIM_OPEN,``).replace(ANSI_FOREGROUND_COLOR,e=>e===`\x1B[34m`?(t=!0,e):e===`\x1B[39m`&&t?(t=!1,e):``)}function toneGlyph(e,t){let n=t.colors;switch(e){case`success`:return n.green(t.glyph.success);case`warning`:return n.yellow(t.glyph.warning);case`error`:return n.red(t.glyph.error);case`info`:return n.dim(t.glyph.dot)}}function renderIndicator(e,t){return e.color===`green`?t.colors.green(e.glyph):t.colors.yellow(e.glyph)}function renderStatusText(e,t){if(e.kind===`progress`)return t.colors.dim(e.text);let n=e.text.indexOf(e.emphasis);if(n===-1)return t.colors.dim(e.text);let r=n+e.emphasis.length;return`${t.colors.dim(e.text.slice(0,n))}${t.colors.yellow(e.text.slice(n,r))}${t.colors.dim(e.text.slice(r))}`}function renderFlowPanelStatus(e,t){return`${renderIndicator(e.indicator,t)} ${renderStatusText(e,t)}`}function renderFlowPanel(e,t,n){let r=t.colors,i=[r.dim(t.glyph.hrule.repeat(Math.max(1,n-1)))];e.title.length>0&&i.push(` ${r.bold(e.title)}`),i.push(``),e.navigation?.kind===`planner`&&i.push(...plannerStepRows(e.navigation,void 0,t));let a=e.lines.slice(-6);for(let e of a){let n=e.text.split(`
2
2
  `);for(let[a,o]of n.entries()){let n=e.tone===`info`?r.dim(o):o,s=a===0?`${toneGlyph(e.tone,t)} `:` `;i.push(` ${s}${n}`)}}switch(a.length>0&&i.push(``),e.content.kind){case`question`:e.content.status!==void 0&&i.push(` ${renderFlowPanelStatus(e.content.status,t)}`,``),i.push(...e.content.rows);break;case`status`:if(i.push(` ${renderFlowPanelStatus(e.content.status,t)}`),e.content.preview!==void 0)for(let t of e.content.preview.split(`
3
3
  `))i.push(` ${r.dim(t)}`);break;case`preview`:{let[n,...a]=e.content.text.split(`
4
- `);i.push(` ${renderIndicator(e.content.indicator,t)} ${r.dim(n??``)}`);for(let e of a)i.push(` ${r.dim(e)}`);break}case`idle`:i.push(` ${renderIndicator(e.content.indicator,t)} ${r.dim(`Working…`)}`);break}return i.map((e,t)=>t===0||e.length===0?clip(e,n):clip(` ${e}`,n))}function optionRow(e){let{option:t,theme:n}=e,r=e.railed===!0;return renderOptionRow({colors:n.colors,glyphs:{pointer:n.glyph.pointer,selectedPointer:n.glyph.selectedPointer,success:n.glyph.success,placeholder:r?n.glyph.caret:n.glyph.option,dot:r?``:n.glyph.dot,warning:n.glyph.warning},label:t.label,hint:t.hint,focusHint:t.focusHint,accent:t.accent,isCursor:e.isCursor,state:resolveOptionRowState(t,e.isChecked),placeholder:e.placeholder,hintPadding:e.hintPadding})}function selectPresentation(e){switch(e.kind){case`single`:return{selection:`single`,filter:void 0,layout:`plain`,edit:void 0};case`search`:return{selection:`single`,filter:{placeholder:e.placeholder},layout:e.layout??`plain`,edit:void 0};case`multi`:return{selection:`multiple`,filter:void 0,layout:`plain`,edit:void 0};case`searchable-multi`:return{selection:`multiple`,filter:{placeholder:e.placeholder},layout:`plain`,edit:void 0};case`stacked`:return{selection:`single`,filter:void 0,layout:`stacked`,edit:void 0};case`task-list`:return{selection:`single`,filter:void 0,layout:`task-list`,edit:void 0};case`inline-edit`:return{selection:`single`,filter:void 0,layout:e.layout,edit:e.edit}}}function selectMessageRows(e,t,n){if(e===``)return[];let r=e.split(`
5
- `).map((e,r)=>` ${t===`stacked`||r>0?n.colors.bold(e):e}`);return r.push(``),r}function searchFilter(e,t,n,r,i){let a=r.colors.dim(r.glyph.caret),o=a;return i?o=`${a} ${e.length>0?e+a:r.colors.dim(t??`type to search`)}`:e.length>0?o=e+a:t!==void 0&&(o=r.colors.dim(`> ${t}`)),n===void 0?o:`${o} ${r.colors.yellow(n)}`}function isRailedSearch(e){return e.filter!==void 0&&e.layout===`plain`&&e.selection===`single`&&e.edit===void 0}function selectViewSize(e){return e.search?e.railed?5:e.filter===``&&e.featuredLead>0?Math.min(e.featuredLead,8):8:e.optionCount}function noticeBody(e,t,n){return e.tone===`info`?n.colors.dim(e.text):e.tone===`success`&&t===`task-list`?n.colors.bold(e.text):e.text}function renameHint(e,n,r,i){let a=renderInputWithBlockCursor({...visibleLine({text:r.editor.text||r.defaultValue,cursor:r.editor.cursor},1/0),visible:n,inverse:i.colors.inverse});return r.editor.text.length>0&&(a=solidWithinDim(a,i)),{...e,hint:r.formatHint(a)}}function keyHint(n,r,i,c,l){let u=i.phase;if(u.kind===`inactive`)return n;let d=c.colors,f=maskLine(u.editor),p=u.kind!==`validating`&&u.kind!==`invalid`,m=``;u.kind===`editing`?m=` ${enterBadge(c,`validate`)}`:u.kind===`validating`?m=` ${d.yellow(c.glyph.validating)} ${d.dim(`validating`)}`:u.kind===`invalid`&&(m=` ${d.red(`${c.glyph.error} API key is not valid`)}`);let h=`${c.glyph.elbow} `,g=u.editor.text.length===0?`type your key`:void 0,_=visibleLine(g===void 0?f:{text:g,cursor:0},Math.max(1,l-visibleLength(`${h}${m}`)),c.glyph.ellipsis),v=p?renderInputWithBlockCursor({..._,visible:r,inverse:c.colors.inverse}):renderInputText(`${_.before}${_.under}${_.after}`);return{...n,hint:`${h}${v}${m}`}}function inlineEditOption(e,t,n,r,i){if(!t||n===void 0||e.value!==n.optionValue)return e;switch(n.editor.kind){case`rename`:return renameHint(e,n.caretVisible,n.editor,r);case`key`:return keyHint(e,n.caretVisible,n.editor,r,i)}}function optionWithoutStackedHint(e,t){if(t!==`stacked`||e.hint===void 0)return{option:e,stackedHint:void 0};let{hint:n,...r}=e;return{option:r,stackedHint:n}}function optionUsesPlaceholder(e,t){let n=e.filter!==void 0&&e.layout!==`task-list`,r=e.selection===`multiple`,i=e.layout!==`plain`;return!n&&!t&&(r||i)}function appendSelectOptionRows(e){let{rows:t,state:n,presentation:r,visible:i,start:a,end:o,cursor:s,visibleLabelWidth:c,width:l,theme:u}=e,f=u.colors,p=!1;for(let e=a;e<o;e+=1){let m=i[e],h=e===s,g=r.layout===`task-list`&&m.trailingAction===!0;g&&(appendSelectNotices(t,n.notices,r.layout,u,l),p=!0),g&&(e>a||(n.notices?.length??0)>0)&&t.push(``);let _=r.layout===`stacked`?Math.max(1,l-6):Math.max(1,l-Math.max(c,m.label.length)-9),{option:v,stackedHint:y}=optionWithoutStackedHint(inlineEditOption(m,h,r.edit,u,_),r.layout),b=isRailedSearch(r),x=n.cursorBadge??(b&&!g?enterBadge(u):void 0),S=h&&x!==void 0?` ${x}`:``;if(t.push(` ${optionRow({option:v,isCursor:h,isChecked:r.selection===`multiple`?n.select.selected.has(m.value):m.checked===!0,placeholder:b||optionUsesPlaceholder(r,g),railed:b,hintPadding:Math.max(0,c-v.label.length),theme:u})}${S}`),y!==void 0){let e=r.edit,n=h&&e!==void 0&&e.optionValue===m.value&&e.editor.kind===`key`&&e.editor.phase.kind!==`inactive`;for(let e of y.split(`
6
- `)){let r=h?n?e:foregroundWithEmphasis(e):dimWithEmphasis(e,u);t.push(` ${renderOptionRowContinuation(r)}`)}}m.description!==void 0&&(m.disabled===!0||h)&&t.push(` ${renderOptionRowContinuation(f.dim(m.description))}`),r.layout===`stacked`&&e<o-1&&t.push(``)}return p}function appendSubmitRow(e,t,n,r){if(n<0)return;let i=t===n,a=i?`${r.glyph.selectedPointer} ${r.colors.bold(`Submit`)}`:` Submit`;e.push(``,` ${renderCursorRow(a,i,r.colors)}`)}function appendSelectNotices(e,t,n,r,i){if(!(t===void 0||t.length===0)){e.push(``);for(let a of t){let t=toneGlyph(a.tone,r),o=` `.repeat(visibleLength(t)+1),l=Math.max(1,i-2-visibleLength(t)-1),u=wrapVisibleLine(a.text,l);for(let[i,s]of u.entries()){let c=noticeBody({...a,text:s},n,r);e.push(i===0?` ${t} ${c}`:` ${o}${c}`)}}}}function selectFooterHints(e,t,n){let r=[],i=`esc to cancel`,a=e.edit;if(a!==void 0&&t[n]?.value===a.optionValue)if(a.editor.kind===`key`){let e=a.editor.phase;if(e.kind!==`inactive`&&e.editor.text.length>0&&(i=`esc to clear`),e.kind===`validating`)return[i];r.push(`type your key`)}else r.push(`type to rename`);return e.filter!==void 0&&r.push(`type to filter`),r.push(`↑/↓ move`),r.push(e.selection===`multiple`?`space to toggle`:`enter to select`),e.selection===`multiple`&&r.push(`enter on Submit to confirm`),r.push(i),r}function renderActionQuestion(e,t,n){let r=[` ${t.colors.dim(`${t.glyph.dot} ${e.context}`)}`,``];for(let[n,i]of e.actions.entries())r.push(` ${optionRow({option:i,isCursor:n===e.cursor,isChecked:!1,placeholder:!0,hintPadding:0,theme:t})}`);return r.push(...questionFooter([`↑/↓ move`,`enter to select`,`esc to cancel`],t)),r.map(e=>clip(e,n))}function renderSelectQuestion(e,t,n){if(e.kind===`actions`)return renderActionQuestion(e,t,n);let r=t.colors,i=selectPresentation(e),a=i.filter?filterOptions(e.options,e.select.filter,e.searchAction):e.options,o=i.selection===`multiple`?submitRowIndex(a):-1,s=e.select.cursor,l=isRailedSearch(i),u=selectMessageRows(e.message,i.layout,t);if(e.description!==void 0||e.metadata!==void 0){if(u.at(-1)===``&&u.pop(),e.description!==void 0)for(let t of wrapVisibleLine(e.description,Math.max(1,n-4)))u.push(` ${r.dim(t)}`);for(let{label:t,value:i}of e.metadata??[]){let e=`${t}: `,a=wrapVisibleLine(i,Math.max(1,n-4-e.length));u.push(` ${r.dim(`${e}${a[0]??``}`)}`);for(let t of a.slice(1))u.push(` ${r.dim(`${` `.repeat(e.length)}${t}`)}`)}u.push(``)}i.filter!==void 0&&u.push(` ${l?` `:``}${searchFilter(e.select.filter,i.filter.placeholder,e.loadingFrame,t,l)}`);let d=0;for(;a[d]?.featured;)d+=1;let f=selectViewSize({search:i.filter!==void 0,filter:e.select.filter,featuredLead:d,optionCount:a.length,railed:l}),h=Math.max(0,Math.min(s-Math.floor(f/2),Math.max(0,a.length-f))),g=Math.min(h+f,a.length),_=a.slice(h,g).filter(e=>e.hint!==void 0||e.focusHint!==void 0).reduce((e,t)=>Math.max(e,t.label.length),0);a.length===0&&u.push(` ${r.dim(`(no matches)`)}`);let v=appendSelectOptionRows({rows:u,state:e,presentation:i,visible:a,start:h,end:g,cursor:s,visibleLabelWidth:_,width:n,theme:t});return appendSubmitRow(u,s,o,t),!l&&a.length>g-h&&u.push(` ${r.dim(`↑↓ ${a.length} options, showing ${h+1}–${g}`)}`),v||appendSelectNotices(u,e.notices,i.layout,t,n),e.error!==void 0&&u.push(``,` ${r.red(e.error)}`),u.push(...questionFooter(l?[`esc to cancel`]:selectFooterHints(i,a,s),t)),u.map(e=>clip(e,n))}function enterBadge(e,t){return e.colors.dim(t===void 0?e.glyph.enter:`${e.glyph.enter} ${t}`)}function reasoningTrack(e){let{count:t,index:n,theme:r}=e,i=r.glyph,a=i.trackLine.repeat(e.connectorWidth),o=[];for(let e=0;e<t;e+=1)e>0&&o.push(a),o.push(e<n?i.trackFilled:e===n?i.trackCurrent:i.trackEmpty);if(!e.accent||n<0)return o.join(``);let s=o.slice(0,2*n+1).join(``);return`${r.colors.blue(s)}${o.slice(2*n+1).join(``)}`}function renderModelEditorQuestion(e,t,n){let{request:r,state:i}=e;switch(i.screen.kind){case`menu`:return renderModelEditorMenu(e,i.screen.cursor,t,n);case`model`:return renderModelEditorModelScreen(r,i.screen.select,t,n)}}function renderModelEditorMenu(e,t,i,a){let{request:o,state:s}=e,{draft:c}=s,l=modelEditorMenuRows(o,c,s.capabilities).map(e=>{if(e.disabled===!0&&e.value===`model`)return c.modelId===null?{...e}:{...e,hint:c.modelId};if(e.disabled===!0||e.value===`done`)return{...e};switch(e.value){case`model`:return{...e,hint:c.modelId??void 0};case`reasoning`:{let n=reasoningPositions(s.capabilities,c.reasoning),a=c.reasoning==="default"?-1:n.indexOf(c.reasoning),o=reasoningTrack({count:n.length,index:a,connectorWidth:1,accent:e.value===t,theme:i}),l=c.reasoning==="default"?`provider default`:c.reasoning;return{...e,hint:`${o} ${l}`}}case`tier`:return{...e,hint:c.tier===`priority`?`fast ${i.glyph.fast}`:`normal`};default:return{...e}}});return renderSelectQuestion({kind:`stacked`,message:``,options:l,select:{filter:``,cursor:Math.max(0,l.findIndex(e=>e.value===t)),selected:new Set}},i,a)}function renderModelEditorModelScreen(e,t,n,r){return renderSelectQuestion({kind:`search`,message:`Select the model`,options:e.model.kind===`pick`?e.model.options:[],placeholder:`type to search`,select:t},n,r)}function renderTextQuestion(n,r,i,s){let c=r.colors,l=[];for(let e of n.notices??[]){let t=e.tone===`info`?c.dim(e.text):e.text;l.push(`${toneGlyph(e.tone,r)} ${t}`)}l.push(...n.message.split(`
4
+ `);i.push(` ${renderIndicator(e.content.indicator,t)} ${r.dim(n??``)}`);for(let e of a)i.push(` ${r.dim(e)}`);break}case`idle`:i.push(` ${renderIndicator(e.content.indicator,t)} ${r.dim(`Working…`)}`);break}return i.map((e,t)=>t===0||e.length===0?clip(e,n):clip(` ${e}`,n))}function optionRow(e){let{option:t,theme:n}=e,r=e.railed===!0;return renderOptionRow({colors:n.colors,glyphs:{pointer:n.glyph.pointer,selectedPointer:n.glyph.selectedPointer,success:n.glyph.success,placeholder:r?n.glyph.caret:n.glyph.option,dot:r?``:n.glyph.dot,warning:n.glyph.warning},label:t.label,hint:t.hint,focusHint:t.focusHint,accent:t.accent,isCursor:e.isCursor,state:resolveOptionRowState(t,e.isChecked),placeholder:e.placeholder,hintPadding:e.hintPadding})}function selectPresentation(e){switch(e.kind){case`single`:return{selection:`single`,filter:void 0,layout:`plain`,edit:void 0};case`search`:return{selection:`single`,filter:{placeholder:e.placeholder},layout:e.layout??`plain`,edit:void 0};case`multi`:return{selection:`multiple`,filter:void 0,layout:`plain`,edit:void 0};case`searchable-multi`:return{selection:`multiple`,filter:{placeholder:e.placeholder},layout:e.layout??`plain`,edit:void 0};case`stacked`:return{selection:`single`,filter:void 0,layout:`stacked`,edit:void 0};case`task-list`:return{selection:`single`,filter:void 0,layout:`task-list`,edit:void 0};case`inline-edit`:return{selection:`single`,filter:void 0,layout:e.layout,edit:e.edit}}}function canNavigateBack(e){return e.activeStep>(e.firstNavigableStep??0)}function canNavigateForward(e){return e.activeStep>=(e.firstNavigableStep??0)&&e.activeStep<e.steps.length-1}function plannerStepRows(e,t,n){let r=e.steps.map((r,i)=>{let a=i===e.activeStep?t:r.count,o=a===void 0||a===0?``:` (${a})`,s=`${r.complete===!0?`${n.glyph.success} `:``}${r.label}${o}`;return i===e.activeStep?n.colors.inverse(n.colors.blue(n.colors.bold(` ${s} `))):r.complete===!0?n.colors.green(s):n.colors.dim(s)});return[` ${r.flatMap((t,i)=>{if(i===r.length-1)return[t];let a=e.activeStep===i&&canNavigateForward(e)?` → `:e.activeStep===i+1&&canNavigateBack(e)?` ← `:` · `;return[t,n.colors.dim(a)]}).join(``)}`,``]}function selectMessageRows(e,t,n){if(e===``)return[];let r=e.split(`
5
+ `).map((e,r)=>` ${t===`stacked`||r>0?n.colors.bold(e):e}`);return r.push(``),r}function searchFilter(e,t,n,r,i){let a=r.colors.dim(r.glyph.caret),o=a;return i?o=`${a} ${e.length>0?e+a:r.colors.dim(t??`type to search`)}`:e.length>0?o=e+a:t!==void 0&&(o=r.colors.dim(`> ${t}`)),n===void 0?o:`${o} ${r.colors.yellow(n)}`}function isRailedSearch(e){return e.filter!==void 0&&e.layout===`plain`&&e.selection===`single`&&e.edit===void 0}function selectViewSize(e){return e.search?e.railed?5:e.stacked?Math.min(e.optionCount,8):8:e.optionCount}function noticeBody(e,t,n){return e.tone===`info`?n.colors.dim(e.text):e.tone===`success`&&t===`task-list`?n.colors.bold(e.text):e.text}function renameHint(e,n,r,i){let a=renderInputWithBlockCursor({...visibleLine({text:r.editor.text||r.defaultValue,cursor:r.editor.cursor},1/0),visible:n,inverse:i.colors.inverse});return r.editor.text.length>0&&(a=solidWithinDim(a,i)),{...e,hint:r.formatHint(a)}}function keyHint(n,r,i,c,l){let u=i.phase;if(u.kind===`inactive`)return n;let d=c.colors,f=maskLine(u.editor),p=u.kind!==`validating`&&u.kind!==`invalid`,m=``;u.kind===`editing`?m=` ${enterBadge(c,`validate`)}`:u.kind===`validating`?m=` ${d.yellow(c.glyph.validating)} ${d.dim(`validating`)}`:u.kind===`invalid`&&(m=` ${d.red(`${c.glyph.error} API key is not valid`)}`);let h=`${c.glyph.elbow} `,g=u.editor.text.length===0?`type your key`:void 0,_=visibleLine(g===void 0?f:{text:g,cursor:0},Math.max(1,l-visibleLength(`${h}${m}`)),c.glyph.ellipsis),v=p?renderInputWithBlockCursor({..._,visible:r,inverse:c.colors.inverse}):renderInputText(`${_.before}${_.under}${_.after}`);return{...n,hint:`${h}${v}${m}`}}function inlineEditOption(e,t,n,r,i){if(!t||n===void 0||e.value!==n.optionValue)return e;switch(n.editor.kind){case`rename`:return renameHint(e,n.caretVisible,n.editor,r);case`key`:return keyHint(e,n.caretVisible,n.editor,r,i)}}function optionWithoutStackedHint(e,t){if(t!==`stacked`||e.hint===void 0)return{option:e,stackedHint:void 0};let{hint:n,...r}=e;return{option:r,stackedHint:n}}function optionUsesPlaceholder(e,t){let n=e.filter!==void 0&&e.layout!==`task-list`,r=e.selection===`multiple`,i=e.layout!==`plain`;return!n&&!t&&(r||i)}function appendSelectOptionRows(e){let{rows:t,state:n,presentation:r,visible:i,start:a,end:o,cursor:s,visibleLabelWidth:c,width:l,theme:u}=e,f=u.colors,p=!1;for(let e=a;e<o;e+=1){let m=i[e],h=e===s,g=r.layout===`task-list`&&m.trailingAction===!0;g&&(appendSelectNotices(t,n.notices,r.layout,u,l),p=!0),g&&(e>a||(n.notices?.length??0)>0)&&t.push(``);let _=r.layout===`stacked`?Math.max(1,l-6):Math.max(1,l-Math.max(c,m.label.length)-9),{option:v,stackedHint:y}=optionWithoutStackedHint(inlineEditOption(m,h,r.edit,u,_),r.layout),b=isRailedSearch(r),x=n.cursorBadge??(b&&!g?enterBadge(u):void 0),S=h&&x!==void 0?` ${x}`:``;if(t.push(` ${optionRow({option:v,isCursor:h,isChecked:r.selection===`multiple`?n.select.selected.has(m.value):m.checked===!0,placeholder:b||optionUsesPlaceholder(r,g),railed:b,hintPadding:Math.max(0,c-v.label.length),theme:u})}${S}`),y!==void 0){let e=r.edit,n=h&&e!==void 0&&e.optionValue===m.value&&e.editor.kind===`key`&&e.editor.phase.kind!==`inactive`;for(let e of y.split(`
6
+ `)){let r=h?n?e:foregroundWithEmphasis(e):dimWithEmphasis(e,u);t.push(` ${renderOptionRowContinuation(r)}`)}}m.description!==void 0&&(m.disabled===!0||h)&&t.push(` ${renderOptionRowContinuation(f.dim(m.description))}`),r.layout===`stacked`&&e<o-1&&t.push(``)}return p}function appendSubmitRow(e,t,n,r){if(n<0)return;let i=t===n,a=i?`${r.glyph.selectedPointer} ${r.colors.bold(`Submit`)}`:` Submit`;e.push(``,` ${renderCursorRow(a,i,r.colors)}`)}function appendSelectNotices(e,t,n,r,i){if(!(t===void 0||t.length===0)){e.push(``);for(let a of t){let t=toneGlyph(a.tone,r),o=` `.repeat(visibleLength(t)+1),l=Math.max(1,i-2-visibleLength(t)-1),u=wrapVisibleLine(a.text,l);for(let[i,s]of u.entries()){let c=noticeBody({...a,text:s},n,r);e.push(i===0?` ${t} ${c}`:` ${o}${c}`)}}}}function selectFooterHints(e,t,n,r){let i=[],a=`esc to cancel`,o=e.edit;if(o!==void 0&&t[n]?.value===o.optionValue)if(o.editor.kind===`key`){let e=o.editor.phase;if(e.kind!==`inactive`&&e.editor.text.length>0&&(a=`esc to clear`),e.kind===`validating`)return[a];i.push(`type your key`)}else i.push(`type to rename`);if(e.filter!==void 0&&i.push(`type to filter`),i.push(`↑/↓ move`),r!==void 0){let t=canNavigateBack(r),n=canNavigateForward(r);return i.push(e.selection===`multiple`?`space/enter toggle`:`enter to select`),t&&n?i.push(`←/→ steps`):t?i.push(`← back`):n&&i.push(`→ next`),i.push(a),i}return i.push(e.selection===`multiple`?`space to toggle`:`enter to select`),e.selection===`multiple`&&i.push(`enter on Submit to confirm`),i.push(a),i}function renderActionQuestion(e,t,n){let r=[` ${t.colors.dim(`${t.glyph.dot} ${e.context}`)}`,``];for(let[n,i]of e.actions.entries())r.push(` ${optionRow({option:i,isCursor:n===e.cursor,isChecked:!1,placeholder:!0,hintPadding:0,theme:t})}`);return r.push(...questionFooter([`↑/↓ move`,`enter to select`,`esc to cancel`],t)),r.map(e=>clip(e,n))}function renderSelectQuestion(e,t,n){if(e.kind===`actions`)return renderActionQuestion(e,t,n);let r=t.colors,i=selectPresentation(e),a=i.filter?filterOptions(e.options,e.select.filter,e.searchAction):e.options,o=e.navigation?.kind===`planner`?e.navigation:void 0,s=i.selection===`multiple`&&o===void 0?submitRowIndex(a):-1,l=e.select.cursor,u=isRailedSearch(i),d=[...e.navigation?.kind===`planner`?plannerStepRows(e.navigation,i.selection===`multiple`?e.select.selected.size:void 0,t):[],...selectMessageRows(e.message,i.layout,t)];if(e.description!==void 0||e.metadata!==void 0){if(d.at(-1)===``&&d.pop(),e.description!==void 0)for(let t of wrapVisibleLine(e.description,Math.max(1,n-4)))d.push(` ${r.dim(t)}`);for(let{label:t,value:i}of e.metadata??[]){let e=`${t}: `,a=wrapVisibleLine(i,Math.max(1,n-4-e.length));d.push(` ${r.dim(`${e}${a[0]??``}`)}`);for(let t of a.slice(1))d.push(` ${r.dim(`${` `.repeat(e.length)}${t}`)}`)}d.push(``)}i.filter!==void 0&&d.push(` ${u?` `:``}${searchFilter(e.select.filter,i.filter.placeholder,e.loadingFrame,t,u)}`);let f=selectViewSize({search:i.filter!==void 0,filter:e.select.filter,optionCount:a.length,railed:u,stacked:i.layout===`stacked`}),h=Math.max(0,Math.min(l-Math.floor(f/2),Math.max(0,a.length-f))),g=Math.min(h+f,a.length),_=a.slice(h,g).filter(e=>e.hint!==void 0||e.focusHint!==void 0).reduce((e,t)=>Math.max(e,t.label.length),0);a.length===0&&d.push(` ${r.dim(`(no matches)`)}`);let v=appendSelectOptionRows({rows:d,state:e,presentation:i,visible:a,start:h,end:g,cursor:l,visibleLabelWidth:_,width:n,theme:t});if(appendSubmitRow(d,l,s,t),o!==void 0&&i.selection===`multiple`){let t=e.select.selected.size;d.push(``,` ${r.dim(`${t} selected`)}`)}return!u&&a.length>g-h&&d.push(` ${r.dim(`↑↓ ${a.length} options, showing ${h+1}–${g}`)}`),v||appendSelectNotices(d,e.notices,i.layout,t,n),e.error!==void 0&&d.push(``,` ${r.red(e.error)}`),d.push(...questionFooter(u?[`esc to cancel`]:selectFooterHints(i,a,l,o),t)),d.map(e=>clip(e,n))}function enterBadge(e,t){return e.colors.dim(t===void 0?e.glyph.enter:`${e.glyph.enter} ${t}`)}function reasoningTrack(e){let{count:t,index:n,theme:r}=e,i=r.glyph,a=i.trackLine.repeat(e.connectorWidth),o=[];for(let e=0;e<t;e+=1)e>0&&o.push(a),o.push(e<n?i.trackFilled:e===n?i.trackCurrent:i.trackEmpty);if(!e.accent||n<0)return o.join(``);let s=o.slice(0,2*n+1).join(``);return`${r.colors.blue(s)}${o.slice(2*n+1).join(``)}`}function renderModelEditorQuestion(e,t,n){let{request:r,state:i}=e;switch(i.screen.kind){case`menu`:return renderModelEditorMenu(e,i.screen.cursor,t,n);case`model`:return renderModelEditorModelScreen(r,i.screen.select,t,n)}}function renderModelEditorMenu(e,t,i,a){let{request:o,state:s}=e,{draft:c}=s,l=modelEditorMenuRows(o,c,s.capabilities).map(e=>{if(e.disabled===!0&&e.value===`model`)return c.modelId===null?{...e}:{...e,hint:c.modelId};if(e.disabled===!0||e.value===`done`)return{...e};switch(e.value){case`model`:return{...e,hint:c.modelId??void 0};case`reasoning`:{let n=reasoningPositions(s.capabilities,c.reasoning),a=c.reasoning==="default"?-1:n.indexOf(c.reasoning),o=reasoningTrack({count:n.length,index:a,connectorWidth:1,accent:e.value===t,theme:i}),l=c.reasoning==="default"?`provider default`:c.reasoning;return{...e,hint:`${o} ${l}`}}case`tier`:return{...e,hint:c.tier===`priority`?`fast ${i.glyph.fast}`:`normal`};default:return{...e}}});return renderSelectQuestion({kind:`stacked`,message:``,options:l,select:{filter:``,cursor:Math.max(0,l.findIndex(e=>e.value===t)),selected:new Set}},i,a)}function renderModelEditorModelScreen(e,t,n,r){return renderSelectQuestion({kind:`search`,message:`Select the model`,options:e.model.kind===`pick`?e.model.options:[],placeholder:`type to search`,select:t},n,r)}function renderTextQuestion(n,r,i,s){let c=r.colors,l=[];for(let e of n.notices??[]){let t=e.tone===`info`?c.dim(e.text):e.text;l.push(`${toneGlyph(e.tone,r)} ${t}`)}l.push(...n.message.split(`
7
7
  `).map(e=>` ${c.bold(e)}`));let u=Math.max(4,i-4),d=n.mask?maskLine(n.editor):n.editor,f=n.editor.text.length===0?n.placeholder:void 0,p=renderInputWithBlockCursor({...visibleLine(f===void 0?d:{text:f,cursor:0},u,r.glyph.ellipsis),visible:s,inverse:c.inverse,render:f===void 0?renderInputText:e=>c.dim(renderInputText(e))});return l.push(` ${p}`),n.error!==void 0&&l.push(``,` ${c.red(n.error)}`),l.push(...questionFooter([`enter to submit`,`esc to cancel`],r)),l.map(e=>clip(e,i))}function renderAcknowledgeQuestion(e,t,n){let r=t.colors,i=[` ${r.bold(e.message)}`];if(e.lines.length>0){i.push(``);for(let t of e.lines)i.push(` ${r.dim(t)}`)}return i.push(...questionFooter([`enter to continue`],t)),i.map(e=>clip(e,n))}export{enterBadge,reasoningTrack,renderAcknowledgeQuestion,renderFlowPanel,renderModelEditorQuestion,renderSelectQuestion,renderTextQuestion};
@@ -44,6 +44,7 @@ type SetupSingleSelectInput = SetupSelectInput & {
44
44
  type SetupMultiSelectInput = SetupSelectInput & {
45
45
  kind: "multi" | "searchable-multi";
46
46
  required: boolean;
47
+ plannerNavigation?: true;
47
48
  };
48
49
  type SetupSelectInputState = SetupSingleSelectInput | SetupMultiSelectInput;
49
50
  /** Pure key transition for a setup select; rendering and lifecycle stay outside. */
@@ -1,2 +1,2 @@
1
- import{filterOptions,orderedSelection,reduceSelect,selectValueAtCursor,submitRowIndex}from"#setup/cli/select-state.js";function setupSelectionIntent(e,t={}){if(t.textNavigation&&e.type===`text`&&e.framing===`unframed`){if(e.value===`k`)return{kind:`move`,direction:`up`};if(e.value===`j`)return{kind:`move`,direction:`down`}}switch(e.type){case`ctrl-c`:case`escape`:return{kind:`cancel`};case`up`:case`ctrl-p`:return{kind:`move`,direction:`up`};case`down`:case`ctrl-n`:return{kind:`move`,direction:`down`};case`ctrl-r`:return{kind:`repaint`};case`enter`:return{kind:`submit`};default:return}}function isMultiSelect(e){return e.kind===`multi`||e.kind===`searchable-multi`}function isSearchableSelect(e){return e.kind===`search`||e.kind===`searchable-multi`}function updatedSelect(e,t){return{kind:`update`,select:reduceSelect(e.select,t,{options:e.options,searchAction:e.searchAction,submitRow:isMultiSelect(e)})}}function submitSetupSelect(n){let a=isSearchableSelect(n)?filterOptions(n.options,n.select.filter,n.searchAction):[...n.options];if(isMultiSelect(n))return n.select.cursor===submitRowIndex(a)?n.required&&n.select.selected.size===0?{kind:`error`,message:`Select at least one option, then submit.`}:{kind:`submit`,values:orderedSelection(n.options,n.select.selected)}:updatedSelect(n,{type:`toggle`});let o=selectValueAtCursor(a,n.select.cursor);return o===void 0?a[n.select.cursor]?.completed?{kind:`ignore`}:{kind:`error`,message:`Type to match an option, then press enter.`}:{kind:`submit`,values:[o]}}function editSetupSelect(e){switch(e.key.type){case`backspace`:return isSearchableSelect(e)?updatedSelect(e,{type:`backspace`}):{kind:`ignore`};case`text`:{if(e.key.framing===`unframed`&&isMultiSelect(e)&&e.key.value===` `)return updatedSelect(e,{type:`toggle`});if(!isSearchableSelect(e))return{kind:`ignore`};let t=e.select,r={options:e.options,searchAction:e.searchAction,submitRow:isMultiSelect(e)};for(let i of e.key.value.replaceAll(`
1
+ import{filterOptions,orderedSelection,reduceSelect,selectValueAtCursor,submitRowIndex}from"#setup/cli/select-state.js";function setupSelectionIntent(e,t={}){if(t.textNavigation&&e.type===`text`&&e.framing===`unframed`){if(e.value===`k`)return{kind:`move`,direction:`up`};if(e.value===`j`)return{kind:`move`,direction:`down`}}switch(e.type){case`ctrl-c`:case`escape`:return{kind:`cancel`};case`up`:case`ctrl-p`:return{kind:`move`,direction:`up`};case`down`:case`ctrl-n`:return{kind:`move`,direction:`down`};case`ctrl-r`:return{kind:`repaint`};case`enter`:return{kind:`submit`};default:return}}function isMultiSelect(e){return e.kind===`multi`||e.kind===`searchable-multi`}function isSearchableSelect(e){return e.kind===`search`||e.kind===`searchable-multi`}function updatedSelect(e,t){return{kind:`update`,select:reduceSelect(e.select,t,{options:e.options,searchAction:e.searchAction,submitRow:isMultiSelect(e)&&e.plannerNavigation!==!0})}}function submitSetupSelect(n){let a=isSearchableSelect(n)?filterOptions(n.options,n.select.filter,n.searchAction):[...n.options];if(isMultiSelect(n))return n.plannerNavigation===!0||n.select.cursor!==submitRowIndex(a)?updatedSelect(n,{type:`toggle`}):n.required&&n.select.selected.size===0?{kind:`error`,message:`Select at least one option, then submit.`}:{kind:`submit`,values:orderedSelection(n.options,n.select.selected)};let o=selectValueAtCursor(a,n.select.cursor);return o===void 0?a[n.select.cursor]?.completed?{kind:`ignore`}:{kind:`error`,message:`Type to match an option, then press enter.`}:{kind:`submit`,values:[o]}}function editSetupSelect(e){switch(e.key.type){case`backspace`:return isSearchableSelect(e)?updatedSelect(e,{type:`backspace`}):{kind:`ignore`};case`text`:{if(e.key.framing===`unframed`&&isMultiSelect(e)&&e.key.value===` `)return updatedSelect(e,{type:`toggle`});if(!isSearchableSelect(e))return{kind:`ignore`};let t=e.select,r={options:e.options,searchAction:e.searchAction,submitRow:isMultiSelect(e)&&e.plannerNavigation!==!0};for(let i of e.key.value.replaceAll(`
2
2
  `,` `))i>=` `&&i!==``&&(t=reduceSelect(t,{type:`char`,char:i},r));return{kind:`update`,select:t}}default:return{kind:`ignore`}}}function reduceSetupSelectInput(e){let t=setupSelectionIntent(e.key,{textNavigation:!isSearchableSelect(e)});switch(t?.kind){case`cancel`:return e.key.type===`escape`&&isSearchableSelect(e)&&e.select.filter.length>0?updatedSelect(e,{type:`clear`}):{kind:`cancel`};case`repaint`:return{kind:`repaint`};case`move`:return updatedSelect(e,{type:t.direction});case`submit`:return submitSetupSelect(e);case void 0:return editSetupSelect(e)}}export{reduceSetupSelectInput,setupSelectionIntent};