eve 0.27.13 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/src/channel/adapter.d.ts +5 -5
  3. package/dist/src/channel/session.d.ts +2 -2
  4. package/dist/src/channel/types.d.ts +16 -6
  5. package/dist/src/chunks/{use-eve-agent-CWYe-vqE.js → use-eve-agent-CyDt3Lny.js} +92 -1
  6. package/dist/src/chunks/{use-eve-agent-CsSQOKnp.js → use-eve-agent-DaH3cf8K.js} +92 -1
  7. package/dist/src/cli/commands/agent-prompt/collect-intent.md +1 -1
  8. package/dist/src/cli/commands/channels.d.ts +0 -17
  9. package/dist/src/cli/commands/channels.js +1 -1
  10. package/dist/src/cli/commands/deploy.js +1 -1
  11. package/dist/src/cli/commands/extension-init.js +1 -1
  12. package/dist/src/cli/commands/init.js +1 -1
  13. package/dist/src/cli/commands/integration-connect.d.ts +29 -0
  14. package/dist/src/cli/commands/integration-connect.js +1 -0
  15. package/dist/src/cli/commands/integration-setup.d.ts +2 -3
  16. package/dist/src/cli/commands/integration-setup.js +1 -1
  17. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  18. package/dist/src/cli/commands/registry-setup-command.d.ts +13 -3
  19. package/dist/src/cli/commands/registry-setup-command.js +2 -1
  20. package/dist/src/cli/commands/registry.d.ts +35 -1
  21. package/dist/src/cli/commands/registry.js +1 -1
  22. package/dist/src/cli/commands/trace.js +1 -1
  23. package/dist/src/cli/dev/tui/agent-header.js +1 -1
  24. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  25. package/dist/src/cli/dev/tui/prompt-commands.d.ts +1 -1
  26. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  27. package/dist/src/cli/dev/tui/remote-auth-command.js +1 -1
  28. package/dist/src/cli/dev/tui/runner.d.ts +8 -7
  29. package/dist/src/cli/dev/tui/runner.js +1 -1
  30. package/dist/src/cli/dev/tui/setup-commands.d.ts +8 -13
  31. package/dist/src/cli/dev/tui/setup-commands.js +3 -2
  32. package/dist/src/cli/dev/tui/setup-flow.d.ts +14 -5
  33. package/dist/src/cli/dev/tui/setup-panel.d.ts +5 -1
  34. package/dist/src/cli/dev/tui/setup-panel.js +2 -2
  35. package/dist/src/cli/dev/tui/status-line.d.ts +1 -1
  36. package/dist/src/cli/dev/tui/status-line.js +1 -1
  37. package/dist/src/cli/dev/tui/subagent-pump.d.ts +8 -2
  38. package/dist/src/cli/dev/tui/subagent-pump.js +1 -1
  39. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +2 -5
  40. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  41. package/dist/src/cli/dev/tui/test/fake-setup-flow-renderer.js +1 -1
  42. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  43. package/dist/src/cli/dev/tui/tui.d.ts +2 -0
  44. package/dist/src/cli/dev/tui/tui.js +1 -1
  45. package/dist/src/cli/dev/tui/vercel-status.d.ts +1 -6
  46. package/dist/src/cli/dev/tui/vercel-status.js +1 -1
  47. package/dist/src/cli/invoke/result.d.ts +15 -0
  48. package/dist/src/cli/invoke/result.js +1 -1
  49. package/dist/src/cli/option-parsers.d.ts +11 -0
  50. package/dist/src/cli/option-parsers.js +1 -0
  51. package/dist/src/cli/run.d.ts +1 -12
  52. package/dist/src/cli/run.js +3 -3
  53. package/dist/src/cli/shutdown.d.ts +2 -0
  54. package/dist/src/cli/shutdown.js +1 -1
  55. package/dist/src/client/eve-agent-store.d.ts +7 -4
  56. package/dist/src/client/eve-agent-store.js +1 -1
  57. package/dist/src/client/index.d.ts +3 -3
  58. package/dist/src/client/index.js +1 -1
  59. package/dist/src/client/message-action-parts.js +1 -1
  60. package/dist/src/client/message-reducer-types.d.ts +5 -3
  61. package/dist/src/client/message-response.d.ts +4 -4
  62. package/dist/src/client/ndjson.d.ts +3 -3
  63. package/dist/src/client/open-stream.d.ts +2 -2
  64. package/dist/src/client/output-schema.d.ts +2 -2
  65. package/dist/src/client/reducer.d.ts +2 -2
  66. package/dist/src/client/session-utils.d.ts +5 -5
  67. package/dist/src/client/session.d.ts +2 -2
  68. package/dist/src/client/types.d.ts +2 -2
  69. package/dist/src/compiled/.vendor-stamp.json +5 -5
  70. package/dist/src/compiled/@workflow/core/index.js +1 -1
  71. package/dist/src/compiled/@workflow/core/private.d.ts +21 -5
  72. package/dist/src/compiled/@workflow/core/private.js +1 -1
  73. package/dist/src/compiled/@workflow/core/runtime/world.d.ts +10 -5
  74. package/dist/src/compiled/@workflow/core/runtime.js +3 -3
  75. package/dist/src/compiled/@workflow/core/telemetry/semantic-conventions.d.ts +2 -2
  76. package/dist/src/compiled/@workflow/core/version.d.ts +1 -1
  77. package/dist/src/compiled/@workflow/core/workflow.js +1 -1
  78. package/dist/src/compiled/@workflow/world-local/index.js +3 -3
  79. package/dist/src/compiled/@workflow/world-vercel/index.js +13 -13
  80. package/dist/src/compiled/_chunks/workflow/{attribute-changes-DeZc2RZz.js → attribute-changes-1LmTKuTT.js} +1 -1
  81. package/dist/src/compiled/_chunks/workflow/{private-Cre8uYkA.js → private-BcwCGTV5.js} +1 -1
  82. package/dist/src/compiled/_chunks/workflow/{resume-hook-ip1hbn1b.js → resume-hook-D1_5NCZ6.js} +1 -1
  83. package/dist/src/compiled/_chunks/workflow/{run-CWytxfIp.js → run-C240Ctf4.js} +1 -1
  84. package/dist/src/compiled/_chunks/workflow/sleep-De802yfX.js +1 -0
  85. package/dist/src/compiled/_chunks/workflow/{wait-until-De9yESQN.js → wait-until-z48sPUjU.js} +2 -2
  86. package/dist/src/compiled/shadcn-registry/index.d.ts +1 -0
  87. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  88. package/dist/src/compiler/extension-compatibility.d.ts +8 -8
  89. package/dist/src/compiler/extension-compatibility.js +1 -1
  90. package/dist/src/compiler/manifest.d.ts +2 -2
  91. package/dist/src/compiler/manifest.js +1 -1
  92. package/dist/src/compiler/normalize-agent-config.js +1 -1
  93. package/dist/src/context/dynamic-instruction-lifecycle.d.ts +2 -2
  94. package/dist/src/context/dynamic-model-lifecycle.d.ts +2 -2
  95. package/dist/src/context/dynamic-skill-lifecycle.d.ts +2 -2
  96. package/dist/src/context/dynamic-tool-lifecycle.d.ts +2 -2
  97. package/dist/src/context/hook-lifecycle.d.ts +2 -2
  98. package/dist/src/evals/assertions/collector.d.ts +2 -10
  99. package/dist/src/evals/assertions/collector.js +1 -1
  100. package/dist/src/evals/assertions/run.d.ts +3 -3
  101. package/dist/src/evals/cli/eval.d.ts +6 -2
  102. package/dist/src/evals/cli/eval.js +2 -2
  103. package/dist/src/evals/cli/filter.d.ts +14 -0
  104. package/dist/src/evals/cli/filter.js +1 -0
  105. package/dist/src/evals/context.js +1 -1
  106. package/dist/src/evals/diagnostics.d.ts +8 -0
  107. package/dist/src/evals/diagnostics.js +1 -0
  108. package/dist/src/evals/expect/index.d.ts +1 -1
  109. package/dist/src/evals/expect/index.js +1 -1
  110. package/dist/src/evals/index.d.ts +1 -1
  111. package/dist/src/evals/judge.js +2 -1
  112. package/dist/src/evals/match.d.ts +4 -4
  113. package/dist/src/evals/runner/artifacts.js +1 -1
  114. package/dist/src/evals/runner/derive-run-facts.d.ts +2 -2
  115. package/dist/src/evals/runner/reporters/assertion-diagnostics.d.ts +3 -0
  116. package/dist/src/evals/runner/reporters/assertion-diagnostics.js +3 -0
  117. package/dist/src/evals/runner/reporters/braintrust.js +1 -1
  118. package/dist/src/evals/runner/reporters/console.js +1 -1
  119. package/dist/src/evals/runner/reporters/junit.js +2 -2
  120. package/dist/src/evals/session.d.ts +3 -3
  121. package/dist/src/evals/types.d.ts +33 -17
  122. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  123. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  124. package/dist/src/execution/route-child-delivery.d.ts +4 -3
  125. package/dist/src/execution/route-child-delivery.js +1 -1
  126. package/dist/src/execution/session-delivery-hook.d.ts +1 -0
  127. package/dist/src/execution/session-delivery-hook.js +1 -1
  128. package/dist/src/execution/session-timeout-control.d.ts +9 -0
  129. package/dist/src/execution/session-timeout-control.js +1 -0
  130. package/dist/src/execution/session-timeout-steps.d.ts +13 -0
  131. package/dist/src/execution/session-timeout-steps.js +1 -0
  132. package/dist/src/execution/session-timeout-workflow.d.ts +6 -0
  133. package/dist/src/execution/session-timeout-workflow.js +1 -0
  134. package/dist/src/execution/session-timeout.d.ts +2 -0
  135. package/dist/src/execution/session-timeout.js +1 -0
  136. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  137. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  138. package/dist/src/execution/subagent-hitl-proxy.d.ts +5 -1
  139. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  140. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -0
  141. package/dist/src/execution/terminal-session-completion-step.js +1 -0
  142. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  143. package/dist/src/execution/turn-cancellation-control.js +1 -1
  144. package/dist/src/execution/turn-workflow.js +1 -1
  145. package/dist/src/execution/workflow-entry.d.ts +1 -0
  146. package/dist/src/execution/workflow-entry.js +1 -1
  147. package/dist/src/execution/workflow-runtime.d.ts +4 -0
  148. package/dist/src/execution/workflow-runtime.js +1 -1
  149. package/dist/src/execution/workflow-steps.d.ts +12 -2
  150. package/dist/src/execution/workflow-steps.js +1 -1
  151. package/dist/src/harness/agent-otel-provider.js +1 -1
  152. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  153. package/dist/src/harness/input-extraction.js +1 -1
  154. package/dist/src/harness/input-request-class.d.ts +23 -0
  155. package/dist/src/harness/input-request-class.js +1 -0
  156. package/dist/src/harness/input-requests.d.ts +20 -9
  157. package/dist/src/harness/input-requests.js +1 -1
  158. package/dist/src/harness/instrumentation-lifecycle.d.ts +12 -1
  159. package/dist/src/harness/proxy-input-requests.d.ts +10 -4
  160. package/dist/src/harness/proxy-input-requests.js +1 -1
  161. package/dist/src/harness/session-limit-continuation.d.ts +0 -11
  162. package/dist/src/harness/session-limit-continuation.js +1 -1
  163. package/dist/src/harness/session-limit-enforcement.d.ts +3 -2
  164. package/dist/src/harness/session-limit-enforcement.js +1 -1
  165. package/dist/src/harness/session-token-limits.d.ts +41 -0
  166. package/dist/src/harness/session-token-limits.js +1 -0
  167. package/dist/src/harness/stale-input-responses.js +1 -1
  168. package/dist/src/harness/subagent-token-budget.d.ts +6 -4
  169. package/dist/src/harness/subagent-token-budget.js +1 -1
  170. package/dist/src/harness/tool-loop.js +1 -1
  171. package/dist/src/harness/turn-sleep.d.ts +12 -0
  172. package/dist/src/harness/turn-sleep.js +1 -0
  173. package/dist/src/harness/turn-tag-state.d.ts +26 -17
  174. package/dist/src/harness/turn-tag-state.js +1 -1
  175. package/dist/src/harness/types.d.ts +4 -4
  176. package/dist/src/harness/workflow-lifecycle.d.ts +2 -2
  177. package/dist/src/internal/application/compiled-artifacts.js +7 -7
  178. package/dist/src/internal/application/package.js +1 -1
  179. package/dist/src/internal/authored-definition/core.js +1 -1
  180. package/dist/src/internal/nitro/host/dev-authored-source-watcher.d.ts +4 -0
  181. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  182. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  183. package/dist/src/internal/workflow/development-world-protocol.js +1 -1
  184. package/dist/src/internal/workflow/world-target.d.ts +7 -0
  185. package/dist/src/internal/workflow/world-target.js +1 -0
  186. package/dist/src/internal/workflow-bundle/workflow-core-shim.d.ts +1 -1
  187. package/dist/src/internal/workflow-bundle/workflow-core-shim.js +1 -1
  188. package/dist/src/protocol/event-dedupe.d.ts +25 -0
  189. package/dist/src/protocol/event-dedupe.js +1 -0
  190. package/dist/src/protocol/event-id.d.ts +16 -0
  191. package/dist/src/protocol/event-id.js +1 -0
  192. package/dist/src/protocol/message.d.ts +39 -23
  193. package/dist/src/protocol/message.js +2 -2
  194. package/dist/src/protocol/routes.d.ts +4 -0
  195. package/dist/src/protocol/routes.js +1 -1
  196. package/dist/src/public/channels/discord/discordChannel.d.ts +3 -3
  197. package/dist/src/public/channels/github/githubChannel.d.ts +3 -3
  198. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -3
  199. package/dist/src/public/channels/slack/hitl.js +1 -1
  200. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -3
  201. package/dist/src/public/channels/teams/hitl.js +1 -1
  202. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -3
  203. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -3
  204. package/dist/src/public/channels/twilio/twilioChannel.d.ts +3 -3
  205. package/dist/src/public/definitions/channel.d.ts +4 -4
  206. package/dist/src/public/definitions/hook.d.ts +2 -2
  207. package/dist/src/public/tools/sleep/index.d.ts +18 -0
  208. package/dist/src/public/tools/sleep/index.js +1 -0
  209. package/dist/src/react/use-eve-agent.d.ts +3 -2
  210. package/dist/src/runtime/framework-tools/ask-question.js +1 -1
  211. package/dist/src/runtime/framework-tools/sleep.d.ts +15 -0
  212. package/dist/src/runtime/framework-tools/sleep.js +1 -0
  213. package/dist/src/runtime/hooks/registry.d.ts +2 -2
  214. package/dist/src/runtime/input/types.d.ts +19 -4
  215. package/dist/src/runtime/input/types.js +1 -1
  216. package/dist/src/runtime/resolve-agent.js +1 -1
  217. package/dist/src/runtime/types.d.ts +2 -2
  218. package/dist/src/services/dev-client/runtime-artifacts.d.ts +7 -0
  219. package/dist/src/services/dev-client/runtime-artifacts.js +1 -1
  220. package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
  221. package/dist/src/setup/boxes/deploy-project.d.ts +3 -3
  222. package/dist/src/setup/flows/deploy.js +1 -1
  223. package/dist/src/setup/flows/ensure-vercel-project.d.ts +17 -0
  224. package/dist/src/setup/flows/ensure-vercel-project.js +1 -0
  225. package/dist/src/setup/flows/in-project.d.ts +1 -1
  226. package/dist/src/setup/flows/link.js +1 -1
  227. package/dist/src/setup/flows/model.js +1 -1
  228. package/dist/src/setup/flows/provider.js +1 -1
  229. package/dist/src/setup/flows/registry.d.ts +20 -0
  230. package/dist/src/setup/flows/registry.js +1 -0
  231. package/dist/src/setup/index.d.ts +0 -1
  232. package/dist/src/setup/index.js +1 -1
  233. package/dist/src/setup/{channel-setup-environment.d.ts → integrations/channels/environment.d.ts} +2 -2
  234. package/dist/src/setup/integrations/channels/environment.js +1 -0
  235. package/dist/src/setup/{channel-setup-integrations.d.ts → integrations/channels/index.d.ts} +3 -3
  236. package/dist/src/setup/integrations/channels/index.js +1 -0
  237. package/dist/src/setup/{channel-setup-runner.d.ts → integrations/channels/runner.d.ts} +1 -1
  238. package/dist/src/setup/integrations/channels/runner.js +1 -0
  239. package/dist/src/setup/{boxes/add-channels.d.ts → integrations/channels/setup.d.ts} +32 -22
  240. package/dist/src/setup/integrations/channels/setup.js +2 -0
  241. package/dist/src/setup/{channel-setup-slack.d.ts → integrations/channels/slack.d.ts} +1 -1
  242. package/dist/src/setup/integrations/channels/slack.js +1 -0
  243. package/dist/src/setup/{channel-setup-integration.d.ts → integrations/channels/types.d.ts} +23 -7
  244. package/dist/src/setup/{channel-setup-ui.d.ts → integrations/channels/ui.d.ts} +2 -2
  245. package/dist/src/setup/integrations/channels/ui.js +2 -0
  246. package/dist/src/setup/{channel-setup-web.d.ts → integrations/channels/web.d.ts} +1 -1
  247. package/dist/src/setup/integrations/channels/web.js +1 -0
  248. package/dist/src/setup/primitives/run-vercel.d.ts +1 -0
  249. package/dist/src/setup/primitives/run-vercel.js +1 -1
  250. package/dist/src/setup/prompter.d.ts +16 -3
  251. package/dist/src/setup/prompter.js +1 -1
  252. package/dist/src/setup/registry-setup-client.d.ts +18 -0
  253. package/dist/src/setup/registry-setup-client.js +2 -0
  254. package/dist/src/setup/registry-setup-protocol.d.ts +93 -0
  255. package/dist/src/setup/registry-setup-protocol.js +1 -0
  256. package/dist/src/setup/scaffold/channels-catalog.d.ts +1 -1
  257. package/dist/src/setup/scaffold/create/extension.js +2 -2
  258. package/dist/src/setup/scaffold/create/project.js +2 -2
  259. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  260. package/dist/src/setup/scaffold/create/web-template.js +2 -2
  261. package/dist/src/setup/scaffold/create-in-place.d.ts +1 -0
  262. package/dist/src/setup/scaffold/create-in-place.js +1 -0
  263. package/dist/src/setup/scaffold/index.js +1 -1
  264. package/dist/src/setup/scaffold/update/connections.js +3 -3
  265. package/dist/src/setup/scaffold/update/update-connection-connector.js +1 -1
  266. package/dist/src/setup/vercel-project-framework.d.ts +1 -1
  267. package/dist/src/setup/vercel-project-framework.js +1 -1
  268. package/dist/src/setup/vercel-project.d.ts +17 -2
  269. package/dist/src/setup/vercel-project.js +0 -0
  270. package/dist/src/shared/agent-definition.d.ts +12 -0
  271. package/dist/src/shared/dynamic-tool-definition.d.ts +2 -2
  272. package/dist/src/shared/ulid.d.ts +39 -0
  273. package/dist/src/shared/ulid.js +1 -0
  274. package/dist/src/svelte/index.js +1 -1
  275. package/dist/src/svelte/use-eve-agent.d.ts +4 -4
  276. package/dist/src/svelte/use-eve-agent.js +1 -1
  277. package/dist/src/vue/index.js +1 -1
  278. package/dist/src/vue/use-eve-agent.d.ts +4 -4
  279. package/dist/src/vue/use-eve-agent.js +1 -1
  280. package/docs/agent-config.md +28 -16
  281. package/docs/channels/overview.mdx +1 -1
  282. package/docs/channels/slack.mdx +2 -2
  283. package/docs/concepts/default-harness.md +12 -0
  284. package/docs/concepts/execution-model-and-durability.mdx +1 -1
  285. package/docs/concepts/sessions-runs-and-streaming.md +61 -0
  286. package/docs/evals/assertions.mdx +8 -1
  287. package/docs/evals/judge.mdx +11 -1
  288. package/docs/evals/reporters.mdx +1 -1
  289. package/docs/evals/running.mdx +3 -0
  290. package/docs/guides/client/streaming.mdx +9 -3
  291. package/docs/guides/dev-tui.md +9 -14
  292. package/docs/guides/frontend/overview.mdx +4 -2
  293. package/docs/guides/frontend/use-eve-agent-svelte.mdx +1 -1
  294. package/docs/guides/frontend/use-eve-agent-vue.mdx +10 -10
  295. package/docs/guides/hooks.md +40 -2
  296. package/docs/guides/instrumentation.md +5 -1
  297. package/docs/reference/cli.md +25 -38
  298. package/docs/reference/typescript-api.md +2 -1
  299. package/docs/tools/human-in-the-loop.md +5 -0
  300. package/docs/tutorial/ship-it.mdx +2 -2
  301. package/package.json +11 -6
  302. package/dist/src/compiled/@workflow/core/runtime/world-target.d.ts +0 -11
  303. package/dist/src/compiled/_chunks/workflow/sleep-BjrUxUcs.js +0 -1
  304. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/index.js +0 -1
  305. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/parse-name.js +0 -1
  306. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/promise.js +0 -1
  307. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/time.js +0 -1
  308. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/workflow-routes.js +0 -1
  309. package/dist/src/node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/world-target.js +0 -1
  310. package/dist/src/node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js +0 -1
  311. package/dist/src/setup/boxes/add-channels.js +0 -2
  312. package/dist/src/setup/boxes/add-connections.d.ts +0 -26
  313. package/dist/src/setup/boxes/add-connections.js +0 -1
  314. package/dist/src/setup/boxes/install-channel-registry-items.d.ts +0 -8
  315. package/dist/src/setup/boxes/install-channel-registry-items.js +0 -1
  316. package/dist/src/setup/boxes/one-shot-next-steps.d.ts +0 -18
  317. package/dist/src/setup/boxes/one-shot-next-steps.js +0 -2
  318. package/dist/src/setup/boxes/preflight.d.ts +0 -37
  319. package/dist/src/setup/boxes/preflight.js +0 -1
  320. package/dist/src/setup/boxes/resolve-target.d.ts +0 -58
  321. package/dist/src/setup/boxes/resolve-target.js +0 -1
  322. package/dist/src/setup/boxes/scaffold.d.ts +0 -40
  323. package/dist/src/setup/boxes/scaffold.js +0 -1
  324. package/dist/src/setup/boxes/select-channels.d.ts +0 -49
  325. package/dist/src/setup/boxes/select-channels.js +0 -1
  326. package/dist/src/setup/boxes/select-chat.d.ts +0 -38
  327. package/dist/src/setup/boxes/select-chat.js +0 -1
  328. package/dist/src/setup/boxes/select-connections.d.ts +0 -30
  329. package/dist/src/setup/boxes/select-connections.js +0 -1
  330. package/dist/src/setup/boxes/select-setup-mode.d.ts +0 -32
  331. package/dist/src/setup/boxes/select-setup-mode.js +0 -1
  332. package/dist/src/setup/channel-setup-deployment.d.ts +0 -11
  333. package/dist/src/setup/channel-setup-deployment.js +0 -1
  334. package/dist/src/setup/channel-setup-environment.js +0 -1
  335. package/dist/src/setup/channel-setup-integration.js +0 -1
  336. package/dist/src/setup/channel-setup-integrations.js +0 -1
  337. package/dist/src/setup/channel-setup-runner.js +0 -1
  338. package/dist/src/setup/channel-setup-slack.js +0 -1
  339. package/dist/src/setup/channel-setup-ui.js +0 -2
  340. package/dist/src/setup/channel-setup-web.js +0 -1
  341. package/dist/src/setup/flows/channels.d.ts +0 -57
  342. package/dist/src/setup/flows/channels.js +0 -1
  343. package/dist/src/setup/flows/connections.d.ts +0 -37
  344. package/dist/src/setup/flows/connections.js +0 -3
  345. package/dist/src/setup/onboarding.d.ts +0 -60
  346. package/dist/src/setup/onboarding.js +0 -1
  347. /package/dist/src/{node_modules/.pnpm/@workflow_utils@5.0.0-beta.7/node_modules/@workflow/utils/dist/pluralize.js → setup/integrations/channels/types.js} +0 -0
