eve 0.7.4 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +11 -11
  3. package/dist/src/chunks/{use-eve-agent-DErQj5hs.js → use-eve-agent-BSXZSn-R.js} +6 -1
  4. package/dist/src/chunks/{use-eve-agent-DoR8C4i6.js → use-eve-agent-Dlut2Qzt.js} +6 -1
  5. package/dist/src/cli/commands/init.js +1 -1
  6. package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
  7. package/dist/src/cli/dev/tui/blocks.js +4 -3
  8. package/dist/src/cli/dev/tui/command-typeahead.d.ts +13 -3
  9. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  10. package/dist/src/cli/dev/tui/line-editor.d.ts +6 -0
  11. package/dist/src/cli/dev/tui/line-editor.js +1 -1
  12. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -0
  13. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  14. package/dist/src/cli/dev/tui/runner.d.ts +15 -0
  15. package/dist/src/cli/dev/tui/runner.js +1 -1
  16. package/dist/src/cli/dev/tui/setup-commands.d.ts +11 -7
  17. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  18. package/dist/src/cli/dev/tui/setup-flow.d.ts +72 -10
  19. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  20. package/dist/src/cli/dev/tui/setup-panel.d.ts +91 -39
  21. package/dist/src/cli/dev/tui/setup-panel.js +3 -1
  22. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +48 -0
  23. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -0
  24. package/dist/src/cli/dev/tui/status-line.d.ts +13 -7
  25. package/dist/src/cli/dev/tui/status-line.js +1 -1
  26. package/dist/src/cli/dev/tui/stream-format.d.ts +2 -0
  27. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  28. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +5 -2
  29. package/dist/src/cli/dev/tui/terminal-renderer.js +6 -5
  30. package/dist/src/cli/dev/tui/theme.d.ts +3 -1
  31. package/dist/src/cli/dev/tui/theme.js +1 -1
  32. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  33. package/dist/src/cli/dev/tui/tui.d.ts +6 -0
  34. package/dist/src/cli/dev/tui/tui.js +1 -1
  35. package/dist/src/cli/dev/tui/vercel-status.d.ts +4 -4
  36. package/dist/src/cli/dev/tui/vercel-status.js +1 -1
  37. package/dist/src/cli/run.d.ts +4 -3
  38. package/dist/src/cli/run.js +2 -2
  39. package/dist/src/client/client.js +1 -1
  40. package/dist/src/client/session-utils.d.ts +1 -0
  41. package/dist/src/client/session-utils.js +1 -1
  42. package/dist/src/client/session.d.ts +1 -0
  43. package/dist/src/client/session.js +1 -1
  44. package/dist/src/client/types.d.ts +19 -0
  45. package/dist/src/compiled/.vendor-stamp.json +1 -2
  46. package/dist/src/compiler/compile-from-memory.js +1 -1
  47. package/dist/src/compiler/manifest.d.ts +28 -7
  48. package/dist/src/compiler/manifest.js +1 -1
  49. package/dist/src/compiler/normalize-agent-config.js +1 -1
  50. package/dist/src/compiler/normalize-sandbox.js +1 -1
  51. package/dist/src/evals/cli/eval-client.js +1 -1
  52. package/dist/src/execution/sandbox/bash-tool.js +1 -1
  53. package/dist/src/execution/sandbox/bindings/docker-base-setup.d.ts +9 -0
  54. package/dist/src/execution/sandbox/bindings/docker-base-setup.js +2 -0
  55. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +77 -0
  56. package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -0
  57. package/dist/src/execution/sandbox/bindings/docker-container.d.ts +16 -0
  58. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -0
  59. package/dist/src/execution/sandbox/bindings/docker-network.d.ts +8 -0
  60. package/dist/src/execution/sandbox/bindings/docker-network.js +1 -0
  61. package/dist/src/execution/sandbox/bindings/docker-options.d.ts +21 -0
  62. package/dist/src/execution/sandbox/bindings/docker-options.js +1 -0
  63. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +7 -0
  64. package/dist/src/execution/sandbox/bindings/docker-session.js +2 -0
  65. package/dist/src/execution/sandbox/bindings/docker-templates.d.ts +35 -0
  66. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -0
  67. package/dist/src/execution/sandbox/bindings/docker-utils.d.ts +2 -0
  68. package/dist/src/execution/sandbox/bindings/docker-utils.js +1 -0
  69. package/dist/src/execution/sandbox/bindings/docker.d.ts +33 -0
  70. package/dist/src/execution/sandbox/bindings/docker.js +1 -0
  71. package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +30 -0
  72. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -0
  73. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +33 -0
  74. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -0
  75. package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +23 -0
  76. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -0
  77. package/dist/src/execution/sandbox/bindings/local-template-prune.d.ts +16 -0
  78. package/dist/src/execution/sandbox/bindings/local-template-prune.js +1 -0
  79. package/dist/src/execution/sandbox/bindings/local.d.ts +16 -25
  80. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  81. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +16 -0
  82. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -0
  83. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +21 -0
  84. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -0
  85. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +18 -0
  86. package/dist/src/execution/sandbox/bindings/microsandbox-network.js +1 -0
  87. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +34 -0
  88. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -0
  89. package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +22 -0
  90. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +178 -0
  91. package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +3 -0
  92. package/dist/src/execution/sandbox/bindings/microsandbox-process.js +1 -0
  93. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +75 -0
  94. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -0
  95. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +13 -0
  96. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -0
  97. package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +22 -0
  98. package/dist/src/execution/sandbox/bindings/microsandbox.js +1 -0
  99. package/dist/src/execution/sandbox/bindings/vercel-create-api.d.ts +20 -0
  100. package/dist/src/execution/sandbox/bindings/vercel-create-api.js +1 -0
  101. package/dist/src/execution/sandbox/bindings/vercel.d.ts +7 -8
  102. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  103. package/dist/src/execution/sandbox/development-cleanup.d.ts +4 -0
  104. package/dist/src/execution/sandbox/development-cleanup.js +1 -0
  105. package/dist/src/execution/sandbox/development-prewarm.d.ts +15 -0
  106. package/dist/src/execution/sandbox/development-prewarm.js +1 -0
  107. package/dist/src/execution/sandbox/development-run.d.ts +8 -0
  108. package/dist/src/execution/sandbox/development-run.js +1 -0
  109. package/dist/src/execution/sandbox/ensure.js +1 -1
  110. package/dist/src/execution/sandbox/lazy-backend.d.ts +1 -1
  111. package/dist/src/execution/sandbox/logging-session.d.ts +5 -0
  112. package/dist/src/execution/sandbox/logging-session.js +1 -0
  113. package/dist/src/execution/sandbox/prewarm.js +1 -1
  114. package/dist/src/execution/sandbox/template-prewarm-lock.d.ts +8 -0
  115. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -0
  116. package/dist/src/internal/application/optional-package-install.d.ts +40 -0
  117. package/dist/src/internal/application/optional-package-install.js +1 -0
  118. package/dist/src/internal/application/package.js +1 -1
  119. package/dist/src/internal/authored-definition/sandbox.d.ts +1 -1
  120. package/dist/src/internal/authored-definition/sandbox.js +1 -1
  121. package/dist/src/internal/authored-module-loader.js +2 -2
  122. package/dist/src/internal/classify-model-routing.d.ts +24 -0
  123. package/dist/src/internal/classify-model-routing.js +1 -0
  124. package/dist/src/internal/nitro/host/channel-routes.js +2 -2
  125. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.d.ts +5 -2
  126. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +1 -1
  127. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +10 -0
  128. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  129. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  130. package/dist/src/internal/nitro/host/dev-live-virtual-modules.d.ts +15 -0
  131. package/dist/src/internal/nitro/host/dev-live-virtual-modules.js +1 -0
  132. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.d.ts +28 -0
  133. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -0
  134. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  135. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +2 -0
  136. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  137. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +4 -0
  138. package/dist/src/internal/nitro/routes/info.js +1 -1
  139. package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
  140. package/dist/src/internal/resolve-model-endpoint-status.d.ts +23 -0
  141. package/dist/src/internal/resolve-model-endpoint-status.js +1 -0
  142. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  143. package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
  144. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  145. package/dist/src/public/definitions/sandbox-backend.js +1 -1
  146. package/dist/src/public/sandbox/backends/default.d.ts +37 -10
  147. package/dist/src/public/sandbox/backends/default.js +1 -1
  148. package/dist/src/public/sandbox/backends/docker.d.ts +14 -0
  149. package/dist/src/public/sandbox/backends/docker.js +1 -0
  150. package/dist/src/public/sandbox/backends/just-bash.d.ts +17 -0
  151. package/dist/src/public/sandbox/backends/just-bash.js +1 -0
  152. package/dist/src/public/sandbox/backends/microsandbox.d.ts +17 -0
  153. package/dist/src/public/sandbox/backends/microsandbox.js +1 -0
  154. package/dist/src/public/sandbox/backends/vercel.d.ts +5 -2
  155. package/dist/src/public/sandbox/backends/vercel.js +1 -1
  156. package/dist/src/public/sandbox/docker-sandbox.d.ts +45 -0
  157. package/dist/src/public/sandbox/index.d.ts +8 -4
  158. package/dist/src/public/sandbox/index.js +1 -1
  159. package/dist/src/public/sandbox/just-bash-sandbox.d.ts +17 -0
  160. package/dist/src/public/sandbox/just-bash-sandbox.js +1 -0
  161. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +54 -0
  162. package/dist/src/public/sandbox/microsandbox-sandbox.js +1 -0
  163. package/dist/src/public/sandbox/vercel-sandbox.d.ts +1 -1
  164. package/dist/src/runtime/compiled-artifacts-source.d.ts +11 -0
  165. package/dist/src/runtime/compiled-artifacts-source.js +1 -1
  166. package/dist/src/runtime/resolve-sandbox.js +1 -1
  167. package/dist/src/runtime/sandbox/keys.js +1 -1
  168. package/dist/src/runtime/sandbox/registry.d.ts +2 -2
  169. package/dist/src/runtime/types.d.ts +1 -1
  170. package/dist/src/runtime/workspace/spec.js +1 -1
  171. package/dist/src/setup/boxes/add-channels.d.ts +3 -2
  172. package/dist/src/setup/boxes/add-channels.js +2 -2
  173. package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
  174. package/dist/src/setup/boxes/deploy-project.js +1 -1
  175. package/dist/src/setup/boxes/link-project.js +1 -1
  176. package/dist/src/setup/boxes/resolve-provisioning.d.ts +6 -0
  177. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  178. package/dist/src/setup/boxes/select-model.d.ts +2 -2
  179. package/dist/src/setup/boxes/select-model.js +1 -1
  180. package/dist/src/setup/cli/channel-setup-prompter.d.ts +28 -0
  181. package/dist/src/setup/cli/channel-setup-prompter.js +1 -1
  182. package/dist/src/setup/cli/index.d.ts +2 -2
  183. package/dist/src/setup/cli/index.js +1 -1
  184. package/dist/src/setup/cli/option-row.d.ts +89 -0
  185. package/dist/src/setup/cli/option-row.js +1 -0
  186. package/dist/src/setup/cli/prompt-ui.d.ts +15 -29
  187. package/dist/src/setup/cli/prompt-ui.js +2 -2
  188. package/dist/src/setup/cli/select-component.d.ts +4 -3
  189. package/dist/src/setup/cli/select-component.js +1 -1
  190. package/dist/src/setup/cli/select-state.d.ts +3 -3
  191. package/dist/src/setup/cli/select-state.js +1 -1
  192. package/dist/src/setup/flows/channels.d.ts +29 -14
  193. package/dist/src/setup/flows/channels.js +1 -1
  194. package/dist/src/setup/flows/deploy.d.ts +1 -0
  195. package/dist/src/setup/flows/deploy.js +1 -1
  196. package/dist/src/setup/flows/link.d.ts +1 -0
  197. package/dist/src/setup/flows/link.js +1 -1
  198. package/dist/src/setup/flows/model.d.ts +30 -6
  199. package/dist/src/setup/flows/model.js +1 -1
  200. package/dist/src/setup/flows/vercel.d.ts +4 -1
  201. package/dist/src/setup/flows/vercel.js +2 -2
  202. package/dist/src/setup/index.js +1 -1
  203. package/dist/src/setup/primitives/open-url.d.ts +14 -0
  204. package/dist/src/setup/primitives/open-url.js +1 -0
  205. package/dist/src/setup/primitives/pm/pnpm.d.ts +9 -0
  206. package/dist/src/setup/primitives/pm/pnpm.js +2 -2
  207. package/dist/src/setup/primitives/pm/run.d.ts +12 -4
  208. package/dist/src/setup/primitives/pm/run.js +1 -1
  209. package/dist/src/setup/primitives/pm/types.d.ts +3 -0
  210. package/dist/src/setup/primitives/process-abort.d.ts +7 -0
  211. package/dist/src/setup/primitives/process-abort.js +1 -0
  212. package/dist/src/setup/primitives/run-vercel.d.ts +2 -0
  213. package/dist/src/setup/primitives/run-vercel.js +1 -1
  214. package/dist/src/setup/project-resolution.d.ts +6 -3
  215. package/dist/src/setup/project-resolution.js +1 -1
  216. package/dist/src/setup/prompter.d.ts +63 -6
  217. package/dist/src/setup/prompter.js +1 -1
  218. package/dist/src/setup/run-vercel-link.d.ts +1 -1
  219. package/dist/src/setup/run-vercel-link.js +1 -1
  220. package/dist/src/setup/runner.d.ts +2 -0
  221. package/dist/src/setup/runner.js +1 -1
  222. package/dist/src/setup/scaffold/channels-catalog.d.ts +2 -0
  223. package/dist/src/setup/scaffold/channels-catalog.js +1 -1
  224. package/dist/src/setup/scaffold/create/add-to-project.d.ts +1 -0
  225. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  226. package/dist/src/setup/scaffold/create/project.d.ts +2 -0
  227. package/dist/src/setup/scaffold/create/project.js +6 -3
  228. package/dist/src/setup/scaffold/update/channels.d.ts +2 -0
  229. package/dist/src/setup/scaffold/update/channels.js +3 -3
  230. package/dist/src/setup/slack-connect-lifecycle.d.ts +97 -0
  231. package/dist/src/setup/slack-connect-lifecycle.js +1 -0
  232. package/dist/src/setup/slack-connect.d.ts +51 -0
  233. package/dist/src/setup/slack-connect.js +1 -0
  234. package/dist/src/setup/slackbot.d.ts +60 -47
  235. package/dist/src/setup/slackbot.js +1 -1
  236. package/dist/src/setup/state.d.ts +2 -1
  237. package/dist/src/setup/state.js +1 -1
  238. package/dist/src/setup/step.d.ts +4 -0
  239. package/dist/src/setup/validate-gateway-key.d.ts +30 -0
  240. package/dist/src/setup/validate-gateway-key.js +1 -0
  241. package/dist/src/setup/vercel-project.d.ts +19 -12
  242. package/dist/src/setup/vercel-project.js +1 -1
  243. package/dist/src/shared/agent-definition.d.ts +26 -0
  244. package/dist/src/shared/model-endpoint-status.d.ts +27 -0
  245. package/dist/src/shared/model-endpoint-status.js +1 -0
  246. package/dist/src/shared/sandbox-backend.d.ts +8 -2
  247. package/dist/src/shared/sandbox-definition.d.ts +4 -3
  248. package/dist/src/shared/sandbox-network-policy.d.ts +4 -2
  249. package/dist/src/shared/sandbox-session.d.ts +3 -2
  250. package/dist/src/svelte/index.js +1 -1
  251. package/dist/src/svelte/use-eve-agent.js +1 -1
  252. package/dist/src/vue/index.js +1 -1
  253. package/dist/src/vue/use-eve-agent.js +1 -1
  254. package/{dist/docs/public → docs}/getting-started.mdx +14 -4
  255. package/{dist/docs/public → docs}/guides/deployment.md +3 -3
  256. package/{dist/docs/public → docs}/guides/dev-tui.md +2 -2
  257. package/{dist/docs/public → docs}/reference/cli.md +2 -1
  258. package/{dist/docs/public → docs}/sandbox.mdx +39 -15
  259. package/package.json +11 -1
  260. package/dist/src/compiled/just-bash/LICENSE +0 -201
  261. package/dist/src/compiled/just-bash/index.d.ts +0 -139
  262. package/dist/src/compiled/just-bash/index.js +0 -2200
  263. package/dist/src/compiled/just-bash/network/types.d.ts +0 -155
  264. package/dist/src/public/sandbox/backends/local.d.ts +0 -16
  265. package/dist/src/public/sandbox/backends/local.js +0 -1
  266. package/dist/src/public/sandbox/local-sandbox.d.ts +0 -7
  267. /package/dist/src/public/sandbox/{local-sandbox.js → docker-sandbox.js} +0 -0
  268. /package/{dist/docs/public → docs}/README.md +0 -0
  269. /package/{dist/docs/public → docs}/agent-config.md +0 -0
  270. /package/{dist/docs/public → docs}/channels/custom.mdx +0 -0
  271. /package/{dist/docs/public → docs}/channels/discord.mdx +0 -0
  272. /package/{dist/docs/public → docs}/channels/eve.mdx +0 -0
  273. /package/{dist/docs/public → docs}/channels/github.mdx +0 -0
  274. /package/{dist/docs/public → docs}/channels/linear.mdx +0 -0
  275. /package/{dist/docs/public → docs}/channels/meta.json +0 -0
  276. /package/{dist/docs/public → docs}/channels/overview.mdx +0 -0
  277. /package/{dist/docs/public → docs}/channels/slack.mdx +0 -0
  278. /package/{dist/docs/public → docs}/channels/teams.mdx +0 -0
  279. /package/{dist/docs/public → docs}/channels/telegram.mdx +0 -0
  280. /package/{dist/docs/public → docs}/channels/twilio.mdx +0 -0
  281. /package/{dist/docs/public → docs}/concepts/context-control.md +0 -0
  282. /package/{dist/docs/public → docs}/concepts/default-harness.md +0 -0
  283. /package/{dist/docs/public → docs}/concepts/execution-model-and-durability.md +0 -0
  284. /package/{dist/docs/public → docs}/concepts/meta.json +0 -0
  285. /package/{dist/docs/public → docs}/concepts/security-model.md +0 -0
  286. /package/{dist/docs/public → docs}/concepts/sessions-runs-and-streaming.md +0 -0
  287. /package/{dist/docs/public → docs}/connections.mdx +0 -0
  288. /package/{dist/docs/public → docs}/evals/assertions.mdx +0 -0
  289. /package/{dist/docs/public → docs}/evals/cases.mdx +0 -0
  290. /package/{dist/docs/public → docs}/evals/judge.mdx +0 -0
  291. /package/{dist/docs/public → docs}/evals/meta.json +0 -0
  292. /package/{dist/docs/public → docs}/evals/overview.mdx +0 -0
  293. /package/{dist/docs/public → docs}/evals/reporters.mdx +0 -0
  294. /package/{dist/docs/public → docs}/evals/running.mdx +0 -0
  295. /package/{dist/docs/public → docs}/evals/targets.mdx +0 -0
  296. /package/{dist/docs/public → docs}/guides/auth-and-route-protection.md +0 -0
  297. /package/{dist/docs/public → docs}/guides/client/continuations.mdx +0 -0
  298. /package/{dist/docs/public → docs}/guides/client/messages.mdx +0 -0
  299. /package/{dist/docs/public → docs}/guides/client/meta.json +0 -0
  300. /package/{dist/docs/public → docs}/guides/client/output-schema.mdx +0 -0
  301. /package/{dist/docs/public → docs}/guides/client/overview.mdx +0 -0
  302. /package/{dist/docs/public → docs}/guides/client/streaming.mdx +0 -0
  303. /package/{dist/docs/public → docs}/guides/dynamic-capabilities.md +0 -0
  304. /package/{dist/docs/public → docs}/guides/dynamic-workflows.md +0 -0
  305. /package/{dist/docs/public → docs}/guides/frontend/meta.json +0 -0
  306. /package/{dist/docs/public → docs}/guides/frontend/nextjs.mdx +0 -0
  307. /package/{dist/docs/public → docs}/guides/frontend/nuxt.mdx +0 -0
  308. /package/{dist/docs/public → docs}/guides/frontend/overview.mdx +0 -0
  309. /package/{dist/docs/public → docs}/guides/frontend/sveltekit.mdx +0 -0
  310. /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-svelte.mdx +0 -0
  311. /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-vue.mdx +0 -0
  312. /package/{dist/docs/public → docs}/guides/hooks.md +0 -0
  313. /package/{dist/docs/public → docs}/guides/instrumentation.md +0 -0
  314. /package/{dist/docs/public → docs}/guides/meta.json +0 -0
  315. /package/{dist/docs/public → docs}/guides/remote-agents.md +0 -0
  316. /package/{dist/docs/public → docs}/guides/session-context.md +0 -0
  317. /package/{dist/docs/public → docs}/guides/state.md +0 -0
  318. /package/{dist/docs/public → docs}/instructions.mdx +0 -0
  319. /package/{dist/docs/public → docs}/introduction.md +0 -0
  320. /package/{dist/docs/public → docs}/meta.json +0 -0
  321. /package/{dist/docs/public → docs}/reference/meta.json +0 -0
  322. /package/{dist/docs/public → docs}/reference/project-layout.md +0 -0
  323. /package/{dist/docs/public → docs}/reference/typescript-api.md +0 -0
  324. /package/{dist/docs/public → docs}/schedules.mdx +0 -0
  325. /package/{dist/docs/public → docs}/skills.mdx +0 -0
  326. /package/{dist/docs/public → docs}/subagents.mdx +0 -0
  327. /package/{dist/docs/public → docs}/tools.mdx +0 -0
  328. /package/{dist/docs/public → docs}/tutorial/connect-a-warehouse.mdx +0 -0
  329. /package/{dist/docs/public → docs}/tutorial/first-agent.mdx +0 -0
  330. /package/{dist/docs/public → docs}/tutorial/guard-the-spend.mdx +0 -0
  331. /package/{dist/docs/public → docs}/tutorial/how-it-runs.mdx +0 -0
  332. /package/{dist/docs/public → docs}/tutorial/meta.json +0 -0
  333. /package/{dist/docs/public → docs}/tutorial/query-sample-data.mdx +0 -0
  334. /package/{dist/docs/public → docs}/tutorial/remember-definitions.mdx +0 -0
  335. /package/{dist/docs/public → docs}/tutorial/run-analysis.mdx +0 -0
  336. /package/{dist/docs/public → docs}/tutorial/ship-it.mdx +0 -0
  337. /package/{dist/docs/public → docs}/tutorial/team-playbooks.mdx +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,50 @@
