eve 0.52.2 → 0.52.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/src/channel/types.d.ts +1 -0
  3. package/dist/src/chunks/{use-eve-agent-1NAM6ftx.js → use-eve-agent-BR8EpIOX.js} +27 -10
  4. package/dist/src/chunks/{use-eve-agent-BEjdhhhK.js → use-eve-agent-XnfjQt1Z.js} +27 -10
  5. package/dist/src/cli/commands/deploy.js +1 -1
  6. package/dist/src/cli/commands/extension-init.d.ts +2 -1
  7. package/dist/src/cli/commands/extension-init.js +1 -1
  8. package/dist/src/cli/commands/init.d.ts +2 -13
  9. package/dist/src/cli/commands/init.js +1 -1
  10. package/dist/src/cli/commands/registry-add-command.d.ts +3 -0
  11. package/dist/src/cli/commands/registry-add-command.js +1 -0
  12. package/dist/src/cli/commands/registry-metadata.d.ts +4 -1
  13. package/dist/src/cli/commands/registry-metadata.js +1 -1
  14. package/dist/src/cli/commands/registry.d.ts +1 -2
  15. package/dist/src/cli/commands/registry.js +1 -1
  16. package/dist/src/cli/dev/run-interactive-ui.d.ts +3 -0
  17. package/dist/src/cli/dev/run-interactive-ui.js +1 -1
  18. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  19. package/dist/src/cli/dev/tui/runner.d.ts +6 -0
  20. package/dist/src/cli/dev/tui/runner.js +1 -1
  21. package/dist/src/cli/dev/tui/setup-commands.d.ts +5 -3
  22. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  23. package/dist/src/cli/dev/tui/status-line.js +1 -1
  24. package/dist/src/cli/dev/tui/tui.d.ts +4 -0
  25. package/dist/src/cli/dev/tui/tui.js +1 -1
  26. package/dist/src/cli/run.d.ts +1 -1
  27. package/dist/src/cli/run.js +2 -2
  28. package/dist/src/cli/telemetry/index.d.ts +15 -0
  29. package/dist/src/cli/telemetry/index.js +2 -2
  30. package/dist/src/client/session.js +1 -1
  31. package/dist/src/compiled/.vendor-stamp.json +1 -1
  32. package/dist/src/compiler/compile-from-memory.d.ts +1 -0
  33. package/dist/src/compiler/compile-from-memory.js +1 -1
  34. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  35. package/dist/src/compiler/extension-compatibility.js +1 -1
  36. package/dist/src/context/build-dynamic-tools.d.ts +2 -1
  37. package/dist/src/context/build-dynamic-tools.js +1 -1
  38. package/dist/src/context/dynamic-tool-lifecycle.d.ts +3 -3
  39. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  40. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -1
  41. package/dist/src/context/hook-lifecycle.js +1 -1
  42. package/dist/src/context/keys.d.ts +2 -0
  43. package/dist/src/context/keys.js +1 -1
  44. package/dist/src/evals/reporters/index.d.ts +1 -0
  45. package/dist/src/evals/reporters/index.js +1 -1
  46. package/dist/src/evals/runner/reporters/datadog.d.ts +137 -0
  47. package/dist/src/evals/runner/reporters/datadog.js +3 -0
  48. package/dist/src/eve-channel/index.js +1 -1
  49. package/dist/src/execution/activity-events.d.ts +1 -0
  50. package/dist/src/execution/activity-events.js +1 -1
  51. package/dist/src/execution/node-step.js +1 -1
  52. package/dist/src/execution/parked-delivery-wait.js +1 -1
  53. package/dist/src/execution/sandbox/bindings/vercel-options.d.ts +10 -0
  54. package/dist/src/execution/sandbox/bindings/vercel-options.js +1 -0
  55. package/dist/src/execution/sandbox/bindings/vercel.js +2 -1
  56. package/dist/src/execution/sandbox/prewarm.js +1 -1
  57. package/dist/src/execution/sandbox/shell-quote.d.ts +1 -12
  58. package/dist/src/execution/sandbox/shell-quote.js +1 -1
  59. package/dist/src/execution/session-activity-projection.js +1 -1
  60. package/dist/src/execution/session-activity.js +1 -1
  61. package/dist/src/execution/session-command-inbox.js +1 -1
  62. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  63. package/dist/src/execution/tasks/child/workflow.js +1 -1
  64. package/dist/src/execution/tasks/parent/dispatch.js +1 -1
  65. package/dist/src/execution/tasks/parent/task-cancel.d.ts +2 -2
  66. package/dist/src/execution/tasks/parent/task-cancel.js +1 -1
  67. package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
  68. package/dist/src/execution/tool-auth.d.ts +4 -32
  69. package/dist/src/execution/tool-auth.js +1 -1
  70. package/dist/src/execution/tools/connection-search.js +2 -2
  71. package/dist/src/execution/tools/sleep-workflow.js +1 -1
  72. package/dist/src/execution/tools/subagent/accept-event-step.d.ts +1 -1
  73. package/dist/src/execution/tools/subagent/accept-event-step.js +1 -1
  74. package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
  75. package/dist/src/execution/tools/subagent/invoke-step.js +1 -1
  76. package/dist/src/execution/tools/workflow/ask.d.ts +3 -2
  77. package/dist/src/execution/tools/workflow/ask.js +1 -1
  78. package/dist/src/execution/tools/workflow/authorization-completion.d.ts +3 -0
  79. package/dist/src/execution/tools/workflow/authorization-completion.js +1 -0
  80. package/dist/src/execution/tools/workflow/body.d.ts +2 -0
  81. package/dist/src/execution/tools/workflow/body.js +1 -1
  82. package/dist/src/execution/tools/workflow/step-context.d.ts +31 -0
  83. package/dist/src/execution/tools/workflow/step-context.js +1 -0
  84. package/dist/src/execution/tools/workflow/step-execution.d.ts +3 -0
  85. package/dist/src/execution/tools/workflow/step-execution.js +1 -0
  86. package/dist/src/execution/tools/workflow/step.d.ts +3 -0
  87. package/dist/src/execution/tools/workflow/step.js +1 -0
  88. package/dist/src/execution/turn-workflow-tool-run.js +1 -1
  89. package/dist/src/execution/wire/session-inbox-contract.d.ts +7 -0
  90. package/dist/src/execution/wire/session-inbox-contract.js +1 -1
  91. package/dist/src/execution/wire/session-inbox-resume.d.ts +2 -0
  92. package/dist/src/execution/wire/session-inbox-resume.js +1 -1
  93. package/dist/src/execution/workflow-runtime.js +1 -1
  94. package/dist/src/execution/workflow-steps.js +1 -1
  95. package/dist/src/harness/action-presentation.d.ts +13 -0
  96. package/dist/src/harness/action-presentation.js +1 -0
  97. package/dist/src/harness/authorization.d.ts +5 -2
  98. package/dist/src/harness/authorization.js +1 -1
  99. package/dist/src/harness/compaction.js +1 -1
  100. package/dist/src/harness/coordination.js +1 -1
  101. package/dist/src/harness/emission.d.ts +1 -6
  102. package/dist/src/harness/emission.js +1 -1
  103. package/dist/src/harness/execute-tool.d.ts +2 -1
  104. package/dist/src/harness/finish-reason.d.ts +3 -0
  105. package/dist/src/harness/finish-reason.js +1 -0
  106. package/dist/src/harness/provider-tool-schemas.d.ts +1 -0
  107. package/dist/src/harness/provider-tool-schemas.js +1 -1
  108. package/dist/src/harness/step-hooks.js +1 -1
  109. package/dist/src/harness/stream-actions.d.ts +2 -2
  110. package/dist/src/harness/stream-actions.js +1 -1
  111. package/dist/src/harness/tool-call-input-errors.d.ts +4 -3
  112. package/dist/src/harness/tool-call-input-errors.js +1 -1
  113. package/dist/src/harness/tool-loop.js +2 -2
  114. package/dist/src/harness/tool-presentation.d.ts +5 -0
  115. package/dist/src/harness/tool-presentation.js +1 -0
  116. package/dist/src/harness/turn-client-context.d.ts +1 -0
  117. package/dist/src/harness/workflow-lifecycle.d.ts +2 -3
  118. package/dist/src/harness/workflow-lifecycle.js +1 -1
  119. package/dist/src/internal/application/compiled-artifacts.d.ts +3 -0
  120. package/dist/src/internal/application/compiled-artifacts.js +1 -1
  121. package/dist/src/internal/application/package.js +1 -1
  122. package/dist/src/internal/authored-definition/connection.js +1 -1
  123. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  124. package/dist/src/internal/authored-module-conditions.d.ts +2 -0
  125. package/dist/src/internal/authored-module-conditions.js +1 -0
  126. package/dist/src/internal/authored-module-loader.d.ts +3 -0
  127. package/dist/src/internal/authored-module-loader.js +3 -3
  128. package/dist/src/internal/authored-module-map-loader.d.ts +3 -1
  129. package/dist/src/internal/authored-module-map-loader.js +1 -1
  130. package/dist/src/internal/authored-package-boundary.js +1 -1
  131. package/dist/src/internal/authored-runtime-modules.d.ts +2 -0
  132. package/dist/src/internal/authored-runtime-modules.js +1 -1
  133. package/dist/src/internal/bundler/nitro-rolldown.d.ts +1 -0
  134. package/dist/src/internal/bundler/nitro-rolldown.js +1 -1
  135. package/dist/src/internal/nitro/development-generation.d.ts +2 -0
  136. package/dist/src/internal/nitro/development-generation.js +1 -1
  137. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  138. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  139. package/dist/src/internal/nitro/host/prepare-application-host.js +1 -1
  140. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  141. package/dist/src/internal/vercel/build-command.d.ts +2 -1
  142. package/dist/src/internal/vercel/build-command.js +1 -1
  143. package/dist/src/internal/workflow-bundle/builder-support.d.ts +5 -0
  144. package/dist/src/internal/workflow-bundle/builder-support.js +1 -1
  145. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  146. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +1 -1
  147. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
  148. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  149. package/dist/src/internal/workflow-bundle/workflow-transformer.d.ts +3 -5
  150. package/dist/src/internal/workflow-bundle/workflow-transformer.js +4 -3
  151. package/dist/src/protocol/activity.d.ts +6 -0
  152. package/dist/src/protocol/activity.js +1 -1
  153. package/dist/src/protocol/message.d.ts +13 -1
  154. package/dist/src/protocol/message.js +1 -1
  155. package/dist/src/public/channels/github/checkout.js +1 -1
  156. package/dist/src/public/channels/slack/activity-plan.js +1 -1
  157. package/dist/src/public/channels/slack/activity.js +2 -2
  158. package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +6 -0
  159. package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -0
  160. package/dist/src/public/models/openai/chatgpt/model.d.ts +1 -1
  161. package/dist/src/public/models/openai/chatgpt/oauth.d.ts +20 -0
  162. package/dist/src/public/models/openai/chatgpt/oauth.js +1 -0
  163. package/dist/src/public/models/openai/chatgpt/token-broker.d.ts +4 -3
  164. package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
  165. package/dist/src/public/models/openai/chatgpt/transport.d.ts +1 -2
  166. package/dist/src/public/models/openai/index.d.ts +3 -4
  167. package/dist/src/public/tools/index.d.ts +1 -1
  168. package/dist/src/runtime/authorization-context.d.ts +14 -0
  169. package/dist/src/runtime/authorization-context.js +1 -0
  170. package/dist/src/runtime/connections/mcp-client.js +1 -1
  171. package/dist/src/runtime/connections/scoped-authorization.d.ts +18 -2
  172. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  173. package/dist/src/runtime/prompt/compose.js +1 -1
  174. package/dist/src/runtime/resolve-connection.js +1 -1
  175. package/dist/src/runtime/resolve-tool.js +1 -1
  176. package/dist/src/runtime/sandbox/keys.js +1 -1
  177. package/dist/src/runtime/types.d.ts +2 -0
  178. package/dist/src/sandbox/backends/default.d.ts +2 -0
  179. package/dist/src/sandbox/backends/default.js +1 -1
  180. package/dist/src/self-modification/agent.d.ts +5 -2
  181. package/dist/src/self-modification/agent.js +1 -1
  182. package/dist/src/self-modification/config.d.ts +52 -0
  183. package/dist/src/self-modification/config.js +1 -0
  184. package/dist/src/self-modification/credentials.d.ts +18 -0
  185. package/dist/src/self-modification/credentials.js +1 -0
  186. package/dist/src/self-modification/extension/eve-add.d.ts +7 -2
  187. package/dist/src/self-modification/extension/eve-add.js +1 -1
  188. package/dist/src/self-modification/extension/extension.d.ts +46 -1
  189. package/dist/src/self-modification/extension/extension.js +1 -1
  190. package/dist/src/self-modification/extension/instructions.d.ts +1 -3
  191. package/dist/src/self-modification/extension/instructions.js +24 -8
  192. package/dist/src/self-modification/extension/production-registry-add.d.ts +42 -0
  193. package/dist/src/self-modification/extension/production-registry-add.js +1 -0
  194. package/dist/src/self-modification/extension/tools/edit_file.js +1 -1
  195. package/dist/src/self-modification/extension/tools/publish.d.ts +7 -0
  196. package/dist/src/self-modification/extension/tools/publish.js +1 -0
  197. package/dist/src/self-modification/extension/tools/registry_add.d.ts +39 -7
  198. package/dist/src/self-modification/extension/tools/registry_add.js +1 -1
  199. package/dist/src/self-modification/extension/tools/search_registry.d.ts +1 -0
  200. package/dist/src/self-modification/extension/tools/search_registry.js +1 -1
  201. package/dist/src/self-modification/filesystem.js +1 -1
  202. package/dist/src/self-modification/git-workspace.d.ts +31 -0
  203. package/dist/src/self-modification/git-workspace.js +1 -0
  204. package/dist/src/self-modification/git.d.ts +6 -0
  205. package/dist/src/self-modification/git.js +1 -0
  206. package/dist/src/self-modification/github-publisher.d.ts +27 -0
  207. package/dist/src/self-modification/github-publisher.js +2 -0
  208. package/dist/src/self-modification/identifiers.d.ts +4 -0
  209. package/dist/src/self-modification/identifiers.js +1 -0
  210. package/dist/src/self-modification/mode.d.ts +4 -0
  211. package/dist/src/self-modification/mode.js +1 -0
  212. package/dist/src/self-modification/network-policy.d.ts +1 -0
  213. package/dist/src/self-modification/network-policy.js +1 -0
  214. package/dist/src/self-modification/proposal.d.ts +39 -0
  215. package/dist/src/self-modification/proposal.js +2 -0
  216. package/dist/src/self-modification/sandbox.d.ts +25 -1
  217. package/dist/src/self-modification/sandbox.js +1 -1
  218. package/dist/src/self-modification/setup.d.ts +34 -0
  219. package/dist/src/self-modification/setup.js +22 -0
  220. package/dist/src/self-modification/workspace-lock.d.ts +2 -0
  221. package/dist/src/self-modification/workspace-lock.js +1 -0
  222. package/dist/src/setup/flows/chatgpt-auth.d.ts +14 -2
  223. package/dist/src/setup/flows/chatgpt-auth.js +1 -1
  224. package/dist/src/setup/flows/model.d.ts +3 -2
  225. package/dist/src/setup/flows/model.js +1 -1
  226. package/dist/src/setup/flows/provider.js +1 -1
  227. package/dist/src/setup/flows/registry.d.ts +4 -0
  228. package/dist/src/setup/flows/registry.js +1 -1
  229. package/dist/src/setup/integrations/registry.js +1 -1
  230. package/dist/src/setup/integrations/runner.js +1 -1
  231. package/dist/src/setup/integrations/self-modification/setup.d.ts +29 -0
  232. package/dist/src/setup/integrations/self-modification/setup.js +1 -0
  233. package/dist/src/setup/integrations/types.d.ts +2 -0
  234. package/dist/src/setup/integrations/types.js +1 -1
  235. package/dist/src/setup/scaffold/create/project.js +1 -1
  236. package/dist/src/shared/boundary-hook-error.d.ts +4 -0
  237. package/dist/src/shared/boundary-hook-error.js +1 -0
  238. package/dist/src/shared/empty-delivery.js +1 -1
  239. package/dist/src/shared/git.d.ts +16 -0
  240. package/dist/src/shared/git.js +1 -0
  241. package/dist/src/{execution/activity-text.d.ts → shared/presentation-text.d.ts} +1 -1
  242. package/dist/src/shared/presentation-text.js +1 -0
  243. package/dist/src/shared/shell-quote.d.ts +2 -0
  244. package/dist/src/shared/shell-quote.js +1 -0
  245. package/dist/src/shared/vercel-services.js +1 -1
  246. package/dist/src/svelte/index.js +1 -1
  247. package/dist/src/svelte/use-eve-agent.js +1 -1
  248. package/dist/src/tasks/session-index.d.ts +1 -1
  249. package/dist/src/tasks/session-index.js +1 -1
  250. package/dist/src/tasks/session-task-cohorts.d.ts +10 -0
  251. package/dist/src/tasks/session-task-cohorts.js +1 -0
  252. package/dist/src/tools/definition.d.ts +21 -0
  253. package/dist/src/tools/definition.js +1 -1
  254. package/dist/src/tools/durable-callbacks.d.ts +37 -9
  255. package/dist/src/tools/durable-callbacks.js +1 -1
  256. package/dist/src/tools/dynamic.d.ts +2 -1
  257. package/dist/src/tools/framework/agent-contract.js +1 -1
  258. package/dist/src/tools/provided/bash.js +1 -1
  259. package/dist/src/tools/provided/glob.js +1 -1
  260. package/dist/src/tools/provided/grep.js +1 -1
  261. package/dist/src/tools/provided/load-skill.js +1 -1
  262. package/dist/src/tools/provided/read-file.js +1 -1
  263. package/dist/src/tools/provided/web-fetch.js +1 -1
  264. package/dist/src/tools/provided/write-file.js +1 -1
  265. package/dist/src/tools/tool-label.d.ts +1 -0
  266. package/dist/src/tools/tool-label.js +1 -0
  267. package/dist/src/tools/workflow-definition.d.ts +5 -2
  268. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  269. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  270. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -1
  271. package/dist/src/tracing/agent-otel-provider.js +2 -2
  272. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  273. package/dist/src/tracing/agent-otel-usage.d.ts +10 -0
  274. package/dist/src/tracing/agent-otel-usage.js +1 -1
  275. package/dist/src/tracing/agent-span-naming.d.ts +1 -0
  276. package/dist/src/tracing/agent-span-naming.js +1 -0
  277. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  278. package/dist/src/vue/index.js +1 -1
  279. package/dist/src/vue/use-eve-agent.js +1 -1
  280. package/docs/concepts/default-harness.md +6 -0
  281. package/docs/concepts/sessions-runs-and-streaming.md +6 -0
  282. package/docs/connections/overview.mdx +1 -1
  283. package/docs/evals/reporters.mdx +20 -1
  284. package/docs/guides/client/continuations.mdx +11 -0
  285. package/docs/guides/dynamic-capabilities.md +4 -4
  286. package/docs/guides/hooks.md +1 -1
  287. package/docs/guides/instrumentation.md +40 -1
  288. package/docs/guides/remote-agents.md +2 -0
  289. package/docs/instructions.mdx +1 -1
  290. package/docs/memory/overview.mdx +45 -13
  291. package/docs/reference/cli.md +6 -0
  292. package/docs/reference/telemetry.md +2 -2
  293. package/docs/reference/typescript-api.md +13 -9
  294. package/docs/sandbox.mdx +16 -2
  295. package/docs/subagents/index.mdx +18 -4
  296. package/docs/tools/overview.mdx +44 -2
  297. package/docs/tools/workflows.mdx +67 -2
  298. package/docs/tutorial/connect-a-warehouse.mdx +49 -26
  299. package/docs/tutorial/first-agent.mdx +20 -19
  300. package/docs/tutorial/guard-the-spend.mdx +4 -4
  301. package/docs/tutorial/how-it-runs.mdx +2 -3
  302. package/docs/tutorial/meta.json +2 -2
  303. package/docs/tutorial/query-sample-data.mdx +30 -19
  304. package/docs/tutorial/remember-definitions.mdx +5 -5
  305. package/docs/tutorial/run-analysis.mdx +155 -18
  306. package/docs/tutorial/ship-it.mdx +71 -81
  307. package/docs/tutorial/team-playbooks.mdx +10 -10
  308. package/package.json +17 -1
  309. package/dist/src/execution/activity-text.js +0 -1
  310. package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +0 -9
  311. package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +0 -1
  312. package/dist/src/public/models/openai/chatgpt/codex-app-server.d.ts +0 -40
  313. package/dist/src/public/models/openai/chatgpt/codex-app-server.js +0 -1
  314. package/dist/src/self-modification/extension/source-lock.d.ts +0 -2
  315. package/dist/src/self-modification/extension/source-lock.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # eve