@@ -0,0 +1 @@
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{join}from"node:path";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{cleanupCreatedConnectionConnector,setupConnectionConnector}from"#setup/connection-connector.js";import{runLinkFlow}from"#setup/flows/link.js";import{readProjectLink}from"#setup/project-resolution.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{updateConnectionConnectorUid}from"#setup/scaffold/update/update-connection-connector.js";const defaultDependencies={readProjectLink,runLinkFlow,setupConnectionConnector,cleanupCreatedConnectionConnector,updateConnectionConnectorUid};async function runIntegrationConnect(e){let n={...defaultDependencies,...e.dependencies},r=n.createPrompter?.()??createPrompter(),i=e.options?.signal;r.intro(`Set up ${e.slug}`);let a=await n.readProjectLink(e.appRoot);if(a===void 0){if((await n.runLinkFlow({appRoot:e.appRoot,prompter:r,signal:i,projectSelection:`create-or-link`,teamSelectMessage:()=>`You need to link to a project to use ${e.slug} through Vercel Connect.\n\nSelect your team`,deps:n.linkFlowDeps})).kind===`cancelled`)return;if(a=await n.readProjectLink(e.appRoot),a===void 0)throw Error(`Project link was not found after linking.`)}let o={log:r.log,prompter:r,projectRoot:e.appRoot,slug:e.slug,service:e.service,canonicalConnectorName:e.canonicalConnectorName??e.slug,project:a,signal:i},s=await n.setupConnectionConnector(o),c=join(e.appRoot,`agent`,`connections`,`${e.slug}.ts`);if(!(await n.updateConnectionConnectorUid(c,s.connectorUid)).patched)throw s.kind===`created`&&await n.cleanupCreatedConnectionConnector({log:r.log,projectRoot:e.appRoot,connectorId:s.connectorId,orgId:a.orgId}),Error(`Could not update the connector in agent/connections/${e.slug}.ts.`);r.outro(`Connection ${e.slug} set up.`)}async function runIntegrationConnectCommand(t,r,i,a,o,c={},l=defaultDependencies){if(!await isEveProject(r)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let u=createRegistrySetupClient({signal:c.signal});try{await runIntegrationConnect({appRoot:r,slug:i,service:a,canonicalConnectorName:o,options:c,dependencies:{...l,createPrompter:()=>u?.prompter??l.createPrompter?.()??createPrompter()}}),u?.complete()}catch(e){u?.fail(e),t.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}export{runIntegrationConnect,runIntegrationConnectCommand};
@@ -1,18 +1,17 @@
1
- import type { AddChannelsDeps } from "#setup/boxes/add-channels.js";
2
- import type { DeployProjectDeps } from "#setup/boxes/deploy-project.js";
1
+ import type { AddChannelsDeps } from "#setup/integrations/channels/setup.js";
3
2
  import { detectDeployment } from "#setup/project-resolution.js";
4
3
  import { type Prompter } from "#setup/prompter.js";
5
4
  import { getVercelAuthStatus } from "#setup/vercel-project.js";
6
5
  import type { RegistryCommandLogger } from "./registry.js";
7
6
  export interface IntegrationSetupOptions {
8
7
  yes?: boolean;
8
+ signal?: AbortSignal;
9
9
  }
10
10
  export interface IntegrationSetupDependencies {
11
11
  createPrompter?: () => Prompter;
12
12
  detectDeployment: typeof detectDeployment;
13
13
  getVercelAuthStatus: typeof getVercelAuthStatus;
14
14
  addChannelsDeps?: AddChannelsDeps;
15
- deployProjectDeps?: DeployProjectDeps;
16
15
  }
17
16
  /** Runs a built-in integration setup after its registry payload is installed. */
18
17
  export declare function runIntegrationSetupCommand(logger: RegistryCommandLogger, appRoot: string, kind: string, options?: IntegrationSetupOptions, dependencies?: IntegrationSetupDependencies): Promise<void>;
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{interactiveAsker}from"#setup/ask.js";import{deployChannelSetup}from"#setup/channel-setup-deployment.js";import{channelSetupEnvironment,describeChannelSetupEnvironment}from"#setup/channel-setup-environment.js";import{channelSetupIntegration,createChannelSetupUi}from"#setup/channel-setup-integrations.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createDefaultSetupState}from"#setup/state.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const defaultIntegrationSetupDependencies={detectDeployment,getVercelAuthStatus};async function runIntegrationSetupCommand(n,r,a,o={},s=defaultIntegrationSetupDependencies){if(!await isEveProject(r)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{if(a!==`slack`&&a!==`web`)throw Error(`Integration setup "${a}" is not available in this version of eve. Upgrade eve and try again.`);let e=a,t=s.createPrompter?.()??createPrompter();t.intro(`Set up ${channelSetupIntegration(e).label}`),t.log.message(`Checking Vercel setup...`);let[n,i]=await Promise.all([s.detectDeployment(r),s.getVercelAuthStatus(r)]),c=projectResolutionFromDeployment(n),l=channelSetupEnvironment(i,c);t.log.info(describeChannelSetupEnvironment(l));let u={...createDefaultSetupState(),project:c,projectPath:{kind:`resolved`,inPlace:!0,path:r},channelSelection:[e]},d=await channelSetupIntegration(e).setup({environment:l,state:u,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetCreateSlackbot:o.yes?!0:void 0,presetPortableCredentials:o.yes?!0:void 0,skipDependencyMutation:!0,deps:s.addChannelsDeps});if(d.kind===`cancelled`){process.env.EVE_SETUP===`1`&&(process.exitCode=130);return}let f=d.state;(f.slackbotAttached||l.vercel.kind===`available`&&f.channels.includes(`web`))&&(f=await deployChannelSetup({state:f,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetDeploy:o.yes===!0?!0:!process.stdin.isTTY||!process.stdout.isTTY?!1:void 0,deps:s.deployProjectDeps})),t.outro(f.channels.includes(e)?`Integration set up.`:`No changes made.`)}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}export{runIntegrationSetupCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createRegistrySetupClient}from"#setup/registry-setup-client.js";import{interactiveAsker}from"#setup/ask.js";import{channelSetupEnvironment,describeChannelSetupEnvironment}from"#setup/integrations/channels/environment.js";import{channelSetupIntegration,createChannelSetupUi}from"#setup/integrations/channels/index.js";import{createDefaultSetupState}from"#setup/state.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const defaultIntegrationSetupDependencies={detectDeployment,getVercelAuthStatus};async function runIntegrationSetupCommand(n,i,o,s={},c=defaultIntegrationSetupDependencies){if(!await isEveProject(i)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let l=createRegistrySetupClient({signal:s.signal});try{if(o!==`slack`&&o!==`web`)throw Error(`Integration setup "${o}" is not available in this version of eve. Upgrade eve and try again.`);let e=o,t=l?.prompter??c.createPrompter?.()??createPrompter(),n=l?.signal??s.signal,r=channelSetupIntegration(e);t.intro(`Set up ${r.label}`),t.log.message(`Checking Vercel setup...`);let[a,u]=await Promise.all([c.detectDeployment(i,{signal:n}),c.getVercelAuthStatus(i,{signal:n})]),d=projectResolutionFromDeployment(a),f=channelSetupEnvironment(u,d);if(t.log.info(describeChannelSetupEnvironment(f)),(await r.setup({environment:f,state:{...createDefaultSetupState(),project:d,projectPath:{kind:`resolved`,inPlace:!0,path:i},channelSelection:[e]},ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetCreateSlackbot:s.yes?!0:void 0,presetPortableCredentials:s.yes?!0:void 0,skipDependencyMutation:!0,deps:c.addChannelsDeps,signal:n})).kind===`cancelled`){l?.cancel(),process.env.EVE_SETUP===`1`&&(process.exitCode=130);return}t.outro(`Integration set up.`),l?.complete()}catch(e){l?.fail(e),n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}export{runIntegrationSetupCommand};
@@ -1 +1 @@
1
- function registerIntegrationCommands(e){let{appRoot:t,logger:n,program:r}=e;r.command(`integration`,{hidden:!0}).command(`setup <kind>`).option(`-y, --yes`).action(async(e,r)=>{let{runIntegrationSetupCommand:i}=await import(`./integration-setup.js`);await i(n,t,e,{yes:r.yes})})}export{registerIntegrationCommands};
1
+ function registerIntegrationCommands(e){let{appRoot:t,logger:n,program:r}=e,i=r.command(`integration`,{hidden:!0});i.command(`setup <kind>`).option(`-y, --yes`).action(async(e,r)=>{let{runIntegrationSetupCommand:i}=await import(`./integration-setup.js`);await i(n,t,e,{yes:r.yes})}),i.command(`connect <slug> <service> [canonical-name]`).action(async(e,r,i)=>{let{runIntegrationConnectCommand:a}=await import(`./integration-connect.js`);await a(n,t,e,r,i)})}export{registerIntegrationCommands};
@@ -1,8 +1,18 @@
1
+ import type { Prompter } from "#setup/prompter.js";
1
2
  export interface RegistrySetupCommand {
2
3
  package: string;
3
4
  bin: string;
4
5
  args: string[];
5
6
  }