1
1
  # eve
2
2
 
3
+ ## 0.8.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 0e6a518: Route `eve dev` startup sandbox prewarm logs into the TUI sandbox section instead of printing them above the interface. Fast prewarms are retained for the TUI startup replay, so the sandbox progress is still visible without corrupting the terminal frame.
8
+
9
+ ## 0.8.0
10
+
11
+ ### Minor Changes
12
+
13
+ - b460a24: Add explicit sandbox backends for Docker, microsandbox, just-bash, and Vercel, with `defaultBackend()` choosing the best available backend for local dev.
14
+
15
+ Docker and microsandbox now use Ubuntu 26.04 and show sandbox initialization progress directly in the dev TUI.
16
+
17
+ - d1caa14: Slack Connect provisioning now keeps fresh requests controllable with "Try again" and "Cancel", while stale project-owned connectors offer a safe "Stop waiting" path with manual recovery instructions. Retry starts a fresh request only after exact connector removal, connector reuse is scoped to the linked project, and `ProvisionSlackbotResult` now uses `state` as its sole lifecycle discriminant without redundant `created` or `attached` fields. After a deploy-and-chat, Eve now opens your browser straight to a direct message with the bot (the Slack Messages tab) instead of the app's about page; `ProvisionSlackbotResult.workspaceUrl` is renamed to `chatUrl` to reflect this.
18
+
19
+ ### Patch Changes
20
+
21
+ - 06fa3c4: Picking a new Vercel project name no longer prints a duplicate warning when the name is taken. Only the line naming the project and team shows, without the redundant "Project name unavailable" headline above it.
22
+ - d1caa14: The dev TUI `/channels` menu now reads as a channel task list: Terminal UI and configured channels stay visible as checked, non-selectable items with an "Already installed" focus hint, available channels remain selectable, and the latest add outcome appears below the list. Channels that provision against Vercel (Slack) are disabled while the directory is unlinked with a yellow "Requires Vercel account, see /model" hint instead of walking inline link pickers.
23
+ - d1caa14: The dev TUI status-line pending-deploy marker now reads `/deploy pending` instead of `deploy pending`, naming the command that ships the pending channel changes.
24
+ - 467267d: `eve dev` now accepts `--input <text>` to pre-fill the first prompt without submitting it. `eve init` uses this to open new agents with `/model` ready to edit or send.
25
+ - 06fa3c4: Adding a channel while `eve dev` runs now works end to end. New projects ship `@vercel/connect` from `eve init`, so a later `eve channels add slack` never introduces a missing dependency; on existing projects, authored modules that import a not-yet-installed package fail at bundle time with an actionable message instead of poisoning Node's resolver cache (which previously kept the rebuild failing even after install until restart). Channel routes added mid-session mount in the dev worker instead of crashing it with an unresolved virtual module.
26
+ - dcd600e: Move bundled documentation from `node_modules/eve/dist/docs` to `node_modules/eve/docs`. Scaffolded agent instructions and package docs now point agents at the new package docs root, and pnpm setup now prefers the active pnpm executable over an older `PNPM_HOME` binary when both are present.
27
+ - d1caa14: `eve dev`'s setup commands (/deploy, /channels, /model) now keep a failed command's captured subprocess output in the transcript after the flow panel closes, so a `vercel deploy --prod` failure shows the actual deploy error instead of only the exit-code summary. The settled-output buffer also grew from 8 to 40 lines so a build error's tail survives.
28
+ - 06fa3c4: Dev TUI setup commands (/model, /channels, /deploy) can now be interrupted while they wait on setup work. Ctrl-C or Esc aborts the active subprocess and waits for the setup stack to unwind before returning to the prompt, so no abandoned command keeps mutating the project in the background.
29
+ - d1caa14: Typing a complete slash command in the dev TUI (e.g. `/model`) now collapses the suggestion dropdown into a dim argument hint trailing the prompt (`❯ /model [provider/model]`) instead of a one-row list above it. Partial or ambiguous drafts still open the list, which no longer windows commands out of view on a bare `/`.
30
+ - 06fa3c4: The `/model` and `eve link` flows are much quieter. The configure menu gains an explicit Done row, a taken project name warns inline with the "New project name" question (and disappears once a free name is submitted), the redundant "not linked yet", "Connected the agent…", "Model credentials ready…", and "reloads env files…" lines are gone, the provider outcome notice is a short "Connected to AI Gateway", and a source reload no longer repeats an unchanged agent banner in the dev TUI.
31
+ - d1caa14: `eve link` and the dev TUI's project-connection flow now go directly from team selection to the existing-project list, without repeating the create-or-link question used by onboarding.
32
+ - d1caa14: The dev TUI decides AI Gateway readiness from how the agent's model routes, not from whether a Vercel project is linked. The compiler records each model's routing (gateway or external provider) in the manifest, and `/eve/v1/info` exposes it. The status bar shows `AI Gateway (project)` when connected, a yellow `⚠ AI Gateway` when the gateway has no credential, or `External endpoint` for a direct provider, and it drops the token counter until a turn moves a token. The "provider required" setup prompt now appears only when the model routes through the gateway with no credential. In `/model`, changing the model is disabled when it's set via an SDK model call (Eve can't rewrite that source), and changing the provider is disabled for an external endpoint.
33
+ - d1caa14: The dev TUI `/model` menu now opens on the row that matters first — the provider row when no provider is configured — and lands the cursor on "Done" after any completed sub-flow. The apply line reads `Model changed to <model>. Live on your next prompt.` (model bolded), and the provider outcome reads `Project linked. Connected to AI Gateway via …`.
34
+ - d1caa14: The dev TUI `/model` panel header now reads "Configure the agent model", and the menu inside it drops its redundant second title.
35
+ - 06fa3c4: Setup-owned `pnpm install` now determines ancestor-workspace membership before installing. Claimed members keep native workspace resolution for `workspace:*` and `catalog:` dependencies, while unclaimed nested projects install standalone without first running the ancestor workspace or its lifecycle scripts.
36
+ - d1caa14: While an `eve dev` turn is running, live thinking and activity render above the persistent chat prompt instead of replacing it.
37
+ - d1caa14: The dev TUI now refreshes its cached Vercel project identity after provider setup, so re-linking updates the status line without restarting `eve dev`.
38
+ - d1caa14: After a Slack channel connects in the dev TUI `/channels` flow, a "See it live" prompt offers "Deploy and chat" — which deploys the agent and then surfaces the Slack workspace link so you can message the bot — or "Later", which returns to the channel list.
39
+ - d1caa14: Dev TUI setup panel fixes: clipped rows now close their color spans so an overflowing notice can no longer bleed its color into the question and input below; the taken-project-name warning is fully yellow with the names in the default foreground; and /model and /channels panels carry a constant title (Agent model, Agent channels) like /deploy.
40
+ - 06fa3c4: Slack channel files are only scaffolded after a fully successful Slack connection. Provisioning reuses an existing project connector on reruns, enforces one five-minute deadline for the browser install, and reports lookup failures separately from a still-pending installation.
41
+ - d1caa14: The dev TUI `/model` provider gate ("Which model provider…") and gateway connection gate ("How do you want to connect…") now render stacked — each option's hint on its own line beneath the label — matching the model menu's primary entry point.
42
+ - d1caa14: The `eve dev` setup panels now use one aligned state-glyph column across model, channel, team, and project selection, with aligned searchable-list metadata. Focusing the new-project row turns its name into an inline editor, so typing and editing keys rename it directly.
43
+ - d1caa14: Setup pickers now share one option-row renderer across the CLI prompts and the dev TUI, so every list looks the same: a single state glyph that changes on hover, hints tab-aligned to a shared column (and only to rows that actually carry a hint), and dimmed (no longer struck-through) disabled rows. A completed row under the cursor reads as inert — a dim pointer rather than a green check — and an editable row (the Vercel project name) is renamed by hovering it and typing or backspacing, with a blinking caret parked after the value.
44
+ - d1caa14: When you paste an `AI_GATEWAY_API_KEY` in the `/model` provider setup, Eve round-trips it against the AI Gateway before saving. It shows "Validating…", then "✓ Valid key" on success. A rejected key isn't saved; you return to the prompt to retry (or Esc to cancel). If the gateway can't be reached, Eve saves the key with a warning rather than block on a flaky network.
45
+ - d1caa14: The scaffolded `.vercelignore` now also excludes `.workflow-data` and `.env*`, so `vercel deploy` from an app directory neither uploads workflow state nor a bare `.env` file (Vercel only default-ignores `.env.local` variants), and dev artifacts can no longer push the upload past the platform's request-size limit.
46
+ - 7dfcefe: The dev TUI now wraps long agent question prompts (and connection-auth titles) to the terminal width. Previously a prompt wider than the terminal soft-wrapped underneath the live region's row accounting, leaking a duplicate copy of the question line into scrollback on every repaint.
47
+
3
48
  ## 0.7.4