2
2
 
3
+ ## 0.52.4
4
+
5
+ ### Patch Changes
6
+
7
+ - 97fccac: Dynamic tools with non-durable presentation labels now remain available and fall back to their tool names.
8
+ - d74fdb4: Add a Datadog eval reporter that creates one LLM Observability Experiment per eve eval run and submits eval assertion metrics through the optional `dd-trace` package. Opted-in eval inputs are pushed as versioned dataset records and linked to their experiment rows. The integration is tested against the public dataset and external Experiment APIs in `dd-trace@6.13.0`.
9
+ - 8946bd5: Enable configured deployments to edit an agent source checkout and publish changes as draft GitHub pull requests. Registry setup installs official registry items in the disposable checkout, provisions a repository-scoped Vercel Connect GitHub connector, and can continue without secrets in headless environments; manual and self-hosted deployments can use a fine-grained GitHub PAT.
10
+ - dc73dee: Keep sandbox template and session keys stable across unrelated agent changes when bootstrap has no skill or workspace seed files. Existing affected sandboxes switch to the corrected key on first use after upgrading.
11
+ - b3ce510: Only suppress a response when the empty-delivery marker is the entire response, apart from surrounding whitespace. Replies that quote or explain the marker are now delivered and retained in conversation history.
12
+ - 22046b2: Combine adjacent queued successful sibling completions into one parent turn, reducing redundant model calls while retaining every result. Batching happens automatically without waiting for unfinished tasks.
13
+ - 6d12a70: Forward inherited activity observation when background tasks start local or remote subagents, so their tool activity appears beneath the task row.
14
+ - f85de0d: Workflow tools can use the same requester-scoped `ctx.getToken` and `ctx.requireAuth` as ordinary tools inside step helpers, automatically waiting for sign-in and retrying the interrupted step. In background workflows, these APIs require a supporting session driver; older conversations fail before calling the auth provider with an instruction to start a new session.
15
+
16
+ ## 0.52.3
17
+
18
+ ### Patch Changes
19
+
20
+ - 9cb899d: Add explicit Datadog operation and resource names to framework-owned agent spans while preserving their OpenTelemetry names and trace hierarchy. Agent invocation spans now include `agent.turn.outcome` so completion, failure, and cancellation remain queryable in backends that discard span events.
21
+ - 1a4f0b3: Allow tools to define an input-aware activity label for channel presentation. Framework tools now provide readable labels for shell, file, skill, fetch, and search actions.
22
+ - e5d8e7b: Match each client `send()` response to the message accepted by the server. Resuming a session with an old stream cursor now skips earlier turns instead of returning an old result.
23
+ - 14af96f: Preserve Node.js custom resolution conditions when bundling authored modules. Production builds with a channel importing `server-only` under `react-server` now produce a valid module map.
24
+ - 4cff7dc: Fix `eve start` failing when an app built on another machine is deployed to a different directory. Sandbox prewarming now resolves authored modules from the deployed app while preserving TypeScript aliases and workspace package resolution.
25
+ - 9034901: Resolve workflow path aliases from the application config and bundle only workflows reachable from the agent. Unresolved workflow imports now fail the build instead of producing a bundle that crashes every durable session.
26
+ - 8a50983: Keep dynamic tool callbacks isolated by session, lifecycle scope, and resolver. Replaying a tool now retains its own implementation when another session or scope registers the same tool name.
27
+ - 0d19fa3: Fix repeated ineffective compaction when provider-reported input tokens exceed the character estimate. Tool-result trimming now accounts for measured context pressure and falls back to summarization when it cannot free enough space.
28
+ - 67f3b8d: Sign in to a ChatGPT subscription directly from eve without installing the Codex CLI. eve now manages its own local login and token refresh, with browser sign-in, device codes over SSH, and actionable recovery messages; existing Codex users sign in once through `/model` after upgrading.
29
+ - 2ff8511: Preserve a cancelled task's notification to its parent when shutdown exceeds the cooperative grace period. Parents no longer wait for a notification from a task that was already cancelled.
30
+ - 3c3a0df: Allow async-generator tools to project typed preliminary and final results into bounded user-facing activity text with `activity.update` and `activity.result`.
31
+ - 2ff8511: Keep conversation sessions available after a `turn.started` or `step.started` handler throws. The failed turn reports the error, and a later message can resume the same session.
32
+ - 461b578: Keep framework context at a stable position throughout a turn so tool steps can reuse the existing prompt prefix instead of moving skill announcements behind new tool results.
33
+ - 4b5fad4: Steer a running background subagent by sending an updated message with its existing `agentId`. eve cancels its previous task and starts a new task in the same child session, preserving its conversation history.
34
+ - 59ec96c: Add CLI telemetry for setup and onboarding flows.
35
+
3
36
  ## 0.52.2