6
- export type RegistrySetupCommandResult = "completed" | "cancelled";
7
- /** Executes a trusted registry setup command from an installed package's declared Node binary. */
8
- export declare function runRegistrySetupCommand(appRoot: string, setup: RegistrySetupCommand, item: string): Promise<RegistrySetupCommandResult>;
7
+ export type RegistrySetupCommandResult = {
8
+ kind: "completed";
9
+ output: readonly string[];
10
+ } | {
11
+ kind: "cancelled";
12
+ };
13
+ export interface RegistrySetupCommandOptions {
14
+ prompter: Prompter;
15
+ signal?: AbortSignal;
16
+ }
17
+ /** Executes a trusted setup binary while the parent prompter owns all terminal interaction. */
18
+ export declare function runRegistrySetupCommand(appRoot: string, setup: RegistrySetupCommand, item: string, options?: RegistrySetupCommandOptions): Promise<RegistrySetupCommandResult>;
@@ -1 +1,2 @@
1
- import{findPackageJSON}from"node:module";import{z}from"#compiled/zod/index.js";import{dirname,isAbsolute,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{spawn}from"node:child_process";import{pathToFileURL}from"node:url";const PackageJsonSchema=z.object({name:z.string().min(1),bin:z.union([z.string(),z.record(z.string(),z.string())]).optional()});function declaredBinPath(e,t){return typeof e.bin==`string`?t===e.name.slice(e.name.lastIndexOf(`/`)+1)?e.bin:void 0:e.bin?.[t]}async function resolveNodePackageBin(e,t){let s=dirname(e),c=PackageJsonSchema.parse(JSON.parse(await readFile(e,`utf8`))),l=declaredBinPath(c,t);if(l===void 0)throw Error(`Package "${c.name}" does not declare a "${t}" binary.`);let u=resolve(s,l),d=relative(s,u);if(d.startsWith(`..`)||isAbsolute(d))throw Error(`Package "${c.name}" declares its "${t}" binary outside the package directory.`);return u}async function runRegistrySetupCommand(t,n,r){let i=findPackageJSON(n.package,pathToFileURL(resolve(t,`package.json`)));if(i===void 0)throw Error(`Setup package "${n.package}" is not installed. Run \`eve add ${r}\` first.`);let o=await resolveNodePackageBin(i,n.bin);return new Promise((e,i)=>{let a=spawn(process.execPath,[o,...n.args],{cwd:t,env:{...process.env,EVE_SETUP:`1`,EVE_SETUP_ITEM:r},stdio:`inherit`});a.once(`error`,i),a.once(`close`,(t,n)=>{if(t===0){e(`completed`);return}if(t===130||n===`SIGINT`){e(`cancelled`);return}i(Error(n===null?`Setup command exited with code ${t??`unknown`}.`:`Setup command was terminated by ${n}.`))})})}export{runRegistrySetupCommand};
1
+ import{findPackageJSON}from"node:module";import{z}from"#compiled/zod/index.js";import{dirname,isAbsolute,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{spawn}from"node:child_process";import{WizardCancelledError}from"#setup/step.js";import{pathToFileURL}from"node:url";import{createProcessOutputBuffer}from"#setup/primitives/process-output.js";import{REGISTRY_SETUP_PROTOCOL_VERSION,isRegistrySetupChildMessage}from"#setup/registry-setup-protocol.js";const PackageJsonSchema=z.object({name:z.string().min(1),bin:z.union([z.string(),z.record(z.string(),z.string())]).optional()});function declaredBinPath(e,t){return typeof e.bin==`string`?t===e.name.slice(e.name.lastIndexOf(`/`)+1)?e.bin:void 0:e.bin?.[t]}async function resolveNodePackageBin(e,t){let s=dirname(e),c=PackageJsonSchema.parse(JSON.parse(await readFile(e,`utf8`))),l=declaredBinPath(c,t);if(l===void 0)throw Error(`Package "${c.name}" does not declare a "${t}" binary.`);let u=resolve(s,l),d=relative(s,u);if(d.startsWith(`..`)||isAbsolute(d))throw Error(`Package "${c.name}" declares its "${t}" binary outside the package directory.`);return u}function send(e,t){e.connected&&e.send(t)}async function answerPrompt(e,t,n,r){try{let i,a=n.prompt;switch(a.kind){case`text`:i=await t.text(a);break;case`password`:i=await t.password(a);break;case`select`:i=(a.options.multiple,await t.select(a.options));break;case`editable-select`:i=t.selectEditable===void 0?{kind:`selected`,value:await t.select(a.options)}:await t.selectEditable({...a.options,editable:{...a.options.editable,formatHint:e=>e}});break;case`acknowledge`:await t.acknowledge?.(a.options);break;case`choice`:{if(t.awaitChoice===void 0){i=await t.select({message:a.options.context,options:[...a.options.actions]});break}let e=t.awaitChoice(a.options);r.set(n.id,e.close);try{i=await e.choice}finally{r.delete(n.id)}break}}send(e,{type:`prompt-result`,id:n.id,value:i})}catch(t){if(t instanceof WizardCancelledError){send(e,{type:`prompt-result`,id:n.id,cancelled:!0});return}throw t}}function handlePresentation(e,t,n,r){switch(n.type){case`log`:return t.log[n.level](n.text),!0;case`note`:return t.note(n.message,n.title,{tone:n.tone}),!0;case`intro`:return t.intro(n.text,n.subtitle),!0;case`outro`:return t.outro(n.text),!0;case`result`:return!1;case`status`:if(r.get(n.id)?.(),r.delete(n.id),n.status!==void 0){let e=t.log.spinner?.(n.status);e!==void 0&&r.set(n.id,()=>e.stop())}return!0;case`close-prompt`:return r.get(n.id)?.(),r.delete(n.id),!0;case`prompt`:return answerPrompt(e,t,n,r).catch(t=>{terminateChild(e,`SIGTERM`),e.emit(`error`,t)}),!0;case`ready`:return!1}}async function runRegistrySetupCommand(t,n,r,i){let o=findPackageJSON(n.package,pathToFileURL(resolve(t,`package.json`)));if(o===void 0)throw Error(`Setup package "${n.package}" is not installed. Run \`eve add ${r}\` first.`);let c=await resolveNodePackageBin(o,n.bin);if(i===void 0)throw Error(`Registry setup commands require a parent prompter.`);return new Promise((e,a)=>{let o=spawn(process.execPath,[c,...n.args],{cwd:t,env:{...process.env,EVE_SETUP:`1`,EVE_SETUP_ITEM:r,EVE_SETUP_PROTOCOL:String(REGISTRY_SETUP_PROTOCOL_VERSION)},stdio:[`ignore`,`pipe`,`pipe`,`ipc`],detached:process.platform!==`win32`}),l=!1,f=!1,p,m=new Map,h=createProcessOutputBuffer(({text:e})=>i.prompter.log.commandOutput(e));o.stdout?.on(`data`,e=>h.write(`stdout`,e)),o.stderr?.on(`data`,e=>h.write(`stderr`,e));let g,cancel=()=>{send(o,{type:`cancel`}),g=setTimeout(()=>terminateChild(o,`SIGTERM`),3e3),g.unref()};i.signal?.addEventListener(`abort`,cancel,{once:!0});let cleanup=()=>{h.flush(),i.signal?.removeEventListener(`abort`,cancel),g!==void 0&&clearTimeout(g);for(let e of m.values())e();m.clear()};o.on(`message`,e=>{if(!isRegistrySetupChildMessage(e)){cancel(),a(Error(`Setup command sent an invalid registry protocol message.`));return}if(e.type===`ready`){if(e.version!==REGISTRY_SETUP_PROTOCOL_VERSION){cancel(),a(Error(`Setup command does not support registry setup protocol v${REGISTRY_SETUP_PROTOCOL_VERSION}.`));return}f=!0;return}if(e.type===`result`){p=e.outcome;return}handlePresentation(o,i.prompter,e,m)}),o.once(`error`,e=>{cleanup(),a(e)}),o.once(`close`,(t,n)=>{if(cleanup(),!l){if(l=!0,p?.kind===`completed`){if(t!==0){a(Error(`Setup command reported success, then exited with code ${t??`unknown`}.`));return}e({kind:`completed`,output:p.facts.map(e=>`${e.label}: ${e.value}`)});return}if(p?.kind===`cancelled`){e({kind:`cancelled`});return}if(p?.kind===`failed`){let e=p.error.details?.length?`\n${p.error.details.join(`
2
+ `)}`:``;a(Error(`${p.error.message}${e}`));return}if(i.signal?.aborted===!0||t===130||n===`SIGINT`){e({kind:`cancelled`});return}if(t===0&&f){a(Error(`Setup command exited without reporting a result.`));return}a(Error(n===null?`Setup command exited with code ${t??`unknown`} before reporting a result.`:`Setup command was terminated by ${n} before reporting a result.`))}})})}function terminateChild(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{runRegistrySetupCommand};
@@ -9,6 +9,8 @@ export interface AddCommandOptions {
9
9
  overwrite?: boolean;
10
10
  skipSetup?: boolean;
11
11
  yes?: boolean;
12
+ /** Suppresses the registry SDK's terminal-native progress output. */
13
+ silent?: boolean;
12
14
  }
13
15
  export interface RegistrySetupDependencies {
14
16
  loadSetupCommandRunner(): Promise<typeof runRegistrySetupCommand>;
@@ -17,10 +19,42 @@ export interface AddCommandDependencies extends RegistrySetupDependencies {
17
19
  createPrompter?: () => Prompter;
18
20
  isInteractive?: () => boolean;
19
21
  }
22
+ /** One discoverable item from an eve-compatible registry catalog. */
23
+ export interface RegistryCatalogItem {
24
+ address: string;
25
+ name: string;
26
+ type?: string;
27
+ description?: string;
28
+ source: string;
29
+ }
30
+ /** Catalog items plus non-fatal failures from the registry sources queried. */
31
+ export interface RegistryCatalogResult {
32
+ items: RegistryCatalogItem[];
33
+ total: number;
34
+ errors: Array<{
35
+ message: string;
36
+ registry: string;
37
+ }>;
38
+ }
20
39
  /** Installs an official registry item without running its declared setup command. */
21
40
  export declare function installOfficialRegistryItem(appRoot: string, item: string, options?: AddCommandOptions): Promise<void>;
41
+ /** Browses all configured catalogs, or one namespace or URL source. */
42
+ export declare function browseRegistryCatalog(appRoot: string, options?: {
43
+ query?: string;
44
+ source?: string;
45
+ }): Promise<RegistryCatalogResult>;
46
+ /** Resolves one official, configured, or URL-addressed item manifest. */
47
+ export declare function getRegistryItemManifest(appRoot: string, item: string): Promise<unknown>;
48
+ /** Installs an official, configured, or URL-addressed registry item. */
49
+ export declare function installRegistryItem(appRoot: string, item: string, options?: AddCommandOptions & {
50
+ prompter?: Prompter;
51
+ signal?: AbortSignal;
52
+ }, dependencies?: AddCommandDependencies): Promise<readonly string[]>;
22
53
  /** Installs an official, configured, or URL-addressed registry item. */
23
- export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: AddCommandOptions, dependencies?: AddCommandDependencies): Promise<void>;
54
+ export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: AddCommandOptions & {
55
+ prompter?: Prompter;
56
+ signal?: AbortSignal;
57
+ }, dependencies?: AddCommandDependencies): Promise<void>;
24
58
  /** Adds registry namespace mappings to the project's package.json. */
25
59
  export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
26
60
  /** Lists registry items from every configured source or one selected source. */
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand},OFFICIAL_REGISTRY=`https://eve.dev/r`,OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:i,cwd:e,overwrite:r.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function browseRegistryItems(e,t,r,i){validateRegistrySource(i);let a=await readRegistryConfig(t),o=i?[i]:[OFFICIAL_CATALOG,...configuredRegistrySources(a)],s=await searchRegistries(o,{config:a,continueOnError:o.length>1,query:r}),c=s.errors??[];c.length<o.length&&printSearchResults(e,s,{query:r,sources:o});for(let t of c)e.error(`${t.registry}: ${t.message}`);c.length>0&&(process.exitCode=1)}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let o=await a.loadSetupCommandRunner();try{await o(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n)===`cancelled`&&e.log(setupReminder(n,`cancelled`))}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let o=await readRegistryConfig(t),l=itemAddress(r);if(i.skipInstall===!0){if(i.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(i.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(l))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[u]=await getRegistryItems([l],{config:o}),d=isOfficialItemAddress(l)?eveMetadataFromRegistryItem(u):void 0;if(assertCompatibleEveVersion(d?.requires),i.skipInstall===!0){if(d?.setup===void 0)throw Error(`Registry item "${r}" does not declare a setup flow.`);await runDeclaredSetup(e,t,r,d.setup,i,a);return}if(await addRegistryItems([l],{config:o,cwd:t,overwrite:i.overwrite}),d?.setup===void 0)return;let f=a.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(i.skipSetup===!0||!i.yes&&!f){e.log(setupReminder(r,`skipped`));return}if(!i.yes)try{if(await(a.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${r} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(r,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(r,`cancelled`));return}await runDeclaredSetup(e,t,r,d.setup,i,a)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n))}async function runRegistrySearchCommand(e,t,n,r){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{installOfficialRegistryItem,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand},OFFICIAL_REGISTRY=`https://eve.dev/r`,OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:i,cwd:e,overwrite:r.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let r=await readRegistryConfig(e),i=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(r)];return{result:await searchRegistries(i,{config:r,continueOnError:i.length>1,query:t.query}),sources:i}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r){let{result:i,sources:a}=await searchRegistryCatalog(t,{query:n,source:r}),o=i.errors??[];o.length<a.length&&printSearchResults(e,i,{query:n,sources:a});for(let t of o)e.error(`${t.registry}: ${t.message}`);o.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let r=await readRegistryConfig(e),i=await getRegistryItems([itemAddress(t)],{config:r});return i.length===1?i[0]:i}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let s=await a.loadSetupCommandRunner();try{let a=i.prompter??createPrompter(),c=await s(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n,{prompter:a,signal:i.signal});if(c.kind===`cancelled`)e.log(setupReminder(n,`cancelled`));else for(let t of c.output)e.log(t)}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode;if(await runAddCommand(o,e,t,{...n,yes:!0},r),process.exitCode=s,i!==void 0)throw Error(i);return a}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let o=await readRegistryConfig(t),l=itemAddress(r);if(i.skipInstall===!0){if(i.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(i.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(l))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[u]=await getRegistryItems([l],{config:o}),d=isOfficialItemAddress(l)?eveMetadataFromRegistryItem(u):void 0;if(assertCompatibleEveVersion(d?.requires),i.skipInstall===!0){if(d?.setup===void 0)throw Error(`Registry item "${r}" does not declare a setup flow.`);await runDeclaredSetup(e,t,r,d.setup,i,a);return}if(await addRegistryItems([l],{config:o,cwd:t,overwrite:i.overwrite,silent:i.silent}),d?.setup===void 0)return;let f=a.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(i.skipSetup===!0||!i.yes&&!f){e.log(setupReminder(r,`skipped`));return}if(!i.yes)try{if(await(a.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${r} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(r,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(r,`cancelled`));return}await runDeclaredSetup(e,t,r,d.setup,i,a)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n))}async function runRegistrySearchCommand(e,t,n,r){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -1,4 +1,4 @@
1
- import{basename,join}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{readFile,readdir,stat}from"node:fs/promises";import{formatElapsed}from"#cli/format-elapsed.js";const TRACE_ID_PATTERN=/^[0-9a-f]{32}$/u,SPAN_FILE_PATTERN=/^([0-9a-f]{16})\.otlp\.json$/u,TRACE_DIRECTORY_SEGMENTS=[`.eve`,`traces`,`v1`],TRACE_DISPLAY_DIRECTORY=TRACE_DIRECTORY_SEGMENTS.join(`/`);async function listLocalTraces(e){let n=join(e,...TRACE_DIRECTORY_SEGMENTS),r;try{r=await readdir(n,{withFileTypes:!0})}catch(e){if(isMissing(e))return[];throw e}let i=[];for(let e of r){if(!e.isDirectory()||!TRACE_ID_PATTERN.test(e.name))continue;let t=await readTrace(n,e.name).catch(()=>void 0);t!==void 0&&i.push(t)}return i.sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs>t.startTimeNs?-1:1)}function resolveLocalTrace(t,n){let r=n.replaceAll(`\\`,`/`),a=basename(r),o=r===a?[r]:[r,a],s=t.find(e=>o.includes(e.traceId));if(s!==void 0)return s;let c=t.filter(e=>e.sessionId!==void 0&&o.includes(e.sessionId));if(c.length===1)return c[0];if(c.length>1)throw ambiguousTraceError(c,n);let l=t.filter(e=>o.some(t=>e.traceId.startsWith(t)||e.sessionId?.startsWith(t)));if(l.length===1)return l[0];throw l.length===0?Error(`No local trace matches "${sanitizeForTerminal(n)}". Run \`eve trace ls\` to list traces.`):ambiguousTraceError(l,n)}async function runTraceListCommand(e,t,n={}){let r=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(r.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),sessionId:e.sessionId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(r.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let a=r.map(e=>[e.traceId,sanitizeForTerminal(e.sessionId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),o=[`TRACE`,`SESSION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],s=o.map((e,t)=>Math.max(e.length,...a.map(e=>e[t].length)));e.log([o,...a].map(e=>e.map((e,t)=>e.padEnd(s[t])).join(` `).trimEnd()).join(`
1
+ import{basename,join}from"node:path";import{createCliTheme,renderCliSection,sanitizeForTerminal}from"#cli/ui/output.js";import{readFile,readdir,stat}from"node:fs/promises";import{formatElapsed}from"#cli/format-elapsed.js";const TRACE_ID_PATTERN=/^[0-9a-f]{32}$/u,SPAN_FILE_PATTERN=/^([0-9a-f]{16})\.otlp\.json$/u,TRACE_DIRECTORY_SEGMENTS=[`.eve`,`traces`,`v1`],TRACE_DISPLAY_DIRECTORY=TRACE_DIRECTORY_SEGMENTS.join(`/`);async function listLocalTraces(e){let n=join(e,...TRACE_DIRECTORY_SEGMENTS),r;try{r=await readdir(n,{withFileTypes:!0})}catch(e){if(isMissing(e))return[];throw e}let i=[];for(let e of r){if(!e.isDirectory()||!TRACE_ID_PATTERN.test(e.name))continue;let t=await readTrace(n,e.name).catch(()=>void 0);t!==void 0&&i.push(t)}return i.sort((e,t)=>e.startTimeNs===t.startTimeNs?e.traceId.localeCompare(t.traceId):e.startTimeNs>t.startTimeNs?-1:1)}function resolveLocalTrace(t,n){let r=n.replaceAll(`\\`,`/`),a=basename(r),o=r===a?[r]:[r,a],s=t.find(e=>o.includes(e.traceId));if(s!==void 0)return s;let c=t.filter(e=>e.sessionId!==void 0&&o.includes(e.sessionId));if(c.length===1)return c[0];if(c.length>1)throw ambiguousTraceError(c,n);let l=t.filter(e=>o.some(t=>e.traceId.startsWith(t)||e.sessionId?.startsWith(t)));if(l.length===1)return l[0];throw l.length===0?Error(`No local trace matches "${sanitizeForTerminal(n)}". Run \`eve traces ls\` to list traces.`):ambiguousTraceError(l,n)}async function runTraceListCommand(e,t,n={}){let r=await listLocalTraces(t);if(n.json===!0){e.log(JSON.stringify(r.map(e=>({agentName:e.agentName??null,durationMs:durationMs(e.startTimeNs,e.endTimeNs),sessionId:e.sessionId??null,spanCount:e.spans.length,startedAt:toDate(e.startTimeNs).toISOString(),traceId:e.traceId})),null,2));return}if(r.length===0){e.log(`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`);return}let a=r.map(e=>[e.traceId,sanitizeForTerminal(e.sessionId??`unknown`),sanitizeForTerminal(e.agentName??`unknown`),toDate(e.startTimeNs).toISOString(),formatElapsed(durationMs(e.startTimeNs,e.endTimeNs)),String(e.spans.length)]),o=[`TRACE`,`SESSION`,`AGENT`,`STARTED`,`DURATION`,`SPANS`],s=o.map((e,t)=>Math.max(e.length,...a.map(e=>e[t].length)));e.log([o,...a].map(e=>e.map((e,t)=>e.padEnd(s[t])).join(` `).trimEnd()).join(`
2
2
  `))}async function runTraceShowCommand(e,t,i){let a=await listLocalTraces(t);if(a.length===0){let t=`No local traces found under ${TRACE_DISPLAY_DIRECTORY}.`;if(i!==void 0)throw Error(t);e.log(t);return}let o=i===void 0?a[0]:resolveLocalTrace(a,i),s=createCliTheme();e.log([renderCliSection(s,{rows:[{label:`Trace ID`,value:o.traceId},{label:`Session ID`,value:o.sessionId??`unknown`},{label:`Agent`,value:o.agentName??`unknown`},{label:`Started`,value:toDate(o.startTimeNs).toISOString()},{label:`Duration`,value:formatElapsed(durationMs(o.startTimeNs,o.endTimeNs))},{label:`Spans`,value:String(o.spans.length)}],title:`Trace`}),`${s.accent(`Spans`)}\n${renderSpanTree(o.spans)}`].join(`
3
3
 
4
4
  `))}async function readTrace(e,n){let r=join(e,n,`segments`),i;try{i=await readdir(r,{withFileTypes:!0})}catch(e){if(isMissing(e))return;throw e}let c=new Map;for(let e of i.sort((e,t)=>e.name.localeCompare(t.name))){if(!e.isFile()||!SPAN_FILE_PATTERN.test(e.name))continue;let i;try{let n=join(r,e.name);if((await stat(n)).size>8388608)continue;i=await readFile(n,`utf8`)}catch{continue}for(let e of parseSegment(i,n))c.has(e.spanId)||c.set(e.spanId,e)}if(c.size===0)return;let l=[...c.values()].sort(compareSpans),d=l.map(e=>e.attributes);return{agentName:firstAttribute(d,`agent.name`),endTimeNs:l.reduce((e,t)=>t.endTimeNs>e?t.endTimeNs:e,0n),sessionId:firstAttribute(d,`agent.session.id`),spans:l,startTimeNs:l.reduce((e,t)=>t.startTimeNs<e?t.startTimeNs:e,l[0].startTimeNs),traceId:n}}function parseSegment(e,t){try{let n=JSON.parse(e);if(!isRecord(n)||!Array.isArray(n.resourceSpans))return[];let r=[];for(let e of n.resourceSpans)if(!(!isRecord(e)||!Array.isArray(e.scopeSpans)))for(let n of e.scopeSpans){if(!isRecord(n)||!Array.isArray(n.spans))continue;let e=isRecord(n.scope)&&typeof n.scope.name==`string`?n.scope.name:void 0;for(let i of n.spans){let n=parseSpan(i,t,e);n!==void 0&&r.push(n)}}return r}catch{return[]}}function parseSpan(e,t,n){if(!isRecord(e)||e.traceId!==t||typeof e.spanId!=`string`||!/^[0-9a-f]{16}$/u.test(e.spanId)||typeof e.name!=`string`)return;let r=parseNanos(e.startTimeUnixNano),i=parseNanos(e.endTimeUnixNano);if(!(r===void 0||i===void 0||i<r))return{attributes:parseAttributes(e.attributes),endTimeNs:i,name:e.name,parentSpanId:typeof e.parentSpanId==`string`&&/^[0-9a-f]{16}$/u.test(e.parentSpanId)?e.parentSpanId:void 0,scope:n,spanId:e.spanId,startTimeNs:r,statusCode:parseStatusCode(e.status),traceId:t}}function parseAttributes(e){if(!Array.isArray(e))return{};let t={};for(let n of e){if(!isRecord(n)||typeof n.key!=`string`||!isRecord(n.value))continue;let e=parseAnyValue(n.value);e!==void 0&&(t[n.key]=e)}return t}function parseAnyValue(e){for(let t of[`stringValue`,`boolValue`,`intValue`,`doubleValue`])if(t in e)return e[t];if(isRecord(e.arrayValue)&&Array.isArray(e.arrayValue.values))return e.arrayValue.values.filter(isRecord).map(e=>parseAnyValue(e))}function renderSpanTree(e){let t=new Map(e.map(e=>[e.spanId,e])),n=new Map,r=[];for(let i of e)if(i.parentSpanId===void 0||!t.has(i.parentSpanId))r.push(i);else{let e=n.get(i.parentSpanId)??[];e.push(i),n.set(i.parentSpanId,e)}r.sort(compareSpans);for(let e of n.values())e.sort(compareSpans);let i=[],a=new Set,render=(e,t,r)=>{if(a.has(e.spanId))return;a.add(e.spanId),i.push(`${t}${r}${spanLabel(e)}`);let o=n.get(e.spanId)??[];o.forEach((e,n)=>{let i=n===o.length-1;render(e,`${t}${r===``?``:r===`└─ `?` `:`│ `}`,i?`└─ `:`├─ `)})};for(let e of r)render(e,``,``);for(let t of[...e].sort(compareSpans))a.has(t.spanId)||render(t,``,``);return i.join(`
@@ -1 +1 @@
1
- import{isPromptControlCommand}from"./prompt-commands.js";import{truncate}from"./tool-format.js";const AGENT_HEADER_TIPS=[`Use /channels to add more ways to reach your agent.`,`Use /deploy to see your agent go live.`,`Type /help to see every command.`,`Tip: /connect to seamlessly add MCP Connections to your agent`];function pickAgentHeaderTip(e=Math.random){let t=Math.min(AGENT_HEADER_TIPS.length-1,Math.floor(e()*AGENT_HEADER_TIPS.length));return AGENT_HEADER_TIPS[t]}function buildAgentHeader(e){let{theme:n,info:r,name:i,width:a}=e,o=n.colors,s=[],c=o.bold(`eve`);if(s.push(` ${c} ${o.dim(truncate(i,Math.max(8,a-8)))}`),r&&(r.diagnostics.discoveryErrors>0||r.diagnostics.discoveryWarnings>0)){let e=[];r.diagnostics.discoveryErrors>0&&e.push(o.red(`${r.diagnostics.discoveryErrors} error${plural(r.diagnostics.discoveryErrors)}`)),r.diagnostics.discoveryWarnings>0&&e.push(o.yellow(`${r.diagnostics.discoveryWarnings} warning${plural(r.diagnostics.discoveryWarnings)}`)),s.push(` ${o.dim(n.glyph.warning)} ${e.join(o.dim(` · `))}`)}return e.tip!==void 0&&s.push(` ${renderTip(e.tip,Math.max(8,a-2),n)}`),s}function renderTip(n,r,i){return truncate(n,r).split(/(\/[a-z:-]+)/u).map(t=>isPromptControlCommand(t)?i.colors.blue(t):i.colors.dim(t)).join(``)}function plural(e){return e===1?``:`s`}export{AGENT_HEADER_TIPS,buildAgentHeader,pickAgentHeaderTip};
1
+ import{isPromptControlCommand}from"./prompt-commands.js";import{truncate}from"./tool-format.js";const AGENT_HEADER_TIPS=[`Use /add to install integrations from the registry.`,`Use /deploy to see your agent go live.`,`Type /help to see every command.`];function pickAgentHeaderTip(e=Math.random){let t=Math.min(AGENT_HEADER_TIPS.length-1,Math.floor(e()*AGENT_HEADER_TIPS.length));return AGENT_HEADER_TIPS[t]}function buildAgentHeader(e){let{theme:n,info:r,name:i,width:a}=e,o=n.colors,s=[],c=o.bold(`eve`);if(s.push(` ${c} ${o.dim(truncate(i,Math.max(8,a-8)))}`),r&&(r.diagnostics.discoveryErrors>0||r.diagnostics.discoveryWarnings>0)){let e=[];r.diagnostics.discoveryErrors>0&&e.push(o.red(`${r.diagnostics.discoveryErrors} error${plural(r.diagnostics.discoveryErrors)}`)),r.diagnostics.discoveryWarnings>0&&e.push(o.yellow(`${r.diagnostics.discoveryWarnings} warning${plural(r.diagnostics.discoveryWarnings)}`)),s.push(` ${o.dim(n.glyph.warning)} ${e.join(o.dim(` · `))}`)}return e.tip!==void 0&&s.push(` ${renderTip(e.tip,Math.max(8,a-2),n)}`),s}function renderTip(n,r,i){return truncate(n,r).split(/(\/[a-z:-]+)/u).map(t=>isPromptControlCommand(t)?i.colors.blue(t):i.colors.dim(t)).join(``)}function plural(e){return e===1?``:`s`}export{AGENT_HEADER_TIPS,buildAgentHeader,pickAgentHeaderTip};
@@ -1 +1 @@
1
- import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(n){return{async handle(r,i){let{target:a}=n;if(a.kind===`remote`&&!isPromptCommandAvailableFor(r.name,`remote`))return{message:`/${r.name} needs eve dev running the local server (it is not available with --url).`};if(r.name===`model`&&r.argument.length>0){if(a.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let e=a.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:t}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(n.modelChangeRefusal??t)(e);return o===null?{message:a(await(n.applyModel??i)({appRoot:e,slug:r.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let o=i.renderer.setupFlow;if(o===void 0)return{message:`/${r.name} is not supported by this renderer.`};if(r.name===`vc:login`&&a.kind===`remote`){if(i.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let e;try{({runRemoteAuthCommand:e}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await e({connection:i.remoteConnection,flow:n.remoteAuthFlow,renderer:o})}}let s;try{s=await import(`./setup-commands.js`)}catch(e){return{message:`/${r.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:c,SETUP_FLOW_CONFIG:l}=s,u=l[r.name];o.begin(u.title,u.indicator);let d=!0;try{let e={command:r.name,appRoot:a.workspaceRoot,renderer:o,disabledConnectionReasons:i.disabledConnectionReasons};i.initialModelStep!==void 0&&(e.initialModelStep=i.initialModelStep),n.flows!==void 0&&(e.flows=n.flows);let t=await c(e);d=t.preserveFlowDiagnostics;let s={message:t.message};return t.effect!==void 0&&(s.effect=t.effect),s}finally{i.keepSetupFlowOpen!==!0&&o.end({preserveDiagnostics:d})}}}}export{createPromptCommandHandler};
1
+ import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(n){return{async handle(r,i){let{target:a}=n;if(a.kind===`remote`&&!isPromptCommandAvailableFor(r.name,`remote`))return{message:`/${r.name} needs eve dev running the local server (it is not available with --url).`};if(r.name===`model`&&r.argument.length>0){if(a.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let e=a.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:t}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(n.modelChangeRefusal??t)(e);return o===null?{message:a(await(n.applyModel??i)({appRoot:e,slug:r.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let o=i.renderer.setupFlow;if(o===void 0)return{message:`/${r.name} is not supported by this renderer.`};if(r.name===`vc:login`&&a.kind===`remote`){if(i.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let e;try{({runRemoteAuthCommand:e}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await e({connection:i.remoteConnection,flow:n.remoteAuthFlow,renderer:o})}}let s;try{s=await import(`./setup-commands.js`)}catch(e){return{message:`/${r.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:c,SETUP_FLOW_CONFIG:l}=s,u=l[r.name];o.begin(u.title,u.indicator);let d=!0;try{let e={command:r.name,appRoot:a.workspaceRoot,renderer:o,withExclusiveTerminal:i.withExclusiveTerminal};i.initialModelStep!==void 0&&(e.initialModelStep=i.initialModelStep),n.flows!==void 0&&(e.flows=n.flows);let t=await c(e);d=t.preserveFlowDiagnostics;let s={message:t.message};return t.tone!==void 0&&(s.tone=t.tone),t.effect!==void 0&&(s.effect=t.effect),s}finally{i.keepSetupFlowOpen!==!0&&o.end({preserveDiagnostics:d})}}}}export{createPromptCommandHandler};
@@ -1,4 +1,4 @@
1
- export type PromptCommandExtensionName = "model" | "channels" | "connect" | "deploy" | "vc:install" | "vc:login";
1
+ export type PromptCommandExtensionName = "model" | "add" | "deploy" | "vc:install" | "vc:login";
2
2
  type PromptCommandTarget = "local" | "remote";
3
3
  /** The slash commands the prompt accepts. */
4
4
  export type PromptCommand = {
@@ -1,2 +1,2 @@
1
- const PROMPT_COMMAND_DEFINITIONS=[{name:`help`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`new`,aliases:[],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`new`}),targets:[`local`,`remote`]},{name:`vc:install`,aliases:[],description:`Install the Vercel CLI`,takesArgument:!1,build:()=>({type:`extension`,name:`vc:install`,argument:``}),targets:[`local`,`remote`]},{name:`vc:login`,aliases:[],description:`Authenticate with Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`vc:login`,argument:``}),targets:[`local`,`remote`]},{name:`model`,aliases:[],description:`Configure the agent's model and provider`,argumentHint:`[provider/model]`,takesArgument:!0,build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`loglevel`,aliases:[],description:`Show or hide captured stdout/stderr/sandbox logs`,argumentHint:`[all|stderr|sandbox|none]`,takesArgument:!0,build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`channels`,aliases:[],description:`Add chat channels to the agent`,takesArgument:!1,build:()=>({type:`extension`,name:`channels`,argument:``}),targets:[`local`]},{name:`connect`,aliases:[],description:`Add an MCP server through Vercel Connect`,takesArgument:!1,build:()=>({type:`extension`,name:`connect`,argument:``}),targets:[`local`]},{name:`deploy`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`exit`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(t){return PROMPT_COMMAND_DEFINITIONS.filter(e=>e.targets.some(e=>e===t))}function isPromptCommandAvailableFor(t,n){return(PROMPT_COMMAND_DEFINITIONS.find(e=>e.name===t)?.targets)?.includes(n)??!1}function parsePromptCommand(e){let n=e.trim();if(!n.startsWith(`/`))return null;for(let e of PROMPT_COMMANDS)for(let t of[e.name,...e.aliases]){let r=`/${t}`;if(n===r)return e.build(``);if(e.takesArgument&&n.startsWith(`${r} `))return e.build(n.slice(r.length).trim())}return null}function isPromptControlCommand(e){return parsePromptCommand(e)!==null}function formatPromptCommandHelp(e=PROMPT_COMMANDS){let n=e.map(e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return{invocation:`/${e.name}${t}${n}`,description:e.description}}),r=Math.max(...n.map(e=>e.invocation.length))+2;return n.map(e=>e.invocation.padEnd(r)+e.description).join(`
1
+ const PROMPT_COMMAND_DEFINITIONS=[{name:`help`,aliases:[],description:`Show available commands`,takesArgument:!1,build:()=>({type:`help`}),targets:[`local`,`remote`]},{name:`new`,aliases:[],description:`Start a fresh session`,takesArgument:!1,build:()=>({type:`new`}),targets:[`local`,`remote`]},{name:`vc:install`,aliases:[],description:`Install the Vercel CLI`,takesArgument:!1,build:()=>({type:`extension`,name:`vc:install`,argument:``}),targets:[`local`,`remote`]},{name:`vc:login`,aliases:[],description:`Authenticate with Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`vc:login`,argument:``}),targets:[`local`,`remote`]},{name:`model`,aliases:[],description:`Configure the agent's model and provider`,argumentHint:`[provider/model]`,takesArgument:!0,build:e=>({type:`extension`,name:`model`,argument:e}),targets:[`local`]},{name:`loglevel`,aliases:[],description:`Show or hide captured stdout/stderr/sandbox logs`,argumentHint:`[all|stderr|sandbox|none]`,takesArgument:!0,build:e=>({type:`loglevel`,argument:e}),targets:[`local`,`remote`]},{name:`add`,aliases:[],description:`Browse and add registry integrations`,takesArgument:!1,build:()=>({type:`extension`,name:`add`,argument:``}),targets:[`local`]},{name:`deploy`,aliases:[],description:`Deploy the agent to Vercel`,takesArgument:!1,build:()=>({type:`extension`,name:`deploy`,argument:``}),targets:[`local`]},{name:`exit`,aliases:[`quit`],description:`Quit the TUI`,takesArgument:!1,build:()=>({type:`exit`}),targets:[`local`,`remote`]}],PROMPT_COMMANDS=PROMPT_COMMAND_DEFINITIONS;function promptCommandsFor(t){return PROMPT_COMMAND_DEFINITIONS.filter(e=>e.targets.some(e=>e===t))}function isPromptCommandAvailableFor(t,n){return(PROMPT_COMMAND_DEFINITIONS.find(e=>e.name===t)?.targets)?.includes(n)??!1}function parsePromptCommand(e){let n=e.trim();if(!n.startsWith(`/`))return null;for(let e of PROMPT_COMMANDS)for(let t of[e.name,...e.aliases]){let r=`/${t}`;if(n===r)return e.build(``);if(e.takesArgument&&n.startsWith(`${r} `))return e.build(n.slice(r.length).trim())}return null}function isPromptControlCommand(e){return parsePromptCommand(e)!==null}function formatPromptCommandHelp(e=PROMPT_COMMANDS){let n=e.map(e=>{let t=e.argumentHint===void 0?``:` ${e.argumentHint}`,n=e.aliases.map(e=>` (/${e})`).join(``);return{invocation:`/${e.name}${t}${n}`,description:e.description}}),r=Math.max(...n.map(e=>e.invocation.length))+2;return n.map(e=>e.invocation.padEnd(r)+e.description).join(`
2
2
  `)}export{PROMPT_COMMANDS,formatPromptCommandHelp,isPromptCommandAvailableFor,isPromptControlCommand,parsePromptCommand,promptCommandsFor};
@@ -1,3 +1,3 @@
1
1
  import{createTuiPrompter}from"./tui-prompter.js";import{describeRemoteAuthCompletedMutations}from"./remote-auth-result.js";import{runRemoteAuthFlow}from"./remote-auth.js";import{remoteHost}from"./target.js";import{WizardCancelledError}from"#setup/step.js";function shouldConfigureTrustedSources(e){switch(e.state){case`auth-required`:case`auth-failed`:return e.challenge.kind===`vercel-deployment-protection`;case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`;case`checking`:case`authenticating`:case`ready`:return!1}}function unavailableAfterAuthentication(e,t){let[n=t,...r]=t.split(/\n\s*\n/u);return[`Authentication was refreshed, but ${e} is unavailable: ${/[.!?]$/u.test(n.trim())?n.trim():`${n.trim()}.`}`,...r.map(e=>e.trim()).filter(e=>e.length>0)].join(`
2
2
 
3
- `)}function mutedRenderer(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 runRemoteAuthCommand(i){i.renderer.begin(`Authenticate via Vercel OIDC`,`pulse`);let a=!0,o=!1,s=new AbortController,c=i.renderer.waitForInterrupt(),l=i.connection.current().target;try{let u=i.flow??runRemoteAuthFlow,d=shouldConfigureTrustedSources(i.connection.current().connection),f=createTuiPrompter(mutedRenderer(i.renderer,()=>o)),p=i.connection.authenticate(async e=>{let t=await u({workspaceRoot:l.workspaceRoot,serverUrl:l.serverUrl,configureTrustedSources:d,prompter:f,signal:e});return a=t.kind===`failed`,t},s.signal),m=await Promise.race([p.then(e=>({kind:`completed`,outcome:e})),c.promise.then(()=>({kind:`interrupted`}))]);m.kind===`interrupted`&&(o=!0,a=!0,s.abort(new WizardCancelledError));let h=m.kind===`completed`?m.outcome:await p;switch(h.kind){case`authenticated`:return`Authenticated ${remoteHost(l)} via Vercel OIDC.`;case`cancelled`:if(o){let e=describeRemoteAuthCompletedMutations(h.completedMutations);return e.length===0?`/vc:login interrupted.`:`/vc:login interrupted. Completed before interruption: ${e.join(`, `)}.`}return h.completedMutations.some(e=>e.kind===`vercel-login`)?`/vc:login dismissed after logging in to Vercel.`:`/vc:login dismissed.`;case`failed`:return h.message;case`unavailable`:return unavailableAfterAuthentication(remoteHost(l),h.failure.message)}}finally{c.dispose(),i.renderer.setStatus(void 0),i.renderer.end({preserveDiagnostics:a})}}export{runRemoteAuthCommand};
3
+ `)}function mutedRenderer(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)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:t=>e.withExclusiveTerminal?.(t)??e.withInheritedStdio(t)}}async function runRemoteAuthCommand(i){i.renderer.begin(`Authenticate via Vercel OIDC`,`pulse`);let a=!0,o=!1,s=new AbortController,c=i.renderer.waitForInterrupt(),l=i.connection.current().target;try{let u=i.flow??runRemoteAuthFlow,d=shouldConfigureTrustedSources(i.connection.current().connection),f=createTuiPrompter(mutedRenderer(i.renderer,()=>o)),p=i.connection.authenticate(async e=>{let t=await u({workspaceRoot:l.workspaceRoot,serverUrl:l.serverUrl,configureTrustedSources:d,prompter:f,signal:e});return a=t.kind===`failed`,t},s.signal),m=await Promise.race([p.then(e=>({kind:`completed`,outcome:e})),c.promise.then(()=>({kind:`interrupted`}))]);m.kind===`interrupted`&&(o=!0,a=!0,s.abort(new WizardCancelledError));let h=m.kind===`completed`?m.outcome:await p;switch(h.kind){case`authenticated`:return`Authenticated ${remoteHost(l)} via Vercel OIDC.`;case`cancelled`:if(o){let e=describeRemoteAuthCompletedMutations(h.completedMutations);return e.length===0?`/vc:login interrupted.`:`/vc:login interrupted. Completed before interruption: ${e.join(`, `)}.`}return h.completedMutations.some(e=>e.kind===`vercel-login`)?`/vc:login dismissed after logging in to Vercel.`:`/vc:login dismissed.`;case`failed`:return h.message;case`unavailable`:return unavailableAfterAuthentication(remoteHost(l),h.failure.message)}}finally{c.dispose(),i.renderer.setStatus(void 0),i.renderer.end({preserveDiagnostics:a})}}export{runRemoteAuthCommand};
@@ -182,7 +182,7 @@ export type AgentTUIRenderer = {
182
182
  clearSetupWarning?(): void;
183
183
  /** Commits the startup `/vc:login` invocation to the transcript. */
184
184
  renderCommandInvocation?(text: string, status?: "failed"): void;
185
- renderCommandResult?(text: string): void;
185
+ renderCommandResult?(text: string, tone?: "success" | "error"): void;
186
186
  readonly setupFlow?: SetupFlowRenderer;
187
187
  readPrompt?(options?: AgentTUISessionOptions): Promise<string | undefined>;
188
188
  /**
@@ -250,10 +250,8 @@ export type AgentTUIRenderer = {
250
250
  flushDelayedDevBuildErrors?(): void;
251
251
  /**
252
252
  * Sets the workspace-scoped Vercel segment of the persistent bottom
253
- * status line: linked project identity and the session's pending-deploy
254
- * flag. Pushed by the runner at startup (async probe) and after
255
- * /vercel, /channels, /deploy outcomes. Renderers without a status
256
- * line ignore it.
253
+ * status line. Pushed by the runner at startup and after Vercel-related
254
+ * setup outcomes. Renderers without a status line ignore it.
257
255
  */
258
256
  setVercelStatus?(status: VercelStatusSnapshot): void;
259
257
  /** Sets the remote deployment badge and its current connection/authentication state. */
@@ -283,16 +281,17 @@ export interface PromptCommandHandlerContext {
283
281
  */
284
282
  readonly keepSetupFlowOpen?: true;
285
283
  readonly remoteConnection?: RemoteConnectionController;
284
+ readonly withExclusiveTerminal?: <T>(task: () => Promise<T>) => Promise<T>;
286
285
  readonly disabledConnectionReasons?: Readonly<Record<string, string>>;
287
286
  }
288
287
  /** What one handled slash command leaves behind for the runner to apply. */
289
288
  export interface PromptCommandOutcome {
290
289
  /** Outcome line rendered under the echoed command; absent renders nothing. */
291
290
  message?: string;
291
+ /** Promotes an outcome to a top-level status. */
292
+ tone?: "success" | "error";
292
293
  /** Post-command work after setup settles. */
293
294
  effect?: VercelStatusEffect | {
294
- kind: "connection-added";
295
- } | {
296
295
  kind: "model-access-changed";
297
296
  };
298
297
  }
@@ -342,6 +341,8 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
342
341
  promptCommandHandler?: PromptCommandHandler;
343
342
  /** Commands shown in discovery for this local or remote session. */
344
343
  availablePromptCommands?: readonly PromptCommandSpec[];
344
+ /** Gives setup subprocesses exclusive terminal and development-host ownership. */
345
+ withExclusiveTerminal?: <T>(task: () => Promise<T>) => Promise<T>;
345
346
  /** Remote target and mutable OIDC token source, when connected through `--url`. */
346
347
  remote?: {
347
348
  readonly target: RemoteDevelopmentTarget;
@@ -1 +1 @@
1
- import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,orderedSetupIssues,resolveModelProviderState}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{toErrorMessage}from"#shared/errors.js";import"#client/index.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";import{devBootPhase}from"#internal/dev-boot-progress.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;#b;#x=!1;#S=new AbortController;#C=!1;#w=[];#T;#E;#D;#O=pickAgentHeaderTip();#k;#A=new Map;#j;#M=new Map;#N=new Set;#P=!1;#F;#I;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#I=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),this.#j=new SubagentPump(n),this.#r=t.name??`eve`,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#E=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#D=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#h=t.promptCommandHandler),this.#g=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#_=createRemoteConnectionController({client:this.#t,credentials:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#v=t.bootDetections??BOOT_DETECTIONS,this.#y=t.getVercelAuthStatus??getVercelAuthStatus,t.onBootProgress!==void 0&&(this.#b=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.serverUrl}))}async#L(){if(this.#f===void 0){this.#z(),await this.#J(void 0);return}let e;if(this.#_!==void 0){let t=await this.#_.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#b);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}this.#z();let t=this.#R(e);await this.#J(t)}#R(e){let t=this.#p===void 0?e:resolveModelProviderState(e,process.env);this.#k=t;let n=this.#f;if(n===void 0)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#O),this.#n.renderAgentHeader?.(r),t}#z(){let e=this.#b;this.#b=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#I?.signal.aborted===!0?onStop():this.#I?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#B()}finally{this.#I?.signal.removeEventListener(`abort`,onStop),this.#x=!0,this.#S.abort(),this.#j.abortAll(),this.#F?.(),this.#F=void 0,this.#n.shutdown?.(),this.#E?.dispose(),this.#D?.dispose(),this.#_?.dispose()}}async#B(){let e=this.#r,r,i,a=!1,o=!1,s=this.#m;await this.#L(),this.#_?.current().connection.state===`auth-required`&&await this.#ie({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#Q(),this.#E?.refreshIdentity(),this.#D?.refresh();let l=this.#m===void 0?void 0:parsePromptCommand(this.#m);for(l?.type===`extension`&&l.name===`model`&&l.argument===``&&this.#p!==void 0&&this.#h!==void 0&&this.#n.setupFlow!==void 0&&(s=void 0,await this.#ae(e));;){if(this.#I?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;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.#U(t)}catch(e){if(isInterruptedError(e))return;throw e}if(r==null)return}let l=parsePromptCommand(r);if(l?.type===`exit`)return;if(l?.type===`new`){if(!await this.#H()){i=void 0,o=!1,r=void 0;continue}i=void 0,o=!1,r=void 0;continue}if(l?.type===`help`){this.#$(formatPromptCommandHelp(this.#g)),i=void 0,o=!1,r=void 0;continue}if(l?.type===`loglevel`){this.#$(this.#se(l.argument)),i=void 0,o=!1,r=void 0;continue}if(l?.type===`extension`){try{await this.#ie(l,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,o=!1;continue}a=!0}let l=await this.#W({prompt:o?void 0:r,inputResponses:i}),u=this.#e.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=r,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=l.turnState?.pendingApprovals??[],n=l.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.#A.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.#A.delete(t.requestId)}}if(a.length===0)break;o=!0,i=a,r=void 0,f=!0;break}if(this.#fe(l)){l=this.#K(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0)if(l.turnState.aborted)this.#P=!0;else{let e=this.#e.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;o=!1,i=void 0,r=void 0;let p=l.turnState?.boundaryEvent;!this.#P&&(p===`session.waiting`||p===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#P&&(this.#P=!1,this.#V(),l.turnState?.aborted?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary())}}#V(){this.#j.abortAll(),this.#A.clear(),this.#M.clear(),this.#N.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#t&&(this.#e=this.#t.session()),this.#d?.clear()}async#H(){try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#V(),this.#n.reset?.(),!0}async#U(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#ue()})}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let o=setInterval(()=>{startRefresh()},500);o.unref?.();try{return await t}finally{r=!0,clearInterval(o),await a}}async#W(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{this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#ue()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),r=await this.#e.send(n)}catch(e){if(isInterruptedError(e))throw e;return this.#_?.reportFailure(e),this.#P=!0,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#q(r,()=>t.abort())}async#G(e){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let t=0;t<8;t+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let t=e.turnId;try{if((await this.#e.cancel(t===void 0?void 0:{turnId:t})).status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#K(){let e=new AbortController;return this.#q(this.#e.stream({signal:e.signal}),()=>e.abort())}#q(e,t){let n=createTurnState();return{abort:()=>{n.aborted=!0,t()},cancel:()=>{this.#G(n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#A,turnState:n,onSubagentCalled:e=>this.#j.begin(e),onSubagentCompleted:e=>this.#j.settle(e),onTurnCancelled:()=>this.#j.settleAll(),onConnectionAuthRequired:e=>this.#de(e),onConnectionAuthCompleted:e=>this.#pe(e),onTerminalFailure:()=>{this.#P=!0},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:n}}async#J(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#w=await detectSetupIssues(t,this.#v),this.#n.renderSetupWarning!==void 0&&(this.#Y(),this.#X())}#Y(){let e=orderedSetupIssues(this.#w,this.#T);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#X(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#y(e,{signal:this.#S.signal})}catch{return}this.#x||this.#C||(this.#T=authIssueForStatus(t),this.#Y())}async#Z(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#w=await detectSetupIssues(n,this.#v);let e=await this.#y(t,{signal:this.#S.signal});this.#T=authIssueForStatus(e)}catch{return}this.#x||this.#Y()}#Q(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#F===void 0&&(this.#F=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#$(e){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e);return}this.#n.renderNotice?.(e)}}async#ee(e,t){let n=this.#h;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r={renderer:this.#n,title:t.title,initialModelStep:t.initialModelStep,remoteConnection:this.#_},i=this.#D?.current(),a=i!==void 0&&Object.keys(i).length>0?{...r,disabledConnectionReasons:i}:r;return t.keepSetupFlowOpen===!0?await n.handle(e,{...a,keepSetupFlowOpen:!0}):await n.handle(e,a)}#te(e,t){if(t!==`startup`)return;let n=this.#_?.current().connection.state,r=n===`auth-failed`||n===`unavailable`?`failed`:void 0,i=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${i}`,r)}async#ne(e){if(e?.kind===`connection-added`){this.#E?.applyEffect({kind:`refresh-identity`}),this.#C=!0,await this.#re(),await this.#ce();return}if(e?.kind===`model-access-changed`){this.#E?.applyEffect({kind:`refresh-identity`}),this.#C=!0,await this.#ce();return}e!==void 0&&(this.#E?.applyEffect(e),this.#C=!0,this.#Z(this.#k))}async#re(){let e=this.#d;e!==void 0&&await e.refreshAfterSourceChange({onRuntimeArtifactsChanged:()=>this.#ue()})}async#ie(e,t,n){let r=await this.#ee(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#te(e,n.trigger),this.#$(r?.message),await this.#ne(r?.effect),this.#oe()}async#ae(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#y(t,{signal:this.#S.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#ie({type:`extension`,name:`vc:install`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`)){this.#n.setupFlow?.end();return}if(n===`logged-out`&&(await this.#ie({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`||n===`logged-out`)){this.#n.setupFlow?.end();return}await this.#ie({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`})}#oe(){let e=this.#_?.current().connection;e?.state!==`ready`||e.info===this.#k||(this.#k=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}#se(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#ce(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e);let t=this.#R(await this.#le());this.#Z(t)}async#le(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#ue(){let e=this.#k,t=await this.#le();t!==void 0&&this.#R(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#de(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#M.set(e.data.name,t),this.#me(t)}#fe(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#M.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#N.add(e.name),this.#me(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#N.size),this.#N.size>0}#pe(e){let t=this.#M.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.#M.set(e.data.name,t),this.#N.delete(e.data.name),this.#me(t),this.#n.setConnectionAuthPendingCount?.(this.#N.size)}#me(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentCompleted:a,onTurnCancelled:o,onConnectionAuthRequired:s,onConnectionAuthCompleted:c,onTerminalFailure:l,failureHintOverride:u}=e,d=new Map,f=new Map,p=0,m=new Set,h=new Set,g=new Set,_=!1,v=!1,y;for await(let e of t)if(!(v&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:p+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;y=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.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)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.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){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}),!h.has(e.requestId)){if(h.add(e.requestId),n.set(e.requestId,e),isQuestionRequest(e)){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!m.has(n))break;switch(t.data.status){case`completed`:yield{type:`tool-result`,toolCallId:n,output:t.data.result.output};break;case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)};break}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,g,u);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,l?.(e);let t=toFailureEvent(e,g,u);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:y},_=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:y},_=!0;return;case`turn.completed`:v=!0,yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p);break;case`turn.cancelled`:o?.(),yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:a?.(e.data.callId);break;case`authorization.required`:s?.(e);break;case`authorization.completed`:c?.(e);break;default:break}_||(yield*closeOpenParts(d,`assistant-complete`,p),yield*closeOpenParts(f,`reasoning-complete`,p),yield{type:`finish`,usage:y})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}function isQuestionRequest(e){return e.display===`select`||e.display===`text`||e.display!==`confirmation`&&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}export{EveTUIRunner,parsePromptCommand};
1
+ import{PROMPT_COMMANDS,formatPromptCommandHelp,parsePromptCommand}from"./prompt-commands.js";import{pickAgentHeaderTip}from"./agent-header.js";import{failureKey,formatFailureDetail,formatFailureHint,formatFailureMessage,isInterruptedError,localFailureHint}from"./errors.js";import{parseLogDisplayMode}from"./log-display-mode.js";import{createMcpConnectionStatusTracker}from"./mcp-connection-status.js";import{createRemoteConnectionController}from"./remote-connection.js";import{SubagentPump}from"./subagent-pump.js";import{BOOT_DETECTIONS,CLI_MISSING_SETUP_ISSUE,LOGIN_SETUP_ISSUE,detectSetupIssues,formatSetupIssuesLine,orderedSetupIssues,resolveModelProviderState}from"./setup-issues.js";import{TerminalRenderer}from"./terminal-renderer.js";import{createVercelStatusTracker}from"./vercel-status.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{toErrorMessage}from"#shared/errors.js";import"#client/index.js";import{probeAgentInfo}from"#services/dev-client/agent-info-probe.js";import{subscribeDevelopmentSandboxPrewarmLogs}from"#execution/sandbox/development-prewarm.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{createDevelopmentRuntimeArtifactRefresher}from"#services/dev-client.js";import{devBootPhase}from"#internal/dev-boot-progress.js";async function delayMs(e){await new Promise(t=>{setTimeout(t,e).unref?.()})}function authIssueForStatus(e){if(e===`logged-out`)return LOGIN_SETUP_ISSUE;if(e===`cli-missing`)return CLI_MISSING_SETUP_ISSUE}var EveTUIRunner=class{#e;#t;#n;#r;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p;#m;#h;#g;#_;#v;#y;#b;#x;#S=!1;#C=new AbortController;#w=!1;#T=[];#E;#D;#O;#k=pickAgentHeaderTip();#A;#j=new Map;#M;#N=new Map;#P=new Set;#F=!1;#I;#L;constructor(t){this.#e=t.session,t.client!==void 0&&(this.#t=t.client),t.lifecycle!==void 0&&(this.#L=t.lifecycle),this.#n=createRenderer(t);let n={formatActionResultError};if(this.#t!==void 0&&(n.client=this.#t),this.#n.subagents!==void 0&&(n.view=this.#n.subagents),this.#M=new SubagentPump(n),this.#r=t.name??`eve`,this.#_=t.withExclusiveTerminal,this.#i=t.tools??`full`,this.#a=t.reasoning??`full`,this.#o=t.subagents??`full`,this.#s=t.connectionAuth??`full`,this.#c=t.assistantResponseStats??`tokensPerSecond`,this.#l=t.contextSize,this.#u=t.formatTransportError??toErrorMessage,t.initialInput!==void 0&&(this.#m=t.initialInput),t.appRoot!==void 0){this.#p=t.appRoot;let e={appRoot:t.appRoot,onChange:e=>this.#n.setVercelStatus?.(e)};t.detectProjectIdentity!==void 0&&(e.detectIdentity=t.detectProjectIdentity),this.#D=createVercelStatusTracker(e),t.probeMcpConnection!==void 0&&(this.#O=createMcpConnectionStatusTracker({onChange:()=>{},probe:t.probeMcpConnection}))}if(t.promptCommandHandler!==void 0&&(this.#h=t.promptCommandHandler),this.#g=t.availablePromptCommands??PROMPT_COMMANDS,t.remote!==void 0){if(this.#t===void 0)throw Error(`A remote TUI requires a configured development client.`);this.#v=createRemoteConnectionController({client:this.#t,credentials:t.remote.credentials,target:t.remote.target,onChange:e=>this.#n.setRemoteConnectionStatus?.(e),resolveOidcToken:t.remote.resolveOidcToken,resolveDeployment:t.remote.resolveDeployment})}this.#y=t.bootDetections??BOOT_DETECTIONS,this.#b=t.getVercelAuthStatus??getVercelAuthStatus,t.onBootProgress!==void 0&&(this.#x=t.onBootProgress),t.serverUrl!==void 0&&(this.#f=t.serverUrl),t.serverUrl!==void 0&&t.remote===void 0&&(this.#d=createDevelopmentRuntimeArtifactRefresher({serverUrl:t.serverUrl}))}async#R(){if(this.#f===void 0){this.#B(),await this.#Y(void 0);return}let e;if(this.#v!==void 0){let t=await this.#v.check();t.state===`ready`&&(e=t.info)}else{let t=this.#t;if(t!==void 0)try{let n=await devBootPhase(`connecting to agent`,()=>probeAgentInfo({client:t}),this.#x);n.kind===`ready`&&(e=n.info)}catch{e=void 0}}this.#B();let t=this.#z(e);await this.#Y(t)}#z(e){let t=this.#p===void 0?e:resolveModelProviderState(e,process.env);this.#A=t;let n=this.#f;if(n===void 0)return t;let r={name:this.#r,serverUrl:n};return t!==void 0&&(r.info=t),this.#p!==void 0&&(r.tip=this.#k),this.#n.renderAgentHeader?.(r),t}#B(){let e=this.#x;this.#x=void 0,e?.({type:`before-first-paint`})}async run(){let onStop=()=>this.#n.requestInterrupt?.();this.#L?.signal.aborted===!0?onStop():this.#L?.signal.addEventListener(`abort`,onStop,{once:!0});try{await this.#V()}finally{this.#L?.signal.removeEventListener(`abort`,onStop),this.#S=!0,this.#C.abort(),this.#M.abortAll(),this.#I?.(),this.#I=void 0,this.#n.shutdown?.(),this.#D?.dispose(),this.#O?.dispose(),this.#v?.dispose()}}async#V(){let e=this.#r,r,i,a=!1,o=!1,s=this.#m;await this.#R(),this.#v?.current().connection.state===`auth-required`&&await this.#ie({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`}),this.#$(),this.#D?.refreshIdentity(),this.#O?.refresh();let l=this.#m===void 0?void 0:parsePromptCommand(this.#m);for(l?.type===`extension`&&l.name===`model`&&l.argument===``&&this.#p!==void 0&&this.#h!==void 0&&this.#n.setupFlow!==void 0&&(s=void 0,await this.#ae(e));;){if(this.#L?.signal.aborted===!0||this.#n.exitRequested?.()===!0)return;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.#W(t)}catch(e){if(isInterruptedError(e))return;throw e}if(r==null)return}let l=parsePromptCommand(r);if(l?.type===`exit`)return;if(l?.type===`new`){if(!await this.#U()){i=void 0,o=!1,r=void 0;continue}i=void 0,o=!1,r=void 0;continue}if(l?.type===`help`){this.#ee(formatPromptCommandHelp(this.#g)),i=void 0,o=!1,r=void 0;continue}if(l?.type===`loglevel`){this.#ee(this.#se(l.argument)),i=void 0,o=!1,r=void 0;continue}if(l?.type===`extension`){try{await this.#ie(l,e,{trigger:`command`})}catch(e){if(isInterruptedError(e))return;throw e}i=void 0,r=void 0,o=!1;continue}a=!0}let l=await this.#G({prompt:o?void 0:r,inputResponses:i}),u=this.#e.state.sessionId;u!==void 0&&this.#n.setSessionId?.(u);let d=r,f=!1;try{for(;;){await this.#n.renderStream(l,{title:e,submittedPrompt:d,continueSession:!!this.#n.readPrompt,tools:this.#i,reasoning:this.#a,subagents:this.#o,connectionAuth:this.#s,assistantResponseStats:this.#c,contextSize:this.#l});let t=l.turnState?.pendingApprovals??[],n=l.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.#j.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.#j.delete(t.requestId)}}if(a.length===0)break;o=!0,i=a,r=void 0,f=!0;break}if(this.#fe(l)){l=this.#q(),d=void 0;continue}if(l.turnState&&l.turnState.boundaryEvent===void 0)if(l.turnState.aborted)this.#F=!0;else{let e=this.#e.state.sessionId;this.#n.renderNotice?.(e?`Lost the event stream — the turn may still be running on the server (session ${e}). Your next message resumes this session; use /cancel to stop the turn.`:`Lost the connection to the running turn.`)}break}}catch(e){if(isInterruptedError(e))return;throw e}if(f)continue;o=!1,i=void 0,r=void 0;let p=l.turnState?.boundaryEvent;!this.#F&&(p===`session.waiting`||p===`session.completed`)&&(r=this.#n.takeQueuedPrompt?.()),this.#F&&(this.#F=!1,this.#H(),l.turnState?.aborted?this.#n.renderNotice?.(`Stopped following the turn and started a new session. Earlier context was cleared; the interrupted turn may still be running on the server.`):this.#n.renderSessionBoundary===void 0?this.#n.renderNotice?.(`Session ended — started a new session. Earlier context was cleared.`):this.#n.renderSessionBoundary())}}#H(){this.#M.abortAll(),this.#j.clear(),this.#N.clear(),this.#P.clear(),this.#n.setConnectionAuthPendingCount?.(0),this.#t&&(this.#e=this.#t.session()),this.#d?.clear()}async#U(){try{await this.#e.reset()}catch(e){return this.#n.renderNotice?.(`Couldn't reset the session: ${toErrorMessage(e)}`),!1}return this.#H(),this.#n.reset?.(),!0}async#W(e){if(!this.#n.readPrompt)return;let t=this.#n.readPrompt(e),n=this.#d;if(n===void 0)return await t;let r=!1,i=!1,a,refresh=async()=>{if(!(r||i)){i=!0;try{await n.refreshIdle({onRuntimeArtifactsChanged:()=>this.#ue()})}finally{i=!1}}},startRefresh=()=>{if(r||i)return;let e=refresh().finally(()=>{a===e&&(a=void 0)});a=e};startRefresh();let o=setInterval(()=>{startRefresh()},500);o.unref?.();try{return await t}finally{r=!0,clearInterval(o),await a}}async#G(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{this.#d!==void 0&&await this.#d.refresh({inputResponses:n.inputResponses,message:n.message,onRuntimeArtifactsChanged:()=>this.#ue()}),n.message!==void 0&&(n.inputResponses?.length??0)===0&&this.#n.flushDelayedDevBuildErrors?.(),r=await this.#e.send(n)}catch(e){if(isInterruptedError(e))throw e;return this.#v?.reportFailure(e),this.#F=!0,{events:errorOnlyTUIStream({errorText:this.#u(e)}),turnState:createTurnState()}}return this.#J(r,()=>t.abort())}async#K(e){if(e.cancelInFlight!==!0){e.cancelInFlight=!0;try{for(let t=0;t<8;t+=1){if(e.boundaryEvent!==void 0||e.aborted===!0)return;let t=e.turnId;try{if((await this.#e.cancel(t===void 0?void 0:{turnId:t})).status===`accepted`)return}catch{}await delayMs(250)}}finally{e.cancelInFlight=!1}}}#q(){let e=new AbortController;return this.#J(this.#e.stream({signal:e.signal}),()=>e.abort())}#J(e,t){let n=createTurnState();return{abort:()=>{n.aborted=!0,t()},cancel:()=>{this.#K(n)},events:eveEventsToTUIStream({events:e,pendingInputRequests:this.#j,turnState:n,onSubagentCalled:e=>this.#M.begin(e),onSubagentCompleted:e=>this.#M.settle(e),onTurnCancelled:()=>this.#M.settleAll(),onConnectionAuthRequired:e=>this.#de(e),onConnectionAuthCompleted:e=>this.#pe(e),onTerminalFailure:()=>{this.#F=!0},failureHintOverride:this.#p===void 0?void 0:localFailureHint}),turnState:n}}async#Y(e){if(this.#p===void 0)return;let t={appRoot:this.#p,env:process.env};e!==void 0&&(t.info=e),this.#T=await detectSetupIssues(t,this.#y),this.#n.renderSetupWarning!==void 0&&(this.#X(),this.#Z())}#X(){let e=orderedSetupIssues(this.#T,this.#E);e.length>0?this.#n.renderSetupWarning?.(formatSetupIssuesLine(e)):this.#n.clearSetupWarning?.()}async#Z(){let e=this.#p;if(e===void 0)return;let t;try{t=await this.#b(e,{signal:this.#C.signal})}catch{return}this.#S||this.#w||(this.#E=authIssueForStatus(t),this.#X())}async#Q(e){let t=this.#p;if(t===void 0||this.#n.renderSetupWarning===void 0)return;let n={appRoot:t,env:process.env};e!==void 0&&(n.info=e);try{this.#T=await detectSetupIssues(n,this.#y);let e=await this.#b(t,{signal:this.#C.signal});this.#E=authIssueForStatus(e)}catch{return}this.#S||this.#X()}#$(){this.#p===void 0||this.#n.renderSandboxLog===void 0||this.#I===void 0&&(this.#I=subscribeDevelopmentSandboxPrewarmLogs({appRoot:this.#p,log:e=>this.#n.renderSandboxLog?.(e)}))}#ee(e,t){if(e!==void 0){if(this.#n.renderCommandResult!==void 0){this.#n.renderCommandResult(e,t);return}this.#n.renderNotice?.(e)}}async#te(e,t){let n=this.#h;if(n===void 0)return{message:`/${e.name} is not available in this session.`};let r={renderer:this.#n,title:t.title,initialModelStep:t.initialModelStep,remoteConnection:this.#v,withExclusiveTerminal:this.#_},i=this.#O?.current(),a=i!==void 0&&Object.keys(i).length>0?{...r,disabledConnectionReasons:i}:r;return t.keepSetupFlowOpen===!0?await n.handle(e,{...a,keepSetupFlowOpen:!0}):await n.handle(e,a)}#ne(e,t){if(t!==`startup`)return;let n=this.#v?.current().connection.state,r=n===`auth-failed`||n===`unavailable`?`failed`:void 0,i=e.argument.length===0?``:` ${e.argument}`;this.#n.renderCommandInvocation?.(`/${e.name}${i}`,r)}async#re(e){if(e?.kind===`model-access-changed`){this.#D?.applyEffect({kind:`refresh-identity`}),this.#w=!0,await this.#ce();return}e!==void 0&&(this.#D?.applyEffect(e),this.#w=!0,this.#Q(this.#A))}async#ie(e,t,n){let r=await this.#te(e,{initialModelStep:n.initialModelStep,keepSetupFlowOpen:n.keepSetupFlowOpen,title:t});this.#ne(e,n.trigger),this.#ee(r?.message,r?.tone),await this.#re(r?.effect),this.#oe()}async#ae(e){let t=this.#p;if(t===void 0)return;let authStatus=async()=>{try{return await this.#b(t,{signal:this.#C.signal})}catch{return}},n=await authStatus();if(n===`cli-missing`&&(await this.#ie({type:`extension`,name:`vc:install`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`)){this.#n.setupFlow?.end();return}if(n===`logged-out`&&(await this.#ie({type:`extension`,name:`vc:login`,argument:``},e,{trigger:`startup`,keepSetupFlowOpen:!0}),n=await authStatus(),n===`cli-missing`||n===`logged-out`)){this.#n.setupFlow?.end();return}await this.#ie({type:`extension`,name:`model`,argument:``},e,{trigger:`startup`,initialModelStep:`provider`}),await this.#ie({type:`extension`,name:`add`,argument:``},e,{trigger:`startup`})}#oe(){let e=this.#v?.current().connection;e?.state!==`ready`||e.info===this.#A||(this.#A=e.info,this.#f!==void 0&&this.#n.renderAgentHeader?.({info:e.info,name:this.#r,serverUrl:this.#f}))}#se(e){let t=this.#n;if(t.logDisplayMode===void 0||t.setLogDisplayMode===void 0)return`/loglevel is not available in this session.`;if(e===``)return`Logs: ${t.logDisplayMode()}. Use /loglevel all|stderr|sandbox|none — logs stay buffered, so switching also hides or restores past lines.`;let n=parseLogDisplayMode(e);if(n===void 0)return`Unknown log level "${e}". Use all, stderr, sandbox, or none.`;if(n===t.logDisplayMode())return`Logs already set to ${n}.`;switch(t.setLogDisplayMode(n),n){case`none`:return`Logs hidden. Output stays buffered — /loglevel all restores it.`;case`stderr`:return`Showing stderr logs only.`;case`sandbox`:return`Showing sandbox logs only.`;case`all`:return`Showing all logs.`}}async#ce(){let e=this.#p;if(e===void 0)return;loadDevelopmentEnvironmentFiles(e);let t=this.#z(await this.#le());this.#Q(t)}async#le(){let e=this.#t;if(e===void 0)return;let t=await probeAgentInfo({client:e});return t.kind===`ready`?t.info:void 0}async#ue(){let e=this.#A,t=await this.#le();t!==void 0&&this.#z(t),(!this.#n.renderAgentHeader||t===void 0)&&this.#n.renderNotice?.(formatAgentUpdateNotice(e,t))}#de(e){let t={name:e.data.name,description:e.data.description,state:`required`};e.data.authorization!==void 0&&(t.challenge=e.data.authorization),e.data.webhookUrl!==void 0&&(t.webhookUrl=e.data.webhookUrl),this.#N.set(e.data.name,t),this.#me(t)}#fe(e){if(e.turnState?.boundaryEvent!==`session.waiting`)return!1;let t=!1;for(let e of this.#N.values())e.state!==`required`||e.webhookUrl===void 0||(e.state=`pending`,this.#P.add(e.name),this.#me(e),t=!0);return t&&this.#n.setConnectionAuthPendingCount?.(this.#P.size),this.#P.size>0}#pe(e){let t=this.#N.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.#N.set(e.data.name,t),this.#P.delete(e.data.name),this.#me(t),this.#n.setConnectionAuthPendingCount?.(this.#P.size)}#me(e){let t={name:e.name,description:e.description,state:e.state};e.challenge!==void 0&&(t.challenge=e.challenge),e.reason!==void 0&&(t.reason=e.reason),this.#n.upsertConnectionAuth?.(t)}};function createRenderer(e){return e.renderer?e.renderer:new TerminalRenderer({tools:e.tools,reasoning:e.reasoning,subagents:e.subagents,connectionAuth:e.connectionAuth,assistantResponseStats:e.assistantResponseStats,contextSize:e.contextSize,logs:e.logs,availablePromptCommands:e.availablePromptCommands,input:e.userInput,output:e.screen,diagnostics:e.diagnostics,onExitRequest:e.lifecycle?.requestStop})}function formatAgentUpdateNotice(e,t){let n=e?.agent.model.id,r=t?.agent.model.id;return n!==void 0&&r!==void 0&&n!==r?`Agent updated: Model ${n} -> ${r}`:`Agent updated.`}async function*eveEventsToTUIStream(e){let{events:t,pendingInputRequests:n,turnState:r,onSubagentCalled:i,onSubagentCompleted:a,onTurnCancelled:o,onConnectionAuthRequired:s,onConnectionAuthCompleted:c,onTerminalFailure:l,failureHintOverride:u}=e,d=new Map,f=new Map,p=createEventDeduper(),m=0,h=new Set,g=new Set,_=new Set,v=!1,y=!1,b;for await(let e of t)if(p.admit(e)&&!(y&&isPostTurnVisibleEvent(e)))switch(e.type){case`session.started`:case`message.received`:break;case`turn.started`:r.turnId=e.data.turnId;break;case`step.started`:m+=1,yield{type:`step-start`};break;case`step.completed`:{let t=e;b=t.data.usage,yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m),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(m<=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||m<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=m,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=m,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=m,yield{type:`assistant-complete`,id:i}}}else n.text.length>0&&(n.completed=!0,n.completedEpoch=m,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(m<=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||m<=n.completedEpoch)break;n.generation+=1,n.text=r,n.completedEpoch=m;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=m,yield{type:`reasoning-complete`,id:i};break}case`actions.requested`:{let t=e.data.actions.filter(e=>e.kind===`tool-call`);if(t.length===0)break;for(let e of t)h.has(e.callId)||(h.add(e.callId),yield{type:`tool-call`,toolCallId:e.callId,toolName:e.toolName,input:e.input});break}case`input.requested`:{let t=e.data.requests.filter(e=>e.action.kind===`tool-call`);if(t.length===0)break;for(let e of t){let t=e.action.callId;if(e.kind!==`session-limit`&&!h.has(t)&&(h.add(t),yield{type:`tool-call`,toolCallId:t,toolName:e.action.toolName,input:e.action.input}),!g.has(e.requestId)){if(g.add(e.requestId),n.set(e.requestId,e),e.kind!==`tool-approval`){upsertPendingQuestion(r,e);continue}upsertPendingApproval(r,e),yield{type:`tool-approval-request`,approvalId:e.requestId,toolCallId:t}}}break}case`action.result`:{let t=e;if(t.data.result.kind!==`tool-result`)break;let n=t.data.result.callId;if(!h.has(n))break;switch(t.data.status){case`completed`:yield{type:`tool-result`,toolCallId:n,output:t.data.result.output};break;case`failed`:yield{type:`tool-error`,toolCallId:n,errorText:formatActionResultError(t)};break;case`rejected`:yield{type:`tool-rejected`,toolCallId:n,reason:formatActionResultError(t)};break}break}case`step.failed`:case`turn.failed`:{let t=toFailureEvent(e,_,u);t&&(yield t);break}case`session.failed`:{r.sawSessionFailure=!0,l?.(e);let t=toFailureEvent(e,_,u);t&&(yield t),r.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m),yield{type:`finish`,usage:b},v=!0;return}case`session.waiting`:case`session.completed`:r.boundaryEvent=e.type,yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m),yield{type:`finish`,usage:b},v=!0;return;case`turn.completed`:y=!0,yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m);break;case`turn.cancelled`:o?.(),yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m),yield{type:`turn-cancelled`};break;case`subagent.called`:i?.(e);break;case`subagent.started`:case`subagent.event`:break;case`subagent.completed`:a?.(e.data.callId);break;case`authorization.required`:s?.(e);break;case`authorization.completed`:c?.(e);break;default:break}v||(yield*closeOpenParts(d,`assistant-complete`,m),yield*closeOpenParts(f,`reasoning-complete`,m),yield{type:`finish`,usage:b})}async function*errorOnlyTUIStream(e){yield{type:`error`,errorText:e.errorText},yield{type:`finish`}}function createTurnState(){return{aborted:!1,pendingApprovals:[],pendingQuestions:[],sawSessionFailure:!1}}function upsertPendingApproval(e,t){let n=toAgentTUIToolApprovalRequest(t),r=e.pendingApprovals.findIndex(e=>e.approvalId===n.approvalId);r===-1?e.pendingApprovals.push(n):e.pendingApprovals[r]=n}function toAgentTUIToolApprovalRequest(e){return{approvalId:e.requestId,toolCallId:e.action.callId,toolName:e.action.toolName,input:e.action.input}}function upsertPendingQuestion(e,t){let n=e.pendingQuestions.findIndex(e=>e.requestId===t.requestId);n===-1?e.pendingQuestions.push(t):e.pendingQuestions[n]=t}function textPartId(e,t){return`text:${e}:${t}`}function reasoningPartId(e,t){return`reasoning:${e}:${t}`}function partStateFor(e,t){let n=e.get(t);return n===void 0&&(n={generation:0,text:``,completed:!1,completedEpoch:0},e.set(t,n)),n}function partGenerationId(e,t){return t===0?e:`${e}#${t}`}function*closeOpenParts(e,t,n){for(let[r,i]of e)i.completed||i.text.length===0||(i.completed=!0,i.completedEpoch=n,yield{type:t,id:partGenerationId(r,i.generation)})}function isPostTurnVisibleEvent(e){switch(e.type){case`actions.requested`:case`authorization.completed`:case`authorization.required`:case`input.requested`:case`message.appended`:case`message.completed`:case`reasoning.appended`:case`reasoning.completed`:case`result.completed`:case`step.completed`:case`step.failed`:case`step.started`:case`subagent.called`:case`subagent.completed`:case`subagent.event`:case`subagent.started`:case`turn.completed`:case`turn.failed`:return!0;default:return!1}}function formatActionResultError(e){if(e.data.error?.message)return e.data.error.message;let t=e.data.result.output;if(typeof t==`string`)return t;try{return JSON.stringify(t)}catch{return`Tool execution failed.`}}function toFailureEvent(e,t,n){let r=failureKey(e);if(t.has(r))return;t.add(r);let c={type:`error`,errorText:formatFailureMessage(e)},l=n?.(e)??formatFailureHint(e);l!==void 0&&(c.hint=l);let u=formatFailureDetail(e);return u!==void 0&&(c.detail=u),c}function toAgentTUIInputQuestion(e){let t=e.display===`text`?`text`:e.display===`select`||e.options!==void 0&&e.options.length>0?`select`:`text`,n={requestId:e.requestId,prompt:e.prompt,display:t};return e.options!==void 0&&(n.options=e.options.map(e=>{let t={id:e.id,label:e.label};return e.description!==void 0&&(t.description=e.description),e.style!==void 0&&(t.style=e.style),t})),e.allowFreeform!==void 0&&(n.allowFreeform=e.allowFreeform),n}export{EveTUIRunner,parsePromptCommand};
@@ -1,9 +1,8 @@
1
- import { runChannelsFlow } from "#setup/flows/channels.js";
2
- import { runConnectionsFlow } from "#setup/flows/connections.js";
3
1
  import { runDeployFlow } from "#setup/flows/deploy.js";
4
2
  import { runInstallVercelCliFlow } from "#setup/flows/install-vercel-cli.js";
5
3
  import { runLoginFlow } from "#setup/flows/login.js";
6
4
  import { runModelFlow } from "#setup/flows/model.js";
5
+ import { runRegistryFlow } from "#setup/flows/registry.js";
7
6
  import type { Prompter } from "#setup/prompter.js";
8
7
  import { type TuiPrompterRenderer } from "./tui-prompter.js";
9
8
  import type { PromptCommandExtensionName } from "./prompt-commands.js";
@@ -28,11 +27,7 @@ export declare const SETUP_FLOW_CONFIG: {
28
27
  title: string;
29
28
  indicator: "pulse";
30
29
  };
31
- channels: {
32
- title: string;
33
- indicator: "pulse";
34
- };
35
- connect: {
30
+ add: {
36
31
  title: string;
37
32
  indicator: "pulse";
38
33
  };
@@ -51,7 +46,8 @@ export interface TuiSetupCommandInput {
51
46
  renderer: TuiSetupCommandRenderer;
52
47
  /** Initial model-flow step authorized by the runner's boot evidence. */
53
48
  initialModelStep?: "provider";
54
- disabledConnectionReasons?: Readonly<Record<string, string>>;
49
+ /** Suspends development runtime artifacts while registry installation and setup mutate them. */
50
+ withExclusiveTerminal?<T>(task: () => Promise<T>): Promise<T>;
55
51
  /** Test seam; defaults to the real TUI-native prompter over `renderer`. */
56
52
  createPrompter?: (renderer: TuiPrompterRenderer) => Prompter;
57
53
  /** Test seam; defaults to the real setup flows. */
@@ -62,23 +58,22 @@ export interface TuiSetupFlows {
62
58
  runInstallVercelCliFlow: typeof runInstallVercelCliFlow;
63
59
  runLoginFlow: typeof runLoginFlow;
64
60
  runModelFlow: typeof runModelFlow;
65
- runChannelsFlow: typeof runChannelsFlow;
66
- runConnectionsFlow: typeof runConnectionsFlow;
61
+ runRegistryFlow: typeof runRegistryFlow;
67
62
  runDeployFlow: typeof runDeployFlow;
68
63
  }
69
64
  export interface TuiSetupCommandResult {
70
65
  message: string;
66
+ /** Promotes an outcome to a top-level status. */
67
+ tone?: "success" | "error";
71
68
  /** Keep warning/error lines after the bordered panel closes. */
72
69
  preserveFlowDiagnostics: boolean;
73
70
  /** Status refresh required after the command settles. */
74
71
  effect?: VercelStatusEffect | {
75
- kind: "connection-added";
76
- } | {
77
72
  kind: "model-access-changed";
78
73
  };
79
74
  }
80
75
  /**
81
- * Runs one TUI setup command (/model, /channels, /connect, /deploy) over the
76
+ * Runs one TUI setup command (/model, /add, /deploy) over the
82
77
  * shared setup flows, asking through the TUI's own bordered panel. Never throws:
83
78
  * every outcome — done, cancelled, failed — folds into the returned command
84
79
  * result. Ctrl-C or Esc on the working indicator (no question open) aborts the
@@ -1,2 +1,3 @@
1
- import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runChannelsFlow}from"#setup/flows/channels.js";import{runConnectionsFlow}from"#setup/flows/connections.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{openUrl}from"#setup/primitives/open-url.js";import{slackMessageDeepLink}from"#setup/slack-connect.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},channels:{title:`Agent channels`,indicator:`pulse`},connect:{title:`Agent connections`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};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),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},renderOutput:n=>{t()||e.renderOutput(n)}}}async function runTuiSetupCommand(t){let{command:r}=t,i=!1,a=new AbortController,o=muteableRenderer(t.renderer,()=>i),s=(t.createPrompter??createTuiPrompter)(o),c=t.renderer.waitForInterrupt(),l=Symbol(`interrupted`),u=executeSetupCommand(t,s,o,a.signal);try{let e=await Promise.race([u,c.promise.then(()=>l)]);return e===l?(i=!0,a.abort(new WizardCancelledError),{...await u,message:`/${r} interrupted.`,preserveFlowDiagnostics:!0}):e}finally{c.dispose(),t.renderer.setStatus(void 0)}}async function executeSetupCommand(e,i,u,d){let{command:f,appRoot:p}=e,m={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runChannelsFlow,runConnectionsFlow,runDeployFlow,...e.flows};try{switch(f){case`vc:install`:return installVercelCliResultMessage(await m.runInstallVercelCliFlow({appRoot:p,prompter:i,signal:d}));case`vc:login`:return loginResultMessage(await m.runLoginFlow({appRoot:p,prompter:i,signal:d}));case`model`:{let pickProvider=e=>u.readProviderPicker(e),t={appRoot:p,prompter:i,signal:d,deps:{pickModelSettings:e=>u.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider})}};e.initialModelStep!==void 0&&(t.initialStep=e.initialModelStep);let n=await m.runModelFlow(t);if(n.kind===`cancelled`)return{message:n.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,preserveFlowDiagnostics:!1};let r=[];n.modelMessage!==void 0&&r.push(n.modelMessage),n.providerOutcome!==void 0&&r.push(providerOutcomeMessage(n.providerOutcome));let a={message:r.join(`
2
- `),preserveFlowDiagnostics:!1};return n.providerOutcome!==void 0&&(a.effect={kind:`model-access-changed`}),a}case`channels`:{let e=await m.runChannelsFlow({appRoot:p,prompter:i,signal:d});switch(e.kind){case`failed`:return pendingChannelsResult(`Channel files changed, but /channels failed: ${e.message}`);case`cancelled`:return{message:`/channels dismissed.`,preserveFlowDiagnostics:!0};case`deploy-and-chat`:return await runDeployAndChat(m,{appRoot:p,prompter:i,signal:d},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,effect:{kind:`channels-added`}}}}case`connect`:{let t=await m.runConnectionsFlow({appRoot:p,prompter:i,signal:d,disabledConnectionReasons:e.disabledConnectionReasons});switch(t.kind){case`cancelled`:return{message:`/connect dismissed.`,preserveFlowDiagnostics:!0,effect:{kind:`model-access-changed`}};case`failed`:return{message:t.addedConnections.length===0?`/connect failed: ${t.message}`:`Connection files changed, but /connect failed: ${t.message}`,preserveFlowDiagnostics:!0,effect:t.addedConnections.length===0?{kind:`model-access-changed`}:{kind:`connection-added`}};case`done`:return{message:t.addedConnections.length===0?`No connections added.`:`Connections added: ${t.addedConnections.join(`, `)}.`,preserveFlowDiagnostics:!0,effect:t.addedConnections.length===0?{kind:`model-access-changed`}:{kind:`connection-added`}}}}case`deploy`:{let e=await m.runDeployFlow({appRoot:p,prompter:i,interactive:!0,signal:d});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(e){if(e instanceof WizardCancelledError)return{message:`/${f} dismissed.`,preserveFlowDiagnostics:f!==`model`};let t=await vercelCliUpgradeOutcome(e,f,m,{appRoot:p,prompter:i,signal:d});if(t!==void 0)return t;let r=vercelActionOutcome(e,f);return r===void 0?{message:`/${f} failed: ${e instanceof Error?e.message:String(e)}`,preserveFlowDiagnostics:!0}:r}}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let a;try{a=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{a=`later`}if(a===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};let o;try{o=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),preserveFlowDiagnostics:!0}}switch(o.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,o.reason),preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}async function runDeployAndChat(e,t,r){let i;try{i=await e.runDeployFlow({...t,interactive:!0})}catch(e){if(e instanceof WizardCancelledError)return pendingChannelsResult(`Channels added, but /deploy was dismissed. Run /deploy to ship them.`);let t=vercelActionOutcome(e,`deploy`);return pendingChannelsResult(t===void 0?`Channels added, but /deploy failed: ${e instanceof Error?e.message:String(e)}`:`Channels added. ${t.message}`)}if(i.kind===`cancelled`)return pendingChannelsResult(`Channels added, but /deploy was dismissed. Run /deploy to ship them.`);if(i.kind===`needs-link`)return pendingChannelsResult(`Channels added, but this directory is not linked to Vercel. Run /model, then /deploy.`);let a=i.productionUrl===void 0?`Deployed.`:`Deployed: ${i.productionUrl}`,o;if(r.chatUrl===void 0)o=`Message your agent in Slack to see it live.`;else{let e=slackMessageDeepLink(r.chatUrl);openUrl(e),o=`Chat with your agent in Slack: ${e}`}return{message:`${a}\n${o}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function pendingChannelsResult(e){return{message:e,preserveFlowDiagnostics:!0,effect:{kind:`channels-added`}}}function providerOutcomeMessage(e){let{resolution:t,status:n}=e;if(n.kind===`gateway-project`)return t===void 0?`Project linked. No model credential found; set AI_GATEWAY_API_KEY in .env.local.`:t.credential===`oidc`?`Project linked. Connected to AI Gateway via VERCEL_OIDC_TOKEN.`:t.shadowedOidc===void 0?`Project linked. Connected to AI Gateway via AI_GATEWAY_API_KEY.`:`Project linked. AI_GATEWAY_API_KEY (${t.source.kind===`shell`?`shell`:t.source.path}) outranks the project's VERCEL_OIDC_TOKEN and stays the active credential — ${t.source.kind===`shell`?`unset it in your shell`:`remove it from ${t.source.path}`} to run on the project.`;if(n.kind===`gateway-key`){let e=n.source.kind===`shell`?`your shell`:n.source.path;return`Connected to AI Gateway via ${n.envKey} in ${e}.`}return`Provider updated — no gateway credential detected; set AI_GATEWAY_API_KEY in .env.local.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};
1
+ import{createTuiPrompter}from"./tui-prompter.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{WizardCancelledError}from"#setup/step.js";import{runLoginFlow}from"#setup/flows/login.js";import{HumanActionRequiredError}from"#setup/human-action.js";import{runInstallVercelCliFlow}from"#setup/flows/install-vercel-cli.js";import{runModelFlow}from"#setup/flows/model.js";import{runProviderFlow}from"#setup/flows/provider.js";import{runRegistryFlow}from"#setup/flows/registry.js";const SETUP_FLOW_CONFIG={"vc:install":{title:`Install the Vercel CLI`,indicator:`pulse`},"vc:login":{title:`Log in to Vercel`,indicator:`pulse`},model:{title:`Configure the agent model`,indicator:`pulse`},add:{title:`Add to your agent`,indicator:`pulse`},deploy:{title:`Deploy to Vercel`,indicator:`spinner`}};function muteableRenderer(e,t,n){return{readSelect:n=>t()?Promise.resolve(void 0):e.readSelect(n),readEditableSelect:n=>t()?Promise.resolve(void 0):e.readEditableSelect(n),readProviderPicker:n=>t()?Promise.resolve(void 0):e.readProviderPicker(n),readModelEditor:n=>t()?Promise.resolve(void 0):e.readModelEditor(n),readText:n=>t()?Promise.resolve(void 0):e.readText(n),readAcknowledge:n=>t()?Promise.resolve():e.readAcknowledge(n),readChoice:n=>t()?{choice:Promise.resolve(void 0),close:()=>{}}:e.readChoice(n),setStatus:n=>{t()||e.setStatus(n)},renderLine:(n,r)=>{(!t()||r===`warning`||r===`error`)&&e.renderLine(n,r)},renderOutput:n=>{t()||e.renderOutput(n)},withInheritedStdio:t=>e.withInheritedStdio(t),withExclusiveTerminal:e=>n?.(e)??e()}}async function runTuiSetupCommand(t){let{command:r}=t,i=!1,a=new AbortController,o=muteableRenderer(t.renderer,()=>i,t.withExclusiveTerminal),s=(t.createPrompter??createTuiPrompter)(o),c=t.renderer.waitForInterrupt(),l=Symbol(`interrupted`),u=executeSetupCommand(t,s,o,a.signal);try{let e=await Promise.race([u,c.promise.then(()=>l)]);return e===l?(i=!0,a.abort(new WizardCancelledError),{...await u,message:`/${r} interrupted.`,preserveFlowDiagnostics:!0}):e}finally{c.dispose(),t.renderer.setStatus(void 0)}}async function executeSetupCommand(e,i,l,u){let{command:d,appRoot:f}=e,p={runInstallVercelCliFlow,runLoginFlow,runModelFlow,runRegistryFlow,runDeployFlow,...e.flows};try{switch(d){case`vc:install`:return installVercelCliResultMessage(await p.runInstallVercelCliFlow({appRoot:f,prompter:i,signal:u}));case`vc:login`:return loginResultMessage(await p.runLoginFlow({appRoot:f,prompter:i,signal:u}));case`model`:{let pickProvider=e=>l.readProviderPicker(e),t={appRoot:f,prompter:i,signal:u,deps:{pickModelSettings:e=>l.readModelEditor(e),runProviderFlow:e=>runProviderFlow({...e,picker:pickProvider})}};e.initialModelStep!==void 0&&(t.initialStep=e.initialModelStep);let n=await p.runModelFlow(t);if(n.kind===`cancelled`)return{message:n.discardedDraft===!0?`/model dismissed. Drafted changes were discarded; Done commits them.`:`/model dismissed.`,preserveFlowDiagnostics:!1};let r=[];n.modelMessage!==void 0&&r.push(n.modelMessage),n.providerOutcome!==void 0&&r.push(providerOutcomeMessage(n.providerOutcome));let a={message:r.join(`
2
+ `),preserveFlowDiagnostics:!1};return n.providerOutcome!==void 0&&(a.effect={kind:`model-access-changed`}),a}case`add`:{let e=await p.runRegistryFlow({appRoot:f,prompter:i,signal:u});return e.kind===`cancelled`?{message:`/add dismissed.`,preserveFlowDiagnostics:!0}:e.addedItems.length>0?{message:[`Registry items added: ${e.addedItems.join(`, `)}.`,...e.output??[]].join(`
3
+ `),tone:`success`,preserveFlowDiagnostics:!0}:{message:`No registry items added.`,preserveFlowDiagnostics:!0}}case`deploy`:{let e=await p.runDeployFlow({appRoot:f,prompter:i,interactive:!0,signal:u});return e.kind===`cancelled`?{message:`/deploy dismissed.`,preserveFlowDiagnostics:!0}:e.kind===`needs-link`?{message:`Not linked to a Vercel project — run /model to connect one first.`,preserveFlowDiagnostics:!0}:{message:e.productionUrl===void 0?`Deployed.`:`Deployed: ${e.productionUrl}`,preserveFlowDiagnostics:!0,effect:{kind:`deployed`}}}}}catch(e){if(e instanceof WizardCancelledError)return{message:`/${d} dismissed.`,preserveFlowDiagnostics:d!==`model`};let t=await vercelCliUpgradeOutcome(e,d,p,{appRoot:f,prompter:i,signal:u});if(t!==void 0)return t;let r=vercelActionOutcome(e,d);return r===void 0?{message:`/${d} failed: ${e instanceof Error?e.message:String(e)}`,tone:`error`,preserveFlowDiagnostics:!0}:r}}async function vercelCliUpgradeOutcome(e,t,n,r){if(!(e instanceof HumanActionRequiredError)||e.action.kind!==`vercel-cli-upgrade`)return;let a;try{a=await r.prompter.select({message:`Your Vercel CLI needs an update to list your teams. Upgrade now?`,options:[{value:`upgrade`,label:`Upgrade Vercel CLI`,description:`Run the Vercel CLI's native upgrader`},{value:`later`,label:`Not now`}],initialValue:`upgrade`})}catch{a=`later`}if(a===`later`)return{message:`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};let o;try{o=await n.runInstallVercelCliFlow({appRoot:r.appRoot,prompter:r.prompter,signal:r.signal,upgrade:!0})}catch(e){return{message:vercelCliUpgradeFailureMessage(t,errorMessage(e)),preserveFlowDiagnostics:!0}}switch(o.kind){case`installed`:return{message:`Upgraded the Vercel CLI. Retry /${t}.`,preserveFlowDiagnostics:!1};case`failed`:return{message:vercelCliUpgradeFailureMessage(t,o.reason),preserveFlowDiagnostics:!0};case`cancelled`:return{message:`Vercel CLI upgrade cancelled — run \`vercel upgrade\`, then retry /${t}.`,preserveFlowDiagnostics:!0};case`already`:return{message:`The Vercel CLI is already up to date. Retry /${t}.`,preserveFlowDiagnostics:!1}}}function errorMessage(e){let t=(e instanceof Error?e.message:String(e)).replace(/\s+/gu,` `).trim();return t.length<=240?t:`${t.slice(0,239)}…`}function vercelCliUpgradeFailureMessage(e,t){return`Couldn't upgrade the Vercel CLI${t===void 0||t===``?``:` (${t})`} — run \`vercel upgrade\`, then retry /${e}.`}function vercelActionOutcome(e,t){if(!(e instanceof HumanActionRequiredError))return;let n=vercelActionMessage(e.action.kind,t);return n===void 0?void 0:{message:n,preserveFlowDiagnostics:!0}}function vercelActionMessage(e,t){switch(e){case`vercel-login`:return`You're not logged in to Vercel — run /vc:login, then retry /${t}.`;case`vercel-forbidden`:return`Vercel denied access to that team — run /vc:login to re-authenticate (for example to complete SSO), or pick a team you can access, then retry /${t}.`;case`vercel-cli-missing`:return`The Vercel CLI isn't installed — run /vc:install to install it, then retry /${t}.`;case`vercel-cli-upgrade`:return`The Vercel CLI needs an update — run \`vercel upgrade\`, then retry /${t}.`;default:return}}function installVercelCliResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:install dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`The Vercel CLI is already installed.`,preserveFlowDiagnostics:!1};case`failed`:return{message:"Couldn't install the Vercel CLI — install it manually with `npm i -g vercel@latest`.",preserveFlowDiagnostics:!0};case`installed`:return{message:`Installed the Vercel CLI. Run /vc:login next.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}}}}function loginResultMessage(e){switch(e.kind){case`cancelled`:return{message:`/vc:login dismissed.`,preserveFlowDiagnostics:!1};case`already`:return{message:`You're already logged in to Vercel.`,preserveFlowDiagnostics:!1};case`cli-missing`:return{message:`The Vercel CLI isn't installed — run /vc:install to install it, then retry /vc:login.`,preserveFlowDiagnostics:!0};case`failed`:return{message:`Vercel login didn't complete — run /vc:login to try again.`,preserveFlowDiagnostics:!0};case`logged-in`:return{message:`Logged in to Vercel.`,preserveFlowDiagnostics:!1,effect:{kind:`refresh-identity`}};case`unavailable`:return{message:`Couldn't reach Vercel — check your connection, then retry /vc:login.`,preserveFlowDiagnostics:!0}}}function providerOutcomeMessage(e){let{resolution:t,status:n}=e;if(n.kind===`gateway-project`)return t===void 0?`Project linked. No model credential found; set AI_GATEWAY_API_KEY in .env.local.`:t.credential===`oidc`?`Project linked. Connected to AI Gateway via VERCEL_OIDC_TOKEN.`:t.shadowedOidc===void 0?`Project linked. Connected to AI Gateway via AI_GATEWAY_API_KEY.`:`Project linked. AI_GATEWAY_API_KEY (${t.source.kind===`shell`?`shell`:t.source.path}) outranks the project's VERCEL_OIDC_TOKEN and stays the active credential — ${t.source.kind===`shell`?`unset it in your shell`:`remove it from ${t.source.path}`} to run on the project.`;if(n.kind===`gateway-key`){let e=n.source.kind===`shell`?`your shell`:n.source.path;return`Connected to AI Gateway via ${n.envKey} in ${e}.`}return`Provider updated — no gateway credential detected; set AI_GATEWAY_API_KEY in .env.local.`}export{SETUP_FLOW_CONFIG,runTuiSetupCommand};