4
49
 
5
50
  ### Patch Changes
package/README.md CHANGED
@@ -61,7 +61,7 @@ Runtime accessors live on the subpath that owns the concern:
61
61
  - `getSkill(identifier)` — handle for a named skill visible to the current agent (`eve/skills`)
62
62
  - `getContext(key)`, `requireContext(key)`, `hasContext(key)`, `setContext(key)`, `ensureContext(key, factory)` — unified context helpers (`eve/context`)
63
63
 
64
- The complete API reference, including types and lower-level runtime primitives, is in [`./dist/docs/public/reference/typescript-api.md`](./dist/docs/public/reference/typescript-api.md).
64
+ The complete API reference, including types and lower-level runtime primitives, is in [`./docs/reference/typescript-api.md`](./docs/reference/typescript-api.md).
65
65
 
66
66
  ## Tiny Example
67
67
 
@@ -124,22 +124,22 @@ CLI commands:
124
124
 
125
125
  ## Deploying
126
126
 
127
- Eve is built for Vercel. The runtime is Nitro + Vercel Workflows. Read [`./dist/docs/public/advanced/deployment.md`](./dist/docs/public/advanced/deployment.md) for the deployment path, environment variables, and Vercel-specific configuration.
127
+ Eve is built for Vercel. The runtime is Nitro + Vercel Workflows. Read [`./docs/guides/deployment.md`](./docs/guides/deployment.md) for the deployment path, environment variables, and Vercel-specific configuration.
128
128
 
129
129
  ## Read Next
130
130
 
131
- These files ship inside the installed package at `node_modules/eve/dist/docs/public/`:
131
+ These files ship inside the installed package at `node_modules/eve/docs/`:
132
132
 
133
- - [Full docs index](./dist/docs/public/README.md) — recommended entry point
134
- - [Getting Started](./dist/docs/public/getting-started.mdx) — install, scaffold, and run locally
135
- - [Project Layout](./dist/docs/public/reference/project-layout.md) — every authored directory in depth
136
- - [`agent.ts`](./dist/docs/public/agent-config.md) — agent config reference
137
- - [TypeScript API](./dist/docs/public/reference/typescript-api.md) — complete `define*` and runtime helper reference
138
- - [Vercel Deployment](./dist/docs/public/advanced/deployment.md) — deploy to production
133
+ - [Full docs index](./docs/README.md) — recommended entry point
134
+ - [Getting Started](./docs/getting-started.mdx) — install, scaffold, and run locally
135
+ - [Project Layout](./docs/reference/project-layout.md) — every authored directory in depth
136
+ - [`agent.ts`](./docs/agent-config.md) — agent config reference
137
+ - [TypeScript API](./docs/reference/typescript-api.md) — complete `define*` and runtime helper reference
138
+ - [Vercel Deployment](./docs/guides/deployment.md) — deploy to production
139
139
 
140
- By authoring concern: [Tools](./dist/docs/public/tools.mdx) · [Channels](./dist/docs/public/channels/overview.mdx) · [Hooks](./dist/docs/public/advanced/hooks.md) · [Skills](./dist/docs/public/skills.mdx) · [Sandbox](./dist/docs/public/sandbox.mdx) · [Connections](./dist/docs/public/connections.mdx) · [Subagents](./dist/docs/public/subagents.mdx) · [Schedules](./dist/docs/public/schedules.mdx) · [Evals](./dist/docs/public/advanced/evals.md)
140
+ By authoring concern: [Tools](./docs/tools.mdx) · [Channels](./docs/channels/overview.mdx) · [Hooks](./docs/guides/hooks.md) · [Skills](./docs/skills.mdx) · [Sandbox](./docs/sandbox.mdx) · [Connections](./docs/connections.mdx) · [Subagents](./docs/subagents.mdx) · [Schedules](./docs/schedules.mdx) · [Evals](./docs/evals/overview.mdx)
141
141
 
142
- By runtime concern: [Sessions and Streaming](./dist/docs/public/advanced/sessions-runs-and-streaming.md) · [Session Context](./dist/docs/public/advanced/session-context.md) · [Context Control](./dist/docs/public/advanced/context-control.md) · [Auth and Route Protection](./dist/docs/public/advanced/auth-and-route-protection.md) · [CLI, Build, and Debugging](./dist/docs/public/reference/cli.md) · [Instrumentation](./dist/docs/public/advanced/instrumentation.md)
142
+ By runtime concern: [Sessions and Streaming](./docs/concepts/sessions-runs-and-streaming.md) · [Session Context](./docs/guides/session-context.md) · [Context Control](./docs/concepts/context-control.md) · [Auth and Route Protection](./docs/guides/auth-and-route-protection.md) · [CLI, Build, and Debugging](./docs/reference/cli.md) · [Instrumentation](./docs/guides/instrumentation.md)
143
143
 
144
144
  ## Architecture (Internals)
145
145
 