4
37
 
5
38
  ### Patch Changes
@@ -198,6 +198,7 @@ export type SessionCommand = {
198
198
  export type SessionSendCommandResult = {
199
199
  readonly status: "accepted";
200
200
  readonly sessionId: string;
201
+ readonly deliveryId?: string;
201
202
  } | {
202
203
  readonly status: "session_not_active";
203
204
  };
@@ -1407,7 +1407,7 @@ var ClientSession = class ClientSession {
1407
1407
  }
1408
1408
  static async create(context, input) {
1409
1409
  const response = await postTurn(context, EVE_SESSION_ROUTE_PATH, input, true);
1410
- const sessionId = await readSessionId(response);
1410
+ const { sessionId } = await readAcceptedMessage(response);
1411
1411
  const session = new ClientSession(context, {
1412
1412
  sessionId,
1413
1413
  streamIndex: 0
@@ -1454,8 +1454,10 @@ var ClientSession = class ClientSession {
1454
1454
  const initialStreamIndex = this.#state.streamIndex;
1455
1455
  const path = createEveSessionRoutePath(this.#state.sessionId);
1456
1456
  const response = retrySessionNotActive ? await postSessionSend(this.#context, path, input) : await postTurn(this.#context, path, input, false);
1457
- if (await readSessionId(response, this.#state.sessionId) !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
1458
- return this.#messageResponse(response, input, initialStreamIndex);
1457
+ const { sessionId: responseSessionId, deliveryId } = await readAcceptedMessage(response, this.#state.sessionId);
1458
+ if (responseSessionId !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
1459
+ if (input.message !== void 0 && deliveryId === void 0) throw new Error("Message route did not return a delivery id. Update the server before sending with this client.");
1460
+ return this.#messageResponse(response, input, initialStreamIndex, input.message === void 0 ? void 0 : deliveryId);
1459
1461
  }
1460
1462
  async cancel(options) {
1461
1463
  return await cancelClientSession({
@@ -1487,16 +1489,18 @@ var ClientSession = class ClientSession {
1487
1489
  if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
1488
1490
  return this.#streamAndAdvance(options);
1489
1491
  }
1490
- #messageResponse(response, input, initialStreamIndex) {
1492
+ #messageResponse(response, input, initialStreamIndex, deliveryId) {
1491
1493
  response.body?.cancel().catch(() => {});
1492
1494
  return new MessageResponse({
1493
1495
  cancelTurn: async (turnId) => await this.cancel({ turnId }),
1494
- createStream: () => this.#createEventStream(initialStreamIndex, input),
1496
+ createStream: () => this.#createEventStream(initialStreamIndex, input, deliveryId),
1495
1497
  sessionId: this.#state.sessionId
1496
1498
  });
1497
1499
  }
1498
- async *#createEventStream(initialStreamIndex, input) {
1500
+ async *#createEventStream(initialStreamIndex, input, deliveryId) {
1499
1501
  let eventCount = 0;
1502
+ let started = deliveryId === void 0;
1503
+ let reachedBoundary = false;
1500
1504
  const pendingAuthorizations = /* @__PURE__ */ new Set();
1501
1505
  try {
1502
1506
  for await (const event of this.#readStream({
@@ -1507,15 +1511,25 @@ var ClientSession = class ClientSession {
1507
1511
  streamReconnectPolicy: input.streamReconnectPolicy
1508
1512
  })) {
1509
1513
  eventCount += 1;
1514
+ if (deliveryId !== void 0) {
1515
+ const matches = event.meta?.deliveryIds?.includes(deliveryId) === true;
1516
+ const terminal = event.type === "session.failed" || event.type === "session.completed";
1517
+ if (!matches && terminal && (!started || event.type === "session.completed")) throw new Error("The session ended before the accepted message reached its turn boundary.");
1518
+ if (!started && !matches) continue;
1519
+ if (!terminal && event.meta?.deliveryIds !== void 0 && !matches) continue;
1520
+ started = true;
1521
+ }
1510
1522
  if (event.type === "authorization.required" && event.data.webhookUrl !== void 0) pendingAuthorizations.add(event.data.name);
1511
1523
  else if (event.type === "authorization.completed") pendingAuthorizations.delete(event.data.name);
1524
+ reachedBoundary = isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0);
1512
1525
  yield event;
1513
- if (isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0)) break;
1526
+ if (reachedBoundary) break;
1514
1527
  }
1528
+ if (deliveryId !== void 0 && !reachedBoundary && !input.signal?.aborted) throw new Error("The response stream ended before the accepted message reached its turn boundary.");
1515
1529
  } finally {
1516
1530
  this.#state = {
1517
1531
  sessionId: this.#state.sessionId,
1518
- streamIndex: initialStreamIndex + eventCount
1532
+ streamIndex: Math.max(this.#state.streamIndex, initialStreamIndex + eventCount)
1519
1533
  };
1520
1534
  }
1521
1535
  }
@@ -1591,11 +1605,14 @@ async function postTurn(context, path, input, requireMessage) {
1591
1605
  }
1592
1606
  return response;
1593
1607
  }
1594
- async function readSessionId(response, expected) {
1608
+ async function readAcceptedMessage(response, expected) {
1595
1609
  const payload = await response.json();
1596
1610
  const sessionId = (typeof payload.sessionId === "string" ? payload.sessionId : void 0) ?? response.headers.get("x-eve-session-id")?.trim() ?? expected;
1597
1611
  if (!sessionId) throw new Error("Message route did not return a session id.");
1598
- return sessionId;
1612
+ return {
1613
+ sessionId,
1614
+ deliveryId: typeof payload.deliveryId === "string" && payload.deliveryId.length > 0 ? payload.deliveryId : void 0
1615
+ };
1599
1616
  }
1600
1617
  function createMessageBody(input, requireMessage) {
1601
1618
  const body = {};
@@ -1407,7 +1407,7 @@ var ClientSession = class ClientSession {
1407
1407
  }
1408
1408
  static async create(context, input) {
1409
1409
  const response = await postTurn(context, EVE_SESSION_ROUTE_PATH, input, true);
1410
- const sessionId = await readSessionId(response);
1410
+ const { sessionId } = await readAcceptedMessage(response);
1411
1411
  const session = new ClientSession(context, {
1412
1412
  sessionId,
1413
1413
  streamIndex: 0
@@ -1454,8 +1454,10 @@ var ClientSession = class ClientSession {
1454
1454
  const initialStreamIndex = this.#state.streamIndex;
1455
1455
  const path = createEveSessionRoutePath(this.#state.sessionId);
1456
1456
  const response = retrySessionNotActive ? await postSessionSend(this.#context, path, input) : await postTurn(this.#context, path, input, false);
1457
- if (await readSessionId(response, this.#state.sessionId) !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
1458
- return this.#messageResponse(response, input, initialStreamIndex);
1457
+ const { sessionId: responseSessionId, deliveryId } = await readAcceptedMessage(response, this.#state.sessionId);
1458
+ if (responseSessionId !== this.#state.sessionId) throw new Error("Message route returned a different session id.");
1459
+ if (input.message !== void 0 && deliveryId === void 0) throw new Error("Message route did not return a delivery id. Update the server before sending with this client.");
1460
+ return this.#messageResponse(response, input, initialStreamIndex, input.message === void 0 ? void 0 : deliveryId);
1459
1461
  }
1460
1462
  async cancel(options) {
1461
1463
  return await cancelClientSession({
@@ -1487,16 +1489,18 @@ var ClientSession = class ClientSession {
1487
1489
  if (options?.follow === false && (options.startIndex ?? this.#state.streamIndex) < 0) throw new Error("stream({ follow: false }) requires a nonnegative startIndex; a tail-relative cursor cannot be bounded.");
1488
1490
  return this.#streamAndAdvance(options);
1489
1491
  }
1490
- #messageResponse(response, input, initialStreamIndex) {
1492
+ #messageResponse(response, input, initialStreamIndex, deliveryId) {
1491
1493
  response.body?.cancel().catch(() => {});
1492
1494
  return new MessageResponse({
1493
1495
  cancelTurn: async (turnId) => await this.cancel({ turnId }),
1494
- createStream: () => this.#createEventStream(initialStreamIndex, input),
1496
+ createStream: () => this.#createEventStream(initialStreamIndex, input, deliveryId),
1495
1497
  sessionId: this.#state.sessionId
1496
1498
  });
1497
1499
  }
1498
- async *#createEventStream(initialStreamIndex, input) {
1500
+ async *#createEventStream(initialStreamIndex, input, deliveryId) {
1499
1501
  let eventCount = 0;
1502
+ let started = deliveryId === void 0;
1503
+ let reachedBoundary = false;
1500
1504
  const pendingAuthorizations = /* @__PURE__ */ new Set();
1501
1505
  try {
1502
1506
  for await (const event of this.#readStream({
@@ -1507,15 +1511,25 @@ var ClientSession = class ClientSession {
1507
1511
  streamReconnectPolicy: input.streamReconnectPolicy
1508
1512
  })) {
1509
1513
  eventCount += 1;
1514
+ if (deliveryId !== void 0) {
1515
+ const matches = event.meta?.deliveryIds?.includes(deliveryId) === true;
1516
+ const terminal = event.type === "session.failed" || event.type === "session.completed";
1517
+ if (!matches && terminal && (!started || event.type === "session.completed")) throw new Error("The session ended before the accepted message reached its turn boundary.");
1518
+ if (!started && !matches) continue;
1519
+ if (!terminal && event.meta?.deliveryIds !== void 0 && !matches) continue;
1520
+ started = true;
1521
+ }
1510
1522
  if (event.type === "authorization.required" && event.data.webhookUrl !== void 0) pendingAuthorizations.add(event.data.name);
1511
1523
  else if (event.type === "authorization.completed") pendingAuthorizations.delete(event.data.name);
1524
+ reachedBoundary = isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0);
1512
1525
  yield event;
1513
- if (isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || pendingAuthorizations.size === 0)) break;
1526
+ if (reachedBoundary) break;
1514
1527
  }
1528
+ if (deliveryId !== void 0 && !reachedBoundary && !input.signal?.aborted) throw new Error("The response stream ended before the accepted message reached its turn boundary.");
1515
1529
  } finally {
1516
1530
  this.#state = {
1517
1531
  sessionId: this.#state.sessionId,
1518
- streamIndex: initialStreamIndex + eventCount
1532
+ streamIndex: Math.max(this.#state.streamIndex, initialStreamIndex + eventCount)
1519
1533
  };
1520
1534
  }
1521
1535
  }
@@ -1591,11 +1605,14 @@ async function postTurn(context, path, input, requireMessage) {
1591
1605
  }
1592
1606
  return response;
1593
1607
  }
1594
- async function readSessionId(response, expected) {
1608
+ async function readAcceptedMessage(response, expected) {
1595
1609
  const payload = await response.json();
1596
1610
  const sessionId = (typeof payload.sessionId === "string" ? payload.sessionId : void 0) ?? response.headers.get("x-eve-session-id")?.trim() ?? expected;
1597
1611
  if (!sessionId) throw new Error("Message route did not return a session id.");
1598
- return sessionId;
1612
+ return {
1613
+ sessionId,
1614
+ deliveryId: typeof payload.deliveryId === "string" && payload.deliveryId.length > 0 ? payload.deliveryId : void 0
1615
+ };
1599
1616
  }
1600
1617
  function createMessageBody(input, requireMessage) {
1601
1618
  const body = {};
@@ -1 +1 @@
1
- import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve deploy\` from the workspace root to deploy every peer agent together.`}))return;if(isNonInteractiveProjectCommand(r)){if(r.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(r.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:t,options:r}))return}let i=n.createPrompter?.()??createPrompter();i.intro(`Deploy your eve agent to Vercel`);try{let a=await runDeployFlow({appRoot:t,prompter:i,interactive:!isNonInteractiveProjectCommand(r)&&n.hasInteractiveTerminal(),deps:n.flowDeps});if(a.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first, or name the project on the deploy itself: `eve deploy --project <name-or-id> --non-interactive --yes`."),process.exitCode=1;return}if(a.kind===`local-model`){e.error("ChatGPT subscription models use local Codex credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}i.outro(a.kind===`cancelled`?`Cancelled.`:a.productionUrl===void 0?`Deployed.`:`Deployed: ${a.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
1
+ import{hasInteractiveTerminal,validateWorkspaceProjectCommand}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{isEveProject}from"#setup/scaffold/index.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal,isEveProject};async function runDeployCommand(e,t,n=defaultDependencies,r={}){if(!await validateWorkspaceProjectCommand({appRoot:t,isEveProject:n.isEveProject,logger:e,workspaceMemberMessage:e=>`This agent belongs to the workspace at ${e.root}. Run \`eve deploy\` from the workspace root to deploy every peer agent together.`}))return;if(isNonInteractiveProjectCommand(r)){if(r.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(r.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:t,options:r}))return}let i=n.createPrompter?.()??createPrompter();i.intro(`Deploy your eve agent to Vercel`);try{let a=await runDeployFlow({appRoot:t,prompter:i,interactive:!isNonInteractiveProjectCommand(r)&&n.hasInteractiveTerminal(),deps:n.flowDeps});if(a.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first, or name the project on the deploy itself: `eve deploy --project <name-or-id> --non-interactive --yes`."),process.exitCode=1;return}if(a.kind===`local-model`){e.error("ChatGPT subscription models use local ChatGPT credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}i.outro(a.kind===`cancelled`?`Cancelled.`:a.productionUrl===void 0?`Deployed.`:`Deployed: ${a.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
@@ -7,6 +7,7 @@ export interface ExtensionInitCliLogger {
7
7
  error(message: string): void;
8
8
  log(message: string): void;
9
9
  }
10
+ export type ExtensionInitSetupStep = "resolve_target" | "scaffold" | "install_dependencies" | "initialize_git" | "handoff";
10
11
  export interface ExtensionInitCommandDependencies {
11
12
  detectInvokingPackageManager: typeof detectInvokingPackageManager;
12
13
  detectPackageManager: typeof detectPackageManager;
@@ -22,4 +23,4 @@ export declare const EVE_INIT_PACKAGE_SPEC_ENV = "EVE_INIT_PACKAGE_SPEC";
22
23
  * Creates a new eve extension package. Same install/git flow as agent `eve init`,
23
24
  * but always create-only and prints next steps instead of starting `eve dev`.
24
25
  */
25
- export declare function runExtensionInitCommand(logger: ExtensionInitCliLogger, parentDirectory: string, target: string | undefined, dependencies?: ExtensionInitCommandDependencies): Promise<void>;
26
+ export declare function runExtensionInitCommand(logger: ExtensionInitCliLogger, parentDirectory: string, target: string | undefined, dependencies?: ExtensionInitCommandDependencies, trackStep?: (step: ExtensionInitSetupStep) => void): Promise<void>;
@@ -1 +1 @@
1
- import{initExtensionHandoff,initExtensionInstructions}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{scaffoldExtensionProject}from"#setup/scaffold/index.js";import{packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";const defaultDependencies={detectInvokingPackageManager,detectPackageManager,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldExtensionProject,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`extension-init`);function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function assertCanScaffoldInPlace(e){let t=await readdir(e),n=blockingCreateInPlaceEntries(t);if(n.length===0)return;let r=n.slice(0,5).join(`, `),i=n.length>5?`, and ${n.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${r}${i}. Use an empty directory.`)}async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldExtension(e,t,n,r,i){let a=resolve(e),o=t===`.`,s=o?a:join(a,t);if(o)await assertCanScaffoldInPlace(s);else if(await pathExists(s))throw Error(`Cannot create project because "${s}" already exists.`);let c=await mkdtemp(join(a,`.eve-extension-init-`)),l=[];try{let e=o?basename(s):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:c,workspaceProbeDirectory:s,packageManager:n,onWorkspaceRootMutation:e=>{l.push(e)}});return o?await moveDirectoryContents(a,s):await rename(a,s),{projectPath:s,workspaceRootMutations:uniqueWorkspaceRootMutations(l)}}finally{await rm(c,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}async function runExtensionInitCommand(e,t,n,r=defaultDependencies){if(n===void 0&&await r.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let i=isLogLevelEnabled(`debug`),a=startCliLiveRow(e);a.update(`Preparing project`);let o,s,c=[],l,u,d;try{let f=n??`.`,p=isCurrentDirectoryTarget(f),m=p?await pathExists(join(resolve(t),`package.json`))?resolve(t):void 0:await resolveTargetDirectory(t,f),h=resolveInitEvePackageOverride();if(m!==void 0)throw Error("`eve extension init` creates a new extension package and cannot add to an existing project. Pass a new directory name, or run from an empty directory with `eve extension init .`.");a.update(`Creating extension`),initLog.debug(`creating extension`);let g=r.now(),_=p?`.`:parseProjectName(f),v=resolve(t);s=await resolveScaffoldPackageManager(_===`.`?v:join(v,_),r);let y=await scaffoldExtension(t,_,s,r,h);o=y.projectPath,c=y.workspaceRootMutations,l=r.now()-g,initLog.debug(`creating extension done`,{ms:l}),a.update(`Installing dependencies`,`${s} install`),initLog.debug(`installing dependencies with ${s}`);let b=r.now(),x=[],S=[],C=await r.runPackageManagerInstall(s,o,{progressDetails:process.stdout.isTTY===!0&&!i,onOutput:e=>{e.text.trim()!==``&&(S.push(e.text),S.length>20&&S.shift(),NPM_NOISE_LINE.test(e.text)||x.push(e.text)),i&&initLog.debug(e.text);let t=installProgressDetail(s,e);t!==void 0&&a.update(`Installing dependencies`,t)}});if(u=r.now()-b,!packageManagerInstallSucceeded(C)){initLog.debug(`dependency installation failed`,{ms:u}),a.stop();let t=x.length>0?x:S;for(let n of t)e.error(n);if(t.length===0){let t=packageManagerInstallFailureMessage(C);t!==void 0&&e.error(t)}throw Error(`Failed to install dependencies in "${o}".`)}initLog.debug(`dependencies installed`,{ms:u}),a.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),d=await r.tryInitializeGit(o)}finally{a.stop()}e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} extension in ${pc.bold(o)} ${pc.dim(`in ${formatElapsed(l)}`)}`);for(let t of c)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`));e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(u)}`)}`),d.kind===`failed`?e.error(pc.yellow(`Git initialization failed: ${d.reason}`)):d.kind===`initialized`&&e.log(`${pc.green(`✓`)} Initialized Git repository`),e.log(initExtensionHandoff({packageManager:s,packageName:basename(o),projectPath:o}))}export{EVE_INIT_PACKAGE_SPEC_ENV,runExtensionInitCommand};
1
+ import{initExtensionHandoff,initExtensionInstructions}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{scaffoldExtensionProject}from"#setup/scaffold/index.js";import{packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";const defaultDependencies={detectInvokingPackageManager,detectPackageManager,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldExtensionProject,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`extension-init`);function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}async function assertCanScaffoldInPlace(e){let t=await readdir(e),n=blockingCreateInPlaceEntries(t);if(n.length===0)return;let r=n.slice(0,5).join(`, `),i=n.length>5?`, and ${n.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${r}${i}. Use an empty directory.`)}async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldExtension(e,t,n,r,i){let a=resolve(e),o=t===`.`,s=o?a:join(a,t);if(o)await assertCanScaffoldInPlace(s);else if(await pathExists(s))throw Error(`Cannot create project because "${s}" already exists.`);let c=await mkdtemp(join(a,`.eve-extension-init-`)),l=[];try{let e=o?basename(s):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:c,workspaceProbeDirectory:s,packageManager:n,onWorkspaceRootMutation:e=>{l.push(e)}});return o?await moveDirectoryContents(a,s):await rename(a,s),{projectPath:s,workspaceRootMutations:uniqueWorkspaceRootMutations(l)}}finally{await rm(c,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}async function runExtensionInitCommand(e,t,n,r=defaultDependencies,i){if(i?.(`resolve_target`),n===void 0&&await r.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let a=isLogLevelEnabled(`debug`),o=startCliLiveRow(e);o.update(`Preparing project`);let s,c,l=[],u,d,f;try{let p=n??`.`,m=isCurrentDirectoryTarget(p),h=m?await pathExists(join(resolve(t),`package.json`))?resolve(t):void 0:await resolveTargetDirectory(t,p),g=resolveInitEvePackageOverride();if(h!==void 0)throw Error("`eve extension init` creates a new extension package and cannot add to an existing project. Pass a new directory name, or run from an empty directory with `eve extension init .`.");i?.(`scaffold`),o.update(`Creating extension`),initLog.debug(`creating extension`);let _=r.now(),v=m?`.`:parseProjectName(p),y=resolve(t);c=await resolveScaffoldPackageManager(v===`.`?y:join(y,v),r);let b=await scaffoldExtension(t,v,c,r,g);s=b.projectPath,l=b.workspaceRootMutations,u=r.now()-_,initLog.debug(`creating extension done`,{ms:u}),i?.(`install_dependencies`),o.update(`Installing dependencies`,`${c} install`),initLog.debug(`installing dependencies with ${c}`);let x=r.now(),S=[],C=[],w=await r.runPackageManagerInstall(c,s,{progressDetails:process.stdout.isTTY===!0&&!a,onOutput:e=>{e.text.trim()!==``&&(C.push(e.text),C.length>20&&C.shift(),NPM_NOISE_LINE.test(e.text)||S.push(e.text)),a&&initLog.debug(e.text);let t=installProgressDetail(c,e);t!==void 0&&o.update(`Installing dependencies`,t)}});if(d=r.now()-x,!packageManagerInstallSucceeded(w)){initLog.debug(`dependency installation failed`,{ms:d}),o.stop();let t=S.length>0?S:C;for(let n of t)e.error(n);if(t.length===0){let t=packageManagerInstallFailureMessage(w);t!==void 0&&e.error(t)}throw Error(`Failed to install dependencies in "${s}".`)}initLog.debug(`dependencies installed`,{ms:d}),i?.(`initialize_git`),o.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),f=await r.tryInitializeGit(s)}finally{o.stop()}i?.(`handoff`),e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} extension in ${pc.bold(s)} ${pc.dim(`in ${formatElapsed(u)}`)}`);for(let t of l)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`));e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(d)}`)}`),f.kind===`failed`?e.error(pc.yellow(`Git initialization failed: ${f.reason}`)):f.kind===`initialized`&&e.log(`${pc.green(`✓`)} Initialized Git repository`),e.log(initExtensionHandoff({packageManager:c,packageName:basename(s),projectPath:s}))}export{EVE_INIT_PACKAGE_SPEC_ENV,runExtensionInitCommand};
@@ -1,4 +1,5 @@
1
1
  import { isCodingAgentLaunch } from "#cli/agent-detection.js";
2
+ import type { EveCliSetupStep, EveCliSetupTerminalResult } from "#cli/telemetry/index.js";
2
3
  import { detectInvokingPackageManager, detectPackageManager } from "#setup/package-manager.js";
3
4
  import { runPackageManagerInstall, spawnPackageManager } from "#setup/primitives/index.js";
4
5
  import { addAgentToProject } from "#setup/scaffold/create/add-to-project.js";
@@ -26,16 +27,4 @@ export interface InitCommandDependencies {
26
27
  validateModelSlug: typeof validateModelSlug;
27
28
  }
28
29
  export declare const EVE_INIT_PACKAGE_SPEC_ENV = "EVE_INIT_PACKAGE_SPEC";
29
- /**
30
- * Creates a new eve agent (`target` is a project name), or adds one to an
31
- * existing project (`target` is a directory), without external provisioning.
32
- * A fresh in-place scaffold asks whether to use the current directory or a new
33
- * subdirectory when the current directory is not empty. Coding-agent launches
34
- * must pass an explicit subdirectory instead.
35
- *
36
- * Runs launched by a coding agent get the dev command printed instead of
37
- * spawned after scaffolding, since the dev TUI would wedge the launching agent.
38
- *
39
- * For extension packages, use `eve extension init` instead.
40
- */
41
- export declare function runInitCommand(logger: InitCliLogger, parentDirectory: string, target: string | undefined, options: InitCommandOptions, dependencies?: InitCommandDependencies): Promise<void>;
30
+ export declare function runInitCommand(logger: InitCliLogger, parentDirectory: string, target: string | undefined, options: InitCommandOptions, dependencies?: InitCommandDependencies, trackStep?: (step: EveCliSetupStep) => void, trackTerminal?: (step: EveCliSetupStep, result: EveCliSetupTerminalResult) => void): Promise<void>;
@@ -1 +1 @@
1
- import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),s=await t.isCodingAgentLaunch(),c=await resolveInitTarget({parentDirectory:i,target:a}),l=resolveInitEvePackageOverride(),u=startCliLiveRow(n);u.update(`Preparing project`);try{let e=c.kind===`fresh`?`creating agent`:`adding agent`;u.update(c.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(c.kind===`fresh`){let e=await resolveScaffoldPackageManager(c.projectPath,t),n=isPackageManagerWorkspaceMember(e,c.projectPath),i;try{i=await scaffoldProject(c.projectPath,c.projectName,c.createInPlace,e,r,t,l,c.overwriteExisting)}catch(e){if(c.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(c.projectPath,c.failurePolicy,c.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${c.projectPath}" to its original state.`:`eve could not completely clean "${c.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(c.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:c.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:c.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${c.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(c.projectPath,r,t,l);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:c.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:c.projectPath}}let d=t.now()-i;initLog.debug(`${e} done`,{ms:d}),a.kind===`added`&&(u.stop(),reportExistingProjectChanges(n,a),u=startCliLiveRow(n)),u.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let f=t.now(),p=[],m=[],h=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(m.push(e.text),m.length>20&&m.shift(),NPM_NOISE_LINE.test(e.text)||p.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&u.update(`Installing dependencies`,t)}}),g=t.now()-f;if(!packageManagerInstallSucceeded(h)){initLog.debug(`dependency installation failed`,{ms:g}),u.stop();let e=p.length>0?p:m;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(h);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:g}),a.kind===`created`?(u.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:d,agentLaunched:s,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:g}):{...a,agentElapsedMs:d,agentLaunched:s,installElapsedMs:g}}finally{u.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies){if(await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug))return;let a;try{a=await runInitSteps({dependencies:i,logger:e,options:r,parentDirectory:t,target:n})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(a.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(a.projectPath)} ${pc.dim(`in ${formatElapsed(a.agentElapsedMs)}`)}`);for(let t of a.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(a.projectPath)} ${pc.dim(`in ${formatElapsed(a.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(a.installElapsedMs)}`)}`),a.kind===`created`&&a.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${a.gitResult.stage}: ${a.gitResult.reason}`)),a.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${a.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(a.projectPath)} commit -m "Initial commit from eve"`)));let o=eveDevArguments(a.packageManager),s=[a.packageManager,...o].join(` `),c=initAgentDevHandoff({projectPath:a.projectPath,devCommand:s});if(a.agentLaunched){e.log(initAgentReadySummary(r.model,a.projectPath,{workspace:r.agents!==void 0})),e.log(c);return}let l;try{l=await i.selectInitHandoff({agentName:basename(a.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(l===`exit`)return;if(l!==`eve-dev`){if(e.log(pc.dim(`$ ${l}`)),!await i.spawnCodingAgentRepl({command:l,cwd:a.projectPath,prompt:initAgentReplPrompt({devCommand:s}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${l} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${a.projectPath}".`);return}let u=a.kind===`created`?[...o,`--onboard`]:o;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(a.packageManager,a.projectPath,u)))throw Error(`Development server exited unsuccessfully in "${a.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
1
+ import{initAgentDevHandoff,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{addAgentsToWorkspace,convertScaffoldToAgentWorkspace}from"./init-agent-workspace.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import pc from"#compiled/picocolors/index.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.agents!==void 0&&await convertScaffoldToAgentWorkspace(p,i.agents,i),i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(pc.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a,trackStep:o}=e,s=isLogLevelEnabled(`debug`),c=await t.isCodingAgentLaunch(),l=await resolveInitTarget({parentDirectory:i,target:a}),u=resolveInitEvePackageOverride(),d=startCliLiveRow(n);d.update(`Preparing project`);try{let e=l.kind===`fresh`?`creating agent`:`adding agent`;o?.(`scaffold`),d.update(l.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(l.kind===`fresh`){let e=await resolveScaffoldPackageManager(l.projectPath,t),n=isPackageManagerWorkspaceMember(e,l.projectPath),i;try{i=await scaffoldProject(l.projectPath,l.projectName,l.createInPlace,e,r,t,u,l.overwriteExisting)}catch(e){if(l.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(l.projectPath,l.failurePolicy,l.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${l.projectPath}" to its original state.`:`eve could not completely clean "${l.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(l.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:l.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:l.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${l.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(l.projectPath,r,t,u);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:l.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:l.projectPath}}let f=t.now()-i;initLog.debug(`${e} done`,{ms:f}),a.kind===`added`&&(d.stop(),reportExistingProjectChanges(n,a),d=startCliLiveRow(n)),o?.(`install_dependencies`),d.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let p=t.now(),m=[],h=[],g=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{progressDetails:process.stdout.isTTY===!0&&!s,onOutput:e=>{e.text.trim()!==``&&(h.push(e.text),h.length>20&&h.shift(),NPM_NOISE_LINE.test(e.text)||m.push(e.text)),s&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&d.update(`Installing dependencies`,t)}}),_=t.now()-p;if(!packageManagerInstallSucceeded(g)){initLog.debug(`dependency installation failed`,{ms:_}),d.stop();let e=m.length>0?m:h;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(g);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:_}),a.kind===`created`?(o?.(`initialize_git`),d.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:f,agentLaunched:c,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:_}):{...a,agentElapsedMs:f,agentLaunched:c,installElapsedMs:_}}finally{d.stop()}}async function runInitCommand(e,t,n,r,i=defaultDependencies,a,o){if(a?.(`resolve_target`),await addAgentsToWorkspace(e,t,n,r,i.validateModelSlug)){a?.(`handoff`),o?.(`handoff`,`completed`);return}let s;try{s=await runInitSteps({dependencies:i,logger:e,options:r,parentDirectory:t,target:n,trackStep:a})}catch(e){if(e instanceof WizardCancelledError){o?.(`resolve_target`,`cancelled`);return}throw e}if(a?.(`handoff`),s.kind===`created`){e.log(`${pc.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);for(let t of s.workspaceRootMutations)e.log(pc.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${pc.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${pc.bold(s.projectPath)} ${pc.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);e.log(`${pc.green(`✓`)} Installed dependencies ${pc.dim(`in ${formatElapsed(s.installElapsedMs)}`)}`),s.kind===`created`&&s.gitResult.kind===`failed`&&(e.error(pc.yellow(`Git initialization failed during ${s.gitResult.stage}: ${s.gitResult.reason}`)),s.gitResult.stage===`commit`&&e.error(pc.yellow(`The eve agent was created successfully. Git repository metadata and staged files were preserved at "${s.projectPath}"; the initial commit is optional.\n\nTo create it later, configure Git identity and run:\n git -C ${JSON.stringify(s.projectPath)} commit -m "Initial commit from eve"`)));let c=eveDevArguments(s.packageManager),l=[s.packageManager,...c].join(` `),u=initAgentDevHandoff({projectPath:s.projectPath,devCommand:l});if(s.agentLaunched){e.log(initAgentReadySummary(r.model,s.projectPath,{workspace:r.agents!==void 0})),e.log(u);return}let d;try{d=await i.selectInitHandoff({agentName:basename(s.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d===`exit`)return;if(d!==`eve-dev`){if(e.log(pc.dim(`$ ${d}`)),!await i.spawnCodingAgentRepl({command:d,cwd:s.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(pc.yellow(`Could not seed ${d} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${s.projectPath}".`);return}let f=s.kind===`created`?[...c,`--onboard`]:c;if(e.log(pc.dim(`$ eve dev`)),!resultSucceeded(await i.spawnPackageManager(s.packageManager,s.projectPath,f)))throw Error(`Development server exited unsuccessfully in "${s.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(e!==void 0&&e.length!==0)return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
@@ -0,0 +1,3 @@
1
+ import { type RegistryCommandLogger } from "./registry-recovery.js";
2
+ /** Adds registry namespace mappings to the project's package.json. */
3
+ export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
@@ -0,0 +1 @@
1
+ import{addRegistryMappings}from"./registry-project.js";import{runRegistryAction}from"./registry-recovery.js";async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}export{runRegistryAddCommand};
@@ -6,6 +6,7 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
6
6
  "chat-sdk": "chat-sdk";
7
7
  native: "native";
8
8
  }>>;
9
+ hidden: z.ZodOptional<z.ZodLiteral<true>>;
9
10
  install: z.ZodOptional<z.ZodObject<{
10
11
  pnpm: z.ZodOptional<z.ZodObject<{
11
12
  buildScripts: z.ZodArray<z.ZodObject<{
@@ -44,12 +45,13 @@ declare const EveRegistryMetadataSchema: z.ZodObject<{
44
45
  default: z.ZodDefault<z.ZodBoolean>;
45
46
  }, z.core.$strip>>>;
46
47
  }, z.core.$strip>;
47
- export type RegistrySearchMetadata = Pick<z.infer<typeof EveRegistryMetadataSchema>, "docs" | "implementation">;
48
+ export type RegistrySearchMetadata = Pick<z.infer<typeof EveRegistryMetadataSchema>, "docs" | "hidden" | "implementation">;
48
49
  /** Parses eve-owned metadata from a registry item manifest. */
49
50
  export declare function eveMetadataFromRegistryItem(item: unknown): {
50
51
  requires?: string | undefined;
51
52
  docs?: string | undefined;
52
53
  implementation?: "chat-sdk" | "native" | undefined;
54
+ hidden?: true | undefined;
53
55
  install?: {
54
56
  pnpm?: {
55
57
  buildScripts: {
@@ -81,6 +83,7 @@ export declare function parseRegistryPresentationManifest(input: unknown): {
81
83
  requires?: string | undefined;
82
84
  docs?: string | undefined;
83
85
  implementation?: "chat-sdk" | "native" | undefined;
86
+ hidden?: true | undefined;
84
87
  install?: {
85
88
  pnpm?: {
86
89
  buildScripts: {
@@ -1 +1 @@
1
- import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,implementation:r}=e.meta?.eve??{};(t!==void 0||r!==void 0)&&n.set(e.name,{docs:t,implementation:r})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
1
+ import{RegistryPackageComponentSchema}from"./registry-package.js";import{z}from"#compiled/zod/index.js";const RegistrySetupSchema=z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}),ExactPackageNameSchema=z.string().regex(/^(?:@[a-z0-9][a-z0-9._~-]*\/)?[a-z0-9][a-z0-9._~-]*$/u),PnpmBuildScriptPolicySchema=z.object({packages:z.array(ExactPackageNameSchema).min(1),optional:z.literal(!0),recommendedAction:z.literal(`ignore-optional`),reason:z.string().min(1)}),EveRegistryMetadataSchema=z.object({requires:z.string().optional(),docs:z.string().min(1).optional(),implementation:z.enum([`native`,`chat-sdk`]).optional(),hidden:z.literal(!0).optional(),install:z.object({pnpm:z.object({buildScripts:z.array(PnpmBuildScriptPolicySchema).min(1)}).optional()}).optional(),setup:z.union([RegistrySetupSchema,z.array(RegistrySetupSchema).min(1)]).transform(e=>Array.isArray(e)?e:[e]).optional(),components:z.array(RegistryPackageComponentSchema).min(1).optional()}),EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}),OfficialRegistryCatalogSchema=z.object({items:z.array(z.object({name:z.string().min(1),meta:z.object({eve:EveRegistryMetadataSchema.optional()}).optional()}))}),RegistryPresentationManifestSchema=EveRegistryItemMetadataSchema.extend({title:z.string().optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),files:z.array(z.object({target:z.string()})).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function parseOfficialRegistrySearchMetadata(e){let{items:t}=OfficialRegistryCatalogSchema.parse(e),n=new Map;for(let e of t){let{docs:t,hidden:r,implementation:i}=e.meta?.eve??{};(t!==void 0||r!==void 0||i!==void 0)&&n.set(e.name,{docs:t,hidden:r,implementation:i})}return n}function parseRegistryPresentationManifest(e){return RegistryPresentationManifestSchema.safeParse(e).data}export{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata,parseRegistryPresentationManifest};
@@ -3,6 +3,7 @@ import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js"
3
3
  import { type RegistryCommandLogger } from "./registry-recovery.js";
4
4
  import type { runRegistrySetupCommand } from "./registry-setup-command.js";
5
5
  import { prepareWebRegistryProject } from "./registry-project.js";
6
+ export { runRegistryAddCommand } from "./registry-add-command.js";
6
7
  export type { RegistryCommandLogger } from "./registry-recovery.js";
7
8
  export interface AddCommandOptions {
8
9
  skipInstall?: boolean;
@@ -81,8 +82,6 @@ export declare function installRegistryItem(appRoot: string, item: string, optio
81
82
  }>;
82
83
  /** Installs an official, configured, or URL-addressed registry item. */
83
84
  export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: string, item: string, options: RunAddCommandOptions, dependencies?: AddCommandDependencies): Promise<RegistrySetupCompletion | false | undefined>;
84
- /** Adds registry namespace mappings to the project's package.json. */
85
- export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
86
85
  /** Lists registry items from every configured source or one selected source. */
87
86
  export declare function runRegistryListCommand(logger: RegistryCommandLogger, appRoot: string, source?: string, options?: RegistryCommandOptions): Promise<void>;
88
87
  /** Searches registry items across every configured source or one selected source. */
@@ -1 +1 @@
1
- import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{addRegistryMappings,assertCanInstallWebChat,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!e.startsWith(`@`)&&!/^https?:\/\//.test(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);l!==void 0&&l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)});let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let a=itemAddress(n);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),l?.components!==void 0){if(!isOfficialItemAddress(a))throw Error(`Registry packages require the official eve registry.`);let s=await runRegistryPackage({logger:e,appRoot:t,item:n,components:l.components,config:o,options:r,dependencies:i,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:a,prompter:o})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:a,options:{yes:r.yes,force:r.overwrite,nonInteractive:r.nonInteractive,answers:r.answers,prompter:o,signal:r.signal},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return reportRegistryCompletion(e,n,s,r)}if(r.skipInstall===!0){if(l?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0){if(r.nonInteractive)return reportRegistryCompletion(e,n,{facts:[]},r);e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&!u&&r.setupAuthorized!==!0){e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}let d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,r)})}async function runRegistryAddCommand(e,t,n){await runRegistryAction(e,t,async()=>{let r=await addRegistryMappings(t,n);for(let t of r.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of r.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);r.added.length>0&&e.log(`Added ${r.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{serializeHeadlessSetupEvent}from"./setup-headless.js";import{assertCanInstallWebChat,prepareWebRegistryProject,readRegistryConfig}from"./registry-project.js";import{errorMessage,reportRegistryCompletion,resolveRegistryItemForAdd,runRegistryAction,setupReminder,setupResumeCommand}from"./registry-recovery.js";import{runRegistryAddCommand}from"./registry-add-command.js";import{runDeclaredSetups}from"./registry-declared-setups.js";import{installRegistryItemTransaction}from"./registry-install-transaction.js";import{prepareDeclaredPnpmBuildPolicy}from"./registry-pnpm-build-policy-flow.js";import{runRegistryPackage}from"./registry-package.js";import{eveMetadataFromRegistryItem,parseOfficialRegistrySearchMetadata}from"./registry-metadata.js";import{printRegistrySearchResults,registryViewText}from"./registry-presentation.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,hasInteractiveTerminal,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand,prepareWebRegistryProject};function resolveOfficialRegistryUrl(e=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL){if(e===void 0)return`https://eve.dev/r`;let t;try{t=new URL(e)}catch{throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`)}if(t.protocol!==`http:`&&t.protocol!==`https:`)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must be an HTTP(S) URL.`);if(t.username!==``||t.password!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include credentials.`);if(t.search!==``||t.hash!==``)throw Error(`EVE_DEV_OFFICIAL_REGISTRY_URL must not include a query or fragment.`);return t.pathname=t.pathname.replace(/\/+$/,``),t.toString().replace(/\/$/,``)}const OFFICIAL_REGISTRY=resolveOfficialRegistryUrl(),OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,SKILLS_REGISTRY=`@skills`;function itemAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,n={}){let r=await readEveRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:r,cwd:e,overwrite:n.overwrite})}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function withBuiltInRegistries(e){return{...e,registries:{[SKILLS_REGISTRY]:`https://www.skills.sh/r/{name}?agent=eve`,...e.registries}}}async function readEveRegistryConfig(e){return withBuiltInRegistries(await readRegistryConfig(e))}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!e.startsWith(`@`)&&!/^https?:\/\//.test(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}async function loadOfficialSearchMetadata(){let e=await fetch(OFFICIAL_CATALOG);if(!e.ok)throw Error(`Could not read the eve registry (${e.status}).`);return parseOfficialRegistrySearchMetadata(await e.json())}function searchItemAddress(e){return e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument}function enrichSearchItem(e,t){let n=searchItemAddress(e);return{item:e,address:n,...t.get(n)}}function registrySourceLabel(e){return e===OFFICIAL_CATALOG?`eve`:e===SKILLS_REGISTRY?`skills.sh`:e}function searchPresentationSections(e,t,n){return e.flatMap(e=>{let r=t.get(e);return r===void 0?[]:[{label:registrySourceLabel(e),items:r.items.map(e=>enrichSearchItem(e,n)),total:r.pagination.total}]})}async function printAddSuggestions(e,t,n){try{let r=n.split(`/`).at(-1)||n,{resultsBySource:i,sources:a,metadataByAddress:o}=await searchRegistryCatalog(t,{limit:5,query:r}),s=searchPresentationSections(a,i,o);if(s.every(e=>e.items.length===0))return;e.log(`Did you mean?`),printRegistrySearchResults(e,{query:r,sections:s})}catch{}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let n=await readEveRegistryConfig(e),r=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(n).filter(e=>t.query!==void 0||e!==SKILLS_REGISTRY)],i=await Promise.all(r.map(async e=>{try{return{result:await searchRegistries([e],{config:n,limit:t.limit??100,query:t.query}),source:e}}catch(t){return{error:t,source:e}}})),a=[],o=new Map;for(let e of i)if(`error`in e)a.push({message:errorMessage(e.error),registry:e.source});else{let t=e.result.errors??[];if(a.push(...t),t.length===0){let t=e.result.items.filter(t=>t.registry===e.source);o.set(e.source,{...e.result,items:t,pagination:{...e.result.pagination,total:e.result.items.length===t.length?e.result.pagination.total:0}})}}let s=new Map(a.map(e=>[`${e.registry}\0${e.message}`,e])),c=o.has(OFFICIAL_CATALOG)?await loadOfficialSearchMetadata():new Map,l=o.get(OFFICIAL_CATALOG);if(l!==void 0){let e=l.items.filter(e=>c.get(searchItemAddress(e))?.hidden!==!0);l.items=e,l.pagination={...l.pagination,total:e.length},l.items.sort((e,t)=>{let rank=e=>c.get(searchItemAddress(e))?.implementation===`native`?0:1;return rank(e)-rank(t)})}let u=[...o.values()];return{config:n,result:{items:u.flatMap(e=>e.items),pagination:{hasMore:u.some(e=>e.pagination.hasMore),limit:t.limit??100,offset:0,total:u.reduce((e,t)=>e+t.pagination.total,0)},...s.size>0?{errors:[...s.values()]}:{}},resultsBySource:o,sources:r,metadataByAddress:c}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry};return e.title!==void 0&&(t.title=e.title),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,resultsBySource:o,sources:s,metadataByAddress:c}=await searchRegistryCatalog(t,{limit:i.limit,query:n,source:r}),l=a.errors??[];if(i.json||o.size>0){let t=a.items.map(e=>({...e,...c.get(searchItemAddress(e))})),r={query:n,sections:searchPresentationSections(s,o,c)};i.json&&(r.json={...a,items:t}),printRegistrySearchResults(e,r)}for(let t of l)e.error(`${t.registry}: ${t.message}`);l.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let n=await readEveRegistryConfig(e),r=await getRegistryItems([itemAddress(t)],{config:n});return r.length===1?r[0]:r}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode,c=await runAddCommand(o,e,t,{...n,yes:n.prompter===void 0||n.yes,setupAuthorized:n.prompter!==void 0},r);if(process.exitCode=s,i!==void 0)throw Error(i);if(c===!1)throw new WizardCancelledError;let l={output:a};return c!==void 0&&(l.setup=c),l}async function runAddCommand(e,t,n,r,i=defaultAddCommandDependencies){return runRegistryAction(e,t,async()=>{let a=itemAddress(n);a===itemAddress(`channel/web`)&&await assertCanInstallWebChat(t);let o=await readEveRegistryConfig(t);if(r.skipInstall===!0){if(r.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(r.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(a))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let s=await resolveRegistryItemForAdd(e,async()=>(await getRegistryItems([a],{config:o}))[0],()=>printAddSuggestions(e,t,n));if(!s.found)return;let c=s.item,l=isOfficialItemAddress(a)?eveMetadataFromRegistryItem(c):void 0;if(assertCompatibleEveVersion(l?.requires),l?.components!==void 0){if(!isOfficialItemAddress(a))throw Error(`Registry packages require the official eve registry.`);let s=await runRegistryPackage({logger:e,appRoot:t,item:n,components:l.components,config:o,options:r,dependencies:i,operations:{itemAddress,metadata:eveMetadataFromRegistryItem,assertCompatibleVersion:assertCompatibleEveVersion,runSetups:({item:n,setups:a,prompter:o})=>runDeclaredSetups({logger:e,appRoot:t,item:n,setups:a,options:{yes:r.yes,force:r.overwrite,nonInteractive:r.nonInteractive,answers:r.answers,prompter:o,signal:r.signal},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)}),setupReminder:e=>setupReminder(e,`skipped`)}});return reportRegistryCompletion(e,n,s,r)}if(r.skipInstall===!0){if(l?.setup===void 0)throw Error(`Registry item "${n}" does not declare a setup flow.`);let a=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:r,dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,a,r)}if(!await prepareDeclaredPnpmBuildPolicy({logger:e,appRoot:t,item:n,policies:l?.install?.pnpm?.buildScripts,options:r}))return!1;if(a===itemAddress(`channel/web`)&&await(i.prepareWebRegistryProject??prepareWebRegistryProject)(t),await installRegistryItemTransaction({appRoot:t,item:n,registryItem:c,nonInteractive:r.nonInteractive,logger:e,install:async()=>{await addRegistryItems([a],{config:o,cwd:t,overwrite:r.overwrite,silent:r.silent})}}),l?.setup===void 0)return reportRegistryCompletion(e,n,{facts:[]},r);let u=i.hasInteractiveTerminal?.()??defaultAddCommandDependencies.hasInteractiveTerminal();if(r.nonInteractive&&e.log(serializeHeadlessSetupEvent({version:1,type:`progress`,message:r.skipInstall?`Setup ${n}`:`Installed ${n}`})),r.skipSetup===!0){if(r.nonInteractive)return reportRegistryCompletion(e,n,{facts:[]},r);e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&!u&&r.setupAuthorized!==!0){e.log(setupReminder(n,`skipped`));return}if(!r.nonInteractive&&!r.yes&&r.setupAuthorized!==!0)try{if(await(r.prompter??i.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${n} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(n,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(n,`cancelled`));return}let d=await runDeclaredSetups({logger:e,appRoot:t,item:n,setups:l.setup,options:{...r,force:r.overwrite},dependencies:i,cancelledReminder:setupReminder(n,`cancelled`),resumeCommand:setupResumeCommand(n)});return reportRegistryCompletion(e,n,d,r)})}async function runRegistryListCommand(e,t,n,r={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n,r))}async function runRegistrySearchCommand(e,t,n,r,i={}){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r,{...i,limit:i.limit??10}))}async function runRegistryViewCommand(e,t,n,r={}){await runRegistryAction(e,t,async()=>{let i=await readEveRegistryConfig(t),a=await getRegistryItems([itemAddress(n)],{config:i}),o=a.length===1?a[0]:a;e.log(r.json?JSON.stringify(o,null,2):registryViewText(n,o))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -1,4 +1,5 @@
1
1
  import { type DevBootProgressReporter } from "#internal/dev-boot-progress.js";
2
+ import type { EveCliSetupStepEvent, EveCliSetupTerminalEvent } from "#cli/telemetry/index.js";
2
3
  import type { DevelopmentCliOptions } from "./command-options.js";
3
4
  import type { DevelopmentTuiStartup, RunDevelopmentTuiInput } from "./tui/tui.js";
4
5
  import type { DevelopmentUrlTarget } from "./url-target.js";
@@ -11,6 +12,8 @@ export declare function runInteractiveDevelopmentUi(input: {
11
12
  readonly remoteTarget?: DevelopmentUrlTarget;
12
13
  readonly report?: DevBootProgressReporter;
13
14
  readonly runDevelopmentTui?: (input: RunDevelopmentTuiInput) => Promise<void>;
15
+ readonly onOnboardingStep?: (input: EveCliSetupStepEvent) => void;
16
+ readonly onOnboardingTerminal?: (input: EveCliSetupTerminalEvent) => void;
14
17
  readonly server: {
15
18
  readonly appRoot?: string;
16
19
  readonly serverUrl: string;
@@ -1 +1 @@
1
- import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{findEveProjectContext}from"#internal/project-context.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(e){let t=await devBootPhase(`loading interactive UI`,async()=>e.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,e.report),n=e.server.appRoot??e.applicationRoot,r=await findEveProjectContext(n),i=r?.environmentRoot??n,a=r?.kind===`workspace-member`?r.member.appRoot:void 0,o=e.remoteTarget===void 0||e.existingLocalServer?{kind:`local`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a}:{kind:`remote`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a},s=resolveTuiDisplayOptions(e.options),c=resolveTuiTitle({name:e.options.name,target:o});c!==void 0&&(s.name=c);let l={target:o,initialInput:e.options.input,onboard:e.options.onboard,onBootProgress:e.report,lifecycle:e.lifecycle,...s};e.startup!==void 0&&(l.startup=e.startup),o.kind===`local`&&(l.withExclusiveTerminal=async t=>{let n=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:n,serverUrl:e.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let r;try{r={ok:!0,value:await t()}}catch(e){r={error:e,ok:!1}}let i={leaseId:n,serverUrl:e.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(i)===void 0&&await resumeDevelopmentRuntimeArtifacts(i)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,r.ok?void 0:{cause:r.error});if(!r.ok)throw r.error;return r.value}),e.remoteTarget?.headers===void 0?await t(l):await t({...l,headers:e.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
1
+ import{resolveTuiDisplayOptions}from"./ui-options.js";import{resolveTuiTitle}from"./tui/target.js";import{randomUUID}from"node:crypto";import{findEveProjectContext}from"#internal/project-context.js";import{devBootPhase}from"#internal/dev-boot-progress.js";import{resumeDevelopmentRuntimeArtifacts,suspendDevelopmentRuntimeArtifacts}from"#services/dev-client/runtime-artifacts.js";async function runInteractiveDevelopmentUi(e){let t=await devBootPhase(`loading interactive UI`,async()=>e.runDevelopmentTui??(await import(`#cli/dev/tui/tui.js`)).runDevelopmentTui,e.report),n=e.server.appRoot??e.applicationRoot,r=await findEveProjectContext(n),i=r?.environmentRoot??n,a=r?.kind===`workspace-member`?r.member.appRoot:void 0,o=e.remoteTarget===void 0||e.existingLocalServer?{kind:`local`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a}:{kind:`remote`,serverUrl:e.server.serverUrl,workspaceRoot:i,agentRoot:a},s=resolveTuiDisplayOptions(e.options),c=resolveTuiTitle({name:e.options.name,target:o});c!==void 0&&(s.name=c);let l={target:o,initialInput:e.options.input,onboard:e.options.onboard,onBootProgress:e.report,onOnboardingStep:e.onOnboardingStep,onOnboardingTerminal:e.onOnboardingTerminal,lifecycle:e.lifecycle,...s};e.startup!==void 0&&(l.startup=e.startup),o.kind===`local`&&(l.withExclusiveTerminal=async t=>{let n=randomUUID();if(!await suspendDevelopmentRuntimeArtifacts({leaseId:n,serverUrl:e.server.serverUrl}))throw Error(`Could not pause the development server for integration setup.`);let r;try{r={ok:!0,value:await t()}}catch(e){r={error:e,ok:!1}}let i={leaseId:n,serverUrl:e.server.serverUrl,silent:!0};if(await resumeDevelopmentRuntimeArtifacts(i)===void 0&&await resumeDevelopmentRuntimeArtifacts(i)===void 0)throw Error(`Could not resume the eve development server after integration setup. Restart eve dev before making further source changes.`,r.ok?void 0:{cause:r.error});if(!r.ok)throw r.error;return r.value}),e.remoteTarget?.headers===void 0?await t(l):await t({...l,headers:e.remoteTarget.headers})}export{runInteractiveDevelopmentUi};
@@ -1 +1 @@
1
- import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(e){return{async handle(t,n){let{target:r}=e;if(r.kind===`remote`&&!isPromptCommandAvailableFor(t.name,`remote`))return{message:`/${t.name} needs eve dev running the local server (it is not available with --url).`};if(t.name===`model`&&t.argument.length>0){if(r.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let n=r.agentRoot??r.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:r}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(e.modelChangeRefusal??r)(n);return o===null?{message:a(await(e.applyModel??i)({appRoot:n,slug:t.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let i=n.renderer.setupFlow;if(i===void 0)return{message:`/${t.name} is not supported by this renderer.`};if(t.name===`vc:login`&&r.kind===`remote`){if(n.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let t;try{({runRemoteAuthCommand:t}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await t({connection:n.remoteConnection,flow:e.remoteAuthFlow,renderer:i})}}let a;try{a=await import(`./setup-commands.js`)}catch(e){return{message:`/${t.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:o,SETUP_FLOW_CONFIG:s}=a,c=s[t.name];i.begin(n.setupFlowTitle??c.title,c.indicator),i.setNavigation?.(n.setupFlowNavigation);let l=!0;try{let a={command:t.name,appRoot:r.workspaceRoot,renderer:i,withExclusiveTerminal:n.withExclusiveTerminal,chatGptAccountLabel:n.chatGptAccountLabel};r.agentRoot!==void 0&&(a.agentRoot=r.agentRoot),n.initialModelStep!==void 0&&(a.initialModelStep=n.initialModelStep),n.registryPlannerContext!==void 0&&(a.registryPlannerContext=n.registryPlannerContext),t.name===`add`&&t.argument.length>0&&(a.initialRegistryAddress=t.argument),e.flows!==void 0&&(a.flows=e.flows);let s=await o(a);l=s.preserveFlowDiagnostics;let{preserveFlowDiagnostics:c,partial:u,...d}=s;return d}finally{n.keepSetupFlowOpen!==!0&&i.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
1
+ import{isPromptCommandAvailableFor}from"./prompt-commands.js";import{toErrorMessage}from"#shared/errors.js";function createPromptCommandHandler(e){return{async handle(t,n){let{target:r}=e;if(r.kind===`remote`&&!isPromptCommandAvailableFor(t.name,`remote`))return{message:`/${t.name} needs eve dev running the local server (it is not available with --url).`};if(t.name===`model`&&t.argument.length>0){if(r.kind!==`local`)return{message:`/model needs eve dev running the local server (it is not available with --url).`};let n=r.agentRoot??r.workspaceRoot;try{let{modelChangeRefusalForUneditableModel:r}=await import(`#setup/flows/model.js`),{changeAgentModel:i,formatApplyModelOutcome:a}=await import(`#setup/flows/model-source-change.js`),o=await(e.modelChangeRefusal??r)(n);return o===null?{message:a(await(e.applyModel??i)({appRoot:n,slug:t.argument}))}:{message:o}}catch(e){return{message:`Couldn't change the model: ${toErrorMessage(e)}`}}}let i=n.renderer.setupFlow;if(i===void 0)return{message:`/${t.name} is not supported by this renderer.`};if(t.name===`vc:login`&&r.kind===`remote`){if(n.remoteConnection===void 0)return{message:`/vc:login is not available in this session.`};let t;try{({runRemoteAuthCommand:t}=await import(`./remote-auth-command.js`))}catch(e){return{message:`/vc:login failed: ${toErrorMessage(e)}`}}return{message:await t({connection:n.remoteConnection,flow:e.remoteAuthFlow,renderer:i})}}let a;try{a=await import(`./setup-commands.js`)}catch(e){return{message:`/${t.name} failed: ${toErrorMessage(e)}`}}let{runTuiSetupCommand:o,SETUP_FLOW_CONFIG:s}=a,c=s[t.name];i.begin(n.setupFlowTitle??c.title,c.indicator),i.setNavigation?.(n.setupFlowNavigation);let l=!0;try{let a={command:t.name,appRoot:r.workspaceRoot,renderer:i,withExclusiveTerminal:n.withExclusiveTerminal,chatGptAccountLabel:n.chatGptAccountLabel};r.agentRoot!==void 0&&(a.agentRoot=r.agentRoot),n.initialModelStep!==void 0&&(a.initialModelStep=n.initialModelStep),n.registryPlannerContext!==void 0&&(a.registryPlannerContext=n.registryPlannerContext),n.onOnboardingScreen!==void 0&&(a.onOnboardingScreen=n.onOnboardingScreen),t.name===`add`&&t.argument.length>0&&(a.initialRegistryAddress=t.argument),e.flows!==void 0&&(a.flows=e.flows);let s=await o(a);l=s.preserveFlowDiagnostics;let{preserveFlowDiagnostics:c,partial:u,...d}=s;return d}finally{n.keepSetupFlowOpen!==!0&&i.end({preserveDiagnostics:l})}}}}export{createPromptCommandHandler};
@@ -1,4 +1,6 @@
1
1
  import { type AgentInfoResult, type ConnectionAuthorizationOutcome, type InputRequest, Client, ClientSession } from "#client/index.js";
2
+ import type { EveCliSetupStepEvent, EveCliSetupTerminalEvent } from "#cli/telemetry/index.js";
3
+ import type { OnboardingScreenEvent } from "./setup-commands.js";
2
4
  import { inspectApplication } from "#services/inspect-application.js";
3
5
  import { type SubagentView } from "./subagent-pump.js";
4
6
  export type { SubagentRun, SubagentStepUpdate, SubagentToolUpdate, SubagentView, } from "./subagent-pump.js";
@@ -292,6 +294,7 @@ export interface PromptCommandHandlerContext {
292
294
  /** Provider entry authorized by confirmed boot-time model-access evidence. */
293
295
  readonly initialModelStep?: "provider";
294
296
  readonly registryPlannerContext?: RegistryPlannerContext;
297
+ readonly onOnboardingScreen?: (input: OnboardingScreenEvent) => void;
295
298
  /** Overrides the standalone command title inside a composed setup journey. */
296
299
  readonly setupFlowTitle?: string;
297
300
  /** Progress owned by an enclosing journey while this command runs. */
@@ -364,6 +367,9 @@ export type EveTUIRunnerOptions = TuiDisplayOptions & {
364
367
  initialInput?: string;
365
368
  /** Explicit fresh-agent onboarding handoff from `eve init`. */
366
369
  onboard?: boolean;
370
+ /** Reports timestamped steps and terminal result for fresh-agent onboarding. */
371
+ onOnboardingStep?: (input: EveCliSetupStepEvent) => void;
372
+ onOnboardingTerminal?: (input: EveCliSetupTerminalEvent) => void;
367
373
  /** Handles non-core slash commands without adding feature branches to the runner. */
368
374
  promptCommandHandler?: PromptCommandHandler;
369
375
  /** Commands shown in discovery for this local or remote session. */