eve 0.7.3 → 0.8.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 (349) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +11 -11
  3. package/dist/src/chunks/{use-eve-agent-DErQj5hs.js → use-eve-agent-BSXZSn-R.js} +6 -1
  4. package/dist/src/chunks/{use-eve-agent-DoR8C4i6.js → use-eve-agent-Dlut2Qzt.js} +6 -1
  5. package/dist/src/cli/commands/init.js +1 -1
  6. package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
  7. package/dist/src/cli/dev/tui/blocks.js +8 -7
  8. package/dist/src/cli/dev/tui/command-typeahead.d.ts +13 -3
  9. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  10. package/dist/src/cli/dev/tui/line-editor.d.ts +6 -0
  11. package/dist/src/cli/dev/tui/line-editor.js +1 -1
  12. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +2 -0
  13. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  14. package/dist/src/cli/dev/tui/runner.d.ts +10 -0
  15. package/dist/src/cli/dev/tui/runner.js +1 -1
  16. package/dist/src/cli/dev/tui/setup-commands.d.ts +11 -7
  17. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  18. package/dist/src/cli/dev/tui/setup-flow.d.ts +72 -10
  19. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  20. package/dist/src/cli/dev/tui/setup-panel.d.ts +91 -39
  21. package/dist/src/cli/dev/tui/setup-panel.js +3 -1
  22. package/dist/src/cli/dev/tui/setup-selection-input.d.ts +48 -0
  23. package/dist/src/cli/dev/tui/setup-selection-input.js +1 -0
  24. package/dist/src/cli/dev/tui/status-line.d.ts +13 -7
  25. package/dist/src/cli/dev/tui/status-line.js +1 -1
  26. package/dist/src/cli/dev/tui/stream-format.d.ts +2 -0
  27. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  28. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +4 -2
  29. package/dist/src/cli/dev/tui/terminal-renderer.js +7 -6
  30. package/dist/src/cli/dev/tui/terminal-text.d.ts +1 -0
  31. package/dist/src/cli/dev/tui/terminal-text.js +1 -1
  32. package/dist/src/cli/dev/tui/theme.d.ts +3 -1
  33. package/dist/src/cli/dev/tui/theme.js +1 -1
  34. package/dist/src/cli/dev/tui/tool-format.d.ts +1 -1
  35. package/dist/src/cli/dev/tui/tool-format.js +2 -2
  36. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  37. package/dist/src/cli/dev/tui/tui.d.ts +6 -0
  38. package/dist/src/cli/dev/tui/tui.js +1 -1
  39. package/dist/src/cli/dev/tui/vercel-status.d.ts +4 -4
  40. package/dist/src/cli/dev/tui/vercel-status.js +1 -1
  41. package/dist/src/cli/run.d.ts +4 -3
  42. package/dist/src/cli/run.js +2 -2
  43. package/dist/src/cli/ui/output.d.ts +1 -0
  44. package/dist/src/cli/ui/output.js +8 -8
  45. package/dist/src/client/client.js +1 -1
  46. package/dist/src/client/session-utils.d.ts +1 -0
  47. package/dist/src/client/session-utils.js +1 -1
  48. package/dist/src/client/session.d.ts +1 -0
  49. package/dist/src/client/session.js +1 -1
  50. package/dist/src/client/types.d.ts +19 -0
  51. package/dist/src/compiled/.vendor-stamp.json +1 -2
  52. package/dist/src/compiler/compile-from-memory.js +1 -1
  53. package/dist/src/compiler/manifest.d.ts +28 -7
  54. package/dist/src/compiler/manifest.js +1 -1
  55. package/dist/src/compiler/normalize-agent-config.js +1 -1
  56. package/dist/src/compiler/normalize-sandbox.js +1 -1
  57. package/dist/src/context/providers/session.js +1 -1
  58. package/dist/src/evals/cli/eval-client.js +1 -1
  59. package/dist/src/execution/durable-session-store.js +1 -1
  60. package/dist/src/execution/sandbox/bash-tool.js +1 -1
  61. package/dist/src/execution/sandbox/bindings/docker-base-setup.d.ts +9 -0
  62. package/dist/src/execution/sandbox/bindings/docker-base-setup.js +2 -0
  63. package/dist/src/execution/sandbox/bindings/docker-cli.d.ts +77 -0
  64. package/dist/src/execution/sandbox/bindings/docker-cli.js +2 -0
  65. package/dist/src/execution/sandbox/bindings/docker-container.d.ts +16 -0
  66. package/dist/src/execution/sandbox/bindings/docker-container.js +1 -0
  67. package/dist/src/execution/sandbox/bindings/docker-network.d.ts +8 -0
  68. package/dist/src/execution/sandbox/bindings/docker-network.js +1 -0
  69. package/dist/src/execution/sandbox/bindings/docker-options.d.ts +21 -0
  70. package/dist/src/execution/sandbox/bindings/docker-options.js +1 -0
  71. package/dist/src/execution/sandbox/bindings/docker-session.d.ts +7 -0
  72. package/dist/src/execution/sandbox/bindings/docker-session.js +2 -0
  73. package/dist/src/execution/sandbox/bindings/docker-templates.d.ts +35 -0
  74. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -0
  75. package/dist/src/execution/sandbox/bindings/docker-utils.d.ts +2 -0
  76. package/dist/src/execution/sandbox/bindings/docker-utils.js +1 -0
  77. package/dist/src/execution/sandbox/bindings/docker.d.ts +33 -0
  78. package/dist/src/execution/sandbox/bindings/docker.js +1 -0
  79. package/dist/src/execution/sandbox/bindings/just-bash-runtime.d.ts +30 -0
  80. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -0
  81. package/dist/src/execution/sandbox/bindings/just-bash.d.ts +33 -0
  82. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -0
  83. package/dist/src/execution/sandbox/bindings/local-backend-utils.d.ts +23 -0
  84. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -0
  85. package/dist/src/execution/sandbox/bindings/local-template-prune.d.ts +16 -0
  86. package/dist/src/execution/sandbox/bindings/local-template-prune.js +1 -0
  87. package/dist/src/execution/sandbox/bindings/local.d.ts +16 -25
  88. package/dist/src/execution/sandbox/bindings/local.js +1 -1
  89. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.d.ts +16 -0
  90. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -0
  91. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.d.ts +21 -0
  92. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -0
  93. package/dist/src/execution/sandbox/bindings/microsandbox-network.d.ts +18 -0
  94. package/dist/src/execution/sandbox/bindings/microsandbox-network.js +1 -0
  95. package/dist/src/execution/sandbox/bindings/microsandbox-options.d.ts +34 -0
  96. package/dist/src/execution/sandbox/bindings/microsandbox-options.js +1 -0
  97. package/dist/src/execution/sandbox/bindings/microsandbox-platform.d.ts +22 -0
  98. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +178 -0
  99. package/dist/src/execution/sandbox/bindings/microsandbox-process.d.ts +3 -0
  100. package/dist/src/execution/sandbox/bindings/microsandbox-process.js +1 -0
  101. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +75 -0
  102. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -0
  103. package/dist/src/execution/sandbox/bindings/microsandbox-templates.d.ts +13 -0
  104. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -0
  105. package/dist/src/execution/sandbox/bindings/microsandbox.d.ts +22 -0
  106. package/dist/src/execution/sandbox/bindings/microsandbox.js +1 -0
  107. package/dist/src/execution/sandbox/bindings/vercel-create-api.d.ts +20 -0
  108. package/dist/src/execution/sandbox/bindings/vercel-create-api.js +1 -0
  109. package/dist/src/execution/sandbox/bindings/vercel.d.ts +7 -8
  110. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  111. package/dist/src/execution/sandbox/development-cleanup.d.ts +4 -0
  112. package/dist/src/execution/sandbox/development-cleanup.js +1 -0
  113. package/dist/src/execution/sandbox/development-prewarm.d.ts +11 -0
  114. package/dist/src/execution/sandbox/development-prewarm.js +1 -0
  115. package/dist/src/execution/sandbox/development-run.d.ts +8 -0
  116. package/dist/src/execution/sandbox/development-run.js +1 -0
  117. package/dist/src/execution/sandbox/ensure.js +1 -1
  118. package/dist/src/execution/sandbox/grep-tool.js +1 -1
  119. package/dist/src/execution/sandbox/lazy-backend.d.ts +1 -1
  120. package/dist/src/execution/sandbox/logging-session.d.ts +5 -0
  121. package/dist/src/execution/sandbox/logging-session.js +1 -0
  122. package/dist/src/execution/sandbox/prewarm.js +1 -1
  123. package/dist/src/execution/sandbox/template-prewarm-lock.d.ts +8 -0
  124. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -0
  125. package/dist/src/execution/workflow-steps.js +1 -1
  126. package/dist/src/harness/step-hooks.js +1 -1
  127. package/dist/src/harness/tool-loop.js +1 -1
  128. package/dist/src/internal/application/optional-package-install.d.ts +40 -0
  129. package/dist/src/internal/application/optional-package-install.js +1 -0
  130. package/dist/src/internal/application/package.js +1 -1
  131. package/dist/src/internal/authored-definition/sandbox.d.ts +1 -1
  132. package/dist/src/internal/authored-definition/sandbox.js +1 -1
  133. package/dist/src/internal/authored-module-loader.js +2 -2
  134. package/dist/src/internal/classify-model-routing.d.ts +24 -0
  135. package/dist/src/internal/classify-model-routing.js +1 -0
  136. package/dist/src/internal/nitro/host/channel-routes.js +2 -2
  137. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.d.ts +5 -2
  138. package/dist/src/internal/nitro/host/compiled-sandbox-backend-prune-plugin.js +1 -1
  139. package/dist/src/internal/nitro/host/create-application-nitro.d.ts +10 -0
  140. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  141. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  142. package/dist/src/internal/nitro/host/dev-live-virtual-modules.d.ts +15 -0
  143. package/dist/src/internal/nitro/host/dev-live-virtual-modules.js +1 -0
  144. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.d.ts +28 -0
  145. package/dist/src/internal/nitro/host/optional-engine-dependency-plugin.js +1 -0
  146. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  147. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.d.ts +2 -0
  148. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  149. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +4 -0
  150. package/dist/src/internal/nitro/routes/info.js +1 -1
  151. package/dist/src/internal/nitro/routes/runtime-artifacts.js +1 -1
  152. package/dist/src/internal/resolve-model-endpoint-status.d.ts +23 -0
  153. package/dist/src/internal/resolve-model-endpoint-status.js +1 -0
  154. package/dist/src/internal/workflow-bundle/builder-support.js +2 -2
  155. package/dist/src/internal/workflow-bundle/vercel-workflow-output.d.ts +1 -1
  156. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  157. package/dist/src/public/definitions/sandbox-backend.js +1 -1
  158. package/dist/src/public/sandbox/backends/default.d.ts +37 -10
  159. package/dist/src/public/sandbox/backends/default.js +1 -1
  160. package/dist/src/public/sandbox/backends/docker.d.ts +14 -0
  161. package/dist/src/public/sandbox/backends/docker.js +1 -0
  162. package/dist/src/public/sandbox/backends/just-bash.d.ts +17 -0
  163. package/dist/src/public/sandbox/backends/just-bash.js +1 -0
  164. package/dist/src/public/sandbox/backends/microsandbox.d.ts +17 -0
  165. package/dist/src/public/sandbox/backends/microsandbox.js +1 -0
  166. package/dist/src/public/sandbox/backends/vercel.d.ts +5 -2
  167. package/dist/src/public/sandbox/backends/vercel.js +1 -1
  168. package/dist/src/public/sandbox/docker-sandbox.d.ts +45 -0
  169. package/dist/src/public/sandbox/index.d.ts +8 -4
  170. package/dist/src/public/sandbox/index.js +1 -1
  171. package/dist/src/public/sandbox/just-bash-sandbox.d.ts +17 -0
  172. package/dist/src/public/sandbox/just-bash-sandbox.js +1 -0
  173. package/dist/src/public/sandbox/microsandbox-sandbox.d.ts +54 -0
  174. package/dist/src/public/sandbox/microsandbox-sandbox.js +1 -0
  175. package/dist/src/public/sandbox/vercel-sandbox.d.ts +1 -1
  176. package/dist/src/runtime/compiled-artifacts-source.d.ts +11 -0
  177. package/dist/src/runtime/compiled-artifacts-source.js +1 -1
  178. package/dist/src/runtime/resolve-sandbox.js +1 -1
  179. package/dist/src/runtime/sandbox/keys.js +1 -1
  180. package/dist/src/runtime/sandbox/registry.d.ts +2 -2
  181. package/dist/src/runtime/types.d.ts +1 -1
  182. package/dist/src/runtime/workspace/spec.js +1 -1
  183. package/dist/src/setup/boxes/add-channels.d.ts +3 -2
  184. package/dist/src/setup/boxes/add-channels.js +2 -2
  185. package/dist/src/setup/boxes/apply-ai-gateway-credential.js +1 -1
  186. package/dist/src/setup/boxes/deploy-project.js +1 -1
  187. package/dist/src/setup/boxes/link-project.js +1 -1
  188. package/dist/src/setup/boxes/resolve-provisioning.d.ts +6 -0
  189. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  190. package/dist/src/setup/boxes/select-model.d.ts +2 -2
  191. package/dist/src/setup/boxes/select-model.js +1 -1
  192. package/dist/src/setup/cli/channel-setup-prompter.d.ts +28 -0
  193. package/dist/src/setup/cli/channel-setup-prompter.js +1 -1
  194. package/dist/src/setup/cli/index.d.ts +2 -2
  195. package/dist/src/setup/cli/index.js +1 -1
  196. package/dist/src/setup/cli/option-row.d.ts +89 -0
  197. package/dist/src/setup/cli/option-row.js +1 -0
  198. package/dist/src/setup/cli/prompt-ui.d.ts +15 -29
  199. package/dist/src/setup/cli/prompt-ui.js +2 -2
  200. package/dist/src/setup/cli/select-component.d.ts +4 -3
  201. package/dist/src/setup/cli/select-component.js +1 -1
  202. package/dist/src/setup/cli/select-state.d.ts +3 -3
  203. package/dist/src/setup/cli/select-state.js +1 -1
  204. package/dist/src/setup/flows/channels.d.ts +29 -14
  205. package/dist/src/setup/flows/channels.js +1 -1
  206. package/dist/src/setup/flows/deploy.d.ts +1 -0
  207. package/dist/src/setup/flows/deploy.js +1 -1
  208. package/dist/src/setup/flows/link.d.ts +1 -0
  209. package/dist/src/setup/flows/link.js +1 -1
  210. package/dist/src/setup/flows/model.d.ts +30 -6
  211. package/dist/src/setup/flows/model.js +1 -1
  212. package/dist/src/setup/flows/vercel.d.ts +4 -1
  213. package/dist/src/setup/flows/vercel.js +2 -2
  214. package/dist/src/setup/index.js +1 -1
  215. package/dist/src/setup/primitives/open-url.d.ts +14 -0
  216. package/dist/src/setup/primitives/open-url.js +1 -0
  217. package/dist/src/setup/primitives/pm/pnpm.d.ts +9 -0
  218. package/dist/src/setup/primitives/pm/pnpm.js +2 -2
  219. package/dist/src/setup/primitives/pm/run.d.ts +12 -4
  220. package/dist/src/setup/primitives/pm/run.js +1 -1
  221. package/dist/src/setup/primitives/pm/types.d.ts +3 -0
  222. package/dist/src/setup/primitives/process-abort.d.ts +7 -0
  223. package/dist/src/setup/primitives/process-abort.js +1 -0
  224. package/dist/src/setup/primitives/run-vercel.d.ts +2 -0
  225. package/dist/src/setup/primitives/run-vercel.js +1 -1
  226. package/dist/src/setup/project-resolution.d.ts +6 -3
  227. package/dist/src/setup/project-resolution.js +1 -1
  228. package/dist/src/setup/prompter.d.ts +63 -6
  229. package/dist/src/setup/prompter.js +1 -1
  230. package/dist/src/setup/run-vercel-link.d.ts +1 -1
  231. package/dist/src/setup/run-vercel-link.js +1 -1
  232. package/dist/src/setup/runner.d.ts +2 -0
  233. package/dist/src/setup/runner.js +1 -1
  234. package/dist/src/setup/scaffold/channels-catalog.d.ts +2 -0
  235. package/dist/src/setup/scaffold/channels-catalog.js +1 -1
  236. package/dist/src/setup/scaffold/create/add-to-project.d.ts +1 -0
  237. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  238. package/dist/src/setup/scaffold/create/project.d.ts +2 -0
  239. package/dist/src/setup/scaffold/create/project.js +6 -3
  240. package/dist/src/setup/scaffold/update/channels.d.ts +2 -0
  241. package/dist/src/setup/scaffold/update/channels.js +3 -3
  242. package/dist/src/setup/slack-connect-lifecycle.d.ts +97 -0
  243. package/dist/src/setup/slack-connect-lifecycle.js +1 -0
  244. package/dist/src/setup/slack-connect.d.ts +51 -0
  245. package/dist/src/setup/slack-connect.js +1 -0
  246. package/dist/src/setup/slackbot.d.ts +60 -47
  247. package/dist/src/setup/slackbot.js +1 -1
  248. package/dist/src/setup/state.d.ts +2 -1
  249. package/dist/src/setup/state.js +1 -1
  250. package/dist/src/setup/step.d.ts +4 -0
  251. package/dist/src/setup/validate-gateway-key.d.ts +30 -0
  252. package/dist/src/setup/validate-gateway-key.js +1 -0
  253. package/dist/src/setup/vercel-project.d.ts +19 -12
  254. package/dist/src/setup/vercel-project.js +1 -1
  255. package/dist/src/shared/agent-definition.d.ts +26 -0
  256. package/dist/src/shared/model-endpoint-status.d.ts +27 -0
  257. package/dist/src/shared/model-endpoint-status.js +1 -0
  258. package/dist/src/shared/sandbox-backend.d.ts +8 -2
  259. package/dist/src/shared/sandbox-definition.d.ts +4 -3
  260. package/dist/src/shared/sandbox-network-policy.d.ts +4 -2
  261. package/dist/src/shared/sandbox-session.d.ts +3 -2
  262. package/dist/src/svelte/index.js +1 -1
  263. package/dist/src/svelte/use-eve-agent.js +1 -1
  264. package/dist/src/vue/index.js +1 -1
  265. package/dist/src/vue/use-eve-agent.js +1 -1
  266. package/{dist/docs/public → docs}/getting-started.mdx +14 -4
  267. package/{dist/docs/public → docs}/guides/deployment.md +3 -3
  268. package/{dist/docs/public → docs}/guides/dev-tui.md +2 -2
  269. package/{dist/docs/public → docs}/reference/cli.md +2 -1
  270. package/{dist/docs/public → docs}/sandbox.mdx +39 -15
  271. package/package.json +11 -1
  272. package/dist/src/compiled/just-bash/LICENSE +0 -201
  273. package/dist/src/compiled/just-bash/index.d.ts +0 -139
  274. package/dist/src/compiled/just-bash/index.js +0 -2200
  275. package/dist/src/compiled/just-bash/network/types.d.ts +0 -155
  276. package/dist/src/public/sandbox/backends/local.d.ts +0 -16
  277. package/dist/src/public/sandbox/backends/local.js +0 -1
  278. package/dist/src/public/sandbox/local-sandbox.d.ts +0 -7
  279. /package/dist/src/public/sandbox/{local-sandbox.js → docker-sandbox.js} +0 -0
  280. /package/{dist/docs/public → docs}/README.md +0 -0
  281. /package/{dist/docs/public → docs}/agent-config.md +0 -0
  282. /package/{dist/docs/public → docs}/channels/custom.mdx +0 -0
  283. /package/{dist/docs/public → docs}/channels/discord.mdx +0 -0
  284. /package/{dist/docs/public → docs}/channels/eve.mdx +0 -0
  285. /package/{dist/docs/public → docs}/channels/github.mdx +0 -0
  286. /package/{dist/docs/public → docs}/channels/linear.mdx +0 -0
  287. /package/{dist/docs/public → docs}/channels/meta.json +0 -0
  288. /package/{dist/docs/public → docs}/channels/overview.mdx +0 -0
  289. /package/{dist/docs/public → docs}/channels/slack.mdx +0 -0
  290. /package/{dist/docs/public → docs}/channels/teams.mdx +0 -0
  291. /package/{dist/docs/public → docs}/channels/telegram.mdx +0 -0
  292. /package/{dist/docs/public → docs}/channels/twilio.mdx +0 -0
  293. /package/{dist/docs/public → docs}/concepts/context-control.md +0 -0
  294. /package/{dist/docs/public → docs}/concepts/default-harness.md +0 -0
  295. /package/{dist/docs/public → docs}/concepts/execution-model-and-durability.md +0 -0
  296. /package/{dist/docs/public → docs}/concepts/meta.json +0 -0
  297. /package/{dist/docs/public → docs}/concepts/security-model.md +0 -0
  298. /package/{dist/docs/public → docs}/concepts/sessions-runs-and-streaming.md +0 -0
  299. /package/{dist/docs/public → docs}/connections.mdx +0 -0
  300. /package/{dist/docs/public → docs}/evals/assertions.mdx +0 -0
  301. /package/{dist/docs/public → docs}/evals/cases.mdx +0 -0
  302. /package/{dist/docs/public → docs}/evals/judge.mdx +0 -0
  303. /package/{dist/docs/public → docs}/evals/meta.json +0 -0
  304. /package/{dist/docs/public → docs}/evals/overview.mdx +0 -0
  305. /package/{dist/docs/public → docs}/evals/reporters.mdx +0 -0
  306. /package/{dist/docs/public → docs}/evals/running.mdx +0 -0
  307. /package/{dist/docs/public → docs}/evals/targets.mdx +0 -0
  308. /package/{dist/docs/public → docs}/guides/auth-and-route-protection.md +0 -0
  309. /package/{dist/docs/public → docs}/guides/client/continuations.mdx +0 -0
  310. /package/{dist/docs/public → docs}/guides/client/messages.mdx +0 -0
  311. /package/{dist/docs/public → docs}/guides/client/meta.json +0 -0
  312. /package/{dist/docs/public → docs}/guides/client/output-schema.mdx +0 -0
  313. /package/{dist/docs/public → docs}/guides/client/overview.mdx +0 -0
  314. /package/{dist/docs/public → docs}/guides/client/streaming.mdx +0 -0
  315. /package/{dist/docs/public → docs}/guides/dynamic-capabilities.md +0 -0
  316. /package/{dist/docs/public → docs}/guides/dynamic-workflows.md +0 -0
  317. /package/{dist/docs/public → docs}/guides/frontend/meta.json +0 -0
  318. /package/{dist/docs/public → docs}/guides/frontend/nextjs.mdx +0 -0
  319. /package/{dist/docs/public → docs}/guides/frontend/nuxt.mdx +0 -0
  320. /package/{dist/docs/public → docs}/guides/frontend/overview.mdx +0 -0
  321. /package/{dist/docs/public → docs}/guides/frontend/sveltekit.mdx +0 -0
  322. /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-svelte.mdx +0 -0
  323. /package/{dist/docs/public → docs}/guides/frontend/use-eve-agent-vue.mdx +0 -0
  324. /package/{dist/docs/public → docs}/guides/hooks.md +0 -0
  325. /package/{dist/docs/public → docs}/guides/instrumentation.md +0 -0
  326. /package/{dist/docs/public → docs}/guides/meta.json +0 -0
  327. /package/{dist/docs/public → docs}/guides/remote-agents.md +0 -0
  328. /package/{dist/docs/public → docs}/guides/session-context.md +0 -0
  329. /package/{dist/docs/public → docs}/guides/state.md +0 -0
  330. /package/{dist/docs/public → docs}/instructions.mdx +0 -0
  331. /package/{dist/docs/public → docs}/introduction.md +0 -0
  332. /package/{dist/docs/public → docs}/meta.json +0 -0
  333. /package/{dist/docs/public → docs}/reference/meta.json +0 -0
  334. /package/{dist/docs/public → docs}/reference/project-layout.md +0 -0
  335. /package/{dist/docs/public → docs}/reference/typescript-api.md +0 -0
  336. /package/{dist/docs/public → docs}/schedules.mdx +0 -0
  337. /package/{dist/docs/public → docs}/skills.mdx +0 -0
  338. /package/{dist/docs/public → docs}/subagents.mdx +0 -0
  339. /package/{dist/docs/public → docs}/tools.mdx +0 -0
  340. /package/{dist/docs/public → docs}/tutorial/connect-a-warehouse.mdx +0 -0
  341. /package/{dist/docs/public → docs}/tutorial/first-agent.mdx +0 -0
  342. /package/{dist/docs/public → docs}/tutorial/guard-the-spend.mdx +0 -0
  343. /package/{dist/docs/public → docs}/tutorial/how-it-runs.mdx +0 -0
  344. /package/{dist/docs/public → docs}/tutorial/meta.json +0 -0
  345. /package/{dist/docs/public → docs}/tutorial/query-sample-data.mdx +0 -0
  346. /package/{dist/docs/public → docs}/tutorial/remember-definitions.mdx +0 -0
  347. /package/{dist/docs/public → docs}/tutorial/run-analysis.mdx +0 -0
  348. /package/{dist/docs/public → docs}/tutorial/ship-it.mdx +0 -0
  349. /package/{dist/docs/public → docs}/tutorial/team-playbooks.mdx +0 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Parses a candidate string into a normalized web URL, or `undefined` if it is