@@ -132,7 +132,7 @@ function createInitialSessionState() {
132
132
  function advanceSession(input) {
133
133
  const boundaryEvent = findBoundaryEvent(input.events);
134
134
  const streamIndex = input.session.streamIndex + input.events.length;
135
- if (boundaryEvent?.type === "session.waiting") return {
135
+ if (boundaryEvent?.type === "session.waiting" || input.preserveCompletedSessions === true && boundaryEvent?.type === "session.completed") return {
136
136
  continuationToken: input.continuationToken ?? input.session.continuationToken,
137
137
  sessionId: input.sessionId,
138
138
  streamIndex
@@ -402,6 +402,7 @@ var ClientSession = class {
402
402
  this.#state = advanceSession({
403
403
  continuationToken,
404
404
  events,
405
+ preserveCompletedSessions: this.#context.preserveCompletedSessions,
405
406
  sessionId,
406
407
  session: initialState
407
408
  });
@@ -436,6 +437,7 @@ var ClientSession = class {
436
437
  this.#state = advanceSession({
437
438
  continuationToken: initialState.continuationToken,
438
439
  events,
440
+ preserveCompletedSessions: this.#context.preserveCompletedSessions,
439
441
  session: {
440
442
  ...initialState,
441
443
  sessionId,
@@ -494,11 +496,13 @@ var Client = class {
494
496
  #headers;
495
497
  #host;
496
498
  #maxReconnectAttempts;
499
+ #preserveCompletedSessions;
497
500
  constructor(options) {
498
501
  this.#host = options.host;
499
502
  this.#auth = options.auth;
500
503
  this.#headers = options.headers;
501
504
  this.#maxReconnectAttempts = options.maxReconnectAttempts ?? 3;
505
+ this.#preserveCompletedSessions = options.preserveCompletedSessions ?? false;
502
506
  }
503
507
  async health() {
504
508
  const url = createClientUrl(this.#host, EVE_HEALTH_ROUTE_PATH);
@@ -539,6 +543,7 @@ var Client = class {
539
543
  return new ClientSession({
540
544
  host: this.#host,
541
545
  maxReconnectAttempts: this.#maxReconnectAttempts,
546
+ preserveCompletedSessions: this.#preserveCompletedSessions,
542
547
  resolveHeaders: (perRequest) => this.#resolveHeaders(perRequest)
543
548
  }, resolved);
544
549
  }
@@ -132,7 +132,7 @@ function createInitialSessionState() {
132
132
  function advanceSession(input) {
133
133
  const boundaryEvent = findBoundaryEvent(input.events);
134
134
  const streamIndex = input.session.streamIndex + input.events.length;
135
- if (boundaryEvent?.type === "session.waiting") return {
135
+ if (boundaryEvent?.type === "session.waiting" || input.preserveCompletedSessions === true && boundaryEvent?.type === "session.completed") return {
136
136
  continuationToken: input.continuationToken ?? input.session.continuationToken,
137
137
  sessionId: input.sessionId,
138
138
  streamIndex
@@ -402,6 +402,7 @@ var ClientSession = class {
402
402
  this.#state = advanceSession({
403
403
  continuationToken,
404
404
  events,
405
+ preserveCompletedSessions: this.#context.preserveCompletedSessions,
405
406
  sessionId,
406
407
  session: initialState
407
408
  });
@@ -436,6 +437,7 @@ var ClientSession = class {
436
437
  this.#state = advanceSession({
437
438
  continuationToken: initialState.continuationToken,
438
439
  events,
440
+ preserveCompletedSessions: this.#context.preserveCompletedSessions,
439
441
  session: {
440
442
  ...initialState,
441
443
  sessionId,
@@ -494,11 +496,13 @@ var Client = class {
494
496
  #headers;
495
497
  #host;
496
498
  #maxReconnectAttempts;
499
+ #preserveCompletedSessions;
497
500
  constructor(options) {
498
501
  this.#host = options.host;
499
502
  this.#auth = options.auth;
500
503
  this.#headers = options.headers;
501
504
  this.#maxReconnectAttempts = options.maxReconnectAttempts ?? 3;
505
+ this.#preserveCompletedSessions = options.preserveCompletedSessions ?? false;
502
506
  }
503
507
  async health() {
504
508
  const url = createClientUrl(this.#host, EVE_HEALTH_ROUTE_PATH);
@@ -539,6 +543,7 @@ var Client = class {
539
543
  return new ClientSession({
540
544
  host: this.#host,
541
545
  maxReconnectAttempts: this.#maxReconnectAttempts,
546
+ preserveCompletedSessions: this.#preserveCompletedSessions,
542
547
  resolveHeaders: (perRequest) => this.#resolveHeaders(perRequest)
543
548
  }, resolved);
544
549
  }
@@ -1 +1 @@
1
- import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{tryInitializeGit}from"./init-git.js";import{join,resolve}from"node:path";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{mkdtemp,rename,rm,stat}from"node:fs/promises";import{EVE_WORDMARK}from"#cli/banner.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{SPINNER_FRAMES,SPINNER_FRAME_MS}from"#setup/cli/rail-log.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{eveDevArguments,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,runPackageManagerInstall,scaffoldBaseProject,spawnPackageManager,tryInitializeGit};async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function addToExistingProject(e,t,n){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve channels add web` from the project afterwards instead.");let r=await n.detectPackageManager(e);return await n.addAgentToProject({projectRoot:e,model:DEFAULT_AGENT_MODEL_ID,packageManager:r.kind}),r.kind}function resolveScaffoldPackageManager(e){return e.detectInvokingPackageManager()??`pnpm`}const EVE_INIT_PACKAGE_VERSION=`latest`;async function scaffoldProject(e,t,n,a,o){let u=resolve(e),d=join(u,t);if(await pathExists(d))throw Error(`Cannot create project because "${d}" already exists.`);let f=await mkdtemp(join(u,`.eve-init-`));try{let e=await o.scaffoldBaseProject({projectName:t,model:DEFAULT_AGENT_MODEL_ID,packageManager:n,targetDirectory:f,evePackageVersion:EVE_INIT_PACKAGE_VERSION});return a.channelWebNextjs===!0&&await o.ensureChannel({projectRoot:e,kind:`web`,packageManager:n,configureVercelServices:!1,webPackageVersions:{evePackageVersion:EVE_INIT_PACKAGE_VERSION}}),await rename(e,d),d}finally{await rm(f,{recursive:!0,force:!0})}}function startSpinner(e,t){if(process.stdout.isTTY!==!0)return e.log(t),{stop(){}};let row=e=>`${import_picocolors.default.green(e)} ${t}`;process.stdout.write(row(SPINNER_FRAMES[0]));let n=0,r=setInterval(()=>{n+=1;let e=SPINNER_FRAMES[n%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];process.stdout.write(`\r\u001B[K${row(e)}`)},SPINNER_FRAME_MS);r.unref?.();let i=!1;return{stop(){i||(i=!0,clearInterval(r),process.stdout.write(`\r\x1B[K`))}}}async function runInitCommand(e,t,n,r,i=defaultDependencies){let a=await resolveTargetDirectory(t,n),o,s;a===void 0?(o=resolveScaffoldPackageManager(i),s=await scaffoldProject(t,parseProjectName(n),o,r,i),e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${import_picocolors.default.bold(s)}`)):(o=await addToExistingProject(a,r,i),s=a,e.log(`${import_picocolors.default.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${import_picocolors.default.bold(s)}`));let c=[],l=startSpinner(e,`Installing dependencies...`),u;try{u=await i.runPackageManagerInstall(o,s,{bypassMinimumReleaseAge:!0,onOutput:e=>c.push(e.text)})}finally{l.stop()}if(!u){for(let t of c)e.error(t);throw Error(`Failed to install dependencies in "${s}".`)}if(e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies`),a===void 0){let t=i.tryInitializeGit(s);t.kind===`failed`&&e.error(import_picocolors.default.yellow(`Git initialization failed: ${t.reason}`))}if(e.log(import_picocolors.default.dim(`$ eve dev`)),!await i.spawnPackageManager(o,s,eveDevArguments(o)))throw Error(`Development server exited unsuccessfully in "${s}".`)}export{runInitCommand};
1
+ import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{tryInitializeGit}from"./init-git.js";import{join,resolve}from"node:path";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{mkdtemp,rename,rm,stat}from"node:fs/promises";import{EVE_WORDMARK}from"#cli/banner.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{SPINNER_FRAMES,SPINNER_FRAME_MS}from"#setup/cli/rail-log.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{eveDevArguments,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,runPackageManagerInstall,scaffoldBaseProject,spawnPackageManager,tryInitializeGit};async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function addToExistingProject(e,t,n){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve channels add web` from the project afterwards instead.");let r=await n.detectPackageManager(e);return await n.addAgentToProject({projectRoot:e,model:DEFAULT_AGENT_MODEL_ID,packageManager:r.kind}),r.kind}function resolveScaffoldPackageManager(e){return e.detectInvokingPackageManager()??`pnpm`}const EVE_INIT_PACKAGE_VERSION=`latest`;async function scaffoldProject(e,t,n,a,o){let u=resolve(e),d=join(u,t);if(await pathExists(d))throw Error(`Cannot create project because "${d}" already exists.`);let p=await mkdtemp(join(u,`.eve-init-`));try{let e=await o.scaffoldBaseProject({projectName:t,model:DEFAULT_AGENT_MODEL_ID,packageManager:n,targetDirectory:p,evePackageVersion:EVE_INIT_PACKAGE_VERSION});return a.channelWebNextjs===!0&&await o.ensureChannel({projectRoot:e,kind:`web`,packageManager:n,configureVercelServices:!1,webPackageVersions:{evePackageVersion:EVE_INIT_PACKAGE_VERSION}}),await rename(e,d),d}finally{await rm(p,{recursive:!0,force:!0})}}function startSpinner(e,t){if(process.stdout.isTTY!==!0)return e.log(t),{stop(){}};let row=e=>`${import_picocolors.default.green(e)} ${t}`;process.stdout.write(row(SPINNER_FRAMES[0]));let n=0,r=setInterval(()=>{n+=1;let e=SPINNER_FRAMES[n%SPINNER_FRAMES.length]??SPINNER_FRAMES[0];process.stdout.write(`\r\u001B[K${row(e)}`)},SPINNER_FRAME_MS);r.unref?.();let i=!1;return{stop(){i||(i=!0,clearInterval(r),process.stdout.write(`\r\x1B[K`))}}}async function runInitCommand(e,t,n,r,i=defaultDependencies){let a=await resolveTargetDirectory(t,n),o,s;a===void 0?(o=resolveScaffoldPackageManager(i),s=await scaffoldProject(t,parseProjectName(n),o,r,i),e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${import_picocolors.default.bold(s)}`)):(o=await addToExistingProject(a,r,i),s=a,e.log(`${import_picocolors.default.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${import_picocolors.default.bold(s)}`));let c=[],l=startSpinner(e,`Installing dependencies...`),u;try{u=await i.runPackageManagerInstall(o,s,{bypassMinimumReleaseAge:!0,onOutput:e=>c.push(e.text)})}finally{l.stop()}if(!u){for(let t of c)e.error(t);throw Error(`Failed to install dependencies in "${s}".`)}if(e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies`),a===void 0){let t=i.tryInitializeGit(s);t.kind===`failed`&&e.error(import_picocolors.default.yellow(`Git initialization failed: ${t.reason}`))}let f=a===void 0,p=f?[...eveDevArguments(o),`--input`,`/model`]:eveDevArguments(o);if(e.log(import_picocolors.default.dim(f?`$ eve dev --input /model`:`$ eve dev`)),!await i.spawnPackageManager(o,s,p))throw Error(`Development server exited unsuccessfully in "${s}".`)}export{runInitCommand};
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import type { Theme } from "./theme.js";
13
13
  export type ToolStatus = "running" | "done" | "error" | "denied" | "approval";
14
- export type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "flow" | "command" | "question" | "subagent" | "subagent-step" | "subagent-tool" | "connection-auth" | "log" | "agent-header";
14
+ export type BlockKind = "user" | "assistant" | "reasoning" | "tool" | "error" | "notice" | "warning" | "result" | "flow" | "command" | "question" | "subagent" | "subagent-step" | "subagent-tool" | "connection-auth" | "sandbox" | "log" | "agent-header";
15
15
  /**
16
16
  * One renderable transcript unit. Fields are interpreted per `kind`; unset
17
17
  * fields are simply omitted from the rendered output.
@@ -1,7 +1,8 @@
1
- import{sliceVisible,visibleLength,wrapVisibleLine}from"./terminal-text.js";import{formatValuePretty,truncate}from"./tool-format.js";import{renderMarkdown}from"./markdown.js";import{isPromptControlCommand}from"./prompt-commands.js";function renderBlockLines(e,n,r,i){let a=nestingPrefix(e.depth??0,r);return renderBody(e,Math.max(8,n-visibleLength(a)),r,i).map(e=>`${a}${e}`)}function nestingPrefix(e,t){return e<=0?``:`${t.colors.orange(t.glyph.rule)} `.repeat(e)}function renderBody(e,t,n,r){switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`log`:return renderLog(e,t,n,r);case`subagent`:return renderSubagentHeader(e,t,n);case`agent-header`:return(e.body??``).split(`
1
+ import{sliceVisible,visibleLength,wrapVisibleLine}from"./terminal-text.js";import{formatValuePretty,truncate}from"./tool-format.js";import{renderMarkdown}from"./markdown.js";import{isPromptControlCommand}from"./prompt-commands.js";function renderBlockLines(e,n,r,i){let a=nestingPrefix(e.depth??0,r);return renderBody(e,Math.max(8,n-visibleLength(a)),r,i).map(e=>`${a}${e}`)}function nestingPrefix(e,t){return e<=0?``:`${t.colors.orange(t.glyph.rule)} `.repeat(e)}function renderBody(e,t,n,r){switch(e.kind){case`user`:return renderUser(e,t,n);case`assistant`:case`subagent-step`:return renderProse(e,t,n);case`reasoning`:return renderReasoning(e,t,n);case`tool`:case`subagent-tool`:return renderTool(e,t,n,r);case`error`:return renderError(e,t,n);case`notice`:return renderNotice(e,t,n);case`warning`:return renderWarning(e,t,n);case`result`:return renderResult(e,t,n);case`flow`:return renderFlow(e,t,n);case`command`:return renderCommand(e,n);case`question`:case`connection-auth`:return renderPreformatted(e,t,n);case`sandbox`:return renderSandbox(e,t,n,r);case`log`:return renderLog(e,t,n,r);case`subagent`:return renderSubagentHeader(e,t,n);case`agent-header`:return(e.body??``).split(`
2
2
  `)}}function renderUser(e,t,n){let r=n.colors.cyan(n.glyph.user);return wrap(e.body??``,t-2).map(e=>`${r} ${e}`)}function renderProse(e,t,r){let i=[],o=e.kind===`subagent-step`,s=o?``:`${r.colors.bold(r.colors.white(r.glyph.brand))} `,c=o?``:` `;e.reasoning&&e.reasoning.trim().length>0&&i.push(...renderReasoningLines(e.reasoning,t,r));let l=(e.body??``).trim();return l.length===0&&i.length===0?[`${s}${r.colors.dim(`thinking${r.glyph.ellipsis}`)}`]:(l.length>0&&renderMarkdown(l).split(`
3
3
  `).flatMap(e=>wrapVisibleLine(e,t-c.length)).forEach((e,t)=>{t===0&&!o&&i.length===0?i.push(`${s}${e}`):i.push(`${c}${e}`)}),i.length>0?i:[`${s}`])}function renderReasoning(e,t,n){return e.collapsed?[`${n.colors.gray(n.glyph.reasoning)} ${n.colors.dim(`thinking`)}`]:renderReasoningLines(e.body??``,t,n,n.glyph.reasoning)}function renderReasoningLines(e,t,n,r){let i=r?2:0,a=wrap(e.trim(),t-i);return a.length===0?[]:a.map((e,t)=>`${r?t===0?`${n.colors.gray(r)} `:` `:``}${n.colors.dim(n.colors.italic(e))}`)}function renderTool(e,t,n,r){let{icon:a,accent:o}=toolGlyph(e.status??`running`,n,r),s=e.title??`tool`,c=t-2,l=truncatePlain(s,c),u=`${a} ${n.colors.bold(l)}`,d=c-l.length-2,f=e.subtitle??``;f.length>0&&d>=6&&(u+=` ${n.colors.gray(truncate(f,d))}`);let p=[u];return e.expanded?p.push(...renderToolExpanded(e,t,n)):e.status===`done`&&e.result&&e.result.length>0?p.push(resultLine(n.glyph.arrow,e.result,t,n,o)):e.status===`error`&&e.result?p.push(resultLine(n.glyph.arrow,e.result,t,n,n.colors.red)):e.status===`denied`&&p.push(resultLine(n.glyph.arrow,`denied`,t,n,n.colors.yellow)),p}function renderToolExpanded(e,t,n){let i=[],push=(e,a,o)=>{if(a!==void 0){i.push(` ${n.colors.dim(e)}`);for(let e of wrap(formatValuePretty(a),t-4))i.push(` ${o(e)}`)}};return push(`input`,e.toolInput,n.colors.gray),e.status===`error`&&e.result?push(`error`,e.result,n.colors.red):push(`output`,e.toolOutput,n.colors.gray),i}function resultLine(e,t,n,r,a){let o=n-4;return` ${r.colors.dim(e)} ${a(truncate(t,o))}`}function toolGlyph(e,t,n){switch(e){case`done`:return{icon:t.colors.green(t.glyph.success),accent:t.colors.gray};case`error`:return{icon:t.colors.red(t.glyph.error),accent:t.colors.red};case`denied`:return{icon:t.colors.yellow(t.glyph.warning),accent:t.colors.yellow};case`approval`:return{icon:t.colors.yellow(t.glyph.question),accent:t.colors.yellow};default:return{icon:t.colors.yellow(n.spinner),accent:t.colors.gray}}}function renderError(e,t,n){let r=n.colors.red(n.colors.bold(n.glyph.error)),i=e.title??`Error`,a=[`${r} ${n.colors.red(n.colors.bold(i))}`];for(let r of wrap(e.body??``,t-2))a.push(` ${colorizeError(r,n)}`);return a.push(...renderErrorDetail(e.detail,t,n)),a}function renderErrorDetail(e,t,n){if(e===void 0||e.trim().length===0)return[];let r=e.split(`
4
- `),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderWarning(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e.body??``,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function paintCommands(e,t){return e.replace(/\/[a-z-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t){let n=t.colors;return[`${n.cyan(t.glyph.user)} ${n.blue(e.body??``)}`]}function renderFlow(e,t,n){let r=n.colors,i=e.title??`info`,a=i===`success`?r.green(n.glyph.success):i===`warning`?r.yellow(n.glyph.warning):i===`error`?r.red(n.glyph.error):r.dim(n.glyph.dot),o=wrap(e.body??``,t-2),paint=e=>i===`info`?r.dim(e):e;return o.map((e,t)=>`${t===0?a:` `} ${paint(e)}`)}function renderResult(e,t,n){let r=n.colors.dim(n.glyph.elbow),i=wrap(e.body??``,t-7);return i.length===0?[` ${r}`]:i.map((e,t)=>t===0?` ${r} ${n.colors.dim(e)}`:` ${n.colors.dim(e)}`)}function renderPreformatted(e,t,r){let i=e.kind===`connection-auth`?r.colors.yellow(r.glyph.connection):r.colors.yellow(r.colors.bold(r.glyph.question)),a=e.title??``,o=[`${i} ${r.colors.bold(a)}`];for(let r of(e.body??``).split(`
5
- `))for(let e of wrapVisibleLine(r,t-2))o.push(` ${e}`);return o}function renderLog(e,r,i,a){let o=e.title===`stderr`,s=o?i.colors.red:i.colors.gray,c=i.colors.dim(i.glyph.rule),l=o?`stderr`:`stdout`,u=i.colors.dim(`${l} ${i.glyph.dot} `),d=visibleLength(u),f=` `.repeat(d),p=a.previous?.kind===`log`&&a.previous.title===e.title,m=(e.body??``).split(`
4
+ `),i=r.slice(0,12),a=i.map(e=>` ${n.colors.dim(truncatePlain(e,Math.max(1,t-2)))}`),o=r.length-i.length;return o>0&&a.push(` ${n.colors.dim(`${n.glyph.ellipsis} +${o} more line${o===1?``:`s`}`)}`),a}const URL_PATTERN=/(https?:\/\/\S+)/u;function colorizeError(e,t){return URL_PATTERN.test(e)?e.split(URL_PATTERN).map((e,n)=>n%2==1?t.colors.cyan(e):t.colors.red(e)).join(``):t.colors.red(e)}function renderNotice(e,t,n){let r=n.colors.dim(n.glyph.dot),i=wrap(e.body??``,t-2);return i.length===0?[r]:i.map(e=>`${r} ${n.colors.dim(e)}`)}function renderWarning(e,t,n){let r=n.colors.yellow(n.glyph.warning);return wrap(e.body??``,t-2).map((e,t)=>`${t===0?r:` `} ${paintCommands(e,n)}`)}function paintCommands(e,t){return e.replace(/\/[a-z-]+/g,e=>isPromptControlCommand(e)?t.colors.blue(e):e)}function renderCommand(e,t){let n=t.colors;return[`${n.cyan(t.glyph.user)} ${n.blue(e.body??``)}`]}function renderFlow(e,t,n){let r=n.colors,i=e.title??`info`,a=i===`success`?r.green(n.glyph.success):i===`warning`?r.yellow(n.glyph.warning):i===`error`?r.red(n.glyph.error):r.dim(n.glyph.dot),o=wrap(e.body??``,t-2),paint=e=>i===`info`?r.dim(e):e;return o.map((e,t)=>`${t===0?a:` `} ${paint(e)}`)}function renderResult(e,t,n){let r=n.colors.dim(n.glyph.elbow),i=wrap(e.body??``,t-7);if(i.length===0)return[` ${r}`];let dim=e=>n.colors.dim(e.replaceAll(`\x1B[22m`,`\x1B[22m\x1B[2m`));return i.map((e,t)=>t===0?` ${r} ${dim(e)}`:` ${dim(e)}`)}function renderPreformatted(e,t,r){let i=e.kind===`connection-auth`?r.colors.yellow(r.glyph.connection):r.colors.yellow(r.colors.bold(r.glyph.question)),a=wrap(e.title??``,t-2),o=a.length===0?[`${i} `]:a.map((e,t)=>t===0?`${i} ${r.colors.bold(e)}`:` ${r.colors.bold(e)}`);for(let r of(e.body??``).split(`
5
+ `))for(let e of wrapVisibleLine(r,t-2))o.push(` ${e}`);return o}function renderSandbox(e,r,i,a){let o=i.colors.cyan(i.glyph.rule),s=i.colors.dim(`sandbox ${i.glyph.dot} `),c=visibleLength(s),l=` `.repeat(c),u=a.previous?.kind===`sandbox`,d=(e.body??``).split(`
6
+ `),f=[];for(let e of d){let t=wrapVisibleLine(e,Math.max(1,r-2-c));for(let e of t){let t=f.length===0&&!u?s:l;f.push(`${o} ${t}${i.colors.gray(e)}`)}}return f.length>0?f:[`${o}`]}function renderLog(e,r,i,a){let o=e.title===`stderr`,s=o?i.colors.red:i.colors.gray,c=i.colors.dim(i.glyph.rule),l=o?`stderr`:`stdout`,u=i.colors.dim(`${l} ${i.glyph.dot} `),d=visibleLength(u),f=` `.repeat(d),p=a.previous?.kind===`log`&&a.previous.title===e.title,m=(e.body??``).split(`
6
7
  `),h=[];for(let e of m){let t=wrapVisibleLine(e,Math.max(1,r-2-d));for(let e of t){let t=h.length===0&&!p?u:f;h.push(`${c} ${t}${i.colors.dim(s(e))}`)}}return h.length>0?h:[`${c}`]}function renderSubagentHeader(e,t,n){let r=truncatePlain(e.title??`subagent`,Math.max(8,t-14));return[`${n.colors.orange(n.glyph.subagent)} ${n.colors.bold(r)} ${n.colors.dim(`subagent`)}`]}function wrap(e,t){return e.trim().length===0?[]:e.split(`
7
8
  `).flatMap(e=>wrapVisibleLine(e,Math.max(1,t)))}function truncatePlain(n,r){return visibleLength(n)<=r?n:sliceVisible(n,r)}export{renderBlockLines};
@@ -38,10 +38,20 @@ export declare function selectedTypeaheadCommand(state: CommandTypeaheadState):
38
38
  * ready for typing it.
39
39
  */
40
40
  export declare function typeaheadCompletion(spec: PromptCommandSpec): string;
41
+ /**
42
+ * When the draft is a complete command name or alias with exactly one match,
43
+ * the dropdown collapses into an inline hint trailing the prompt row. Returns
44
+ * the command's argument shape to paint dim after the input — an empty string
45
+ * for argument-less commands, which still collapse the list — or `undefined`
46
+ * when the list should render normally (partial draft, multiple matches, or a
47
+ * dismissed list).
48
+ */
49
+ export declare function inlineCommandHint(state: CommandTypeaheadState): string | undefined;
41
50
  /**
42
51
  * Paints the suggestion rows (the select-question grammar): the highlight
43
- * carries the cursor glyph and a blue name, every row shows its argument
44
- * hint, aliases, and description dim, and overflow windows around the
45
- * highlight.
52
+ * carries the cursor glyph and a blue name, every row shows its aliases and
53
+ * description dim, and overflow windows around the highlight. The argument
54
+ * hint is held back for the inline exact-match view ({@link inlineCommandHint})
55
+ * — it only earns space once a single command is committed to.
46
56
  */
47
57
  export declare function renderCommandSuggestions(state: CommandTypeaheadState, theme: Theme, width: number): string[];
@@ -1 +1 @@
1
- import{sliceVisible,visibleLength}from"./terminal-text.js";function typeaheadFor(e,t,n){let r=matchingCommands(e,t),i=n===void 0?void 0:n.matches[n.selectedIndex],a=i===void 0?-1:r.indexOf(i);return{query:t,matches:r,selectedIndex:a>=0?a:0,dismissed:n!==void 0&&n.dismissed&&n.query===t}}function matchingCommands(e,t){if(!t.startsWith(`/`)||/\s/.test(t))return[];let n=t.slice(1);return e.filter(e=>[e.name,...e.aliases].some(e=>e.startsWith(n)))}function isTypeaheadOpen(e){return e.matches.length>0&&!e.dismissed}function moveTypeaheadSelection(e,t){let n=e.matches.length;if(n===0)return e;let r=(e.selectedIndex+t+n)%n;return{...e,selectedIndex:r}}function dismissTypeahead(e){return e.dismissed?e:{...e,dismissed:!0}}function selectedTypeaheadCommand(e){return e.matches[e.selectedIndex]}function typeaheadCompletion(e){return`/${e.name}${e.takesArgument?` `:``}`}function renderCommandSuggestions(n,r,i){let a=r.colors,o=n.matches.length,s=Math.min(o,6),c=Math.max(0,Math.min(n.selectedIndex-Math.floor(s/2),o-s)),l=Math.min(c+s,o),u=n.matches.slice(c,l),invocation=e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return`/${e.name}${t}${n}`},d=Math.max(...u.map(e=>invocation(e).length))+2;return u.map((e,t)=>{let i=c+t===n.selectedIndex,o=i?a.cyan(r.glyph.prompt):` `,s=i?a.blue(`/${e.name}`):`/${e.name}`,l=invocation(e).slice(`/${e.name}`.length),u=` `.repeat(d-invocation(e).length);return`${o} ${s}${a.dim(l)}${u}${a.dim(e.description)}`}).map(n=>visibleLength(n)>i?sliceVisible(n,i):n)}export{dismissTypeahead,isTypeaheadOpen,moveTypeaheadSelection,renderCommandSuggestions,selectedTypeaheadCommand,typeaheadCompletion,typeaheadFor};
1
+ import{sliceVisible,visibleLength}from"./terminal-text.js";function typeaheadFor(e,t,n){let r=matchingCommands(e,t),i=n===void 0?void 0:n.matches[n.selectedIndex],a=i===void 0?-1:r.indexOf(i);return{query:t,matches:r,selectedIndex:a>=0?a:0,dismissed:n!==void 0&&n.dismissed&&n.query===t}}function matchingCommands(e,t){if(!t.startsWith(`/`)||/\s/.test(t))return[];let n=t.slice(1);return e.filter(e=>[e.name,...e.aliases].some(e=>e.startsWith(n)))}function isTypeaheadOpen(e){return e.matches.length>0&&!e.dismissed}function moveTypeaheadSelection(e,t){let n=e.matches.length;if(n===0)return e;let r=(e.selectedIndex+t+n)%n;return{...e,selectedIndex:r}}function dismissTypeahead(e){return e.dismissed?e:{...e,dismissed:!0}}function selectedTypeaheadCommand(e){return e.matches[e.selectedIndex]}function typeaheadCompletion(e){return`/${e.name}${e.takesArgument?` `:``}`}function inlineCommandHint(e){if(e.dismissed||e.matches.length!==1)return;let t=e.matches[0],n=e.query.startsWith(`/`)?e.query.slice(1):e.query;if([t.name,...t.aliases].includes(n))return t.argumentHint??``}function renderCommandSuggestions(n,r,i){let a=r.colors,o=n.matches.length,s=Math.min(o,8),c=Math.max(0,Math.min(n.selectedIndex-Math.floor(s/2),o-s)),l=Math.min(c+s,o),u=n.matches.slice(c,l),invocation=e=>{let t=e.aliases.map(e=>` (/${e})`).join(``);return`/${e.name}${t}`},d=Math.max(...u.map(e=>invocation(e).length))+2;return u.map((e,t)=>{let i=c+t===n.selectedIndex,o=i?a.cyan(r.glyph.prompt):` `,s=i?a.blue(`/${e.name}`):`/${e.name}`,l=invocation(e).slice(`/${e.name}`.length),u=` `.repeat(d-invocation(e).length);return`${o} ${s}${a.dim(l)}${u}${a.dim(e.description)}`}).map(n=>visibleLength(n)>i?sliceVisible(n,i):n)}export{dismissTypeahead,inlineCommandHint,isTypeaheadOpen,moveTypeaheadSelection,renderCommandSuggestions,selectedTypeaheadCommand,typeaheadCompletion,typeaheadFor};
@@ -8,6 +8,7 @@
8
8
  * so it stays on screen. Keeping it pure makes the editing rules trivial to
9
9
  * unit test without a TTY.
10
10
  */
11
+ import type { TerminalKey } from "./stream-format.js";
11
12
  /** One logical input line: its text and the caret's index within it. */
12
13
  export interface LineState {
13
14
  readonly text: string;
@@ -37,6 +38,11 @@ export declare function killToEnd(state: LineState): LineState;
37
38
  export declare function killToStart(state: LineState): LineState;
38
39
  /** Deletes the whitespace-delimited word before the caret (Ctrl+W). */
39
40
  export declare function deleteWord(state: LineState): LineState;
41
+ /**
42
+ * Applies a key owned by the single-line editor. Returns `undefined` when the
43
+ * key belongs to the surrounding controller (submit, cancel, history, menus).
44
+ */
45
+ export declare function applyLineEditorKey(state: LineState, key: TerminalKey): LineState | undefined;
40
46
  /**
41
47
  * The portion of `state.text` to draw within `budget` columns, split at the
42
48
  * caret so the renderer can place its caret glyph between `before` and
@@ -1 +1 @@
1
- const EMPTY_LINE={text:``,cursor:0};function lineOf(e){return{text:e,cursor:e.length}}function insert(e,t){return t.length===0?e:{text:e.text.slice(0,e.cursor)+t+e.text.slice(e.cursor),cursor:e.cursor+t.length}}function backspace(e){return e.cursor===0?e:{text:e.text.slice(0,e.cursor-1)+e.text.slice(e.cursor),cursor:e.cursor-1}}function deleteForward(e){return e.cursor>=e.text.length?e:{text:e.text.slice(0,e.cursor)+e.text.slice(e.cursor+1),cursor:e.cursor}}function moveLeft(e){return e.cursor===0?e:{text:e.text,cursor:e.cursor-1}}function moveRight(e){return e.cursor>=e.text.length?e:{text:e.text,cursor:e.cursor+1}}function moveHome(e){return e.cursor===0?e:{text:e.text,cursor:0}}function moveEnd(e){return e.cursor===e.text.length?e:{text:e.text,cursor:e.text.length}}function killToEnd(e){return e.cursor>=e.text.length?e:{text:e.text.slice(0,e.cursor),cursor:e.cursor}}function killToStart(e){return e.cursor===0?e:{text:e.text.slice(e.cursor),cursor:0}}function deleteWord(e){if(e.cursor===0)return e;let t=e.cursor;for(;t>0&&isWhitespace(e.text[t-1]);)--t;for(;t>0&&!isWhitespace(e.text[t-1]);)--t;return{text:e.text.slice(0,t)+e.text.slice(e.cursor),cursor:t}}function isWhitespace(e){return e!==void 0&&/\s/u.test(e)}function visibleLine(e,t,n=`…`){let r=Math.max(1,t),{text:i,cursor:a}=e;if(i.length<=r)return{before:i.slice(0,a),after:i.slice(a)};let o=a<r?0:a-r+1;o=Math.min(o,i.length-r),o=Math.max(0,o);let s=o+r,c=i.slice(o,s),l=a-o;return o>0&&l>0&&(c=n+c.slice(n.length)),s<i.length&&l<c.length&&(c=c.slice(0,c.length-n.length)+n),{before:c.slice(0,l),after:c.slice(l)}}var PromptHistory=class{#e=[];#t=0;#n=``;add(e){if(e.trim().length!==0){if(this.#e.at(-1)===e){this.#r();return}this.#e.push(e),this.#r()}}begin(e){this.#t=this.#e.length,this.#n=e}previous(e){if(this.#e.length!==0&&(this.#t===this.#e.length&&(this.#n=e),this.#t!==0))return--this.#t,this.#e[this.#t]}next(){if(!(this.#t>=this.#e.length))return this.#t+=1,this.#t===this.#e.length?this.#n:this.#e[this.#t]}#r(){this.#t=this.#e.length,this.#n=``}};export{EMPTY_LINE,PromptHistory,backspace,deleteForward,deleteWord,insert,killToEnd,killToStart,lineOf,moveEnd,moveHome,moveLeft,moveRight,visibleLine};
1
+ const EMPTY_LINE={text:``,cursor:0};function lineOf(e){return{text:e,cursor:e.length}}function insert(e,t){return t.length===0?e:{text:e.text.slice(0,e.cursor)+t+e.text.slice(e.cursor),cursor:e.cursor+t.length}}function backspace(e){return e.cursor===0?e:{text:e.text.slice(0,e.cursor-1)+e.text.slice(e.cursor),cursor:e.cursor-1}}function deleteForward(e){return e.cursor>=e.text.length?e:{text:e.text.slice(0,e.cursor)+e.text.slice(e.cursor+1),cursor:e.cursor}}function moveLeft(e){return e.cursor===0?e:{text:e.text,cursor:e.cursor-1}}function moveRight(e){return e.cursor>=e.text.length?e:{text:e.text,cursor:e.cursor+1}}function moveHome(e){return e.cursor===0?e:{text:e.text,cursor:0}}function moveEnd(e){return e.cursor===e.text.length?e:{text:e.text,cursor:e.text.length}}function killToEnd(e){return e.cursor>=e.text.length?e:{text:e.text.slice(0,e.cursor),cursor:e.cursor}}function killToStart(e){return e.cursor===0?e:{text:e.text.slice(e.cursor),cursor:0}}function deleteWord(e){if(e.cursor===0)return e;let t=e.cursor;for(;t>0&&isWhitespace(e.text[t-1]);)--t;for(;t>0&&!isWhitespace(e.text[t-1]);)--t;return{text:e.text.slice(0,t)+e.text.slice(e.cursor),cursor:t}}function applyLineEditorKey(e,t){switch(t.type){case`character`:return insert(e,t.value);case`backspace`:return backspace(e);case`delete`:return deleteForward(e);case`left`:return moveLeft(e);case`right`:return moveRight(e);case`home`:case`ctrl-a`:return moveHome(e);case`end`:case`ctrl-e`:return moveEnd(e);case`ctrl-k`:return killToEnd(e);case`ctrl-u`:return killToStart(e);case`ctrl-w`:return deleteWord(e);default:return}}function isWhitespace(e){return e!==void 0&&/\s/u.test(e)}function visibleLine(e,t,n=`…`){let r=Math.max(1,t),{text:i,cursor:a}=e;if(i.length<=r)return{before:i.slice(0,a),after:i.slice(a)};let o=a<r?0:a-r+1;o=Math.min(o,i.length-r),o=Math.max(0,o);let s=o+r,c=i.slice(o,s),l=a-o;return o>0&&l>0&&(c=n+c.slice(n.length)),s<i.length&&l<c.length&&(c=c.slice(0,c.length-n.length)+n),{before:c.slice(0,l),after:c.slice(l)}}var PromptHistory=class{#e=[];#t=0;#n=``;add(e){if(e.trim().length!==0){if(this.#e.at(-1)===e){this.#r();return}this.#e.push(e),this.#r()}}begin(e){this.#t=this.#e.length,this.#n=e}previous(e){if(this.#e.length!==0&&(this.#t===this.#e.length&&(this.#n=e),this.#t!==0))return--this.#t,this.#e[this.#t]}next(){if(!(this.#t>=this.#e.length))return this.#t+=1,this.#t===this.#e.length?this.#n:this.#e[this.#t]}#r(){this.#t=this.#e.length,this.#n=``}};export{EMPTY_LINE,PromptHistory,applyLineEditorKey,backspace,deleteForward,deleteWord,insert,killToEnd,killToStart,lineOf,moveEnd,moveHome,moveLeft,moveRight,visibleLine};
@@ -8,6 +8,8 @@ export interface PromptCommandHandlerOptions {
8
8
  appRoot: string;
9
9
  slug: string;
10
10
  }) => Promise<ApplyModelOutcome>;
11
+ /** Test seam; defaults to the model flow's external-provider refusal check. */
12
+ readonly modelChangeRefusal?: (appRoot: string) => Promise<string | null>;
11
13
  /** Test seam; forwarded to runTuiSetupCommand's injectable flows. */
12
14
  readonly flows?: Partial<TuiSetupFlows>;
13
15
  }
@@ -1 +1 @@
1
- import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(t){return{async handle(n,r){let i=t.appRoot;if(i===void 0)return{message:`/${n.name} needs eve dev running the local server (it is not available with --url).`};if(n.name===`model`&&n.argument.length>0)try{let{changeAgentModel:e,formatApplyModelOutcome:r}=await import(`#setup/flows/model.js`);return{message:r(await(t.applyModel??e)({appRoot:i,slug:n.argument}))}}catch(t){return{message:`Couldn't change the model: ${toErrorMessage(t)}`}}let a=r.renderer.setupFlow;if(a===void 0)return{message:`/${n.name} is not supported by this renderer.`};let o;try{o=await import(`./setup-commands.js`)}catch(t){return{message:`/${n.name} failed: ${toErrorMessage(t)}`}}let{runTuiSetupCommand:s,SETUP_FLOW_TITLES:c}=o;a.begin(c[n.name]);let l=!0;try{let e={command:n.name,appRoot:i,renderer:a};t.flows!==void 0&&(e.flows=t.flows);let r=await s(e);l=r.preserveFlowDiagnostics;let o={message:r.message};return r.vercelEffect!==void 0&&(o.vercelEffect=r.vercelEffect),o}finally{a.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
1
+ import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(t){return{async handle(n,r){let i=t.appRoot;if(i===void 0)return{message:`/${n.name} needs eve dev running the local server (it is not available with --url).`};if(n.name===`model`&&n.argument.length>0)try{let{changeAgentModel:e,formatApplyModelOutcome:r,modelChangeRefusalForUneditableModel:a}=await import(`#setup/flows/model.js`),o=await(t.modelChangeRefusal??a)(i);return o===null?{message:r(await(t.applyModel??e)({appRoot:i,slug:n.argument}))}:{message:o}}catch(t){return{message:`Couldn't change the model: ${toErrorMessage(t)}`}}let a=r.renderer.setupFlow;if(a===void 0)return{message:`/${n.name} is not supported by this renderer.`};let o;try{o=await import(`./setup-commands.js`)}catch(t){return{message:`/${n.name} failed: ${toErrorMessage(t)}`}}let{runTuiSetupCommand:s,SETUP_FLOW_TITLES:c}=o;a.begin(c[n.name]);let l=!0;try{let e={command:n.name,appRoot:i,renderer:a};t.flows!==void 0&&(e.flows=t.flows);let r=await s(e);l=r.preserveFlowDiagnostics;let o={message:r.message};return r.vercelEffect!==void 0&&(o.vercelEffect=r.vercelEffect),o}finally{a.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
@@ -69,6 +69,11 @@ export type AgentTUITurnState = {
69
69
  };
70
70
  export type AgentTUISessionOptions = {
71
71
  title?: string;
72
+ /**
73
+ * Text to seed the editable prompt buffer with before the user types.
74
+ * Set by the runner for the first prompt when `eve dev --input` is used.
75
+ */
76
+ initialDraft?: string;
72
77
  submittedPrompt?: string;
73
78
  continueSession?: boolean;
74
79
  tools?: TerminalPartDisplayMode;
@@ -126,6 +131,11 @@ export type AgentTUIRenderer = {
126
131
  * recovery and slash-command results. Optional.
127
132
  */
128
133
  renderNotice?(text: string): void;
134
+ /**
135
+ * Commits one development sandbox lifecycle line to the transcript.
136
+ * Optional so non-terminal renderers can ignore local prewarm progress.
137
+ */
138
+ renderSandboxLog?(text: string): void;
129
139
  renderSetupWarning?(text: string): void;
130
140
  renderCommandResult?(text: string): void;
131
141
  readonly setupFlow?: SetupFlowRenderer;
@@ -245,6 +255,11 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
245
255
  serverUrl?: string;
246
256
  /** Absolute local application root; omitted for remote `--url` sessions. */
247
257
  appRoot?: string;
258
+ /**
259
+ * Seeds the editable prompt buffer for the first prompt only. The text is
260
+ * not auto-submitted — the user can edit it and presses Enter to send.
261
+ */
262
+ initialInput?: string;
248
263
  /** Handles non-core slash commands without adding feature branches to the runner. */
249
264
  promptCommandHandler?: PromptCommandHandler;
250
265
  /** Boot-time installation-state checks; defaults to the built-ins. */
@@ -1 +1 @@
1
- import{pickAgentHeaderTip}from"./agent-header.js";import{formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{failureKey,formatFailureDetail,formatFailureMessage,formatGatewayAuthFailureNotice,isAbortLikeError,isGatewayAuthFailure,isInterruptedError}from"./errors.js";import{BOOT_DETECTIONS,detectSetupIssues,formatSetupIssuesLine}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import{toErrorMessage}from"#shared/errors.js";import{isCurrentTurnBoundaryEvent}from"#client/index.js";import{createDevelopmentRuntimeArtifactSessionRefresher}from"#services/dev-client.js";var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_=pickAgentHeaderTip();#v;#y=new Map;#b=new Map;#x=new Map;#S=new Map;#C=new Set;#w=!1;constructor(e){if(this.#e=e.session,e.client!==void 0&&(this.#t=e.client),this.#n=createRenderer(e),this.#r=e.name??`Eve`,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#g=createVercelStatusTracker(t)}e.promptCommandHandler!==void 0&&(this.#m=e.promptCommandHandler),this.#h=e.bootDetections??BOOT_DETECTIONS,e.serverUrl!==void 0&&(this.#f=e.serverUrl,this.#d=createDevelopmentRuntimeArtifactSessionRefresher({serverUrl:e.serverUrl}))}async#T(){let e=this.#f;if(e===void 0){await this.#A(void 0);return}let t;try{t=await this.#t?.info()}catch{t=void 0}this.#v=t;let n={name:this.#r,serverUrl:e};t!==void 0&&(n.info=t),this.#p!==void 0&&(n.tip=this.#_),this.#n.renderAgentHeader?.(n),await this.#A(t)}async run(){try{await this.#E()}finally{this.#n.shutdown?.(),this.#g?.dispose()}}async#E(){let e=this.#r,r,i,a=!1,o=!1;for(await this.#T(),this.#g?.refreshIdentity();;){if(!o){if(r==null){if(!this.#n.readPrompt){if(a)return;throw Error(`No prompt was provided and the renderer does not support prompt input.`)}try{r=await this.#O({title:e})}catch(e){if(isInterruptedError(e))return;throw e}if(r==null)return}let s=parsePromptCommand(r);if(s?.type===`exit`)return;if(s?.type===`new`){this.#D(),i=void 0,o=!1,r=void 0,this.#n.reset?.();continue}if(s?.type===`help`){this.#j(formatPromptCommandHelp()),i=void 0,o=!1,r=void 0;continue}if(s?.type===`loglevel`){this.#j(this.#M(s.argument)),i=void 0,o=!1,r=void 0;continue}if(s?.type===`extension`){try{let t=this.#m===void 0?{message:`/${s.name} is not available in this session.`}:await this.#m.handle(s,{renderer:this.#n,title:e});t?.message!==void 0&&this.#j(t.message),t?.vercelEffect!==void 0&&this.#g?.applyEffect(t.vercelEffect)}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,o=!1;continue}a=!0}let s=await this.#k({prompt:o?void 0:r,inputResponses:i});try{await this.#n.renderStream(s,{title:e,submittedPrompt:r,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=s.turnState?.pendingApprovals??[],n=s.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`:`deny`}),this.#y.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.#y.delete(t.requestId)}}o=!0,i=a,r=void 0;continue}s.turnState&&s.turnState.boundaryEvent===void 0&&(this.#w=!0)}catch(e){if(isInterruptedError(e))return;throw e}o=!1,i=void 0,r=void 0,this.#w&&(this.#w=!1,this.#D(),this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`))}}#D(){for(let e of this.#x.values())e.abort();this.#x.clear(),this.#b.clear(),this.#y.clear(),this.#S.clear(),this.#C.clear(),this.#t&&(this.#e=this.#t.session()),this.#d?.clear()}async#O(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#t,r=this.#d;if(n===void 0||r===void 0)return await t;let i=!1,a=!1,o,refresh=async()=>{if(!(i||a)){a=!0;try{this.#e=await r.refreshIdle({createSession:()=>n.session(),onRuntimeArtifactsChanged:()=>this.#N(),session:this.#e})}finally{a=!1}}},startRefresh=()=>{if(i||a)return;let e=refresh().finally(()=>{o===e&&(o=void 0)});o=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{i=!0,clearInterval(s),await o}}async#k(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;try{let e=this.#t;e!==void 0&&this.#d!==void 0&&(this.#e=await this.#d.refresh({createSession:()=>e.session(),inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#N(),session:this.#e})),r=await this.#e.send(n)}catch(e){if(isInterruptedError(e))throw e;return this.#w=!0,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}let i=createTurnState();return{abort:()=>t.abort(),events:eveEventsToTUIStream({events:r,pendingInputRequests:this.#y,subagentRuns:this.#b,turnState:i,onSubagentCalled:e=>this.#L(e),onSubagentCompleted:e=>this.#z(e),onConnectionAuthRequired:e=>this.#P(e),onConnectionAuthCompleted:e=>this.#F(e),onTerminalFailure:()=>{this.#w=!0},failureOverride:this.#p===void 0?void 0:e=>isGatewayAuthFailure(e)?formatGatewayAuthFailureNotice(e):void 0}),turnState:i}}async#A(e){if(this.#p===void 0||this.#n.renderSetupWarning===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e);let n=await detectSetupIssues(t,this.#h);n.length!==0&&this.#n.renderSetupWarning(formatSetupIssuesLine(n))}#j(e){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e);return}this.#n.renderNotice?.(e)}#M(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|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, 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`all`:return`Showing all logs.`}}async#N(){let e=this.#v,t;try{t=await this.#t?.info()}catch{t=void 0}if(t!==void 0&&(this.#v=t,this.#f!==void 0)){let e={info:t,name:this.#r,serverUrl:this.#f};this.#p!==void 0&&(e.tip=this.#_),this.#n.renderAgentHeader?.(e)}(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#P(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.#S.set(e.data.name,t),this.#I(t)}#F(e){let t=this.#S.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.#S.set(e.data.name,t),this.#C.delete(e.data.name),this.#I(t),this.#n.setConnectionAuthPendingCount?.(this.#C.size)}#I(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)}#L(e){let t=e.data.callId;if(this.#x.has(t))return;let n=this.#t;if(!n)return;let r=new AbortController;this.#x.set(t,r),(async()=>{try{let i=n.session({sessionId:e.data.childSessionId,streamIndex:0}).stream({signal:r.signal});for await(let e of i)if(r.signal.aborted||(this.#B(t,e),isCurrentTurnBoundaryEvent(e)))break}catch(e){if(!isAbortLikeError(e)){let n=toErrorMessage(e),r=this.#b.get(t);if(r){let{key:e,step:i}=openCurrentSubagentSection(r);i.message=i.message?`${i.message}\n\nstream error: ${n}`:`stream error: ${n}`,i.finalized=!0,r.currentSectionKey=null,this.#n.upsertSubagentStep?.({callId:t,subagentName:r.name,sectionKey:e,reasoning:i.reasoning,message:i.message,finalized:!0})}}}finally{this.#x.delete(t)}})()}#R(e,t,n){let r=t.tools.get(n.childCallId),i=r??{toolName:n.toolName,input:n.input,status:n.status};if(r){let e={"approval-requested":0,executing:1,done:2,failed:2};e[n.status]>e[r.status]&&(r.status=n.status),r.input=n.input}else t.tools.set(n.childCallId,i);this.#n.markChildToolCallId?.(n.childCallId),this.#n.upsertSubagentTool?.({callId:e,subagentName:t.name,childCallId:n.childCallId,toolName:i.toolName,input:i.input,status:i.status})}#z(e){let t=this.#b.get(e);if(t){for(let[n,r]of t.steps)r.finalized||(r.finalized=!0,this.#n.upsertSubagentStep?.({callId:e,subagentName:t.name,sectionKey:n,reasoning:r.reasoning,message:r.message,finalized:!0}));t.currentSectionKey=null}}#B(e,t){let n=this.#b.get(e);if(!n)return;let r=this.#n,emit=(t,i)=>{r.upsertSubagentStep?.({callId:e,subagentName:n.name,sectionKey:t,reasoning:i.reasoning,message:i.message,finalized:i.finalized})},finalizeCurrent=()=>{if(n.currentSectionKey===null)return;let e=n.steps.get(n.currentSectionKey);e&&(e.finalized=!0,emit(n.currentSectionKey,e)),n.currentSectionKey=null};switch(t.type){case`reasoning.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.reasoning+=t.data.reasoningDelta,emit(e,r);break}case`reasoning.completed`:break;case`message.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.message+=t.data.messageDelta,emit(e,r);break}case`message.completed`:{let{key:e,step:r}=openCurrentSubagentSection(n);t.data.message!==null&&r.message.length===0&&(r.message=t.data.message),r.finalized=!0,emit(e,r),n.currentSectionKey=null;break}case`step.completed`:finalizeCurrent();break;case`actions.requested`:finalizeCurrent();for(let r of t.data.actions)r.kind===`tool-call`&&this.#R(e,n,{childCallId:r.callId,toolName:r.toolName,input:r.input,status:`executing`});break;case`input.requested`:finalizeCurrent();for(let r of t.data.requests)r.action.kind===`tool-call`&&this.#R(e,n,{childCallId:r.action.callId,toolName:r.action.toolName,input:r.action.input,status:`approval-requested`});break;case`action.result`:{let i=t.data.result;if(i.kind!==`tool-result`)break;let a=n.tools.get(i.callId);if(!a)break;t.data.status===`failed`?(a.status=`failed`,a.errorText=formatActionResultError(t)):(a.status=`done`,a.output=i.output);let o={callId:e,subagentName:n.name,childCallId:i.callId,toolName:a.toolName,input:a.input,status:a.status};a.output!==void 0&&(o.output=a.output),a.errorText!==void 0&&(o.errorText=a.errorText),r.upsertSubagentTool?.(o);break}default:break}}};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,input:e.userInput,output:e.screen})}function parseLogDisplayMode(e){return e===`all`||e===`stderr`||e===`none`?e:void 0}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.`}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,subagentRuns:r,turnState:i,onSubagentCalled:a,onSubagentCompleted:o,onConnectionAuthRequired:s,onConnectionAuthCompleted:c,onTerminalFailure:l,failureOverride:u}=e,d=new Map,f=new Map,p=0,m=new Set,h=new Set,g=new Set,_=new Set,v=!1,y=!1,b;for await(let e of t)if(!(y&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`turn.started`:case`message.received`:break;case`step.started`:p+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;b=t.data.usage,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),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(d,n),i=t.data.messageSoFar;if(r.completed){if(r.text.startsWith(i)||p<=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(d,t),r=e.data.message;if(n.completed){if(r===null||r===n.text||p<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=p,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=p,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=p,yield{type:`assistant-complete`,id:i}}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=p,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(f,n),i=t.data.reasoningSoFar;if(r.completed){if(r.text.startsWith(i)||p<=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(f,t),r=e.data.reasoning;if(n.completed){if(r.length===0||r===n.text||n.text.startsWith(r)||p<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=p;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=p,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data,n=t.actions.filter(e=>e.kind===`tool-call`);if(n.length===0)break;let r=toolBatchKey(`actions.requested`,t.turnId,t.stepIndex,n);if(g.has(r)){for(let e of n)m.has(e.callId)||h.add(e.callId);break}g.add(r);for(let e of n)m.has(e.callId)||(m.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data,r=t.requests.filter(e=>e.action.kind===`tool-call`);if(r.length===0)break;let a=inputRequestBatchKey(t.turnId,t.stepIndex,r);if(g.has(a)){for(let e of r)m.has(e.action.callId)||h.add(e.action.callId);break}g.add(a);for(let e of r){let t=e.action.callId;if(m.has(t)||(m.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),n.set(e.requestId,e),isQuestionRequest(e)){upsertPendingQuestion(i,e);continue}upsertPendingApproval(i,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(h.has(n)||!m.has(n))break;t.data.status===`failed`?yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)}:yield{type:`tool-result`,toolCallId:n,output:t.data.result.output};break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,_,u);t&&(yield t);break}case`session.failed`:{i.sawSessionFailure=!0,l?.(e);let t=toFailureEvent(e,_,u);t&&(yield t),i.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b},v=!0;return}case`session.waiting`:case`session.completed`:i.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b},v=!0;return;case`turn.completed`:y=!0,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p);break;case`subagent.called`:{let t=e;if(!r.has(t.data.callId))r.set(t.data.callId,{name:t.data.name,steps:new Map,currentSectionKey:null,nextSectionKey:0,tools:new Map});else{let e=r.get(t.data.callId);e&&(e.name=t.data.name)}a?.(t);break}case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:o?.(e.data.callId);break;case`authorization.required`:s?.(e);break;case`authorization.completed`:c?.(e);break;default:break}v||(yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{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`action.result`: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 toolBatchKey(e,t,n,r){return`${e}:${t}:${String(n)}:${stableStringify(r.map(e=>({input:e.input,toolName:e.toolName})))}`}function inputRequestBatchKey(e,t,n){return toolBatchKey(`input.requested`,e,t,n.map(e=>({input:e.action.input,toolName:e.action.toolName})))}function stableStringify(e){return JSON.stringify(toStableJson(e))??`undefined`}function toStableJson(e,t=new WeakSet){if(typeof e!=`object`||!e)return e;if(t.has(e))return`[Circular]`;if(t.add(e),Array.isArray(e))return e.map(e=>toStableJson(e,t));let n=e,r={};for(let e of Object.keys(n).sort())r[e]=toStableJson(n[e],t);return r}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 o=failureKey(e);if(t.has(o))return;t.add(o);let s=n?.(e),c={type:`error`,errorText:s??formatFailureMessage(e)};if(s!==void 0)return c;let l=formatFailureDetail(e);return l!==void 0&&(c.detail=l),c}function isQuestionRequest(e){return e.display===`select`||e.display===`text`?!0:e.display===`confirmation`?!1:e.options!==void 0&&e.options.length>0}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}function openCurrentSubagentSection(e){e.currentSectionKey===null&&(e.currentSectionKey=e.nextSectionKey++,e.steps.set(e.currentSectionKey,{reasoning:``,message:``,finalized:!1}));let t=e.steps.get(e.currentSectionKey);if(!t)throw Error(`invariant: subagent section state missing for current key`);return{key:e.currentSectionKey,step:t}}export{EveTUIRunner,parsePromptCommand};
1
+ import{pickAgentHeaderTip}from"./agent-header.js";import{formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{failureKey,formatFailureDetail,formatFailureMessage,formatGatewayAuthFailureNotice,isAbortLikeError,isGatewayAuthFailure,isInterruptedError}from"./errors.js";import{BOOT_DETECTIONS,detectSetupIssues,formatSetupIssuesLine}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import{toErrorMessage}from"#shared/errors.js";import{isCurrentTurnBoundaryEvent}from"#client/index.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createDevelopmentRuntimeArtifactSessionRefresher}from"#services/dev-client.js";var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v=pickAgentHeaderTip();#y;#b=new Map;#x=new Map;#S=new Map;#C=new Map;#w=new Set;#T=!1;#E;constructor(e){if(this.#e=e.session,e.client!==void 0&&(this.#t=e.client),this.#n=createRenderer(e),this.#r=e.name??`Eve`,this.#i=e.tools??`full`,this.#a=e.reasoning??`full`,this.#o=e.subagents??`full`,this.#s=e.connectionAuth??`full`,this.#c=e.assistantResponseStats??`tokensPerSecond`,this.#l=e.contextSize,this.#u=e.formatTransportError??toErrorMessage,e.initialInput!==void 0&&(this.#m=e.initialInput),e.appRoot!==void 0){this.#p=e.appRoot;let t={appRoot:e.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};e.detectProjectIdentity!==void 0&&(t.detectIdentity=e.detectProjectIdentity),this.#_=createVercelStatusTracker(t)}e.promptCommandHandler!==void 0&&(this.#h=e.promptCommandHandler),this.#g=e.bootDetections??BOOT_DETECTIONS,e.serverUrl!==void 0&&(this.#f=e.serverUrl,this.#d=createDevelopmentRuntimeArtifactSessionRefresher({serverUrl:e.serverUrl}))}async#D(){let e=this.#f;if(e===void 0){await this.#M(void 0);return}let t;try{t=await this.#t?.info()}catch{t=void 0}this.#y=t;let n={name:this.#r,serverUrl:e};t!==void 0&&(n.info=t),this.#p!==void 0&&(n.tip=this.#v),this.#n.renderAgentHeader?.(n),await this.#M(t)}async run(){try{await this.#O()}finally{this.#E?.(),this.#E=void 0,this.#n.shutdown?.(),this.#_?.dispose()}}async#O(){let e=this.#r,r,i,a=!1,o=!1,s=this.#m;for(await this.#D(),this.#N(),this.#_?.refreshIdentity();;){if(!o){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};s!==void 0&&(t.initialDraft=s,s=void 0);try{r=await this.#A(t)}catch(e){if(isInterruptedError(e))return;throw e}if(r==null)return}let c=parsePromptCommand(r);if(c?.type===`exit`)return;if(c?.type===`new`){this.#k(),i=void 0,o=!1,r=void 0,this.#n.reset?.();continue}if(c?.type===`help`){this.#P(formatPromptCommandHelp()),i=void 0,o=!1,r=void 0;continue}if(c?.type===`loglevel`){this.#P(this.#F(c.argument)),i=void 0,o=!1,r=void 0;continue}if(c?.type===`extension`){try{let t=this.#h===void 0?{message:`/${c.name} is not available in this session.`}:await this.#h.handle(c,{renderer:this.#n,title:e});t?.message!==void 0&&this.#P(t.message),t?.vercelEffect!==void 0&&this.#_?.applyEffect(t.vercelEffect)}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,o=!1;continue}a=!0}let c=await this.#j({prompt:o?void 0:r,inputResponses:i});try{await this.#n.renderStream(c,{title:e,submittedPrompt:r,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=c.turnState?.pendingApprovals??[],n=c.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`:`deny`}),this.#b.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.#b.delete(t.requestId)}}o=!0,i=a,r=void 0;continue}c.turnState&&c.turnState.boundaryEvent===void 0&&(this.#T=!0)}catch(e){if(isInterruptedError(e))return;throw e}o=!1,i=void 0,r=void 0,this.#T&&(this.#T=!1,this.#k(),this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`))}}#k(){for(let e of this.#S.values())e.abort();this.#S.clear(),this.#x.clear(),this.#b.clear(),this.#C.clear(),this.#w.clear(),this.#t&&(this.#e=this.#t.session()),this.#d?.clear()}async#A(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#t,r=this.#d;if(n===void 0||r===void 0)return await t;let i=!1,a=!1,o,refresh=async()=>{if(!(i||a)){a=!0;try{this.#e=await r.refreshIdle({createSession:()=>n.session(),onRuntimeArtifactsChanged:()=>this.#I(),session:this.#e})}finally{a=!1}}},startRefresh=()=>{if(i||a)return;let e=refresh().finally(()=>{o===e&&(o=void 0)});o=e};startRefresh();let s=setInterval(()=>{startRefresh()},500);s.unref?.();try{return await t}finally{i=!0,clearInterval(s),await o}}async#j(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;try{let e=this.#t;e!==void 0&&this.#d!==void 0&&(this.#e=await this.#d.refresh({createSession:()=>e.session(),inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#I(),session:this.#e})),r=await this.#e.send(n)}catch(e){if(isInterruptedError(e))throw e;return this.#T=!0,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}let i=createTurnState();return{abort:()=>t.abort(),events:eveEventsToTUIStream({events:r,pendingInputRequests:this.#b,subagentRuns:this.#x,turnState:i,onSubagentCalled:e=>this.#B(e),onSubagentCompleted:e=>this.#H(e),onConnectionAuthRequired:e=>this.#L(e),onConnectionAuthCompleted:e=>this.#R(e),onTerminalFailure:()=>{this.#T=!0},failureOverride:this.#p===void 0?void 0:e=>isGatewayAuthFailure(e)?formatGatewayAuthFailureNotice(e):void 0}),turnState:i}}async#M(e){if(this.#p===void 0||this.#n.renderSetupWarning===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e);let n=await detectSetupIssues(t,this.#g);n.length!==0&&this.#n.renderSetupWarning(formatSetupIssuesLine(n))}#N(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#E===void 0&&(this.#E=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#P(e){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e);return}this.#n.renderNotice?.(e)}#F(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|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, 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`all`:return`Showing all logs.`}}async#I(){let e=this.#y,t;try{t=await this.#t?.info()}catch{t=void 0}if(t!==void 0&&(this.#y=t,this.#f!==void 0)){let e={info:t,name:this.#r,serverUrl:this.#f};this.#p!==void 0&&(e.tip=this.#v),this.#n.renderAgentHeader?.(e)}(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#L(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.#C.set(e.data.name,t),this.#z(t)}#R(e){let t=this.#C.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.#C.set(e.data.name,t),this.#w.delete(e.data.name),this.#z(t),this.#n.setConnectionAuthPendingCount?.(this.#w.size)}#z(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)}#B(e){let t=e.data.callId;if(this.#S.has(t))return;let n=this.#t;if(!n)return;let r=new AbortController;this.#S.set(t,r),(async()=>{try{let i=n.session({sessionId:e.data.childSessionId,streamIndex:0}).stream({signal:r.signal});for await(let e of i)if(r.signal.aborted||(this.#U(t,e),isCurrentTurnBoundaryEvent(e)))break}catch(e){if(!isAbortLikeError(e)){let n=toErrorMessage(e),r=this.#x.get(t);if(r){let{key:e,step:i}=openCurrentSubagentSection(r);i.message=i.message?`${i.message}\n\nstream error: ${n}`:`stream error: ${n}`,i.finalized=!0,r.currentSectionKey=null,this.#n.upsertSubagentStep?.({callId:t,subagentName:r.name,sectionKey:e,reasoning:i.reasoning,message:i.message,finalized:!0})}}}finally{this.#S.delete(t)}})()}#V(e,t,n){let r=t.tools.get(n.childCallId),i=r??{toolName:n.toolName,input:n.input,status:n.status};if(r){let e={"approval-requested":0,executing:1,done:2,failed:2};e[n.status]>e[r.status]&&(r.status=n.status),r.input=n.input}else t.tools.set(n.childCallId,i);this.#n.markChildToolCallId?.(n.childCallId),this.#n.upsertSubagentTool?.({callId:e,subagentName:t.name,childCallId:n.childCallId,toolName:i.toolName,input:i.input,status:i.status})}#H(e){let t=this.#x.get(e);if(t){for(let[n,r]of t.steps)r.finalized||(r.finalized=!0,this.#n.upsertSubagentStep?.({callId:e,subagentName:t.name,sectionKey:n,reasoning:r.reasoning,message:r.message,finalized:!0}));t.currentSectionKey=null}}#U(e,t){let n=this.#x.get(e);if(!n)return;let r=this.#n,emit=(t,i)=>{r.upsertSubagentStep?.({callId:e,subagentName:n.name,sectionKey:t,reasoning:i.reasoning,message:i.message,finalized:i.finalized})},finalizeCurrent=()=>{if(n.currentSectionKey===null)return;let e=n.steps.get(n.currentSectionKey);e&&(e.finalized=!0,emit(n.currentSectionKey,e)),n.currentSectionKey=null};switch(t.type){case`reasoning.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.reasoning+=t.data.reasoningDelta,emit(e,r);break}case`reasoning.completed`:break;case`message.appended`:{let{key:e,step:r}=openCurrentSubagentSection(n);r.message+=t.data.messageDelta,emit(e,r);break}case`message.completed`:{let{key:e,step:r}=openCurrentSubagentSection(n);t.data.message!==null&&r.message.length===0&&(r.message=t.data.message),r.finalized=!0,emit(e,r),n.currentSectionKey=null;break}case`step.completed`:finalizeCurrent();break;case`actions.requested`:finalizeCurrent();for(let r of t.data.actions)r.kind===`tool-call`&&this.#V(e,n,{childCallId:r.callId,toolName:r.toolName,input:r.input,status:`executing`});break;case`input.requested`:finalizeCurrent();for(let r of t.data.requests)r.action.kind===`tool-call`&&this.#V(e,n,{childCallId:r.action.callId,toolName:r.action.toolName,input:r.action.input,status:`approval-requested`});break;case`action.result`:{let i=t.data.result;if(i.kind!==`tool-result`)break;let a=n.tools.get(i.callId);if(!a)break;t.data.status===`failed`?(a.status=`failed`,a.errorText=formatActionResultError(t)):(a.status=`done`,a.output=i.output);let o={callId:e,subagentName:n.name,childCallId:i.callId,toolName:a.toolName,input:a.input,status:a.status};a.output!==void 0&&(o.output=a.output),a.errorText!==void 0&&(o.errorText=a.errorText),r.upsertSubagentTool?.(o);break}default:break}}};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,input:e.userInput,output:e.screen})}function parseLogDisplayMode(e){return e===`all`||e===`stderr`||e===`none`?e:void 0}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.`}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,subagentRuns:r,turnState:i,onSubagentCalled:a,onSubagentCompleted:o,onConnectionAuthRequired:s,onConnectionAuthCompleted:c,onTerminalFailure:l,failureOverride:u}=e,d=new Map,f=new Map,p=0,m=new Set,h=new Set,g=new Set,_=new Set,v=!1,y=!1,b;for await(let e of t)if(!(y&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`turn.started`:case`message.received`:break;case`step.started`:p+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;b=t.data.usage,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),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(d,n),i=t.data.messageSoFar;if(r.completed){if(r.text.startsWith(i)||p<=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(d,t),r=e.data.message;if(n.completed){if(r===null||r===n.text||p<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=p,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=p,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=p,yield{type:`assistant-complete`,id:i}}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=p,yield{type:`assistant-complete`,id:i});break}case`reasoning.appended`:{let t=e,n=reasoningPartId(t.data.turnId,t.data.stepIndex),r=partStateFor(f,n),i=t.data.reasoningSoFar;if(r.completed){if(r.text.startsWith(i)||p<=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(f,t),r=e.data.reasoning;if(n.completed){if(r.length===0||r===n.text||n.text.startsWith(r)||p<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=p;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=p,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data,n=t.actions.filter(e=>e.kind===`tool-call`);if(n.length===0)break;let r=toolBatchKey(`actions.requested`,t.turnId,t.stepIndex,n);if(g.has(r)){for(let e of n)m.has(e.callId)||h.add(e.callId);break}g.add(r);for(let e of n)m.has(e.callId)||(m.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data,r=t.requests.filter(e=>e.action.kind===`tool-call`);if(r.length===0)break;let a=inputRequestBatchKey(t.turnId,t.stepIndex,r);if(g.has(a)){for(let e of r)m.has(e.action.callId)||h.add(e.action.callId);break}g.add(a);for(let e of r){let t=e.action.callId;if(m.has(t)||(m.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),n.set(e.requestId,e),isQuestionRequest(e)){upsertPendingQuestion(i,e);continue}upsertPendingApproval(i,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(h.has(n)||!m.has(n))break;t.data.status===`failed`?yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)}:yield{type:`tool-result`,toolCallId:n,output:t.data.result.output};break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,_,u);t&&(yield t);break}case`session.failed`:{i.sawSessionFailure=!0,l?.(e);let t=toFailureEvent(e,_,u);t&&(yield t),i.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b},v=!0;return}case`session.waiting`:case`session.completed`:i.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b},v=!0;return;case`turn.completed`:y=!0,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p);break;case`subagent.called`:{let t=e;if(!r.has(t.data.callId))r.set(t.data.callId,{name:t.data.name,steps:new Map,currentSectionKey:null,nextSectionKey:0,tools:new Map});else{let e=r.get(t.data.callId);e&&(e.name=t.data.name)}a?.(t);break}case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:o?.(e.data.callId);break;case`authorization.required`:s?.(e);break;case`authorization.completed`:c?.(e);break;default:break}v||(yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:b})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{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 toolBatchKey(e,t,n,r){return`${e}:${t}:${String(n)}:${stableStringify(r.map(e=>({input:e.input,toolName:e.toolName})))}`}function inputRequestBatchKey(e,t,n){return toolBatchKey(`input.requested`,e,t,n.map(e=>({input:e.action.input,toolName:e.action.toolName})))}function stableStringify(e){return JSON.stringify(toStableJson(e))??`undefined`}function toStableJson(e,t=new WeakSet){if(typeof e!=`object`||!e)return e;if(t.has(e))return`[Circular]`;if(t.add(e),Array.isArray(e))return e.map(e=>toStableJson(e,t));let n=e,r={};for(let e of Object.keys(n).sort())r[e]=toStableJson(n[e],t);return r}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 o=failureKey(e);if(t.has(o))return;t.add(o);let s=n?.(e),c={type:`error`,errorText:s??formatFailureMessage(e)};if(s!==void 0)return c;let l=formatFailureDetail(e);return l!==void 0&&(c.detail=l),c}function isQuestionRequest(e){return e.display===`select`||e.display===`text`?!0:e.display===`confirmation`?!1:e.options!==void 0&&e.options.length>0}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}function openCurrentSubagentSection(e){e.currentSectionKey===null&&(e.currentSectionKey=e.nextSectionKey++,e.steps.set(e.currentSectionKey,{reasoning:``,message:``,finalized:!1}));let t=e.steps.get(e.currentSectionKey);if(!t)throw Error(`invariant: subagent section state missing for current key`);return{key:e.currentSectionKey,step:t}}export{EveTUIRunner,parsePromptCommand};
@@ -4,21 +4,25 @@ import { runModelFlow } from "#setup/flows/model.js";
4
4
  import type { Prompter } from "#setup/prompter.js";
5
5
  import { type TuiPrompterRenderer } from "./tui-prompter.js";
6
6
  import type { PromptCommandExtensionName } from "./prompt-commands.js";
7
+ import type { SetupFlowRenderer } from "./setup-flow.js";
7
8
  import type { VercelStatusEffect } from "./vercel-status.js";
8
9
  export type TuiSetupCommand = PromptCommandExtensionName;
9
10
  /**
10
11
  * Human panel titles per command. The bordered panel never repeats the echoed
11
- * command (the transcript already shows it); /channels and /model carry no
12
- * title at all because their opening questions ("Where will you chat with
13
- * your agent?", "Configure the agent's model") are the panel's header.
12
+ * command verbatim (the transcript already shows it), but it always carries a
13
+ * title: flows move past their opening question (project pickers, name
14
+ * prompts), and without a constant header those later questions float
15
+ * unanchored in the panel.
14
16
  */
15
17
  export declare const SETUP_FLOW_TITLES: Record<TuiSetupCommand, string>;
18
+ /** The prompter surface plus the working-state interrupt trap a command races against. */
19
+ export type TuiSetupCommandRenderer = TuiPrompterRenderer & Pick<SetupFlowRenderer, "waitForInterrupt">;
16
20
  export interface TuiSetupCommandInput {
17
21
  command: TuiSetupCommand;
18
22
  /** The local project the in-process dev server is running. */
19
23
  appRoot: string;
20
24
  /** The renderer surface the TUI-native prompter drives. */
21
- renderer: TuiPrompterRenderer;
25
+ renderer: TuiSetupCommandRenderer;
22
26
  /** Test seam; defaults to the real TUI-native prompter over `renderer`. */
23
27
  createPrompter?: (renderer: TuiPrompterRenderer) => Prompter;
24
28
  /** Test seam; defaults to the real setup flows. */
@@ -41,8 +45,8 @@ export interface TuiSetupCommandResult {
41
45
  * Runs one TUI setup command (/model, /channels, /deploy) over the
42
46
  * shared setup flows, asking through the TUI's own bordered panel. Never throws:
43
47
  * every outcome — done, cancelled, failed — folds into the returned command
44
- * result. Known limitation: a flow cannot be cancelled mid-subprocess (keys
45
- * drop while no panel is active); the subprocess's own completion or failure
46
- * settles the flow.
48
+ * result. Ctrl-C or Esc on the working spinner (no question open) aborts the
49
+ * active flow, then keeps command ownership until its subprocesses and setup
50
+ * stack have unwound.
47
51
  */
48
52
  export declare function runTuiSetupCommand(input: TuiSetupCommandInput): Promise<TuiSetupCommandResult>;
@@ -1,2 +1,2 @@
1
- import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{runChannelsFlow}from"#setup/flows/channels.js";import{runModelFlow}from"#setup/flows/model.js";import{WizardCancelledError}from"#setup/step.js";const SETUP_FLOW_TITLES={model:``,channels:``,deploy:`Deploy to Vercel`};async function runTuiSetupCommand(r){let{command:i,appRoot:a}=r,o={runModelFlow,runChannelsFlow,runDeployFlow,...r.flows},s=(r.createPrompter??createTuiPrompter)(r.renderer);try{switch(i){case`model`:{let e=await o.runModelFlow({appRoot:a,prompter:s});if(e.kind===`cancelled`)return{message:`/model cancelled.`,preserveFlowDiagnostics:!1};let t=[];return e.modelMessage!==void 0&&t.push(e.modelMessage),e.providerOutcome!==void 0&&t.push(providerOutcomeMessage(e.providerOutcome)),{message:t.join(`
2
- `),preserveFlowDiagnostics:!1}}case`channels`:{let e=await o.runChannelsFlow({appRoot:a,prompter:s});return e.kind===`cancelled`?{message:`/channels cancelled.`,preserveFlowDiagnostics:!0}:e.addedChannels.length===0?{message:`No channels added.`,preserveFlowDiagnostics:!0}:{message:`Channels added: ${e.addedChannels.join(`, `)} — run /deploy to ship them.`,preserveFlowDiagnostics:!0,vercelEffect:{kind:`channels-added`}}}case`deploy`:{let e=await o.runDeployFlow({appRoot:a,prompter:s,interactive:!0});return e.kind===`cancelled`?{message:`/deploy cancelled.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,vercelEffect:{kind:`deployed`}}}}}catch(e){return e instanceof WizardCancelledError?{message:`/${i} cancelled.`,preserveFlowDiagnostics:i!==`model`}:{message:`/${i} failed: ${e instanceof Error?e.message:String(e)}`,preserveFlowDiagnostics:!0}}finally{r.renderer.setStatus(void 0)}}function providerOutcomeMessage(e){let{credential:t,status:n}=e;return n.kind===`gateway-project`?t===void 0?`Project linked no model credential found; set AI_GATEWAY_API_KEY in .env.local.`:`Project linked connected to AI Gateway via ${t}.`:n.kind===`gateway-key`?`Connected to AI Gateway via ${n.envKey} in ${n.envFile}.`:`Provider updated — no gateway credential detected; set AI_GATEWAY_API_KEY in .env.local.`}export{SETUP_FLOW_TITLES,runTuiSetupCommand};
1
+ import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{runChannelsFlow}from"#setup/flows/channels.js";import{runModelFlow}from"#setup/flows/model.js";import{openUrl}from"#setup/primitives/open-url.js";import{slackMessageDeepLink}from"#setup/slack-connect.js";import{WizardCancelledError}from"#setup/step.js";const SETUP_FLOW_TITLES={model:`Configure the agent model`,channels:`Agent channels`,deploy:`Deploy to Vercel`};function muteableRenderer(e,t){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(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)},renderOutput:n=>{t()||e.renderOutput(n)}}}async function runTuiSetupCommand(t){let{command:n}=t,r=!1,i=new AbortController,a=(t.createPrompter??createTuiPrompter)(muteableRenderer(t.renderer,()=>r)),o=t.renderer.waitForInterrupt(),s=Symbol(`interrupted`),c=executeSetupCommand(t,a,i.signal);try{let e=await Promise.race([c,o.promise.then(()=>s)]);if(e!==s)return e;r=!0,i.abort(new WizardCancelledError);let t=await c,a={message:`/${n} interrupted.`,preserveFlowDiagnostics:!0};return t.vercelEffect!==void 0&&(a.vercelEffect=t.vercelEffect),a}finally{o.dispose(),t.renderer.setStatus(void 0)}}async function executeSetupCommand(e,i,a){let{command:o,appRoot:s}=e,c={runModelFlow,runChannelsFlow,runDeployFlow,...e.flows};try{switch(o){case`model`:{let e=await c.runModelFlow({appRoot:s,prompter:i,signal:a});if(e.kind===`cancelled`)return{message:`/model cancelled.`,preserveFlowDiagnostics:!1};let t=[];e.modelMessage!==void 0&&t.push(e.modelMessage),e.providerOutcome!==void 0&&t.push(providerOutcomeMessage(e.providerOutcome));let n={message:t.join(`
2
+ `),preserveFlowDiagnostics:!1};return e.providerOutcome!==void 0&&(n.vercelEffect={kind:`refresh-identity`}),n}case`channels`:{let e=await c.runChannelsFlow({appRoot:s,prompter:i,signal:a});switch(e.kind){case`failed`:return pendingChannelsResult(`Channel files changed, but /channels failed: ${e.message}`);case`cancelled`:return{message:`/channels cancelled.`,preserveFlowDiagnostics:!0};case`deploy-and-chat`:return await runDeployAndChat(c,{appRoot:s,prompter:i,signal:a},e.chat);case`done`:return e.addedChannels.length===0?{message:`No channels added.`,preserveFlowDiagnostics:!0}:{message:`Channels added: ${e.addedChannels.join(`, `)} — run /deploy to ship them.`,preserveFlowDiagnostics:!0,vercelEffect:{kind:`channels-added`}}}}case`deploy`:{let e=await c.runDeployFlow({appRoot:s,prompter:i,interactive:!0,signal:a});return e.kind===`cancelled`?{message:`/deploy cancelled.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,vercelEffect:{kind:`deployed`}}}}}catch(e){return e instanceof WizardCancelledError?{message:`/${o} cancelled.`,preserveFlowDiagnostics:o!==`model`}:{message:`/${o} failed: ${e instanceof Error?e.message:String(e)}`,preserveFlowDiagnostics:!0}}}async function runDeployAndChat(e,t,n){let r;try{r=await e.runDeployFlow({...t,interactive:!0})}catch(e){return e instanceof WizardCancelledError?pendingChannelsResult(`Channels added, but /deploy was cancelled. Run /deploy to ship them.`):pendingChannelsResult(`Channels added, but /deploy failed: ${e instanceof Error?e.message:String(e)}`)}if(r.kind===`cancelled`)return pendingChannelsResult(`Channels added, but /deploy was cancelled. Run /deploy to ship them.`);if(r.kind===`needs-link`)return pendingChannelsResult(`Channels added, but this directory is not linked to Vercel. Run /model, then /deploy.`);let o=r.productionUrl===void 0?`Deployed.`:`Deployed: ${r.productionUrl}`,s;if(n.chatUrl===void 0)s=`Message your agent in Slack to see it live.`;else{let e=slackMessageDeepLink(n.chatUrl);openUrl(e),s=`Chat with your agent in Slack: ${e}`}return{message:`${o}\n${s}`,preserveFlowDiagnostics:!0,vercelEffect:{kind:`deployed`}}}function pendingChannelsResult(e){return{message:e,preserveFlowDiagnostics:!0,vercelEffect:{kind:`channels-added`}}}function providerOutcomeMessage(e){let{credential:t,status:n}=e;return n.kind===`gateway-project`?t===void 0?`Project linked. No model credential found; set AI_GATEWAY_API_KEY in .env.local.`:`Project linked. Connected to AI Gateway via ${t}.`:n.kind===`gateway-key`?`Connected to AI Gateway via ${n.envKey} in ${n.envFile}.`:`Provider updated — no gateway credential detected; set AI_GATEWAY_API_KEY in .env.local.`}export{SETUP_FLOW_TITLES,runTuiSetupCommand};