3
+ * not a valid `http(s)` URL. Uses the URL parser rather than a pattern so the
4
+ * accept/reject decision matches what a browser would resolve.
5
+ */
6
+ export declare function parseWebUrl(candidate: string): string | undefined;
7
+ /**
8
+ * Opens a URL in the user's default browser, best-effort and fire-and-forget.
9
+ * Used where Eve owns the hand-off (e.g. pointing the user at their Slack
10
+ * workspace after a deploy) rather than relying on a child CLI to open it. A
11
+ * missing or failing opener is never fatal: callers still print the URL for the
12
+ * user to open by hand.
13
+ */
14
+ export declare function openUrl(url: string): void;
@@ -0,0 +1 @@
1
+ import{spawn}from"node:child_process";function osOpenCommand(e){switch(process.platform){case`darwin`:return{command:`open`,args:[e]};case`win32`:return{command:`cmd`,args:[`/c`,`start`,``,e]};default:return{command:`xdg-open`,args:[e]}}}function parseWebUrl(e){let t=URL.parse(e.trim());if(t&&(t.protocol===`http:`||t.protocol===`https:`))return t.href}function openUrl(t){if(parseWebUrl(t)===void 0)return;let{command:n,args:r}=osOpenCommand(t);try{let t=spawn(n,r,{stdio:`ignore`,detached:!0});t.on(`error`,()=>{}),t.unref()}catch{}}export{openUrl,parseWebUrl};
@@ -1,5 +1,14 @@
1
1
  export declare const PNPM_WORKSPACE_PATH = "pnpm-workspace.yaml";
2
+ export declare const PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS: readonly ["list", "--depth", "-1", "--json"];
2
3
  export declare const PNPM_WORKSPACE_CONTENT: string;
4
+ /** Whether pnpm can walk from this project into a parent-owned workspace. */
5
+ export declare function hasAncestorPnpmWorkspace(projectRoot: string): boolean;
6
+ /**
7
+ * Reads `pnpm list --depth -1 --json` and answers whether the ancestor
8
+ * workspace explicitly includes `projectRoot`. `undefined` means the output
9
+ * was not trustworthy enough to choose an install mode.
10
+ */
11
+ export declare function pnpmWorkspaceClaimsProject(stdout: string, projectRoot: string): boolean | undefined;
3
12
  export declare const pnpmPackageManager: {
4
13
  kind: "pnpm";
5
14
  scaffoldFiles: {
@@ -1,8 +1,8 @@
1
- import{pathExists}from"../../path-exists.js";import{extname,join}from"node:path";import{existsSync}from"node:fs";import{readFile,writeFile}from"node:fs/promises";const PNPM_WORKSPACE_PATH=`pnpm-workspace.yaml`,PNPM_WORKSPACE_CONTENT=[`minimumReleaseAgeExclude:`,` - eve`,`allowBuilds:`,` sharp: false`,`# Compatibility for Eve releases with an incomplete runtime manifest.`,`packageExtensions:`,` "eve@>=0.6.0-beta.13 <=0.7.0":`,` dependencies:`,` oxc-parser: 0.134.0`,``].join(`
1
+ import{pathExists}from"../../path-exists.js";import{dirname,extname,join,resolve}from"node:path";import{existsSync,realpathSync}from"node:fs";import{readFile,writeFile}from"node:fs/promises";const PNPM_WORKSPACE_PATH=`pnpm-workspace.yaml`,PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS=[`list`,`--depth`,`-1`,`--json`],PNPM_WORKSPACE_CONTENT=[`minimumReleaseAgeExclude:`,` - eve`,`allowBuilds:`,` sharp: false`,`# Compatibility for Eve releases with an incomplete runtime manifest.`,`packageExtensions:`,` "eve@>=0.6.0-beta.13 <=0.7.0":`,` dependencies:`,` oxc-parser: 0.134.0`,``].join(`
2
2
  `),EVE_RELEASE_AGE_EXCLUSION=` - eve`,SHARP_BUILD_POLICY=` sharp: false`;function findYamlBlockEnd(e,t){let n=t+1;for(;n<e.length;){let t=e[n]??``;if(t.length>0&&!t.startsWith(` `)&&!t.startsWith(` `))break;n+=1}return n}function withSharpBuildPolicy(e){let t=e.endsWith(`
3
3
  `)?e:`${e}\n`,n=t.split(`
4
4
  `),r=n.findIndex(e=>e===`allowBuilds:`);if(r<0)return`${t.trim().length===0?``:`${t}\n`}allowBuilds:\n${SHARP_BUILD_POLICY}\n`;let i=findYamlBlockEnd(n,r);if(n.slice(r+1,i).some(e=>/^\s+sharp:/.test(e)))return e;let a=i;for(;a>r+1&&n[a-1]===``;)--a;return n.splice(a,0,SHARP_BUILD_POLICY),n.join(`
5
5
  `)}function withExperimentalEveReleaseAgeExclusion(e){let t=e.endsWith(`
6
6
  `)?e:`${e}\n`,n=t.split(`
7
7
  `),r=n.findIndex(e=>e===`minimumReleaseAgeExclude:`);if(r<0)return`${t.trim().length===0?``:`${t}\n`}minimumReleaseAgeExclude:\n${EVE_RELEASE_AGE_EXCLUSION}\n`;let i=findYamlBlockEnd(n,r);if(n.slice(r+1,i).some(e=>e.trim()===`- eve`))return e;let a=i;for(;a>r+1&&n[a-1]===``;)--a;return n.splice(a,0,EVE_RELEASE_AGE_EXCLUSION),n.join(`
8
- `)}async function ensurePnpmWorkspacePolicy(t){if(!await pathExists(t))return await writeFile(t,PNPM_WORKSPACE_CONTENT,`utf8`),`written`;let n=await readFile(t,`utf8`),r=withExperimentalEveReleaseAgeExclusion(withSharpBuildPolicy(n));return r===n?`skipped`:(await writeFile(t,r,`utf8`),`written`)}const pnpmPackageManager={kind:`pnpm`,scaffoldFiles:{[PNPM_WORKSPACE_PATH]:PNPM_WORKSPACE_CONTENT},async applyProjectConfiguration(e){let t=join(e,PNPM_WORKSPACE_PATH);return await ensurePnpmWorkspacePolicy(t)===`written`?{filesSkipped:[],filesWritten:[t]}:{filesSkipped:[t],filesWritten:[]}},devArguments:()=>[`exec`,`eve`,`dev`],installArguments:e=>[`install`,`--no-frozen-lockfile`,...e.bypassMinimumReleaseAge===!0?[`--config.minimum-release-age=0`]:[]],prepareArguments:(e,t)=>[`--dir`,e,...existsSync(join(e,`pnpm-workspace.yaml`))?[]:[`--ignore-workspace`],...t],resolveInvocation(e){let i=process.env.PNPM_HOME;if(i!==void 0){let t=join(i,process.platform===`win32`?`pnpm.CMD`:`pnpm`);if(existsSync(t))return{args:e,command:t,shell:process.platform===`win32`}}let a=process.env.npm_execpath;if(a!==void 0&&a.toLowerCase().includes(`pnpm`)){let n=extname(a).toLowerCase();return n===`.cjs`||n===`.js`?{args:[a,...e],command:process.execPath}:{args:e,command:a,shell:process.platform===`win32`}}return{args:e,command:`pnpm`}}};export{PNPM_WORKSPACE_CONTENT,PNPM_WORKSPACE_PATH,pnpmPackageManager};
8
+ `)}async function ensurePnpmWorkspacePolicy(t){if(!await pathExists(t))return await writeFile(t,PNPM_WORKSPACE_CONTENT,`utf8`),`written`;let n=await readFile(t,`utf8`),r=withExperimentalEveReleaseAgeExclusion(withSharpBuildPolicy(n));return r===n?`skipped`:(await writeFile(t,r,`utf8`),`written`)}function hasAncestorPnpmWorkspace(e){let n=dirname(resolve(e));for(;;){if(existsSync(join(n,`pnpm-workspace.yaml`)))return!0;let e=dirname(n);if(e===n)return!1;n=e}}function pnpmWorkspaceClaimsProject(e,t){let n;try{n=JSON.parse(e)}catch{return}if(!Array.isArray(n)||n.length===0)return;let canonicalPath=e=>{let t=resolve(e);try{return realpathSync.native(t)}catch{return t}},r=canonicalPath(t),a=!1;for(let e of n){if(typeof e!=`object`||!e)continue;let t=e.path;if(typeof t==`string`&&(a=!0,canonicalPath(t)===r))return!0}return a?!1:void 0}const pnpmPackageManager={kind:`pnpm`,scaffoldFiles:{[PNPM_WORKSPACE_PATH]:PNPM_WORKSPACE_CONTENT},async applyProjectConfiguration(e){let t=join(e,PNPM_WORKSPACE_PATH);return await ensurePnpmWorkspacePolicy(t)===`written`?{filesSkipped:[],filesWritten:[t]}:{filesSkipped:[t],filesWritten:[]}},devArguments:()=>[`exec`,`eve`,`dev`],installArguments:e=>[`install`,`--no-frozen-lockfile`,...e.bypassMinimumReleaseAge===!0?[`--config.minimum-release-age=0`]:[],...e.ignoreWorkspace===!0?[`--ignore-workspace`]:[]],prepareArguments:(e,t)=>[`--dir`,e,...t],resolveInvocation(e){let t=process.env.npm_execpath;if(t!==void 0&&t.toLowerCase().includes(`pnpm`)){let r=extname(t).toLowerCase();return r===`.cjs`||r===`.js`?{args:[t,...e],command:process.execPath}:{args:e,command:t,shell:process.platform===`win32`}}if(process.env.npm_config_user_agent?.toLowerCase().startsWith(`pnpm/`))return{args:e,command:`pnpm`,shell:process.platform===`win32`};let i=process.env.PNPM_HOME;if(i!==void 0){let t=join(i,process.platform===`win32`?`pnpm.CMD`:`pnpm`);if(existsSync(t))return{args:e,command:t,shell:process.platform===`win32`}}return{args:e,command:`pnpm`}}};export{PNPM_WORKSPACE_CONTENT,PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS,PNPM_WORKSPACE_PATH,hasAncestorPnpmWorkspace,pnpmPackageManager,pnpmWorkspaceClaimsProject};
@@ -1,19 +1,27 @@
1
1
  import type { PackageManagerKind } from "../../package-manager.js";
2
2
  import { type ProcessOutputHandler } from "../process-output.js";
3
+ import type { PackageManagerInstallOptions } from "./types.js";
3
4
  /** Output routing options for setup-owned package manager commands. */
4
5
  export interface RunPackageManagerOptions {
5
6
  /** Streams command output to a parent-owned renderer instead of writing outside it. */
6
7
  onOutput?: ProcessOutputHandler;
8
+ /** Aborts the package-manager subprocess when setup is interrupted. */
9
+ signal?: AbortSignal;
7
10
  }
8
11
  /** @deprecated Use {@link RunPackageManagerOptions}. */
9
12
  export type RunPnpmOptions = RunPackageManagerOptions;
10
13
  /** Runs the selected package manager in `projectRoot`. */
11
14
  export declare function spawnPackageManager(kind: PackageManagerKind, projectRoot: string, args: readonly string[], options?: RunPackageManagerOptions): Promise<boolean>;
12
- export interface RunInstallOptions extends RunPackageManagerOptions {
13
- /** Disables the manager's minimum-release-age cooldown for this run when supported. */
14
- bypassMinimumReleaseAge?: boolean;
15
+ export interface RunInstallOptions extends RunPackageManagerOptions, PackageManagerInstallOptions {
15
16
  }
16
- /** Installs project dependencies using the selected package-manager strategy. */
17
+ /**
18
+ * Installs project dependencies using the selected package-manager strategy.
19
+ *
20
+ * pnpm resolves an unclaimed nested project as part of an ancestor workspace,
21
+ * where `install` can exit successfully without touching the project and can
22
+ * run the ancestor's lifecycle scripts. Membership is therefore established
23
+ * before installation, so exactly one correctly scoped install runs.
24
+ */
17
25
  export declare function runPackageManagerInstall(kind: PackageManagerKind, projectRoot: string, options?: RunInstallOptions): Promise<boolean>;
18
26
  /** The argv that runs the locally installed Eve binary's `dev` command. */
19
27
  export declare function eveDevArguments(kind: PackageManagerKind): readonly string[];
@@ -1 +1 @@
1
- import{createProcessOutputBuffer}from"../process-output.js";import{getPackageManagerStrategy}from"./index.js";import{spawn}from"node:child_process";function spawnPackageManager(r,i,a,o={}){return new Promise(s=>{let c=getPackageManagerStrategy(r),l=c.prepareArguments(i,a),u=c.resolveInvocation(l),d=o.onOutput&&createProcessOutputBuffer(o.onOutput),f=spawn(u.command,[...u.args],{cwd:i,stdio:o.onOutput?[`inherit`,`pipe`,`pipe`]:`inherit`,shell:u.shell});f.stdout?.on(`data`,e=>d?.write(`stdout`,e)),f.stderr?.on(`data`,e=>d?.write(`stderr`,e));let p=!1;function settle(e){p||(p=!0,d?.flush(),s(e))}function reportFailure(e){o.onOutput?o.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}f.on(`error`,e=>{e.code===`ENOENT`?reportFailure(`${r} not found. Install it before running this step.`):reportFailure(`${r} ${a.join(` `)} failed: ${e.message}`),settle(!1)}),f.on(`close`,e=>settle(e===0))})}function runPackageManagerInstall(e,n,r={}){return spawnPackageManager(e,n,getPackageManagerStrategy(e).installArguments(r),{onOutput:r.onOutput})}function eveDevArguments(e){return getPackageManagerStrategy(e).devArguments()}function spawnPnpm(e,t,n={}){return spawnPackageManager(`pnpm`,e,t,n)}function runPnpmInstall(e,t={}){return runPackageManagerInstall(`pnpm`,e,t)}export{eveDevArguments,runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm};
1
+ import{createProcessOutputBuffer}from"../process-output.js";import{armProcessAbort}from"../process-abort.js";import{PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS,hasAncestorPnpmWorkspace,pnpmWorkspaceClaimsProject}from"./pnpm.js";import{getPackageManagerStrategy}from"./index.js";import{spawn}from"node:child_process";function spawnPackageManager(n,r,i,s={}){return s.signal?.aborted===!0?Promise.resolve(!1):new Promise(c=>{let l=getPackageManagerStrategy(n),u=l.prepareArguments(r,i),d=l.resolveInvocation(u),f=s.onOutput&&createProcessOutputBuffer(s.onOutput),p=spawn(d.command,[...d.args],{cwd:r,stdio:s.onOutput?[`inherit`,`pipe`,`pipe`]:`inherit`,shell:d.shell,signal:s.signal}),m=armProcessAbort(p,s.signal);p.stdout?.on(`data`,e=>f?.write(`stdout`,e)),p.stderr?.on(`data`,e=>f?.write(`stderr`,e));let h=!1;function settle(e){h||(h=!0,f?.flush(),c(e))}function reportFailure(e){s.onOutput?s.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}p.on(`error`,e=>{s.signal?.aborted===!0||e.name===`AbortError`||(e.code===`ENOENT`?(m(),reportFailure(`${n} not found. Install it before running this step.`),settle(!1)):(m(),reportFailure(`${n} ${i.join(` `)} failed: ${e.message}`),settle(!1)))}),p.on(`close`,e=>{m(),settle(s.signal?.aborted===!0?!1:e===0)})})}function capturePackageManager(n,r,i,s){return s.signal?.aborted===!0?Promise.resolve({ok:!1,stdout:``}):new Promise(c=>{let l=getPackageManagerStrategy(n),u=l.prepareArguments(r,i),d=l.resolveInvocation(u),f=spawn(d.command,[...d.args],{cwd:r,stdio:[`ignore`,`pipe`,`pipe`],shell:d.shell,signal:s.signal}),p=armProcessAbort(f,s.signal),m=[],h=s.onOutput&&createProcessOutputBuffer(s.onOutput);f.stdout?.on(`data`,e=>m.push(e)),f.stderr?.on(`data`,e=>h?.write(`stderr`,e));let g=!1;function settle(e){g||(g=!0,h?.flush(),c({ok:e,stdout:Buffer.concat(m).toString(`utf8`)}))}function reportFailure(e){s.onOutput?s.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}f.on(`error`,e=>{s.signal?.aborted===!0||e.name===`AbortError`||(p(),reportFailure(e.code===`ENOENT`?`${n} not found. Install it before running this step.`:`${n} ${i.join(` `)} failed: ${e.message}`),settle(!1))}),f.on(`close`,e=>{p(),!g&&e!==0&&s.signal?.aborted!==!0&&reportFailure(`${n} ${i.join(` `)} exited with code ${e??`unknown`}.`),settle(s.signal?.aborted===!0?!1:e===0)})})}async function runPackageManagerInstall(e,t,o={}){let s=getPackageManagerStrategy(e),c=o;if(e===`pnpm`&&o.ignoreWorkspace!==!0&&hasAncestorPnpmWorkspace(t)){let r=await capturePackageManager(e,t,PNPM_WORKSPACE_MEMBERSHIP_ARGUMENTS,o);if(!r.ok)return!1;let a=pnpmWorkspaceClaimsProject(r.stdout,t);if(a===void 0)return o.onOutput?.({stream:`stderr`,text:`Could not determine whether the ancestor pnpm workspace includes this project.`}),!1;a||(c={...o,ignoreWorkspace:!0})}return spawnPackageManager(e,t,s.installArguments(c),o)}function eveDevArguments(e){return getPackageManagerStrategy(e).devArguments()}function spawnPnpm(e,t,n={}){return spawnPackageManager(`pnpm`,e,t,n)}function runPnpmInstall(e,t={}){return runPackageManagerInstall(`pnpm`,e,t)}export{eveDevArguments,runPackageManagerInstall,runPnpmInstall,spawnPackageManager,spawnPnpm};
@@ -11,7 +11,10 @@ export interface PackageManagerConfigurationResult {
11
11
  readonly filesWritten: readonly string[];
12
12
  }
13
13
  export interface PackageManagerInstallOptions {
14
+ /** Disables the manager's minimum-release-age cooldown for this run when supported. */
14
15
  readonly bypassMinimumReleaseAge?: boolean;
16
+ /** Resolves the project standalone even when an ancestor workspace exists. */
17
+ readonly ignoreWorkspace?: boolean;
15
18
  }
16
19
  /**
17
20
  * Package-manager-specific command and generated-project behavior.
@@ -0,0 +1,7 @@
1
+ import type { ChildProcess } from "node:child_process";
2
+ /**
3
+ * Couples a parent abort signal to a child process and guarantees eventual
4
+ * termination. Callers still wait for `close`; this helper only owns signals
5
+ * and the SIGKILL escalation.
6
+ */
7
+ export declare function armProcessAbort(child: ChildProcess, signal: AbortSignal | undefined): () => void;
@@ -0,0 +1 @@
1
+ function armProcessAbort(e,t){if(t===void 0)return()=>{};let n,abort=()=>{e.kill(`SIGTERM`),n=setTimeout(()=>e.kill(`SIGKILL`),5e3),n.unref()};return t.aborted?abort():t.addEventListener(`abort`,abort,{once:!0}),()=>{t.removeEventListener(`abort`,abort),n!==void 0&&clearTimeout(n)}}export{armProcessAbort};
@@ -7,6 +7,8 @@ export interface RunVercelOptions {
7
7
  nonInteractive?: boolean;
8
8
  /** Streams command output to a parent-owned renderer instead of writing outside it. */
9
9
  onOutput?: ProcessOutputHandler;
10
+ /** Aborts the Vercel CLI subprocess when its parent setup flow is interrupted. */
11
+ signal?: AbortSignal;
10
12
  /**
11
13
  * Hard deadline for the whole command. When it elapses the run settles as a
12
14
  * failure and the child is killed (SIGTERM, then SIGKILL after a short
@@ -1 +1 @@
1
- import{createProcessOutputBuffer}from"./process-output.js";import{dirname,join,resolve}from"node:path";import{spawn}from"node:child_process";import{accessSync,constants,existsSync,statSync}from"node:fs";const CONNECT_FEATURE_FLAG_ENV={FF_CONNECT_ENABLED:`1`},VERCEL_NOT_FOUND_MESSAGE=`Vercel CLI not found. Install with: npm i -g vercel@latest`;function buildSpawnEnv(e){return{...process.env,...CONNECT_FEATURE_FLAG_ENV,...e}}function existingDir(e){let n=resolve(e);for(;!existsSync(n);){let e=dirname(n);if(e===n)break;n=e}return n}function armDeadline(e,t,n){if(t===void 0)return()=>{};let r=setTimeout(()=>{n(),e.kill(`SIGTERM`);let t=setTimeout(()=>e.kill(`SIGKILL`),5e3);t.unref(),e.once(`close`,()=>clearTimeout(t))},t);return r.unref(),()=>clearTimeout(r)}function timeoutMessage(e,t){return`vercel ${e.join(` `)} timed out after ${Math.round(t/1e3)}s and was aborted.`}function ancestorDirectories(e){let n=[],i=resolve(e);for(;;){n.push(i);let e=dirname(i);if(e===i)return n;i=e}}function findExecutable(e){try{if(accessSync(e,constants.F_OK|constants.X_OK),statSync(e).isFile())return e}catch{return}}function findLocalVercel(e){for(let t of ancestorDirectories(e)){let e=findExecutable(join(t,`node_modules`,`.bin`,`vercel`));if(e!==void 0)return e}}function resolveVercelInvocation(e){let t=findLocalVercel(e);return t===void 0?{command:`vercel`,commandArgs:[]}:{command:t,commandArgs:[]}}function stdioForRun(e){return e.onOutput?[e.nonInteractive?`ignore`:`inherit`,`pipe`,`pipe`]:e.nonInteractive?[`ignore`,`pipe`,`pipe`]:`inherit`}async function runVercel(t,n){return new Promise(r=>{let a=existingDir(n.cwd),o=resolveVercelInvocation(a),s=n.onOutput&&createProcessOutputBuffer(n.onOutput),c=spawn(o.command,[...o.commandArgs,...t],{cwd:a,stdio:stdioForRun(n),env:buildSpawnEnv(n.extraEnv??{})});c.stdout?.on(`data`,e=>s?.write(`stdout`,e)),c.stderr?.on(`data`,e=>s?.write(`stderr`,e));let l=!1;function settle(e){l||(l=!0,s?.flush(),r(e))}function reportFailure(e){n.onOutput?n.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}let u=armDeadline(c,n.timeoutMs,()=>{reportFailure(timeoutMessage(t,n.timeoutMs??0)),settle(!1)});c.on(`error`,e=>{u(),e.code===`ENOENT`?reportFailure(VERCEL_NOT_FOUND_MESSAGE):reportFailure(`vercel ${t.join(` `)} failed: ${e.message}`),settle(!1)}),c.on(`close`,e=>{u(),!l&&e!==0&&e!==null&&(s?.flush(),reportFailure(`vercel ${t.join(` `)} exited with code ${e}.`)),settle(e===0)})})}async function runVercelCaptureStdout(t,n){return new Promise(r=>{let a=existingDir(n.cwd),o=resolveVercelInvocation(a),s=n.onOutput&&createProcessOutputBuffer(n.onOutput),c=spawn(o.command,[...o.commandArgs,...t],{cwd:a,stdio:[n.nonInteractive?`ignore`:`inherit`,`pipe`,n.onOutput?`pipe`:`inherit`],env:buildSpawnEnv(n.extraEnv??{})}),l=[];c.stdout?.on(`data`,e=>l.push(e.toString(`utf8`))),c.stderr?.on(`data`,e=>s?.write(`stderr`,e));let u=!1;function settle(e){u||(u=!0,s?.flush(),r({ok:e,stdout:l.join(``)}))}function reportFailure(e){n.onOutput?n.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}let d=armDeadline(c,n.timeoutMs,()=>{reportFailure(timeoutMessage(t,n.timeoutMs??0)),settle(!1)});c.on(`error`,e=>{d(),reportFailure(e.code===`ENOENT`?VERCEL_NOT_FOUND_MESSAGE:`vercel ${t.join(` `)} failed: ${e.message}`),settle(!1)}),c.on(`close`,e=>{d(),!u&&e!==0&&e!==null&&reportFailure(`vercel ${t.join(` `)} exited with code ${e}.`),settle(e===0)})})}async function captureVercel(t,n){return new Promise(r=>{let a=existingDir(n.cwd),o=resolveVercelInvocation(a),s=n.onOutput&&createProcessOutputBuffer(n.onOutput),c=spawn(o.command,[...o.commandArgs,...t],{cwd:a,stdio:[`ignore`,`pipe`,`pipe`],env:buildSpawnEnv(n.extraEnv??{})}),l=[],u=[];c.stdout?.on(`data`,e=>l.push(e.toString(`utf8`))),c.stderr?.on(`data`,e=>{u.push(e.toString(`utf8`)),s?.write(`stderr`,e)});let d=!1;function fail(e){d||(d=!0,s?.flush(),n.onOutput?.({stream:`stderr`,text:e.message}),r({ok:!1,failure:e}))}function succeed(){d||(d=!0,s?.flush(),r({ok:!0,stdout:l.join(``)}))}let f=armDeadline(c,n.timeoutMs,()=>{fail({code:null,stdout:l.join(``),stderr:u.join(``),message:timeoutMessage(t,n.timeoutMs??0)})});c.on(`error`,e=>{f(),fail({errno:e.code,stdout:l.join(``),stderr:u.join(``),message:e.code===`ENOENT`?VERCEL_NOT_FOUND_MESSAGE:`vercel ${t.join(` `)} failed: ${e.message}`})}),c.on(`close`,e=>{if(f(),e!==0&&e!==null){fail({code:e,stdout:l.join(``),stderr:u.join(``),message:`vercel ${t.join(` `)} exited with code ${e}.`});return}succeed()})})}export{captureVercel,runVercel,runVercelCaptureStdout};
1
+ import{createProcessOutputBuffer}from"./process-output.js";import{armProcessAbort}from"./process-abort.js";import{dirname,join,resolve}from"node:path";import{spawn}from"node:child_process";import{accessSync,constants,existsSync,statSync}from"node:fs";const CONNECT_FEATURE_FLAG_ENV={FF_CONNECT_ENABLED:`1`},VERCEL_NOT_FOUND_MESSAGE=`Vercel CLI not found. Install with: npm i -g vercel@latest`;function buildSpawnEnv(e){return{...process.env,...CONNECT_FEATURE_FLAG_ENV,...e}}function existingDir(e){let t=resolve(e);for(;!existsSync(t);){let e=dirname(t);if(e===t)break;t=e}return t}function armDeadline(e,t,n){if(t===void 0)return()=>{};let r=setTimeout(()=>{n(),e.kill(`SIGTERM`);let t=setTimeout(()=>e.kill(`SIGKILL`),5e3);t.unref(),e.once(`close`,()=>clearTimeout(t))},t);return r.unref(),()=>clearTimeout(r)}function timeoutMessage(e,t){return`vercel ${e.join(` `)} timed out after ${Math.round(t/1e3)}s and was aborted.`}function abortMessage(e){return`vercel ${e.join(` `)} was aborted.`}function isAbortError(e,t){return t?.aborted===!0||e.name===`AbortError`||e.code===`ABORT_ERR`}function ancestorDirectories(e){let t=[],r=resolve(e);for(;;){t.push(r);let e=dirname(r);if(e===r)return t;r=e}}function findExecutable(e){try{if(accessSync(e,constants.F_OK|constants.X_OK),statSync(e).isFile())return e}catch{return}}function findLocalVercel(e){for(let t of ancestorDirectories(e)){let e=findExecutable(join(t,`node_modules`,`.bin`,`vercel`));if(e!==void 0)return e}}function resolveVercelInvocation(e){let t=findLocalVercel(e);return t===void 0?{command:`vercel`,commandArgs:[]}:{command:t,commandArgs:[]}}function stdioForRun(e){return e.onOutput?[e.nonInteractive?`ignore`:`inherit`,`pipe`,`pipe`]:e.nonInteractive?[`ignore`,`pipe`,`pipe`]:`inherit`}async function runVercel(n,r){return r.signal?.aborted===!0?!1:new Promise(i=>{let a=existingDir(r.cwd),o=resolveVercelInvocation(a),s=r.onOutput&&createProcessOutputBuffer(r.onOutput),c=spawn(o.command,[...o.commandArgs,...n],{cwd:a,stdio:stdioForRun(r),env:buildSpawnEnv(r.extraEnv??{}),signal:r.signal}),l=armProcessAbort(c,r.signal);c.stdout?.on(`data`,e=>s?.write(`stdout`,e)),c.stderr?.on(`data`,e=>s?.write(`stderr`,e));let u=!1;function settle(e){u||(u=!0,s?.flush(),i(e))}function reportFailure(e){r.onOutput?r.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}let d=armDeadline(c,r.timeoutMs,()=>{reportFailure(timeoutMessage(n,r.timeoutMs??0)),settle(!1)});c.on(`error`,e=>{isAbortError(e,r.signal)||(e.code===`ENOENT`?(l(),d(),reportFailure(VERCEL_NOT_FOUND_MESSAGE),settle(!1)):(l(),d(),reportFailure(`vercel ${n.join(` `)} failed: ${e.message}`),settle(!1)))}),c.on(`close`,e=>{if(l(),d(),r.signal?.aborted===!0){settle(!1);return}!u&&e!==0&&e!==null&&(s?.flush(),reportFailure(`vercel ${n.join(` `)} exited with code ${e}.`)),settle(e===0)})})}async function runVercelCaptureStdout(n,r){return r.signal?.aborted===!0?{ok:!1,stdout:``}:new Promise(i=>{let a=existingDir(r.cwd),o=resolveVercelInvocation(a),s=r.onOutput&&createProcessOutputBuffer(r.onOutput),c=spawn(o.command,[...o.commandArgs,...n],{cwd:a,stdio:[r.nonInteractive?`ignore`:`inherit`,`pipe`,r.onOutput?`pipe`:`inherit`],env:buildSpawnEnv(r.extraEnv??{}),signal:r.signal}),l=armProcessAbort(c,r.signal),u=[];c.stdout?.on(`data`,e=>u.push(e.toString(`utf8`))),c.stderr?.on(`data`,e=>s?.write(`stderr`,e));let d=!1;function settle(e){d||(d=!0,s?.flush(),i({ok:e,stdout:u.join(``)}))}function reportFailure(e){r.onOutput?r.onOutput({stream:`stderr`,text:e}):process.stderr.write(`\n${e}\n`)}let f=armDeadline(c,r.timeoutMs,()=>{reportFailure(timeoutMessage(n,r.timeoutMs??0)),settle(!1)});c.on(`error`,e=>{isAbortError(e,r.signal)||(l(),f(),reportFailure(e.code===`ENOENT`?VERCEL_NOT_FOUND_MESSAGE:`vercel ${n.join(` `)} failed: ${e.message}`),settle(!1))}),c.on(`close`,e=>{if(l(),f(),r.signal?.aborted===!0){settle(!1);return}!d&&e!==0&&e!==null&&reportFailure(`vercel ${n.join(` `)} exited with code ${e}.`),settle(e===0)})})}async function captureVercel(n,r){return r.signal?.aborted===!0?{ok:!1,failure:{errno:`ABORT_ERR`,stdout:``,stderr:``,message:abortMessage(n)}}:new Promise(i=>{let a=existingDir(r.cwd),o=resolveVercelInvocation(a),s=r.onOutput&&createProcessOutputBuffer(r.onOutput),c=spawn(o.command,[...o.commandArgs,...n],{cwd:a,stdio:[`ignore`,`pipe`,`pipe`],env:buildSpawnEnv(r.extraEnv??{}),signal:r.signal}),l=armProcessAbort(c,r.signal),u=[],d=[];c.stdout?.on(`data`,e=>u.push(e.toString(`utf8`))),c.stderr?.on(`data`,e=>{d.push(e.toString(`utf8`)),s?.write(`stderr`,e)});let f=!1;function fail(e,t=!0){f||(f=!0,s?.flush(),t&&r.onOutput?.({stream:`stderr`,text:e.message}),i({ok:!1,failure:e}))}function succeed(){f||(f=!0,s?.flush(),i({ok:!0,stdout:u.join(``)}))}let p=armDeadline(c,r.timeoutMs,()=>{fail({code:null,stdout:u.join(``),stderr:d.join(``),message:timeoutMessage(n,r.timeoutMs??0)})});c.on(`error`,e=>{isAbortError(e,r.signal)||(l(),p(),fail({errno:e.code,stdout:u.join(``),stderr:d.join(``),message:e.code===`ENOENT`?VERCEL_NOT_FOUND_MESSAGE:`vercel ${n.join(` `)} failed: ${e.message}`}))}),c.on(`close`,e=>{if(l(),p(),r.signal?.aborted===!0){fail({errno:`ABORT_ERR`,stdout:u.join(``),stderr:d.join(``),message:abortMessage(n)},!1);return}if(e!==0&&e!==null){fail({code:e,stdout:u.join(``),stderr:d.join(``),message:`vercel ${n.join(` `)} exited with code ${e}.`});return}succeed()})})}export{captureVercel,runVercel,runVercelCaptureStdout};
@@ -7,10 +7,13 @@ export interface DeploymentInfo {
7
7
  orgId?: string;
8
8
  productionUrl?: string;
9
9
  }
10
+ export interface ProjectDetectionOptions {
11
+ signal?: AbortSignal;
12
+ }
10
13
  /**
11
14
  * Reads local Vercel link metadata and checks whether the linked project has a production alias.
12
15
  */
13
- export declare function detectDeployment(projectPath: string): Promise<DeploymentInfo>;
16
+ export declare function detectDeployment(projectPath: string, options?: ProjectDetectionOptions): Promise<DeploymentInfo>;
14
17
  /** Human-readable identity of a linked Vercel project, for the dashboard status bar. */
15
18
  export interface ProjectIdentity {
16
19
  projectName: string;
@@ -28,7 +31,7 @@ export interface ProjectIdentity {
28
31
  *
29
32
  * @param projectPath Absolute path of the linked project directory.
30
33
  */
31
- export declare function detectProjectIdentity(projectPath: string): Promise<ProjectIdentity | undefined>;
34
+ export declare function detectProjectIdentity(projectPath: string, options?: ProjectDetectionOptions): Promise<ProjectIdentity | undefined>;
32
35
  export type ProjectResolution = {
33
36
  kind: "unresolved";
34
37
  } | {
@@ -44,7 +47,7 @@ export declare function projectResolutionFromDeployment(deployment: DeploymentIn
44
47
  * Side-effect-free fact gathering after a link: reads `.vercel/project.json`
45
48
  * to resolve the project. The on-disk link is the single source of truth.
46
49
  */
47
- export declare function detectProjectResolution(projectRoot: string): Promise<ProjectResolution>;
50
+ export declare function detectProjectResolution(projectRoot: string, options?: ProjectDetectionOptions): Promise<ProjectResolution>;
48
51
  export declare function mergeProjectResolution(current: ProjectResolution, next: ProjectResolution): ProjectResolution;
49
52
  export declare function projectResolutionFromDeployResult(project: ProjectResolution, deploy: {
50
53
  deployed: boolean;
@@ -1 +1 @@
1
- import{captureVercel}from"./primitives/run-vercel.js";import{join}from"node:path";import{readFile}from"node:fs/promises";function pickShortestAlias(e){if(!Array.isArray(e))return;let t;for(let n of e)typeof n!=`string`||n.length===0||(t===void 0||n.length<t.length)&&(t=n);return t}async function fetchProductionAlias(t,n,r){let i=await captureVercel([`api`,`/v9/projects/${t}?teamId=${n}`,`--scope`,n],{cwd:r});if(i.ok)try{let e=pickShortestAlias(JSON.parse(i.stdout).targets?.production?.alias);return e?`https://${e}`:void 0}catch{return}}async function detectDeployment(e){let r;try{r=await readFile(join(e,`.vercel`,`project.json`),`utf8`)}catch{return{state:`unlinked`}}let i;try{i=JSON.parse(r)}catch{return{state:`unlinked`}}let a=typeof i.projectId==`string`?i.projectId:void 0,o=typeof i.orgId==`string`?i.orgId:void 0;if(!a||!o)return{state:`unlinked`};let s=await fetchProductionAlias(a,o,e);return{state:s?`deployed`:`linked`,projectId:a,orgId:o,productionUrl:s}}async function fetchVercelName(t,n,r){let i=await captureVercel([`api`,t,`--scope`,n],{cwd:r});if(i.ok)try{let e=JSON.parse(i.stdout);return typeof e.name==`string`&&e.name.length>0?e.name:typeof e.slug==`string`&&e.slug.length>0?e.slug:void 0}catch{return}}async function detectProjectIdentity(e){let r;try{r=await readFile(join(e,`.vercel`,`project.json`),`utf8`)}catch{return}let i;try{i=JSON.parse(r)}catch{return}let a=typeof i.projectId==`string`?i.projectId:void 0,o=typeof i.orgId==`string`?i.orgId:void 0;if(!a||!o)return;let[s,c]=await Promise.all([fetchVercelName(`/v9/projects/${a}?teamId=${o}`,o,e).then(e=>e??a),o.startsWith(`team_`)?fetchVercelName(`/v2/teams/${o}`,o,e):Promise.resolve(void 0)]);return{projectName:s,teamName:c}}function projectResolutionFromDeployment(e){return e.state===`unlinked`||e.projectId===void 0?{kind:`unresolved`}:e.state===`deployed`&&e.productionUrl!==void 0?{kind:`deployed`,projectId:e.projectId,productionUrl:e.productionUrl}:{kind:`linked`,projectId:e.projectId}}async function detectProjectResolution(e){return projectResolutionFromDeployment(await detectDeployment(e))}function mergeProjectResolution(e,t){return t.kind===`unresolved`||e.kind===`deployed`&&e.projectId===t.projectId?e:t}function projectResolutionFromDeployResult(e,t){return e.kind===`unresolved`||!t.deployed||t.productionUrl===void 0?e:{kind:`deployed`,projectId:e.projectId,productionUrl:t.productionUrl}}function isProjectResolved(e){return e.kind!==`unresolved`}function projectProductionUrlFromResolution(e){return e.kind===`deployed`?e.productionUrl:void 0}export{detectDeployment,detectProjectIdentity,detectProjectResolution,isProjectResolved,mergeProjectResolution,projectProductionUrlFromResolution,projectResolutionFromDeployResult,projectResolutionFromDeployment};
1
+ import{captureVercel}from"./primitives/run-vercel.js";import{join}from"node:path";import{readFile}from"node:fs/promises";function pickShortestAlias(e){if(!Array.isArray(e))return;let t;for(let n of e)typeof n!=`string`||n.length===0||(t===void 0||n.length<t.length)&&(t=n);return t}async function fetchProductionAlias(t,n,r,i){let a=await captureVercel([`api`,`/v9/projects/${t}?teamId=${n}`,`--scope`,n],{cwd:r,signal:i.signal});if(a.ok)try{let e=pickShortestAlias(JSON.parse(a.stdout).targets?.production?.alias);return e?`https://${e}`:void 0}catch{return}}async function detectDeployment(e,r={}){r.signal?.throwIfAborted();let i;try{i=await readFile(join(e,`.vercel`,`project.json`),`utf8`)}catch{return{state:`unlinked`}}let a;try{a=JSON.parse(i)}catch{return{state:`unlinked`}}let o=typeof a.projectId==`string`?a.projectId:void 0,s=typeof a.orgId==`string`?a.orgId:void 0;if(!o||!s)return{state:`unlinked`};let c=await fetchProductionAlias(o,s,e,r);return r.signal?.throwIfAborted(),{state:c?`deployed`:`linked`,projectId:o,orgId:s,productionUrl:c}}async function fetchVercelName(t,n,r,i){let a=await captureVercel([`api`,t,`--scope`,n],{cwd:r,signal:i.signal});if(a.ok)try{let e=JSON.parse(a.stdout);return typeof e.name==`string`&&e.name.length>0?e.name:typeof e.slug==`string`&&e.slug.length>0?e.slug:void 0}catch{return}}async function detectProjectIdentity(e,r={}){r.signal?.throwIfAborted();let i;try{i=await readFile(join(e,`.vercel`,`project.json`),`utf8`)}catch{return}let a;try{a=JSON.parse(i)}catch{return}let o=typeof a.projectId==`string`?a.projectId:void 0,s=typeof a.orgId==`string`?a.orgId:void 0;if(!o||!s)return;let[c,l]=await Promise.all([fetchVercelName(`/v9/projects/${o}?teamId=${s}`,s,e,r).then(e=>e??o),s.startsWith(`team_`)?fetchVercelName(`/v2/teams/${s}`,s,e,r):Promise.resolve(void 0)]);return r.signal?.throwIfAborted(),{projectName:c,teamName:l}}function projectResolutionFromDeployment(e){return e.state===`unlinked`||e.projectId===void 0?{kind:`unresolved`}:e.state===`deployed`&&e.productionUrl!==void 0?{kind:`deployed`,projectId:e.projectId,productionUrl:e.productionUrl}:{kind:`linked`,projectId:e.projectId}}async function detectProjectResolution(e,t={}){return projectResolutionFromDeployment(await detectDeployment(e,t))}function mergeProjectResolution(e,t){return t.kind===`unresolved`||e.kind===`deployed`&&e.projectId===t.projectId?e:t}function projectResolutionFromDeployResult(e,t){return e.kind===`unresolved`||!t.deployed||t.productionUrl===void 0?e:{kind:`deployed`,projectId:e.projectId,productionUrl:t.productionUrl}}function isProjectResolved(e){return e.kind!==`unresolved`}function projectProductionUrlFromResolution(e){return e.kind===`deployed`?e.productionUrl:void 0}export{detectDeployment,detectProjectIdentity,detectProjectResolution,isProjectResolved,mergeProjectResolution,projectProductionUrlFromResolution,projectResolutionFromDeployResult,projectResolutionFromDeployment};
@@ -1,3 +1,4 @@
1
+ import { type ChannelSetupAwaitChoice } from "#setup/cli/index.js";
1
2
  import { type RailSpinner } from "#setup/cli/index.js";
2
3
  /**
3
4
  * Clack constrains option values to readonly primitives. Our scaffold flow
@@ -9,14 +10,30 @@ export interface SelectOption<T extends PrompterValue> {
9
10
  value: T;
10
11
  label: string;
11
12
  hint?: string;
13
+ /** Short inline annotation shown dimmed only while the cursor is on this row. */
14
+ focusHint?: string;
12
15
  /**
13
16
  * Longer, display-only explanation shown dimmed alongside the option while it
14
17
  * is highlighted during navigation. Hidden once a choice is submitted.
15
18
  */
16
19
  description?: string;
20
+ /** Cursor-pointer/active-label accent; "warning" turns them yellow for an attention row. */
21
+ accent?: "warning";
17
22
  disabled?: boolean;
18
23
  /** Parenthetical shown after a disabled option's label explaining why. */
19
24
  disabledReason?: string;
25
+ /**
26
+ * "warning" renders the disabled reason in yellow with a dimmed (not struck)
27
+ * label: the row is unavailable here but actionable elsewhere (e.g. a channel
28
+ * that needs a Vercel account points at /model), unlike the default disabled
29
+ * styling, which marks a hard conflict.
30
+ */
31
+ disabledReasonTone?: "warning";
32
+ /**
33
+ * Completed work: renders with a check and remains cursor-addressable for
34
+ * contextual feedback, but cannot be selected or toggled.
35
+ */
36
+ completed?: boolean;
20
37
  /**
21
38
  * Marks a mandatory row that is always selected and cannot be toggled off; the
22
39
  * cursor skips it and it renders a dimmed check. Mutually exclusive with
@@ -39,7 +56,7 @@ export interface SelectOption<T extends PrompterValue> {
39
56
  * prints it to scrollback before the prompt.
40
57
  */
41
58
  export interface SelectNotice {
42
- tone: "success" | "info" | "warning";
59
+ tone: "success" | "info" | "warning" | "error";
43
60
  text: string;
44
61
  }
45
62
  /** Options common to every {@link Prompter.select} call. */
@@ -60,12 +77,14 @@ export interface SelectCommonOptions<T extends PrompterValue> {
60
77
  */
61
78
  required?: boolean;
62
79
  /**
63
- * "stacked" renders each option's hint on its own line below the label with
64
- * a blank line between options for small action menus whose hints carry
65
- * current values. A TUI-panel affordance: the CLI prompter keeps its inline
66
- * hint rendering.
80
+ * How option hints are laid out in the dev TUI panel (the CLI prompter ignores
81
+ * it and keeps its default inline, unnumbered rendering). "stacked" renders
82
+ * each hint on its own line below the label with a blank line between options —
83
+ * for small action menus whose hints carry current values. "inline" keeps hints
84
+ * on the label row, suppresses numeric shortcuts, and separates the trailing
85
+ * completion action (e.g. the `/channels` task list).
67
86
  */
68
- layout?: "stacked";
87
+ hintLayout?: "stacked" | "inline";
69
88
  /** Outcome lines from earlier laps of a looping menu. */
70
89
  notices?: readonly SelectNotice[];
71
90
  }
@@ -81,6 +100,24 @@ export interface MultiSelectOptions<T extends PrompterValue> extends SelectCommo
81
100
  /** Pre-mark these values as selected. */
82
101
  initialValues?: T[];
83
102
  }
103
+ /** Result of a single-select whose one row can be edited inline. */
104
+ export type EditableSelectResult<T extends PrompterValue> = {
105
+ kind: "selected";
106
+ value: T;
107
+ } | {
108
+ kind: "edited";
109
+ value: T;
110
+ text: string;
111
+ };
112
+ /** Inline-edit behavior for one row in an otherwise ordinary single-select. */
113
+ export interface EditableSelectOptions<T extends PrompterValue> extends SingleSelectOptions<T> {
114
+ editable: {
115
+ value: T;
116
+ defaultValue: string;
117
+ formatHint: (value: string) => string;
118
+ validate?: (value: string) => string | undefined;
119
+ };
120
+ }
84
121
  /** Color intent for {@link Prompter.note}: red warning (default) or green success. */
85
122
  export type NoteTone = "warning" | "success";
86
123
  /** Input for {@link Prompter.acknowledge}: a heading plus optional body lines. */
@@ -94,6 +131,13 @@ export interface Prompter {
94
131
  placeholder?: string;
95
132
  defaultValue?: string;
96
133
  validate?: (value: string) => string | undefined;
134
+ /**
135
+ * Context lines shown with the question (e.g. why it is being re-asked).
136
+ * They live and die with the question: the TUI paints them inside the
137
+ * question panel so they vanish on submit, the CLI prints them to
138
+ * scrollback above the prompt.
139
+ */
140
+ notices?: readonly SelectNotice[];
97
141
  }): Promise<string>;
98
142
  password(opts: {
99
143
  message: string;
@@ -108,6 +152,13 @@ export interface Prompter {
108
152
  */
109
153
  select<T extends PrompterValue>(opts: SingleSelectOptions<T>): Promise<T>;
110
154
  select<T extends PrompterValue>(opts: MultiSelectOptions<T>): Promise<T[]>;
155
+ /**
156
+ * TUI enhancement for a select row whose secondary value becomes an inline
157
+ * editor while focused. Typing and editing keys update it directly. Optional
158
+ * so non-repainting prompt implementations can keep the ordinary
159
+ * select-then-text fallback.
160
+ */
161
+ selectEditable?<T extends PrompterValue>(opts: EditableSelectOptions<T>): Promise<EditableSelectResult<T>>;
111
162
  /**
112
163
  * Static instructions the user dismisses before the flow moves on. The TUI
113
164
  * renders them in the question slot of the flow panel (the text takes the
@@ -116,6 +167,12 @@ export interface Prompter {
116
167
  * lightweight test fakes can omit it — flows fall back to {@link note}.
117
168
  */
118
169
  acknowledge?(opts: AcknowledgeOptions): Promise<void>;
170
+ /**
171
+ * Presents actions while a setup operation continues in the background.
172
+ * The TUI implements it; plain and headless prompters omit it, so callers
173
+ * fall back to waiting without concurrent controls.
174
+ */
175
+ awaitChoice?: ChannelSetupAwaitChoice;
119
176
  /**
120
177
  * Rail-attached notice, no bullet — reads as a follow-up to the previous
121
178
  * step. Red by default (warnings, collisions); pass `tone: "success"` for a
@@ -1 +1 @@
1
- import{__toESM}from"../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{h,ht,q}from"../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{WizardCancelledError}from"./step.js";import{initialQuitGuardState,quitHintNote,reduceQuitGuard}from"./quit-guard.js";import{cornerFor,createRailLog,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,runSelectComponent}from"#setup/cli/index.js";var import_picocolors=__toESM(require_picocolors(),1);function guardCancel(e){if(q(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,import_picocolors.default)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(h.aliases.delete(`escape`),!0)}function attachQuitGuard(e){let t=initialQuitGuardState;return e.on(`key`,(n,r)=>{let{state:i,action:a}=reduceQuitGuard(t,r?.name===`escape`?{type:`escape`}:{type:`other-key`});t=i,a===`quit`&&(e.state=`cancel`)}),{note:()=>quitHintNote(t,import_picocolors.default)}}function toPromptState(e){return e}function railForState(e){return railFor(toPromptState(e),import_picocolors.default)}function cornerForState(e){return cornerFor(toPromptState(e),import_picocolors.default)}function header(e,t,n){return formatPromptHeader(toPromptState(e),t,{colors:import_picocolors.default,leadingRail:n===0?`white`:`green`})}const REDACTED_DISPLAY=`••••••••`;function textPrompt(e,t){let n,i=new ht({validate:t.validate?e=>t.validate?.(e??``):void 0,placeholder:t.placeholder,defaultValue:t.defaultValue,render(){let r=header(this.state,t.message,e),i=t.placeholder?import_picocolors.default.inverse(t.placeholder[0])+import_picocolors.default.dim(t.placeholder.slice(1)):import_picocolors.default.inverse(import_picocolors.default.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=t.mask?a:this.value?this.userInputWithCursor:i;switch(this.state){case`error`:return`${r.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${import_picocolors.default.red(this.error)}\n`;case`submit`:{let n=t.mask?this.value?REDACTED_DISPLAY:t.placeholder||``:this.value||t.placeholder||``;return formatPromptSubmission(this.state,t.message,n,{colors:import_picocolors.default,leadingRail:e===0?`white`:`green`})}case`cancel`:return`${r}${railForState(this.state)} ${import_picocolors.default.strikethrough(import_picocolors.default.dim(t.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${r}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(n?.note())}\n`}}});return n=attachQuitGuard(i),i.prompt()}function cornerNote(e){return e?` ${e}`:``}function createPrompter(){disableEscapeCancel();let e=0,t=createRailLog({colors:import_picocolors.default,output:process.stdout});return{async text(n){t.settle();let r=guardCancel(await textPrompt(e,n));return e+=1,r??``},async password(n){t.settle();let r=guardCancel(await textPrompt(e,{message:n.message,mask:!0,validate:n.validate}));return e+=1,r??``},async select(n){t.settle();for(let e of n.notices??[])e.tone===`success`?t.success(e.text):e.tone===`warning`?t.warning(e.text):t.message(e.text);let r=guardCancel(await runSelectComponent({message:n.message,options:n.options,multiple:n.multiple===!0,search:n.search??!1,required:n.required??!1,placeholder:n.placeholder,defaultValue:n.multiple===!0?void 0:n.initialValue,initialValues:n.multiple===!0?n.initialValues:void 0,leadingRail:e===0?`white`:`green`,attachGuard:e=>attachQuitGuard(e)}));return e+=1,r},async acknowledge(e){t.settle(),process.stdout.write(formatRailLine(import_picocolors.default.bold(e.message),import_picocolors.default,process.stdout));for(let t of e.lines??[])process.stdout.write(formatRailLine(import_picocolors.default.dim(t),import_picocolors.default,process.stdout))},note(e,n,r){t.settle();let i=r?.tone===`success`?import_picocolors.default.green:import_picocolors.default.red;n&&process.stdout.write(formatRailLine(i(import_picocolors.default.bold(n)),import_picocolors.default,process.stdout)),process.stdout.write(formatRailLine(i(e),import_picocolors.default,process.stdout))},intro(e,n=`Production-grade agent framework.`){t.settle(),process.stdout.write(formatPromptOpener(e,n,import_picocolors.default))},outro(e){t.settle(),process.stdout.write(formatPromptOutro(e,import_picocolors.default))},log:t}}export{createPrompter};
1
+ import{__toESM}from"../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{WizardCancelledError}from"./step.js";import{h,ht,q}from"../node_modules/.pnpm/@clack_core@1.3.1/node_modules/@clack/core/dist/index.js";import{initialQuitGuardState,quitHintNote,reduceQuitGuard}from"./quit-guard.js";import{cornerFor,createRailLog,formatPromptCancellation,formatPromptHeader,formatPromptOpener,formatPromptOutro,formatPromptSubmission,formatRailLine,railFor,runSelectComponent}from"#setup/cli/index.js";var import_picocolors=__toESM(require_picocolors(),1);function guardCancel(e){if(q(e))throw process.stdout.write(formatPromptCancellation(`Setup cancelled.`,import_picocolors.default)),new WizardCancelledError;return e}let escapeCancelDisabled=!1;function disableEscapeCancel(){escapeCancelDisabled||=(h.aliases.delete(`escape`),!0)}function attachQuitGuard(e){let t=initialQuitGuardState;return e.on(`key`,(n,r)=>{let{state:i,action:a}=reduceQuitGuard(t,r?.name===`escape`?{type:`escape`}:{type:`other-key`});t=i,a===`quit`&&(e.state=`cancel`)}),{note:()=>quitHintNote(t,import_picocolors.default)}}function toPromptState(e){return e}function railForState(e){return railFor(toPromptState(e),import_picocolors.default)}function cornerForState(e){return cornerFor(toPromptState(e),import_picocolors.default)}function header(e,t,n){return formatPromptHeader(toPromptState(e),t,{colors:import_picocolors.default,leadingRail:n===0?`white`:`green`})}const REDACTED_DISPLAY=`••••••••`;function textPrompt(e,t){let n,r=new ht({validate:t.validate?e=>t.validate?.(e??``):void 0,placeholder:t.placeholder,defaultValue:t.defaultValue,render(){let r=header(this.state,t.message,e),i=t.placeholder?import_picocolors.default.inverse(t.placeholder[0])+import_picocolors.default.dim(t.placeholder.slice(1)):import_picocolors.default.inverse(import_picocolors.default.hidden(`_`)),a=this.value?`•`.repeat(this.value.length):i,o=i;switch(t.mask?o=a:this.value&&(o=this.userInputWithCursor),this.state){case`error`:return`${r.trim()}\n${railForState(this.state)} ${o}\n${cornerForState(this.state)} ${import_picocolors.default.red(this.error)}\n`;case`submit`:{let n=this.value||t.placeholder||``;return t.mask&&(n=this.value?REDACTED_DISPLAY:t.placeholder??``),formatPromptSubmission(this.state,t.message,n,{colors:import_picocolors.default,leadingRail:e===0?`white`:`green`})}case`cancel`:return`${r}${railForState(this.state)} ${import_picocolors.default.strikethrough(import_picocolors.default.dim(t.mask&&this.value?REDACTED_DISPLAY:this.value??``))}${this.value?.trim()?`\n${railForState(this.state)}`:``}`;default:return`${r}${railForState(this.state)} ${o}\n${cornerForState(this.state)}${cornerNote(n?.note())}\n`}}});return n=attachQuitGuard(r),r.prompt()}function cornerNote(e){return e?` ${e}`:``}function createPrompter(){disableEscapeCancel();let e=0,t=createRailLog({colors:import_picocolors.default,output:process.stdout});function printNotices(e){for(let n of e??[])n.tone===`success`?t.success(n.text):n.tone===`warning`?t.warning(n.text):n.tone===`error`?t.error(n.text):t.message(n.text)}return{async text(n){t.settle(),printNotices(n.notices);let r=guardCancel(await textPrompt(e,n));return e+=1,r??``},async password(n){t.settle();let r=guardCancel(await textPrompt(e,{message:n.message,mask:!0,validate:n.validate}));return e+=1,r??``},async select(n){t.settle(),printNotices(n.notices);let r=guardCancel(await runSelectComponent({message:n.message,options:n.options,multiple:n.multiple===!0,search:n.search??!1,required:n.required??!1,placeholder:n.placeholder,defaultValue:n.multiple===!0?void 0:n.initialValue,initialValues:n.multiple===!0?n.initialValues:void 0,leadingRail:e===0?`white`:`green`,attachGuard:e=>attachQuitGuard(e)}));return e+=1,r},async acknowledge(e){t.settle(),process.stdout.write(formatRailLine(import_picocolors.default.bold(e.message),import_picocolors.default,process.stdout));for(let t of e.lines??[])process.stdout.write(formatRailLine(import_picocolors.default.dim(t),import_picocolors.default,process.stdout))},note(e,n,r){t.settle();let i=r?.tone===`success`?import_picocolors.default.green:import_picocolors.default.red;n&&process.stdout.write(formatRailLine(i(import_picocolors.default.bold(n)),import_picocolors.default,process.stdout)),process.stdout.write(formatRailLine(i(e),import_picocolors.default,process.stdout))},intro(e,n=`Production-grade agent framework.`){t.settle(),process.stdout.write(formatPromptOpener(e,n,import_picocolors.default))},outro(e){t.settle(),process.stdout.write(formatPromptOutro(e,import_picocolors.default))},log:t}}export{createPrompter};
@@ -6,5 +6,5 @@ type VercelOutputHandler = NonNullable<RunVercelOptions["onOutput"]>;
6
6
  * AI Gateway model calls. Safe to call repeatedly; Vercel CLI no-ops if
7
7
  * the env is already fresh.
8
8
  */
9
- export declare function runVercelEnvPull(projectRoot: string, onOutput?: VercelOutputHandler): Promise<boolean>;
9
+ export declare function runVercelEnvPull(projectRoot: string, onOutput?: VercelOutputHandler, signal?: AbortSignal): Promise<boolean>;
10
10
  export {};
@@ -1 +1 @@
1
- import{runVercel}from"#setup/primitives/index.js";async function runVercelEnvPull(e,t){return runVercel([`env`,`pull`,`--yes`],{cwd:e,onOutput:t})}export{runVercelEnvPull};
1
+ import{runVercel}from"#setup/primitives/index.js";async function runVercelEnvPull(e,t,n){return runVercel([`env`,`pull`,`--yes`],{cwd:e,onOutput:t,signal:n})}export{runVercelEnvPull};
@@ -32,6 +32,8 @@ export interface RunnerOptions<State> {
32
32
  * Defaults to the raw state.
33
33
  */
34
34
  snapshot?: (state: State) => State;
35
+ /** Cancels the active gather/perform operation and prevents later boxes from starting. */
36
+ signal?: AbortSignal;
35
37
  }
36
38
  /**
37
39
  * Linear interactive runner: walk the boxes in order, prompting for each. A box
@@ -1 +1 @@
1
- import{WizardCancelledError}from"./step.js";function isCancellation(t){return t instanceof WizardCancelledError}var RetryableSetupError=class extends Error{constructor(e,t){super(e,t),this.name=`RetryableSetupError`}};function isRetryable(e){return e instanceof RetryableSetupError}async function runInteractive(e,t,n,r){let i=t,view=()=>r?.snapshot?r.snapshot(i):i,a={};try{for(let t of e)if(t.shouldRun?.(view())!==!1)for(;;){let e=await t.gather({state:view(),initial:a[t.id]});a[t.id]=e;try{let r=await t.perform({state:view(),input:e,sink:n});i=t.apply(i,r);break}catch(e){if(!isRetryable(e))throw e;n.write(e instanceof Error?e.message:String(e))}}}catch(e){if(isCancellation(e))return{kind:`cancelled`};throw e}return{kind:`done`,state:i}}async function runHeadless(e,t,n,r){let i=t,view=()=>r?.snapshot?r.snapshot(i):i;for(let t of e){if(t.shouldRun?.(view())===!1)continue;let e=await t.gather({state:view()}),r=await t.perform({state:view(),input:e,sink:n});i=t.apply(i,r)}return i}export{RetryableSetupError,runHeadless,runInteractive};
1
+ import{WizardCancelledError}from"./step.js";function isCancellation(t,n){return t instanceof WizardCancelledError||n?.aborted===!0}var RetryableSetupError=class extends Error{constructor(e,t){super(e,t),this.name=`RetryableSetupError`}};function isRetryable(e){return e instanceof RetryableSetupError}async function runInteractive(e,t,n,r){let i=t,view=()=>r?.snapshot?r.snapshot(i):i,a={};try{for(let t of e)if(r?.signal?.throwIfAborted(),t.shouldRun?.(view())!==!1)for(;;){let e=await t.gather({state:view(),initial:a[t.id],signal:r?.signal});r?.signal?.throwIfAborted(),a[t.id]=e;try{let a=await t.perform({state:view(),input:e,sink:n,signal:r?.signal});r?.signal?.throwIfAborted(),i=t.apply(i,a);break}catch(e){if(!isRetryable(e))throw e;n.write(e instanceof Error?e.message:String(e))}}}catch(e){if(isCancellation(e,r?.signal))return{kind:`cancelled`};throw e}return{kind:`done`,state:i}}async function runHeadless(e,t,n,r){let i=t,view=()=>r?.snapshot?r.snapshot(i):i;for(let t of e){if(r?.signal?.throwIfAborted(),t.shouldRun?.(view())===!1)continue;let e=await t.gather({state:view(),signal:r?.signal});r?.signal?.throwIfAborted();let a=await t.perform({state:view(),input:e,sink:n,signal:r?.signal});r?.signal?.throwIfAborted(),i=t.apply(i,a)}return i}export{RetryableSetupError,runHeadless,runInteractive};
@@ -20,6 +20,8 @@ export interface ScaffoldableChannel {
20
20
  label: string;
21
21
  /** Optional picker hint. */
22
22
  hint?: string;
23
+ /** The add sub-flow provisions against the linked Vercel project. */
24
+ requiresVercelProject?: true;
23
25
  }
24
26
  /**
25
27
  * Channels the CLI can scaffold, in picker order. Derived from
@@ -1 +1 @@
1
- import{channelEntries}from"../../packages/eve-catalog/src/index.js";const CHANNEL_SCAFFOLDS=[{slug:`eve`,kind:`web`,label:`Web Chat`,hint:`Next.js app`},{slug:`slack`,kind:`slack`,label:`Slack`,hint:`creates slackbot and deploys to Vercel`}];function buildScaffoldableChannels(){let n=new Set(channelEntries().filter(e=>e.surfaces.scaffoldable).map(e=>e.slug)),r=[];for(let e of CHANNEL_SCAFFOLDS){if(!n.delete(e.slug))throw Error(`Channel overlay "${e.slug}" is not a scaffoldable channel in @vercel/eve-catalog.`);let t={slug:e.slug,kind:e.kind,label:e.label};e.hint!==void 0&&(t.hint=e.hint),r.push(t)}if(n.size>0){let e=[...n].sort().join(`, `);throw Error(`Scaffoldable catalog channels missing a scaffolder overlay: ${e}.`)}return r}const SCAFFOLDABLE_CHANNELS=buildScaffoldableChannels();export{SCAFFOLDABLE_CHANNELS};
1
+ import{channelEntries}from"../../packages/eve-catalog/src/index.js";const CHANNEL_SCAFFOLDS=[{slug:`eve`,kind:`web`,label:`Web Chat`,hint:`Next.js app`},{slug:`slack`,kind:`slack`,label:`Slack`,hint:`Creates slackbot and deploys to Vercel`,requiresVercelProject:!0}];function buildScaffoldableChannels(){let n=new Set(channelEntries().filter(e=>e.surfaces.scaffoldable).map(e=>e.slug)),r=[];for(let e of CHANNEL_SCAFFOLDS){if(!n.delete(e.slug))throw Error(`Channel overlay "${e.slug}" is not a scaffoldable channel in @vercel/eve-catalog.`);let t={slug:e.slug,kind:e.kind,label:e.label};e.hint!==void 0&&(t.hint=e.hint),e.requiresVercelProject!==void 0&&(t.requiresVercelProject=e.requiresVercelProject),r.push(t)}if(n.size>0){let e=[...n].sort().join(`, `);throw Error(`Scaffoldable catalog channels missing a scaffolder overlay: ${e}.`)}return r}const SCAFFOLDABLE_CHANNELS=buildScaffoldableChannels();export{SCAFFOLDABLE_CHANNELS};
@@ -9,6 +9,7 @@ export interface AddAgentToProjectOptions {
9
9
  packageManager?: PackageManagerKind;
10
10
  evePackageVersion?: string;
11
11
  aiPackageVersion?: string;
12
+ connectPackageVersion?: string;
12
13
  zodPackageVersion?: string;
13
14
  }
14
15
  export interface AddAgentToProjectResult {
@@ -1 +1 @@
1
- import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{patchPackageJson}from"../update/package-json.js";import{resolveVersionToken}from"../version-tokens.js";import{agentTemplateFiles,formatEveDependencySpecifier}from"./project.js";import{join}from"node:path";import{readFile}from"node:fs/promises";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(i){let a=join(i.projectRoot,`package.json`);if(!await pathExists(a))throw Error(`Cannot add an Eve agent to "${i.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let o=agentTemplateFiles(i.model),s=[];for(let e of Object.keys(o))await pathExists(join(i.projectRoot,e))&&s.push(e);if(s.length===0&&await pathExists(join(i.projectRoot,`agent`))&&s.push(`agent/`),s.length>0)throw Error(`Cannot add an Eve agent to "${i.projectRoot}" because it already has: ${s.join(`, `)}. Move them aside first.`);let c=resolveVersionToken(`evePackageVersion`,i.evePackageVersion??`0.7.3`),l=resolveVersionToken(`aiPackageVersion`,i.aiPackageVersion??`7.0.0-canary.171`),u=resolveVersionToken(`zodPackageVersion`,i.zodPackageVersion??`4.4.3`),d=[];for(let[e,t]of Object.entries(o)){let r=join(i.projectRoot,e);await writeTextFile(r,t),d.push(r)}let f=JSON.parse(await readFile(a,`utf8`)),p={ai:l,eve:formatEveDependencySpecifier(c),zod:u},m={};for(let[e,t]of Object.entries(p))hasDeclaredDependency(f,e)||(m[e]=t);return Object.keys(m).length>0&&await patchPackageJson(a,{dependencies:m}),await getPackageManagerStrategy(i.packageManager??`pnpm`).applyProjectConfiguration(i.projectRoot),{filesWritten:d,dependenciesAdded:Object.keys(m).sort()}}export{addAgentToProject};
1
+ import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{patchPackageJson}from"../update/package-json.js";import{resolveVersionToken}from"../version-tokens.js";import{agentTemplateFiles,formatEveDependencySpecifier}from"./project.js";import{join}from"node:path";import{readFile}from"node:fs/promises";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(i){let a=join(i.projectRoot,`package.json`);if(!await pathExists(a))throw Error(`Cannot add an Eve agent to "${i.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let o=agentTemplateFiles(i.model),s=[];for(let e of Object.keys(o))await pathExists(join(i.projectRoot,e))&&s.push(e);if(s.length===0&&await pathExists(join(i.projectRoot,`agent`))&&s.push(`agent/`),s.length>0)throw Error(`Cannot add an Eve agent to "${i.projectRoot}" because it already has: ${s.join(`, `)}. Move them aside first.`);let c=resolveVersionToken(`evePackageVersion`,i.evePackageVersion??`0.8.0`),l=resolveVersionToken(`aiPackageVersion`,i.aiPackageVersion??`7.0.0-canary.171`),u=resolveVersionToken(`connectPackageVersion`,i.connectPackageVersion??`0.2.2`),d=resolveVersionToken(`zodPackageVersion`,i.zodPackageVersion??`4.4.3`),f=[];for(let[e,t]of Object.entries(o)){let r=join(i.projectRoot,e);await writeTextFile(r,t),f.push(r)}let p=JSON.parse(await readFile(a,`utf8`)),m={"@vercel/connect":u,ai:l,eve:formatEveDependencySpecifier(c),zod:d},h={};for(let[e,t]of Object.entries(m))hasDeclaredDependency(p,e)||(h[e]=t);return Object.keys(h).length>0&&await patchPackageJson(a,{dependencies:h}),await getPackageManagerStrategy(i.packageManager??`pnpm`).applyProjectConfiguration(i.projectRoot),{filesWritten:f,dependenciesAdded:Object.keys(h).sort()}}export{addAgentToProject};
@@ -2,6 +2,7 @@ import type { PackageManagerKind } from "../../package-manager.js";
2
2
  export declare const CURRENT_DIRECTORY_PROJECT_NAME = ".";
3
3
  export declare const DEFAULT_EVE_PACKAGE_VERSION = "__EVE_PACKAGE_VERSION__";
4
4
  export declare const DEFAULT_AI_PACKAGE_VERSION = "__AI_SDK_VERSION__";
5
+ export declare const DEFAULT_CONNECT_PACKAGE_VERSION = "__VERCEL_CONNECT_VERSION__";
5
6
  export declare const DEFAULT_ZOD_PACKAGE_VERSION = "__ZOD_VERSION__";
6
7
  /**
7
8
  * Provider slug a gateway model id routes through: the segment before the
@@ -40,6 +41,7 @@ export interface ScaffoldBaseProjectOptions {
40
41
  onOverwriteFile?: (filePath: string) => void | Promise<void>;
41
42
  evePackageVersion?: string;
42
43
  aiPackageVersion?: string;
44
+ connectPackageVersion?: string;
43
45
  zodPackageVersion?: string;
44
46
  tsgoPackageVersion?: string;
45
47
  typesNodePackageVersion?: string;
@@ -1,4 +1,4 @@
1
- import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_EVE_PACKAGE_VERSION=`0.7.3`,DEFAULT_AI_PACKAGE_VERSION=`7.0.0-canary.171`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`;function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.evePackageVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TSGO_VERSION__`,t.tsgoPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.typesNodePackageVersion)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_EVE_PACKAGE_VERSION=`0.8.0`,DEFAULT_AI_PACKAGE_VERSION=`7.0.0-canary.171`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.2.2`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`;function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.evePackageVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TSGO_VERSION__`,t.tsgoPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.typesNodePackageVersion)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -18,6 +18,7 @@ export default defineAgent({
18
18
  "typecheck": "tsgo"
19
19
  },
20
20
  "dependencies": {
21
+ "@vercel/connect": "__EVE_INIT_CONNECT_VERSION__",
21
22
  "ai": "__EVE_INIT_AI_SDK_VERSION__",
22
23
  "eve": "__EVE_INIT_PACKAGE_VERSION__",
23
24
  "zod": "__EVE_INIT_ZOD_VERSION__"
@@ -54,14 +55,16 @@ dist
54
55
  .DS_Store
55
56
  *.tsbuildinfo
56
57
  `,".vercelignore":`node_modules
58
+ .env*
57
59
  .eve
60
+ .workflow-data
58
61
  .next
59
62
  .output
60
63
  .nitro
61
64
  dist
62
65
  `,"AGENTS.md":`# Eve Agent App
63
66
 
64
- This project uses the Eve framework. Before writing code, always read the relevant guide in \`node_modules/eve/dist/docs/public/\`.
67
+ This project uses the Eve framework. Before writing code, always read the relevant guide in \`node_modules/eve/docs/\`.
65
68
  `,"CLAUDE.md":`@AGENTS.md
66
69
  `};function templateFiles(t,n){return{"agent/agent.ts":t?`import { defineAgent } from "eve";
67
70
 
@@ -77,4 +80,4 @@ export default defineAgent({
77
80
  },
78
81
  },
79
82
  });
80
- `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate(t),...getPackageManagerStrategy(n).scaffoldFiles}}async function assertCanCreateInPlace(e,n){if(!await pathExists(e))return;let r=(await readdir(e)).filter(e=>!ALLOWED_CREATE_IN_PLACE_ENTRIES.has(e));if(r.length>0&&!n){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(e){let i=resolve(e.targetDirectory??process.cwd(),e.projectName),a=e.projectName===`.`,s=e.overwriteExisting??!1,u=e.byokProvider??!1,d=e.packageManager??`pnpm`;if(a)await assertCanCreateInPlace(i,s);else if(await pathExists(i))throw Error(`Cannot create project because "${i}" already exists.`);let f=e.typesNodePackageVersion??`25.9.1`,p={appName:basename(i),model:e.model,evePackageVersion:resolveVersionToken(`evePackageVersion`,e.evePackageVersion??`0.7.3`),aiPackageVersion:resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`7.0.0-canary.171`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.4.3`),tsgoPackageVersion:resolveVersionToken(`tsgoPackageVersion`,e.tsgoPackageVersion??`7.0.0-dev.20260523.1`),typesNodePackageVersion:u?resolveVersionToken(`typesNodePackageVersion`,f):f};await mkdir(i,{recursive:!0});for(let[r,o]of Object.entries(templateFiles(u,d))){let c=`${i}/${r}`,l=await pathExists(c);await writeTextFile(c,renderTemplate(o,p),{force:a&&s}),l&&await e.onOverwriteFile?.(c)}return i}async function isEveProject(e){for(let t of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${t}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_VERSION,DEFAULT_ZOD_PACKAGE_VERSION,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,scaffoldBaseProject};
83
+ `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate(t),...getPackageManagerStrategy(n).scaffoldFiles}}async function assertCanCreateInPlace(e,n){if(!await pathExists(e))return;let r=(await readdir(e)).filter(e=>!ALLOWED_CREATE_IN_PLACE_ENTRIES.has(e));if(r.length>0&&!n){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(e){let i=resolve(e.targetDirectory??process.cwd(),e.projectName),a=e.projectName===`.`,s=e.overwriteExisting??!1,u=e.byokProvider??!1,d=e.packageManager??`pnpm`;if(a)await assertCanCreateInPlace(i,s);else if(await pathExists(i))throw Error(`Cannot create project because "${i}" already exists.`);let f=e.typesNodePackageVersion??`25.9.1`,p={appName:basename(i),model:e.model,evePackageVersion:resolveVersionToken(`evePackageVersion`,e.evePackageVersion??`0.8.0`),aiPackageVersion:resolveVersionToken(`aiPackageVersion`,e.aiPackageVersion??`7.0.0-canary.171`),connectPackageVersion:resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`0.2.2`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,e.zodPackageVersion??`4.4.3`),tsgoPackageVersion:resolveVersionToken(`tsgoPackageVersion`,e.tsgoPackageVersion??`7.0.0-dev.20260523.1`),typesNodePackageVersion:u?resolveVersionToken(`typesNodePackageVersion`,f):f};await mkdir(i,{recursive:!0});for(let[r,o]of Object.entries(templateFiles(u,d))){let c=`${i}/${r}`,l=await pathExists(c);await writeTextFile(c,renderTemplate(o,p),{force:a&&s}),l&&await e.onOverwriteFile?.(c)}return i}async function isEveProject(e){for(let t of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${t}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_CONNECT_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_VERSION,DEFAULT_ZOD_PACKAGE_VERSION,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,scaffoldBaseProject};
@@ -67,6 +67,8 @@ export interface EnsureChannelOptions {
67
67
  /** Manager that owns generated project configuration. Defaults to pnpm. */
68
68
  packageManager?: PackageManagerKind;
69
69
  force?: boolean;
70
+ /** Exact UID returned by Vercel Connect; takes precedence over the derived slug. */
71
+ slackConnectorUid?: string;
70
72
  slackConnectorSlug?: SlackConnectorSlug;
71
73
  connectPackageVersion?: string;
72
74
  webPackageVersions?: WebPackageVersions;
@@ -1,7 +1,7 @@
1
- import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{patchPackageJson}from"./package-json.js";import{resolveVersionToken}from"../version-tokens.js";import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{WEB_APP_TEMPLATE_FILES,WEB_APP_TEMPLATE_PACKAGE_JSON}from"../create/web-template.js";import"../create/project.js";import{basename,join,resolve}from"node:path";import{readFile,readdir,writeFile}from"node:fs/promises";const SLACK_CHANNEL_DEFAULT_ROUTE=`/eve/v1/slack`,DEFAULT_SLACK_CONNECTOR_SLUG=`my-agent`,PACKAGE_DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`],WEB_NEXT_CONFIG_PATH=`next.config.ts`,WEB_VERCEL_JSON_PATH=`vercel.json`,WEB_VERCEL_JSON_SCHEMA=`https://openapi.vercel.sh/vercel.json`,WEB_COMPETING_NEXT_CONFIG_PATHS=[`next.config.js`,`next.config.mjs`,WEB_NEXT_CONFIG_PATH,`next.config.mts`].filter(e=>e!==WEB_NEXT_CONFIG_PATH),WEB_DEFAULT_VERCEL_SERVICES={web:{entrypoint:`.`,framework:`nextjs`,routePrefix:`/`},eve:{buildCommand:`eve build`,entrypoint:`.`,framework:`eve`,routePrefix:`/_eve_internal/eve`}};function toSlackConnectorSlug(e){return e}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function readDependencyVersion(e,t){let n=JSON.parse(await readFile(e,`utf8`));if(!isJsonObject(n)||!isJsonObject(n.dependencies))return;let r=n.dependencies[t];return typeof r==`string`?r:void 0}function packageJsonHasDependency(e,t){for(let n of PACKAGE_DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function hasPackageDependency(e,n){if(!await pathExists(e))return!1;let r=JSON.parse(await readFile(e,`utf8`));return isJsonObject(r)&&packageJsonHasDependency(r,n)}async function isNextJsProject(e){return hasPackageDependency(join(e,`package.json`),`next`)}async function ensurePackageDependency(e,n,i){return!await pathExists(e)||await readDependencyVersion(e,n)===i?[]:(await patchPackageJson(e,{dependencies:{[n]:i}}),[{path:e,dependencies:[n],devDependencies:[],scripts:[]}])}function resolveWebPackageVersions(e){return{evePackageVersion:e?.evePackageVersion??`0.7.3`,aiPackageVersion:e?.aiPackageVersion??`7.0.0-canary.171`,nextPackageVersion:e?.nextPackageVersion??`16.2.6`,reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.4.3`,tsgoPackageVersion:e?.tsgoPackageVersion??`7.0.0-dev.20260523.1`,typesNodePackageVersion:e?.typesNodePackageVersion??`25.9.1`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}async function patchWebPackageJson(e,n){if(!await pathExists(e))return[];let a={...WEB_APP_TEMPLATE_PACKAGE_JSON.dependencies,ai:resolveVersionToken(`aiPackageVersion`,n.aiPackageVersion),eve:formatEveDependencySpecifier(resolveVersionToken(`evePackageVersion`,n.evePackageVersion)),next:resolveVersionToken(`nextPackageVersion`,n.nextPackageVersion),react:resolveVersionToken(`reactPackageVersion`,n.reactPackageVersion),"react-dom":resolveVersionToken(`reactDomPackageVersion`,n.reactDomPackageVersion),streamdown:resolveVersionToken(`streamdownPackageVersion`,n.streamdownPackageVersion),zod:resolveVersionToken(`zodPackageVersion`,n.zodPackageVersion)},o={...WEB_APP_TEMPLATE_PACKAGE_JSON.devDependencies,"@types/node":resolveVersionToken(`typesNodePackageVersion`,n.typesNodePackageVersion),"@types/react":resolveVersionToken(`typesReactPackageVersion`,n.typesReactPackageVersion),"@types/react-dom":resolveVersionToken(`typesReactDomPackageVersion`,n.typesReactDomPackageVersion),"@typescript/native-preview":resolveVersionToken(`tsgoPackageVersion`,n.tsgoPackageVersion)},s=WEB_APP_TEMPLATE_PACKAGE_JSON.scripts;return await patchPackageJson(e,{dependencies:a,devDependencies:o,scripts:s}),[{path:e,dependencies:Object.keys(a),devDependencies:Object.keys(o),scripts:Object.keys(s)}]}function normalizeSlackConnectorSlug(e){return toSlackConnectorSlug((e.trim().replace(/^@/,``).split(`/`).at(-1)??``).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`).replace(/^[^a-z0-9]+/,``).replace(/[^a-z0-9]+$/,``).slice(0,100).replace(/[^a-z0-9]+$/,``)||`my-agent`)}async function deriveSlackConnectorSlug(e,t){if(t!==void 0&&t.length>0&&t!==`.`)return normalizeSlackConnectorSlug(t);try{let t=await readFile(join(e,`package.json`),`utf8`),n=JSON.parse(t);if(typeof n.name==`string`&&n.name.length>0)return normalizeSlackConnectorSlug(n.name)}catch{}return normalizeSlackConnectorSlug(basename(resolve(e))||`my-agent`)}function buildSlackTemplate(e){return`import { connectSlackCredentials } from "@vercel/connect/eve";
1
+ import{getPackageManagerStrategy}from"../../primitives/pm/index.js";import{pathExists,writeTextFile}from"../files.js";import{patchPackageJson}from"./package-json.js";import{resolveVersionToken}from"../version-tokens.js";import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{WEB_APP_TEMPLATE_FILES,WEB_APP_TEMPLATE_PACKAGE_JSON}from"../create/web-template.js";import"../create/project.js";import{basename,join,resolve}from"node:path";import{readFile,readdir,writeFile}from"node:fs/promises";const SLACK_CHANNEL_DEFAULT_ROUTE=`/eve/v1/slack`,DEFAULT_SLACK_CONNECTOR_SLUG=`my-agent`,PACKAGE_DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`peerDependencies`,`optionalDependencies`],WEB_NEXT_CONFIG_PATH=`next.config.ts`,WEB_VERCEL_JSON_PATH=`vercel.json`,WEB_VERCEL_JSON_SCHEMA=`https://openapi.vercel.sh/vercel.json`,WEB_COMPETING_NEXT_CONFIG_PATHS=[`next.config.js`,`next.config.mjs`,WEB_NEXT_CONFIG_PATH,`next.config.mts`].filter(e=>e!==WEB_NEXT_CONFIG_PATH),WEB_DEFAULT_VERCEL_SERVICES={web:{entrypoint:`.`,framework:`nextjs`,routePrefix:`/`},eve:{buildCommand:`eve build`,entrypoint:`.`,framework:`eve`,routePrefix:`/_eve_internal/eve`}};function toSlackConnectorSlug(e){return e}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function readDependencyVersion(e,t){let n=JSON.parse(await readFile(e,`utf8`));if(!isJsonObject(n)||!isJsonObject(n.dependencies))return;let r=n.dependencies[t];return typeof r==`string`?r:void 0}function packageJsonHasDependency(e,t){for(let n of PACKAGE_DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function hasPackageDependency(e,n){if(!await pathExists(e))return!1;let r=JSON.parse(await readFile(e,`utf8`));return isJsonObject(r)&&packageJsonHasDependency(r,n)}async function isNextJsProject(e){return hasPackageDependency(join(e,`package.json`),`next`)}async function ensurePackageDependency(e,n,i){return!await pathExists(e)||await readDependencyVersion(e,n)===i?[]:(await patchPackageJson(e,{dependencies:{[n]:i}}),[{path:e,dependencies:[n],devDependencies:[],scripts:[]}])}function resolveWebPackageVersions(e){return{evePackageVersion:e?.evePackageVersion??`0.8.0`,aiPackageVersion:e?.aiPackageVersion??`7.0.0-canary.171`,nextPackageVersion:e?.nextPackageVersion??`16.2.6`,reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.4.3`,tsgoPackageVersion:e?.tsgoPackageVersion??`7.0.0-dev.20260523.1`,typesNodePackageVersion:e?.typesNodePackageVersion??`25.9.1`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}async function patchWebPackageJson(e,n){if(!await pathExists(e))return[];let a={...WEB_APP_TEMPLATE_PACKAGE_JSON.dependencies,ai:resolveVersionToken(`aiPackageVersion`,n.aiPackageVersion),eve:formatEveDependencySpecifier(resolveVersionToken(`evePackageVersion`,n.evePackageVersion)),next:resolveVersionToken(`nextPackageVersion`,n.nextPackageVersion),react:resolveVersionToken(`reactPackageVersion`,n.reactPackageVersion),"react-dom":resolveVersionToken(`reactDomPackageVersion`,n.reactDomPackageVersion),streamdown:resolveVersionToken(`streamdownPackageVersion`,n.streamdownPackageVersion),zod:resolveVersionToken(`zodPackageVersion`,n.zodPackageVersion)},o={...WEB_APP_TEMPLATE_PACKAGE_JSON.devDependencies,"@types/node":resolveVersionToken(`typesNodePackageVersion`,n.typesNodePackageVersion),"@types/react":resolveVersionToken(`typesReactPackageVersion`,n.typesReactPackageVersion),"@types/react-dom":resolveVersionToken(`typesReactDomPackageVersion`,n.typesReactDomPackageVersion),"@typescript/native-preview":resolveVersionToken(`tsgoPackageVersion`,n.tsgoPackageVersion)},s=WEB_APP_TEMPLATE_PACKAGE_JSON.scripts;return await patchPackageJson(e,{dependencies:a,devDependencies:o,scripts:s}),[{path:e,dependencies:Object.keys(a),devDependencies:Object.keys(o),scripts:Object.keys(s)}]}function normalizeSlackConnectorSlug(e){return toSlackConnectorSlug((e.trim().replace(/^@/,``).split(`/`).at(-1)??``).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`).replace(/^[^a-z0-9]+/,``).replace(/[^a-z0-9]+$/,``).slice(0,100).replace(/[^a-z0-9]+$/,``)||`my-agent`)}async function deriveSlackConnectorSlug(e,t){if(t!==void 0&&t.length>0&&t!==`.`)return normalizeSlackConnectorSlug(t);try{let t=await readFile(join(e,`package.json`),`utf8`),n=JSON.parse(t);if(typeof n.name==`string`&&n.name.length>0)return normalizeSlackConnectorSlug(n.name)}catch{}return normalizeSlackConnectorSlug(basename(resolve(e))||`my-agent`)}function buildSlackTemplate(e){if(!e.startsWith(`slack/`)||e.length===6)throw Error(`Invalid Slack connector UID "${e}".`);return`import { connectSlackCredentials } from "@vercel/connect/eve";
2
2
  import { slackChannel } from "eve/channels/slack";
3
3
 
4
4
  export default slackChannel({
5
- credentials: connectSlackCredentials("slack/${e}"),
5
+ credentials: connectSlackCredentials(${JSON.stringify(e)}),
6
6
  });
7
- `}function renderWebAppTemplate(e,t,n){let r=n?``:`, { configureVercelOutput: false }`;return e.replaceAll(`__EVE_INIT_APP_NAME__`,t).replaceAll(`__EVE_INIT_WITH_EVE_OPTIONS__`,r)}function withWebVercelServices(e){let t=JSON.parse(e);if(!isJsonObject(t))throw Error(`${WEB_VERCEL_JSON_PATH} must contain a JSON object.`);let n=t.experimentalServices;if(n!==void 0&&!isJsonObject(n))throw Error(`${WEB_VERCEL_JSON_PATH} experimentalServices must contain a JSON object.`);let r={...t,$schema:typeof t.$schema==`string`?t.$schema:WEB_VERCEL_JSON_SCHEMA,experimentalServices:{...n,web:n?.web??WEB_DEFAULT_VERCEL_SERVICES.web,eve:n?.eve??WEB_DEFAULT_VERCEL_SERVICES.eve}};return JSON.stringify(t)===JSON.stringify(r)?e:`${JSON.stringify(r,null,2)}\n`}async function ensureWebVercelServices(e){if(!await pathExists(e))return await writeTextFile(e,`${JSON.stringify({$schema:WEB_VERCEL_JSON_SCHEMA,experimentalServices:WEB_DEFAULT_VERCEL_SERVICES},null,2)}\n`,{force:!0}),`written`;let r=await readFile(e,`utf8`),i=withWebVercelServices(r);return i===r?`skipped`:(await writeFile(e,i,`utf8`),`written`)}async function findCompetingNextConfigFiles(e){let n=[];for(let r of WEB_COMPETING_NEXT_CONFIG_PATHS){let i=join(e,r);await pathExists(i)&&n.push(i)}return n}async function ensureChannel(e){switch(e.kind){case`slack`:return ensureSlackChannel({...e,kind:`slack`});case`web`:return ensureWebChannel({...e,kind:`web`})}}async function ensureWebChannel(r){let i=join(r.projectRoot,`package.json`),a=await pathExists(join(r.projectRoot,`app/page.tsx`));if(!r.force&&await isNextJsProject(r.projectRoot))return{kind:`web`,action:`skipped`,skipReason:`nextjs-project`,filesWritten:[],filesSkipped:[i],packageJsonUpdated:[]};let o=await patchWebPackageJson(i,resolveWebPackageVersions(r.webPackageVersions)),c=[],u=[],d=[],f=[],p=basename(resolve(r.projectRoot)),m=r.configureVercelServices??!0;if(m){let e=join(r.projectRoot,WEB_VERCEL_JSON_PATH);await ensureWebVercelServices(e)===`written`?c.push(e):f.push(e)}let h=await getPackageManagerStrategy(r.packageManager??`pnpm`).applyProjectConfiguration(r.projectRoot);c.push(...h.filesWritten),f.push(...h.filesSkipped);for(let[e,i]of Object.entries(WEB_APP_TEMPLATE_FILES)){let a=join(r.projectRoot,e);if(e===`agent/channels/eve.ts`&&!r.force&&await pathExists(a)){f.push(a);continue}let o=await pathExists(a);await writeTextFile(a,renderWebAppTemplate(i,p,m),{force:!0}),c.push(a),o&&u.push(a)}d.push(...await findCompetingNextConfigFiles(r.projectRoot));let g={kind:`web`,action:a?`overwritten`:`created`,filesWritten:c,filesSkipped:f,packageJsonUpdated:o};return u.length>0&&(g.filesOverwritten=u),d.length>0&&(g.competingNextConfigFiles=d),g}async function ensureSlackChannel(e){let r=join(e.projectRoot,`agent/channels/slack.ts`),a=await pathExists(r);if(!e.force&&a)return{kind:`slack`,action:`skipped`,filesWritten:[],filesSkipped:[r],packageJsonUpdated:[]};let o=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`0.2.2`),s=await ensurePackageDependency(join(e.projectRoot,`package.json`),`@vercel/connect`,o),c=e.slackConnectorSlug??await deriveSlackConnectorSlug(e.projectRoot);await writeTextFile(r,buildSlackTemplate(c),{force:e.force});let l={kind:`slack`,action:a?`overwritten`:`created`,filesWritten:[r],filesSkipped:[],packageJsonUpdated:s,slackConnectorSlug:c};return a&&(l.filesOverwritten=[r]),l}async function listAuthoredChannels(e){let t=join(e,`agent/channels`),n;try{n=await readdir(t,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let r=[];for(let e of n){if(e.isFile()){let t=getSupportedModuleBaseName(e.name);t!==null&&r.push(t);continue}if(e.isDirectory())try{(await readdir(join(t,e.name))).some(e=>matchesSupportedModuleBaseName(e,`connection`))&&r.push(e.name)}catch{}}return r.sort()}export{DEFAULT_SLACK_CONNECTOR_SLUG,SLACK_CHANNEL_DEFAULT_ROUTE,deriveSlackConnectorSlug,ensureChannel,isNextJsProject,listAuthoredChannels,normalizeSlackConnectorSlug};
7
+ `}function renderWebAppTemplate(e,t,n){let r=n?``:`, { configureVercelOutput: false }`;return e.replaceAll(`__EVE_INIT_APP_NAME__`,t).replaceAll(`__EVE_INIT_WITH_EVE_OPTIONS__`,r)}function withWebVercelServices(e){let t=JSON.parse(e);if(!isJsonObject(t))throw Error(`${WEB_VERCEL_JSON_PATH} must contain a JSON object.`);let n=t.experimentalServices;if(n!==void 0&&!isJsonObject(n))throw Error(`${WEB_VERCEL_JSON_PATH} experimentalServices must contain a JSON object.`);let r={...t,$schema:typeof t.$schema==`string`?t.$schema:WEB_VERCEL_JSON_SCHEMA,experimentalServices:{...n,web:n?.web??WEB_DEFAULT_VERCEL_SERVICES.web,eve:n?.eve??WEB_DEFAULT_VERCEL_SERVICES.eve}};return JSON.stringify(t)===JSON.stringify(r)?e:`${JSON.stringify(r,null,2)}\n`}async function ensureWebVercelServices(e){if(!await pathExists(e))return await writeTextFile(e,`${JSON.stringify({$schema:WEB_VERCEL_JSON_SCHEMA,experimentalServices:WEB_DEFAULT_VERCEL_SERVICES},null,2)}\n`,{force:!0}),`written`;let r=await readFile(e,`utf8`),i=withWebVercelServices(r);return i===r?`skipped`:(await writeFile(e,i,`utf8`),`written`)}async function findCompetingNextConfigFiles(e){let n=[];for(let r of WEB_COMPETING_NEXT_CONFIG_PATHS){let i=join(e,r);await pathExists(i)&&n.push(i)}return n}async function ensureChannel(e){switch(e.kind){case`slack`:return ensureSlackChannel({...e,kind:`slack`});case`web`:return ensureWebChannel({...e,kind:`web`})}}async function ensureWebChannel(r){let i=join(r.projectRoot,`package.json`),a=await pathExists(join(r.projectRoot,`app/page.tsx`));if(!r.force&&await isNextJsProject(r.projectRoot))return{kind:`web`,action:`skipped`,skipReason:`nextjs-project`,filesWritten:[],filesSkipped:[i],packageJsonUpdated:[]};let o=await patchWebPackageJson(i,resolveWebPackageVersions(r.webPackageVersions)),c=[],u=[],d=[],f=[],p=basename(resolve(r.projectRoot)),m=r.configureVercelServices??!0;if(m){let e=join(r.projectRoot,WEB_VERCEL_JSON_PATH);await ensureWebVercelServices(e)===`written`?c.push(e):f.push(e)}let h=await getPackageManagerStrategy(r.packageManager??`pnpm`).applyProjectConfiguration(r.projectRoot);c.push(...h.filesWritten),f.push(...h.filesSkipped);for(let[e,i]of Object.entries(WEB_APP_TEMPLATE_FILES)){let a=join(r.projectRoot,e);if(e===`agent/channels/eve.ts`&&!r.force&&await pathExists(a)){f.push(a);continue}let o=await pathExists(a);await writeTextFile(a,renderWebAppTemplate(i,p,m),{force:!0}),c.push(a),o&&u.push(a)}d.push(...await findCompetingNextConfigFiles(r.projectRoot));let g={kind:`web`,action:a?`overwritten`:`created`,filesWritten:c,filesSkipped:f,packageJsonUpdated:o};return u.length>0&&(g.filesOverwritten=u),d.length>0&&(g.competingNextConfigFiles=d),g}async function ensureSlackChannel(e){let r=join(e.projectRoot,`agent/channels/slack.ts`),a=await pathExists(r);if(!e.force&&a)return{kind:`slack`,action:`skipped`,filesWritten:[],filesSkipped:[r],packageJsonUpdated:[]};let o=resolveVersionToken(`connectPackageVersion`,e.connectPackageVersion??`0.2.2`),s=await ensurePackageDependency(join(e.projectRoot,`package.json`),`@vercel/connect`,o),c=e.slackConnectorSlug??await deriveSlackConnectorSlug(e.projectRoot);await writeTextFile(r,buildSlackTemplate(e.slackConnectorUid??`slack/${c}`),{force:e.force});let l={kind:`slack`,action:a?`overwritten`:`created`,filesWritten:[r],filesSkipped:[],packageJsonUpdated:s,slackConnectorSlug:c};return a&&(l.filesOverwritten=[r]),l}async function listAuthoredChannels(e){let t=join(e,`agent/channels`),n;try{n=await readdir(t,{withFileTypes:!0})}catch(e){if(e.code===`ENOENT`)return[];throw e}let r=[];for(let e of n){if(e.isFile()){let t=getSupportedModuleBaseName(e.name);t!==null&&r.push(t);continue}if(e.isDirectory())try{(await readdir(join(t,e.name))).some(e=>matchesSupportedModuleBaseName(e,`connection`))&&r.push(e.name)}catch{}}return r.sort()}export{DEFAULT_SLACK_CONNECTOR_SLUG,SLACK_CHANNEL_DEFAULT_ROUTE,deriveSlackConnectorSlug,ensureChannel,isNextJsProject,listAuthoredChannels,normalizeSlackConnectorSlug};