eve 0.29.3 → 0.29.5

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 (326) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/src/acp/adapter.d.ts +43 -0
  3. package/dist/src/acp/adapter.js +1 -0
  4. package/dist/src/acp/line-limit.d.ts +3 -0
  5. package/dist/src/acp/line-limit.js +1 -0
  6. package/dist/src/acp/server.d.ts +24 -0
  7. package/dist/src/acp/server.js +1 -0
  8. package/dist/src/channel/clear-session.d.ts +4 -0
  9. package/dist/src/channel/clear-session.js +1 -0
  10. package/dist/src/channel/compact-session.d.ts +4 -0
  11. package/dist/src/channel/compact-session.js +1 -0
  12. package/dist/src/channel/routes.d.ts +34 -6
  13. package/dist/src/channel/types.d.ts +61 -9
  14. package/dist/src/chunks/{use-eve-agent-DaH3cf8K.js → use-eve-agent-BXMIf5fR.js} +130 -11
  15. package/dist/src/chunks/{use-eve-agent-CyDt3Lny.js → use-eve-agent-k-XHfrJT.js} +130 -11
  16. package/dist/src/cli/acp/command.d.ts +22 -0
  17. package/dist/src/cli/acp/command.js +4 -0
  18. package/dist/src/cli/commands/agent-prompt/build-and-verify.md +4 -0
  19. package/dist/src/cli/commands/extension-init.js +1 -1
  20. package/dist/src/cli/commands/init-git.js +1 -1
  21. package/dist/src/cli/commands/init-repl.js +1 -1
  22. package/dist/src/cli/commands/init.js +1 -1
  23. package/dist/src/cli/commands/logs.js +2 -2
  24. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  25. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  26. package/dist/src/cli/commands/registry-project.js +1 -1
  27. package/dist/src/cli/commands/registry-setup-command.js +1 -1
  28. package/dist/src/cli/commands/registry.d.ts +14 -2
  29. package/dist/src/cli/commands/registry.js +1 -1
  30. package/dist/src/cli/commands/trace.d.ts +2 -2
  31. package/dist/src/cli/dev/command-options.d.ts +22 -0
  32. package/dist/src/cli/dev/command-options.js +1 -0
  33. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  34. package/dist/src/cli/dev/diagnostic-sink.js +1 -1
  35. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  36. package/dist/src/cli/dev/local-server-process.js +1 -1
  37. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  38. package/dist/src/cli/dev/tui/message-queue.d.ts +9 -13
  39. package/dist/src/cli/dev/tui/message-queue.js +1 -1
  40. package/dist/src/cli/dev/tui/prompt-commands.d.ts +13 -5
  41. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  42. package/dist/src/cli/dev/tui/remote-auth.d.ts +6 -3
  43. package/dist/src/cli/dev/tui/remote-connection-probe.js +1 -1
  44. package/dist/src/cli/dev/tui/runner.d.ts +7 -7
  45. package/dist/src/cli/dev/tui/runner.js +1 -1
  46. package/dist/src/cli/dev/tui/stream-format.d.ts +14 -0
  47. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  48. package/dist/src/cli/dev/tui/subagent-pump.d.ts +5 -5
  49. package/dist/src/cli/dev/tui/terminal-background.d.ts +23 -0
  50. package/dist/src/cli/dev/tui/terminal-background.js +1 -0
  51. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  52. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +7 -0
  53. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -2
  54. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +10 -5
  55. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  56. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
  57. package/dist/src/cli/dev/tui/traces/trace-surfaces.d.ts +40 -0
  58. package/dist/src/cli/dev/tui/traces/trace-surfaces.js +1 -0
  59. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +8 -1
  60. package/dist/src/cli/dev/tui/traces/trace-view.js +2 -2
  61. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +13 -0
  62. package/dist/src/cli/dev/tui/traces/trace-viewer-session.js +1 -1
  63. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -1
  64. package/dist/src/cli/dev/tui/tui.js +1 -1
  65. package/dist/src/cli/invoke/invoke.js +1 -1
  66. package/dist/src/cli/invoke/result.js +1 -1
  67. package/dist/src/cli/run.d.ts +3 -0
  68. package/dist/src/cli/run.js +3 -3
  69. package/dist/src/cli/ui/terminal-text.d.ts +0 -3
  70. package/dist/src/cli/ui/terminal-text.js +1 -1
  71. package/dist/src/client/agent-info-schema.d.ts +2 -2
  72. package/dist/src/client/agent-info-schema.js +1 -1
  73. package/dist/src/client/index.d.ts +1 -1
  74. package/dist/src/client/open-stream.js +1 -1
  75. package/dist/src/client/session.d.ts +29 -1
  76. package/dist/src/client/session.js +1 -1
  77. package/dist/src/client/types.d.ts +29 -0
  78. package/dist/src/compiled/.vendor-stamp.json +2 -1
  79. package/dist/src/compiled/@agentclientprotocol/sdk/LICENSE +191 -0
  80. package/dist/src/compiled/@agentclientprotocol/sdk/index.d.ts +1835 -0
  81. package/dist/src/compiled/@agentclientprotocol/sdk/index.js +65 -0
  82. package/dist/src/compiled/@agentclientprotocol/sdk/jsonrpc.d.ts +603 -0
  83. package/dist/src/compiled/@agentclientprotocol/sdk/schema/guards.gen.d.ts +199 -0
  84. package/dist/src/compiled/@agentclientprotocol/sdk/schema/index.d.ts +51 -0
  85. package/dist/src/compiled/@agentclientprotocol/sdk/schema/types.gen.d.ts +6118 -0
  86. package/dist/src/compiled/@agentclientprotocol/sdk/stream.d.ts +35 -0
  87. package/dist/src/compiler/artifacts.js +1 -1
  88. package/dist/src/compiler/extension-compatibility.d.ts +8 -8
  89. package/dist/src/compiler/extension-compatibility.js +1 -1
  90. package/dist/src/compiler/manifest.d.ts +11 -22
  91. package/dist/src/compiler/manifest.js +1 -1
  92. package/dist/src/compiler/model-catalog.js +1 -1
  93. package/dist/src/compiler/normalize-agent-config.d.ts +3 -1
  94. package/dist/src/compiler/normalize-agent-config.js +1 -1
  95. package/dist/src/compiler/normalize-manifest.js +1 -1
  96. package/dist/src/compiler/normalize-sandbox.js +1 -1
  97. package/dist/src/compiler/normalize-subagent.d.ts +1 -0
  98. package/dist/src/compiler/normalize-subagent.js +1 -1
  99. package/dist/src/compiler/remote-agent-node.d.ts +3 -0
  100. package/dist/src/compiler/workspace-resources.js +1 -1
  101. package/dist/src/context/dynamic-subagent-lifecycle.d.ts +22 -0
  102. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -0
  103. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  104. package/dist/src/context/keys.d.ts +13 -2
  105. package/dist/src/context/keys.js +1 -1
  106. package/dist/src/context/run-step.js +1 -1
  107. package/dist/src/discover/project-source.js +1 -1
  108. package/dist/src/evals/cli/eval.js +2 -2
  109. package/dist/src/evals/loaders/json.js +1 -1
  110. package/dist/src/evals/loaders/yaml.js +1 -1
  111. package/dist/src/evals/runner/artifacts.js +1 -1
  112. package/dist/src/evals/runner/discover.js +1 -1
  113. package/dist/src/evals/runner/reporters/junit.js +1 -1
  114. package/dist/src/evals/session.js +1 -1
  115. package/dist/src/execution/create-session-step.d.ts +2 -0
  116. package/dist/src/execution/create-session-step.js +1 -1
  117. package/dist/src/execution/delegation-tool.d.ts +3 -0
  118. package/dist/src/execution/delegation-tool.js +1 -0
  119. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  120. package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
  121. package/dist/src/execution/effective-agent-config.d.ts +12 -0
  122. package/dist/src/execution/effective-agent-config.js +1 -0
  123. package/dist/src/execution/node-step.d.ts +4 -0
  124. package/dist/src/execution/node-step.js +1 -1
  125. package/dist/src/execution/runtime-context.d.ts +2 -0
  126. package/dist/src/execution/runtime-context.js +1 -1
  127. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  128. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  129. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  130. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  131. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
  132. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  133. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -1
  134. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +1 -1
  135. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  136. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  137. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  138. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -1
  139. package/dist/src/execution/session-callback-request.d.ts +5 -0
  140. package/dist/src/execution/session-callback-request.js +1 -0
  141. package/dist/src/execution/session-delivery-hook.d.ts +1 -0
  142. package/dist/src/execution/session-delivery-hook.js +1 -1
  143. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  144. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  145. package/dist/src/execution/workflow-entry.js +1 -1
  146. package/dist/src/execution/workflow-runtime.d.ts +2 -0
  147. package/dist/src/execution/workflow-runtime.js +1 -1
  148. package/dist/src/execution/workflow-steps.js +1 -1
  149. package/dist/src/harness/agent-handles.d.ts +238 -0
  150. package/dist/src/harness/agent-handles.js +2 -0
  151. package/dist/src/harness/attachment-staging.js +1 -1
  152. package/dist/src/harness/compaction.d.ts +1 -1
  153. package/dist/src/harness/compaction.js +1 -1
  154. package/dist/src/harness/tool-loop.js +2 -2
  155. package/dist/src/harness/types.d.ts +16 -0
  156. package/dist/src/internal/application/build-profile.js +1 -1
  157. package/dist/src/internal/application/build-workspace.js +1 -1
  158. package/dist/src/internal/application/cache-metadata.js +1 -1
  159. package/dist/src/internal/application/compiled-artifacts.js +8 -8
  160. package/dist/src/internal/application/optional-package-install.js +2 -2
  161. package/dist/src/internal/application/output-publication-artifacts.js +1 -1
  162. package/dist/src/internal/application/output-publication-journal.js +1 -1
  163. package/dist/src/internal/application/output-publication-lock.js +1 -1
  164. package/dist/src/internal/application/output-publication.js +1 -1
  165. package/dist/src/internal/application/package.js +1 -1
  166. package/dist/src/internal/application/paths.js +1 -1
  167. package/dist/src/internal/application/production-compiler-artifacts.js +1 -1
  168. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  169. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  170. package/dist/src/internal/authored-definition/core.js +1 -1
  171. package/dist/src/internal/authored-module-loader.js +3 -3
  172. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  173. package/dist/src/internal/materialized-authored-modules.js +1 -1
  174. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  175. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  176. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  177. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  178. package/dist/src/internal/nitro/host/build-application.js +1 -1
  179. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  180. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  181. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  182. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -1
  183. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  184. package/dist/src/internal/nitro/host/cron-handler-route.js +1 -1
  185. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  186. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  187. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  188. package/dist/src/internal/nitro/host/dev-host-workspace.js +1 -1
  189. package/dist/src/internal/nitro/host/dev-server-http.js +1 -1
  190. package/dist/src/internal/nitro/host/dev-server-state.js +1 -1
  191. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  192. package/dist/src/internal/nitro/host/extension-build-config.js +1 -1
  193. package/dist/src/internal/nitro/host/extension-declarations.js +2 -2
  194. package/dist/src/internal/nitro/host/extension-distribution.js +3 -3
  195. package/dist/src/internal/nitro/host/extension-state-usage.js +1 -1
  196. package/dist/src/internal/nitro/host/normalize-vercel-service-crons.js +1 -1
  197. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  198. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  199. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  200. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  201. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +1 -1
  202. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  203. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  204. package/dist/src/internal/vercel/project-link.js +1 -1
  205. package/dist/src/internal/vercel-agent-summary.d.ts +1 -1
  206. package/dist/src/internal/workflow/development-world-client.js +1 -1
  207. package/dist/src/internal/workflow-bundle/builder-support.js +6 -6
  208. package/dist/src/internal/workflow-bundle/builder.js +3 -3
  209. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  210. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  211. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  212. package/dist/src/protocol/clear-session.d.ts +14 -0
  213. package/dist/src/protocol/clear-session.js +1 -0
  214. package/dist/src/protocol/compact-session.d.ts +14 -0
  215. package/dist/src/protocol/compact-session.js +1 -0
  216. package/dist/src/protocol/message.d.ts +19 -1
  217. package/dist/src/protocol/message.js +1 -1
  218. package/dist/src/protocol/routes.d.ts +10 -0
  219. package/dist/src/protocol/routes.js +1 -1
  220. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  221. package/dist/src/public/channels/discord/verify.js +1 -1
  222. package/dist/src/public/channels/eve.js +1 -1
  223. package/dist/src/public/channels/github/auth.js +2 -2
  224. package/dist/src/public/channels/github/githubChannel.js +1 -1
  225. package/dist/src/public/channels/github/verify.js +1 -1
  226. package/dist/src/public/channels/index.d.ts +1 -1
  227. package/dist/src/public/channels/linear/inbound.js +2 -2
  228. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  229. package/dist/src/public/channels/linear/verify.js +1 -1
  230. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  231. package/dist/src/public/channels/telegram/verify.js +1 -1
  232. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  233. package/dist/src/public/definitions/agent.d.ts +32 -1
  234. package/dist/src/public/definitions/agent.js +1 -1
  235. package/dist/src/public/definitions/channel.d.ts +5 -2
  236. package/dist/src/public/definitions/channel.js +1 -1
  237. package/dist/src/public/definitions/hook.d.ts +1 -0
  238. package/dist/src/public/definitions/tool.d.ts +4 -1
  239. package/dist/src/public/index.d.ts +1 -2
  240. package/dist/src/public/index.js +1 -1
  241. package/dist/src/public/models/openai/chatgpt/auth.js +1 -1
  242. package/dist/src/public/next/server.js +2 -2
  243. package/dist/src/public/next/vercel-output-config.js +1 -1
  244. package/dist/src/public/nuxt/dev-server.js +1 -1
  245. package/dist/src/public/nuxt/vercel-services.js +1 -1
  246. package/dist/src/public/sveltekit/dev-server.js +1 -1
  247. package/dist/src/public/sveltekit/vercel-json.js +1 -1
  248. package/dist/src/runtime/framework-tools/connection-search-dynamic.d.ts +2 -18
  249. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
  250. package/dist/src/runtime/framework-tools/file-state.js +1 -1
  251. package/dist/src/runtime/framework-tools/index.d.ts +7 -2
  252. package/dist/src/runtime/framework-tools/index.js +1 -1
  253. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  254. package/dist/src/runtime/resolve-agent.js +1 -1
  255. package/dist/src/runtime/resolve-dynamic-subagent.d.ts +12 -0
  256. package/dist/src/runtime/resolve-dynamic-subagent.js +1 -0
  257. package/dist/src/runtime/resolve-dynamic-tool.d.ts +15 -0
  258. package/dist/src/runtime/resolve-dynamic-tool.js +1 -1
  259. package/dist/src/runtime/sandbox/keys.js +1 -1
  260. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +22 -0
  261. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -0
  262. package/dist/src/runtime/subagents/registry.d.ts +10 -2
  263. package/dist/src/runtime/subagents/registry.js +1 -1
  264. package/dist/src/runtime/types.d.ts +11 -2
  265. package/dist/src/runtime/workspace/seed-files.js +1 -1
  266. package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
  267. package/dist/src/setup/flows/registry.js +1 -1
  268. package/dist/src/setup/index.d.ts +1 -0
  269. package/dist/src/setup/index.js +1 -1
  270. package/dist/src/setup/integrations/discord/api.d.ts +15 -0
  271. package/dist/src/setup/integrations/discord/api.js +1 -0
  272. package/dist/src/setup/integrations/discord/connect.d.ts +24 -0
  273. package/dist/src/setup/integrations/discord/connect.js +1 -0
  274. package/dist/src/setup/integrations/discord/setup.d.ts +19 -0
  275. package/dist/src/setup/integrations/discord/setup.js +8 -0
  276. package/dist/src/setup/integrations/registry.js +1 -1
  277. package/dist/src/setup/package-manager.js +1 -1
  278. package/dist/src/setup/primitives/pm/pnpm.js +3 -3
  279. package/dist/src/setup/project-resolution.js +1 -1
  280. package/dist/src/setup/prompter.js +1 -1
  281. package/dist/src/setup/registry-setup-client.d.ts +6 -2
  282. package/dist/src/setup/registry-setup-client.js +1 -1
  283. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  284. package/dist/src/setup/scaffold/create/extension.js +1 -1
  285. package/dist/src/setup/scaffold/create/project.js +2 -9
  286. package/dist/src/setup/scaffold/files.js +1 -1
  287. package/dist/src/setup/scaffold/update/channels.js +2 -2
  288. package/dist/src/setup/scaffold/update/connections.js +1 -1
  289. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  290. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  291. package/dist/src/setup/vercel-project-framework.js +1 -1
  292. package/dist/src/shared/agent-definition.d.ts +7 -0
  293. package/dist/src/shared/agent-turn-outcome.d.ts +47 -0
  294. package/dist/src/shared/agent-turn-outcome.js +1 -0
  295. package/dist/src/shared/dynamic-tool-definition.d.ts +1 -5
  296. package/dist/src/shared/dynamic-tool-definition.js +1 -1
  297. package/dist/src/shared/guards.d.ts +2 -0
  298. package/dist/src/shared/guards.js +1 -1
  299. package/dist/src/shared/skill-package.js +1 -1
  300. package/dist/src/shared/skill-paths.d.ts +4 -4
  301. package/dist/src/shared/skill-paths.js +2 -2
  302. package/dist/src/shared/vercel-output-directory.js +1 -1
  303. package/dist/src/source-change/static-source-change.js +1 -1
  304. package/dist/src/svelte/index.js +1 -1
  305. package/dist/src/svelte/use-eve-agent.js +1 -1
  306. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  307. package/dist/src/tracing/local-trace-reader.d.ts +22 -5
  308. package/dist/src/tracing/local-trace-reader.js +1 -1
  309. package/dist/src/tracing/local-trace-retention.js +1 -1
  310. package/dist/src/tracing/local-trace-span-processor.js +1 -1
  311. package/dist/src/vue/index.js +1 -1
  312. package/dist/src/vue/use-eve-agent.js +1 -1
  313. package/docs/channels/custom.mdx +41 -1
  314. package/docs/channels/discord.mdx +30 -14
  315. package/docs/channels/eve.mdx +26 -1
  316. package/docs/concepts/default-harness.md +4 -0
  317. package/docs/guides/acp.md +91 -0
  318. package/docs/guides/client/streaming.mdx +38 -0
  319. package/docs/guides/dev-tui.md +10 -7
  320. package/docs/guides/dynamic-capabilities.md +49 -6
  321. package/docs/guides/meta.json +1 -0
  322. package/docs/reference/cli.md +3 -0
  323. package/docs/reference/project-layout.md +1 -1
  324. package/docs/reference/typescript-api.md +48 -48
  325. package/docs/subagents.mdx +32 -2
  326. package/package.json +3 -2
@@ -7,6 +7,8 @@ const EVE_HEALTH_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/health`;
7
7
  const EVE_INFO_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/info`;
8
8
  const EVE_CREATE_SESSION_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/session`;
9
9
  const EVE_RESET_SESSION_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/session/reset`;
10
+ const EVE_COMPACT_SESSION_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/session/compact`;
11
+ const EVE_CLEAR_SESSION_ROUTE_PATH = `${EVE_ROUTE_PREFIX}/session/clear`;
10
12
  const EVE_CONTINUE_SESSION_ROUTE_PATTERN = `${EVE_ROUTE_PREFIX}/session/:sessionId`;
11
13
  const EVE_MESSAGE_STREAM_ROUTE_PATTERN = `${EVE_ROUTE_PREFIX}/session/:sessionId/stream`;
12
14
  const EVE_CANCEL_TURN_ROUTE_PATTERN = `${EVE_ROUTE_PREFIX}/session/:sessionId/cancel`;
@@ -118,7 +120,7 @@ const schedule = entry.extend({
118
120
  markdown: z.string().optional()
119
121
  });
120
122
  const subagent = entry.extend({
121
- description: z.string(),
123
+ description: z.string().optional(),
122
124
  entryPath: z.string(),
123
125
  nodeId: z.string(),
124
126
  rootPath: z.string(),
@@ -383,6 +385,28 @@ const CancelTurnResponseSchema = z.object({
383
385
  status: z.enum(["accepted", "no_active_turn"])
384
386
  });
385
387
 
388
+ //#endregion
389
+ //#region src/protocol/clear-session.ts
390
+ const ClearResponseSchema = z.discriminatedUnion("status", [z.object({
391
+ ok: z.literal(true),
392
+ sessionId: z.string().min(1),
393
+ status: z.literal("accepted")
394
+ }), z.object({
395
+ ok: z.literal(true),
396
+ status: z.literal("no_active_session")
397
+ })]);
398
+
399
+ //#endregion
400
+ //#region src/protocol/compact-session.ts
401
+ const CompactResponseSchema = z.discriminatedUnion("status", [z.object({
402
+ ok: z.literal(true),
403
+ sessionId: z.string().min(1),
404
+ status: z.literal("accepted")
405
+ }), z.object({
406
+ ok: z.literal(true),
407
+ status: z.literal("no_active_session")
408
+ })]);
409
+
386
410
  //#endregion
387
411
  //#region src/protocol/reset-session.ts
388
412
  const ResetResponseSchema = z.discriminatedUnion("status", [z.object({
@@ -679,6 +703,7 @@ async function openStreamBody(input) {
679
703
  let response;
680
704
  try {
681
705
  response = await fetch(url, {
706
+ cache: "no-store",
682
707
  headers,
683
708
  redirect: input.redirect,
684
709
  signal: input.signal ?? null
@@ -810,6 +835,33 @@ var ClientSession = class {
810
835
  get state() {
811
836
  return this.#state;
812
837
  }
838
+ async snapshot(options) {
839
+ options?.signal?.throwIfAborted();
840
+ const initialState = this.#state;
841
+ const sessionId = initialState.sessionId;
842
+ if (!sessionId) throw new Error("Session has no session ID. Send a message first.");
843
+ const events = [];
844
+ for await (const event of this.#readStream({
845
+ follow: false,
846
+ sessionId,
847
+ signal: options?.signal,
848
+ startIndex: 0
849
+ })) events.push(event);
850
+ options?.signal?.throwIfAborted();
851
+ const lastEvent = events.at(-1);
852
+ const continuationToken = lastEvent?.type === "session.waiting" ? lastEvent.data.continuationToken : lastEvent?.type === "session.completed" && this.#context.preserveCompletedSessions ? initialState.continuationToken : void 0;
853
+ return {
854
+ events,
855
+ session: continuationToken === void 0 ? {
856
+ sessionId,
857
+ streamIndex: events.length
858
+ } : {
859
+ continuationToken,
860
+ sessionId,
861
+ streamIndex: events.length
862
+ }
863
+ };
864
+ }
813
865
  async send(input) {
814
866
  const payload = normalizeSendTurnInput(input);
815
867
  const state = this.#state;
@@ -854,6 +906,66 @@ var ClientSession = class {
854
906
  status: result.data.status
855
907
  };
856
908
  }
909
+ async clear() {
910
+ const state = this.#state;
911
+ const continuationToken = state.continuationToken;
912
+ if (continuationToken === void 0) {
913
+ if (state.sessionId !== void 0) throw new Error("Session has no continuation token. Consume its event stream before clearing.");
914
+ return { status: "no_active_session" };
915
+ }
916
+ const url = createClientUrl(this.#context.host, EVE_CLEAR_SESSION_ROUTE_PATH);
917
+ const headers = await this.#context.resolveHeaders();
918
+ headers.set("content-type", "application/json");
919
+ const response = await fetch(url, withRedirectPolicy$1({
920
+ body: JSON.stringify({ continuationToken }),
921
+ headers,
922
+ method: "POST"
923
+ }, this.#context.redirect));
924
+ const body = await response.text();
925
+ if (!response.ok) throw new ClientError(response.status, body, response.headers);
926
+ let payload;
927
+ try {
928
+ payload = JSON.parse(body);
929
+ } catch {
930
+ throw new Error(`Clear route returned invalid JSON (${response.status}).`);
931
+ }
932
+ const result = ClearResponseSchema.safeParse(payload);
933
+ if (!result.success || result.data.status === "accepted" && state.sessionId !== void 0 && result.data.sessionId !== state.sessionId) throw new Error(`Clear route returned an invalid response (${response.status}).`);
934
+ return result.data.status === "accepted" ? {
935
+ sessionId: result.data.sessionId,
936
+ status: "accepted"
937
+ } : { status: "no_active_session" };
938
+ }
939
+ async compact() {
940
+ const state = this.#state;
941
+ const continuationToken = state.continuationToken;
942
+ if (continuationToken === void 0) {
943
+ if (state.sessionId !== void 0) throw new Error("Session has no continuation token. Consume its event stream before compacting.");
944
+ return { status: "no_active_session" };
945
+ }
946
+ const url = createClientUrl(this.#context.host, EVE_COMPACT_SESSION_ROUTE_PATH);
947
+ const headers = await this.#context.resolveHeaders();
948
+ headers.set("content-type", "application/json");
949
+ const response = await fetch(url, withRedirectPolicy$1({
950
+ body: JSON.stringify({ continuationToken }),
951
+ headers,
952
+ method: "POST"
953
+ }, this.#context.redirect));
954
+ const body = await response.text();
955
+ if (!response.ok) throw new ClientError(response.status, body, response.headers);
956
+ let payload;
957
+ try {
958
+ payload = JSON.parse(body);
959
+ } catch {
960
+ throw new Error(`Compact route returned invalid JSON (${response.status}).`);
961
+ }
962
+ const result = CompactResponseSchema.safeParse(payload);
963
+ if (!result.success || result.data.status === "accepted" && state.sessionId !== void 0 && result.data.sessionId !== state.sessionId) throw new Error(`Compact route returned an invalid response (${response.status}).`);
964
+ return result.data.status === "accepted" ? {
965
+ sessionId: result.data.sessionId,
966
+ status: "accepted"
967
+ } : { status: "no_active_session" };
968
+ }
857
969
  async reset() {
858
970
  const state = this.#state;
859
971
  const continuationToken = state.continuationToken;
@@ -923,10 +1035,8 @@ var ClientSession = class {
923
1035
  async *#createEventStream(sessionId, continuationToken, initialState, input) {
924
1036
  const events = [];
925
1037
  try {
926
- for await (const event of followStreamIterable({
927
- host: this.#context.host,
928
- resolveHeaders: () => this.#context.resolveHeaders(input.headers),
929
- redirect: this.#context.redirect,
1038
+ for await (const event of this.#readStream({
1039
+ headers: input.headers,
930
1040
  streamReconnectPolicy: input.streamReconnectPolicy,
931
1041
  sessionId,
932
1042
  signal: input.signal,
@@ -951,15 +1061,12 @@ var ClientSession = class {
951
1061
  const streamIndex = options?.startIndex ?? initialState.streamIndex;
952
1062
  const events = [];
953
1063
  try {
954
- for await (const event of followStreamIterable({
1064
+ for await (const event of this.#readStream({
955
1065
  follow: options?.follow,
956
- host: this.#context.host,
957
- resolveHeaders: () => this.#context.resolveHeaders(),
958
- redirect: this.#context.redirect,
959
- streamReconnectPolicy: options?.streamReconnectPolicy,
960
1066
  sessionId,
961
1067
  signal: options?.signal,
962
- startIndex: streamIndex
1068
+ startIndex: streamIndex,
1069
+ streamReconnectPolicy: options?.streamReconnectPolicy
963
1070
  })) {
964
1071
  events.push(event);
965
1072
  yield event;
@@ -978,6 +1085,18 @@ var ClientSession = class {
978
1085
  });
979
1086
  }
980
1087
  }
1088
+ #readStream(input) {
1089
+ return followStreamIterable({
1090
+ follow: input.follow,
1091
+ host: this.#context.host,
1092
+ resolveHeaders: () => this.#context.resolveHeaders(input.headers),
1093
+ redirect: this.#context.redirect,
1094
+ streamReconnectPolicy: input.streamReconnectPolicy,
1095
+ sessionId: input.sessionId,
1096
+ signal: input.signal,
1097
+ startIndex: input.startIndex
1098
+ });
1099
+ }
981
1100
  };
982
1101
  async function postTurnWithRetry(input) {
983
1102
  const attempts = input.mustDeliver ? DELIVER_RETRY_ATTEMPTS : 1;
@@ -0,0 +1,22 @@
1
+ import { Command } from "#compiled/commander/index.js";
2
+ import type { ClientOptions } from "#client/types.js";
3
+ import type { DevelopmentServer, DevelopmentServerOptions } from "#internal/nitro/host/types.js";
4
+ export type RunAcpServer = (input: {
5
+ readonly auth?: ClientOptions["auth"];
6
+ readonly eveVersion: string;
7
+ readonly headers?: ClientOptions["headers"];
8
+ readonly serverUrl: string;
9
+ readonly signal?: AbortSignal;
10
+ readonly workspaceRoot?: string;
11
+ }) => Promise<void>;
12
+ export type ResolveVerifiedRemoteDevelopmentClient = typeof import("#setup/verified-remote-client.js").resolveVerifiedRemoteDevelopmentClient;
13
+ export interface RegisterAcpCommandOptions {
14
+ readonly appRoot: string;
15
+ readonly eveVersion: string;
16
+ readonly program: Command;
17
+ readonly resolveVerifiedRemoteDevelopmentClient?: ResolveVerifiedRemoteDevelopmentClient;
18
+ readonly runAcpServer?: RunAcpServer;
19
+ readonly startHost?: (appRoot: string, options?: DevelopmentServerOptions) => DevelopmentServer;
20
+ }
21
+ /** Registers the ACP stdio bridge for local and deployed eve agents. */
22
+ export declare function registerAcpCommand(options: RegisterAcpCommandOptions): void;
@@ -0,0 +1,4 @@
1
+ import"#compiled/commander/index.js";import{loadDevelopmentEnvironmentFiles}from"#cli/dev/environment.js";import{parseDevelopmentHeaderOption,resolveDevelopmentUrlTarget}from"#cli/dev/url-target.js";import{parseDevelopmentServerUrl}from"#cli/dev/url.js";import{FORCED_EXIT_BACKSTOP_MS,installShutdownSignal}from"#cli/shutdown.js";function registerAcpCommand(o){o.program.command(`acp`).description(`Serve an eve agent through stable ACP v1 over stdio.`).argument(`[url]`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`-u, --url <url>`,`Connect to an existing server URL`,parseDevelopmentServerUrl).option(`--scope <team>`,`Vercel team that owns the URL target`).option(`-H, --header <header>`,`Request header for a URL target, in "Name: value" form (repeatable)`,parseDevelopmentHeaderOption).addHelpText(`after`,`
2
+ Without a URL, eve supervises a local development server. You can also pass a bare URL, for example: eve acp https://example.com
3
+ ACP does not grant the agent access to the client's workspace or terminal.
4
+ `).action(async(t,r)=>{let s=resolveDevelopmentUrlTarget(r,t);loadDevelopmentEnvironmentFiles(o.appRoot);let c=installShutdownSignal({exitAfterMs:FORCED_EXIT_BACKSTOP_MS});if(s!==void 0){try{await runAcp(o,{headers:s.headers,serverUrl:s.serverUrl,signal:c.signal,vercelScope:r.scope??process.env.EVE_VERCEL_SCOPE})}finally{c.dispose()}return}let l,u,closeServer=()=>l===void 0?Promise.resolve():(u??=l.close(),u.catch(()=>void 0),u);c.signal.addEventListener(`abort`,()=>void closeServer(),{once:!0});try{l=(o.startHost??await loadStartHost())(o.appRoot,{existing:`reject`,host:`127.0.0.1`,output:`stderr`,port:0});let e=await Promise.race([l.start(),c.stopped.then(()=>void 0)]);if(e===void 0)return;await runAcp(o,{serverUrl:e.url,signal:c.signal,workspaceRoot:e.appRoot}),c.requestStop()}finally{await closeServer(),c.dispose()}})}async function runAcp(e,t){let n=e.runAcpServer??(await import(`#acp/server.js`)).runAcpServer,{vercelScope:r,...i}=t,a=typeof i.headers==`function`?void 0:i.headers,o=Object.keys(a??{}).some(e=>e.toLowerCase()===`authorization`);if(i.workspaceRoot!==void 0||o){await n({eveVersion:e.eveVersion,...i});return}let{options:s}=await(e.resolveVerifiedRemoteDevelopmentClient??(await import(`#setup/verified-remote-client.js`)).resolveVerifiedRemoteDevelopmentClient)({headers:a,serverUrl:i.serverUrl,signal:i.signal,vercelScope:r,workspaceRoot:e.appRoot});await n({auth:s.auth,eveVersion:e.eveVersion,headers:s.headers,serverUrl:i.serverUrl,signal:i.signal})}async function loadStartHost(){return(await import(`#cli/dev/local-server-process.js`)).createDevelopmentServer}export{registerAcpCommand};
@@ -9,6 +9,10 @@ package docs are unavailable, use https://eve.dev/docs as a fallback. Read
9
9
  such as `connections`, `channels/slack`, or `guides/auth-and-route-protection`
10
10
  for the Vercel Connect flow.
11
11
 
12
+ Before implementing an integration yourself, use `eve registry search <query>` or
13
+ `eve registry list` to discover available integrations. Inspect one with
14
+ `eve registry view <item>`, then install it with `eve add <item>`.
15
+
12
16
  - Put the purpose in `agent/instructions.md` (the always-on system prompt),
13
17
  replacing the scaffold's placeholder with what the user said the agent should
14
18
  do.
@@ -1 +1 @@
1
- import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{initExtensionHandoff,initExtensionInstructions}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import{scaffoldExtensionProject}from"#setup/scaffold/index.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";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{runPackageManagerInstall}from"#setup/primitives/index.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";var import_picocolors=__toESM(require_picocolors(),1);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=blockingCreateInPlaceEntries(await readdir(e));if(t.length===0)return;let n=t.slice(0,5).join(`, `),r=t.length>5?`, and ${t.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${n}${r}. 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===`.`,c=o?a:join(a,t);if(o)await assertCanScaffoldInPlace(c);else if(await pathExists(c))throw Error(`Cannot create project because "${c}" already exists.`);let u=await mkdtemp(join(a,`.eve-extension-init-`)),p=[];try{let e=o?basename(c):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:u,workspaceProbeDirectory:c,packageManager:n,onWorkspaceRootMutation:e=>{p.push(e)}});return o?await moveDirectoryContents(a,c):await rename(a,c),{projectPath:c,workspaceRootMutations:uniqueWorkspaceRootMutations(p)}}finally{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 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,i,a=defaultDependencies){if(i===void 0&&await a.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let c=isLogLevelEnabled(`debug`),l=startCliLiveRow(e);l.update(`Preparing project`);let u,d,f=[],p,m,h;try{let n=i??`.`,r=isCurrentDirectoryTarget(n),o=r?await pathExists(join(resolve(t),`package.json`))?resolve(t):void 0:await resolveTargetDirectory(t,n),s=resolveInitEvePackageOverride();if(o!==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 .`.");l.update(`Creating extension`),initLog.debug(`creating extension`);let g=a.now(),_=r?`.`:parseProjectName(n),v=resolve(t);d=await resolveScaffoldPackageManager(_===`.`?v:join(v,_),a);let y=await scaffoldExtension(t,_,d,a,s);u=y.projectPath,f=y.workspaceRootMutations,p=a.now()-g,initLog.debug(`creating extension done`,{ms:p}),l.update(`Installing dependencies`,`${d} install`),initLog.debug(`installing dependencies with ${d}`);let b=a.now(),x=[],S=[],C=await a.runPackageManagerInstall(d,u,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!c,onOutput:e=>{e.text.trim()!==``&&(S.push(e.text),S.length>20&&S.shift(),NPM_NOISE_LINE.test(e.text)||x.push(e.text)),c&&initLog.debug(e.text);let t=installProgressDetail(d,e);t!==void 0&&l.update(`Installing dependencies`,t)}});if(m=a.now()-b,!C){initLog.debug(`dependency installation failed`,{ms:m}),l.stop();let t=x.length>0?x:S;for(let n of t)e.error(n);throw Error(`Failed to install dependencies in "${u}".`)}initLog.debug(`dependencies installed`,{ms:m}),l.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),h=await a.tryInitializeGit(u)}finally{l.stop()}e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} extension in ${import_picocolors.default.bold(u)} ${import_picocolors.default.dim(`in ${formatElapsed(p)}`)}`);for(let t of f)e.log(import_picocolors.default.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`));e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies ${import_picocolors.default.dim(`in ${formatElapsed(m)}`)}`),h.kind===`failed`?e.error(import_picocolors.default.yellow(`Git initialization failed: ${h.reason}`)):h.kind===`initialized`&&e.log(`${import_picocolors.default.green(`✓`)} Initialized Git repository`),e.log(initExtensionHandoff({packageManager:d,packageName:basename(u),projectPath:u}))}export{EVE_INIT_PACKAGE_SPEC_ENV,runExtensionInitCommand};
1
+ import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{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{scaffoldExtensionProject}from"#setup/scaffold/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{runPackageManagerInstall}from"#setup/primitives/index.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";var import_picocolors=__toESM(require_picocolors(),1);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=blockingCreateInPlaceEntries(await readdir(e));if(t.length===0)return;let n=t.slice(0,5).join(`, `),r=t.length>5?`, and ${t.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${n}${r}. 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 o=resolve(e),l=t===`.`,u=l?o:join(o,t);if(l)await assertCanScaffoldInPlace(u);else if(await pathExists(u))throw Error(`Cannot create project because "${u}" already exists.`);let d=await mkdtemp(join(o,`.eve-extension-init-`)),p=[];try{let e=l?basename(u):t,a=await r.scaffoldExtensionProject({projectName:e,evePackage:i,targetDirectory:d,workspaceProbeDirectory:u,packageManager:n,onWorkspaceRootMutation:e=>{p.push(e)}});return l?await moveDirectoryContents(a,u):await rename(a,u),{projectPath:u,workspaceRootMutations:uniqueWorkspaceRootMutations(p)}}finally{await rm(d,{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,i,a=defaultDependencies){if(i===void 0&&await a.isCodingAgentLaunch()){e.log(initExtensionInstructions());return}let o=isLogLevelEnabled(`debug`),s=startCliLiveRow(e);s.update(`Preparing project`);let c,l,u=[],p,m,h;try{let n=i??`.`,r=isCurrentDirectoryTarget(n),d=r?await pathExists(join(resolve(t),`package.json`))?resolve(t):void 0:await resolveTargetDirectory(t,n),f=resolveInitEvePackageOverride();if(d!==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 .`.");s.update(`Creating extension`),initLog.debug(`creating extension`);let g=a.now(),_=r?`.`:parseProjectName(n),v=resolve(t);l=await resolveScaffoldPackageManager(_===`.`?v:join(v,_),a);let y=await scaffoldExtension(t,_,l,a,f);c=y.projectPath,u=y.workspaceRootMutations,p=a.now()-g,initLog.debug(`creating extension done`,{ms:p}),s.update(`Installing dependencies`,`${l} install`),initLog.debug(`installing dependencies with ${l}`);let b=a.now(),x=[],S=[],C=await a.runPackageManagerInstall(l,c,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(S.push(e.text),S.length>20&&S.shift(),NPM_NOISE_LINE.test(e.text)||x.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(l,e);t!==void 0&&s.update(`Installing dependencies`,t)}});if(m=a.now()-b,!C){initLog.debug(`dependency installation failed`,{ms:m}),s.stop();let t=x.length>0?x:S;for(let n of t)e.error(n);throw Error(`Failed to install dependencies in "${c}".`)}initLog.debug(`dependencies installed`,{ms:m}),s.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),h=await a.tryInitializeGit(c)}finally{s.stop()}e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} extension in ${import_picocolors.default.bold(c)} ${import_picocolors.default.dim(`in ${formatElapsed(p)}`)}`);for(let t of u)e.log(import_picocolors.default.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`));e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies ${import_picocolors.default.dim(`in ${formatElapsed(m)}`)}`),h.kind===`failed`?e.error(import_picocolors.default.yellow(`Git initialization failed: ${h.reason}`)):h.kind===`initialized`&&e.log(`${import_picocolors.default.green(`✓`)} Initialized Git repository`),e.log(initExtensionHandoff({packageManager:l,packageName:basename(c),projectPath:c}))}export{EVE_INIT_PACKAGE_SPEC_ENV,runExtensionInitCommand};
@@ -1 +1 @@
1
- import{join}from"node:path";import{rm}from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";const GIT_TIMEOUT_MS=5e3,runFile=promisify(execFile);async function commandSucceeds(e,t,n){try{let r={timeout:GIT_TIMEOUT_MS,windowsHide:!0};return n!==void 0&&(r.cwd=n),await runFile(e,[...t],r),!0}catch{return!1}}function isGitAvailable(){return commandSucceeds(`git`,[`--version`])}async function isInsideExistingRepository(e){return await commandSucceeds(`git`,[`rev-parse`,`--is-inside-work-tree`],e)||await commandSucceeds(`hg`,[`--cwd`,`.`,`root`],e)}function hasConfiguredDefaultBranch(e){return commandSucceeds(`git`,[`config`,`init.defaultBranch`],e)}async function runGit(e,t){await runFile(`git`,[...t],{cwd:e,timeout:GIT_TIMEOUT_MS,windowsHide:!0})}async function tryInitializeGit(n){if(!await isGitAvailable()||await isInsideExistingRepository(n))return{kind:`skipped`};let r=!1;try{return await runGit(n,[`init`]),r=!0,await hasConfiguredDefaultBranch(n)||await runGit(n,[`checkout`,`-b`,`main`]),await runGit(n,[`add`,`-A`]),await runGit(n,[`commit`,`-m`,`Initial commit from eve`]),{kind:`initialized`}}catch(i){return r&&await rm(join(n,`.git`),{recursive:!0,force:!0}).catch(()=>{}),{kind:`failed`,reason:i instanceof Error?i.message:String(i)}}}export{tryInitializeGit};
1
+ import{rm}from"node:fs/promises";import{join}from"node:path";import{execFile}from"node:child_process";import{promisify}from"node:util";const GIT_TIMEOUT_MS=5e3,runFile=promisify(execFile);async function commandSucceeds(e,t,n){try{let r={timeout:GIT_TIMEOUT_MS,windowsHide:!0};return n!==void 0&&(r.cwd=n),await runFile(e,[...t],r),!0}catch{return!1}}function isGitAvailable(){return commandSucceeds(`git`,[`--version`])}async function isInsideExistingRepository(e){return await commandSucceeds(`git`,[`rev-parse`,`--is-inside-work-tree`],e)||await commandSucceeds(`hg`,[`--cwd`,`.`,`root`],e)}function hasConfiguredDefaultBranch(e){return commandSucceeds(`git`,[`config`,`init.defaultBranch`],e)}async function runGit(e,t){await runFile(`git`,[...t],{cwd:e,timeout:GIT_TIMEOUT_MS,windowsHide:!0})}async function tryInitializeGit(n){if(!await isGitAvailable()||await isInsideExistingRepository(n))return{kind:`skipped`};let r=!1;try{return await runGit(n,[`init`]),r=!0,await hasConfiguredDefaultBranch(n)||await runGit(n,[`checkout`,`-b`,`main`]),await runGit(n,[`add`,`-A`]),await runGit(n,[`commit`,`-m`,`Initial commit from eve`]),{kind:`initialized`}}catch(i){return r&&await rm(join(n,`.git`),{recursive:!0,force:!0}).catch(()=>{}),{kind:`failed`,reason:i instanceof Error?i.message:String(i)}}}export{tryInitializeGit};
@@ -1 +1 @@
1
- import{hasInteractiveTerminal}from"./preconditions.js";import{constants}from"node:fs";import{delimiter,extname,join}from"node:path";import{createPrompter}from"#setup/prompter.js";import{access,stat}from"node:fs/promises";import{spawn}from"node:child_process";const positional=e=>[e],CODING_AGENT_REPLS=[{command:`claude`,label:`Claude Code`,promptArgs:positional},{command:`codex`,label:`Codex`,promptArgs:positional},{command:`cursor-agent`,label:`Cursor`,promptArgs:positional},{command:`droid`,label:`Droid`,promptArgs:positional},{command:`gemini`,label:`Gemini CLI`,promptArgs:e=>[`-i`,e]},{command:`opencode`,label:`opencode`,promptArgs:e=>[`--prompt`,e]},{command:`pi`,label:`Pi`,promptArgs:positional}],WINDOWS_EXECUTABLE_EXTENSIONS=[`.COM`,`.EXE`,`.BAT`,`.CMD`],defaultDependencies={createPrompter,hasInteractiveTerminal,isCodingAgentReplAvailable};function executableNames(e){if(process.platform!==`win32`)return[e];let t=process.env.PATHEXT?.split(`;`).filter(Boolean);return(t&&t.length>0?t:WINDOWS_EXECUTABLE_EXTENSIONS).map(t=>`${e}${t}`)}async function isExecutable(e){try{return(await stat(e)).isFile()?(await access(e,constants.X_OK),!0):!1}catch{return!1}}async function resolveCodingAgentRepl(e){let t=process.env.PATH;if(t===void 0||t.length===0)return null;for(let r of t.split(delimiter))if(r.length!==0)for(let t of executableNames(e)){let e=join(r,t);if(await isExecutable(e))return e}return null}async function isCodingAgentReplAvailable(e){return await resolveCodingAgentRepl(e)!==null}function handoffOptions(e,t){return[{value:`eve-dev`,label:`Start eve dev`,focusHint:`talk to '${t}' in your terminal`},...e.map(e=>({value:e.command,label:`Open ${e.label}`,focusHint:`build '${t}' using ${e.label}`}))]}async function selectInitHandoff(e){let t={...defaultDependencies,...e.deps};if(!t.hasInteractiveTerminal())return`eve-dev`;let n=await Promise.all(CODING_AGENT_REPLS.map(({command:e})=>t.isCodingAgentReplAvailable(e))),r=CODING_AGENT_REPLS.filter((e,t)=>n[t]);return r.length===0?`eve-dev`:t.createPrompter().select({message:`How would you like to continue?`,options:handoffOptions(r,e.agentName),initialValue:`eve-dev`})}function codingAgentRepl(e){let t=CODING_AGENT_REPLS.find(t=>t.command===e);if(t===void 0)throw Error(`Unsupported coding-agent REPL "${e}".`);return t}function isDirectlySpawnable(e,t){if(t!==`win32`)return!0;let n=extname(e).toLowerCase();return n===`.exe`||n===`.com`}function replSpawnPlan(e,t,n,r=process.platform){return t!==null&&isDirectlySpawnable(t,r)?{file:t,args:codingAgentRepl(e).promptArgs(n),shell:!1,seeded:!0}:{file:e,args:[],shell:r===`win32`,seeded:!1}}async function spawnCodingAgentRepl(e){let t=e.resolvePath??resolveCodingAgentRepl,n=replSpawnPlan(e.command,await t(e.command),e.prompt);return n.seeded||e.onPromptUnseeded?.(e.prompt),new Promise(t=>{let r=spawn(n.file,n.args,{cwd:e.cwd,shell:n.shell,stdio:`inherit`}),i=!1,settle=e=>{i||(i=!0,t(e))};r.once(`error`,()=>settle(!1)),r.once(`close`,e=>settle(e===0))})}export{isCodingAgentReplAvailable,replSpawnPlan,resolveCodingAgentRepl,selectInitHandoff,spawnCodingAgentRepl};
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{access,stat}from"node:fs/promises";import{constants}from"node:fs";import{delimiter,extname,join}from"node:path";import{createPrompter}from"#setup/prompter.js";import{spawn}from"node:child_process";const positional=e=>[e],CODING_AGENT_REPLS=[{command:`claude`,label:`Claude Code`,promptArgs:positional},{command:`codex`,label:`Codex`,promptArgs:positional},{command:`cursor-agent`,label:`Cursor`,promptArgs:positional},{command:`droid`,label:`Droid`,promptArgs:positional},{command:`gemini`,label:`Gemini CLI`,promptArgs:e=>[`-i`,e]},{command:`opencode`,label:`opencode`,promptArgs:e=>[`--prompt`,e]},{command:`pi`,label:`Pi`,promptArgs:positional}],WINDOWS_EXECUTABLE_EXTENSIONS=[`.COM`,`.EXE`,`.BAT`,`.CMD`],defaultDependencies={createPrompter,hasInteractiveTerminal,isCodingAgentReplAvailable};function executableNames(e){if(process.platform!==`win32`)return[e];let t=process.env.PATHEXT?.split(`;`).filter(Boolean);return(t&&t.length>0?t:WINDOWS_EXECUTABLE_EXTENSIONS).map(t=>`${e}${t}`)}async function isExecutable(e){try{return(await stat(e)).isFile()?(await access(e,constants.X_OK),!0):!1}catch{return!1}}async function resolveCodingAgentRepl(e){let t=process.env.PATH;if(t===void 0||t.length===0)return null;for(let n of t.split(delimiter))if(n.length!==0)for(let t of executableNames(e)){let e=join(n,t);if(await isExecutable(e))return e}return null}async function isCodingAgentReplAvailable(e){return await resolveCodingAgentRepl(e)!==null}function handoffOptions(e,t){return[{value:`eve-dev`,label:`Start eve dev`,focusHint:`talk to '${t}' in your terminal`},...e.map(e=>({value:e.command,label:`Open ${e.label}`,focusHint:`build '${t}' using ${e.label}`}))]}async function selectInitHandoff(e){let t={...defaultDependencies,...e.deps};if(!t.hasInteractiveTerminal())return`eve-dev`;let n=await Promise.all(CODING_AGENT_REPLS.map(({command:e})=>t.isCodingAgentReplAvailable(e))),r=CODING_AGENT_REPLS.filter((e,t)=>n[t]);return r.length===0?`eve-dev`:t.createPrompter().select({message:`How would you like to continue?`,options:handoffOptions(r,e.agentName),initialValue:`eve-dev`})}function codingAgentRepl(e){let t=CODING_AGENT_REPLS.find(t=>t.command===e);if(t===void 0)throw Error(`Unsupported coding-agent REPL "${e}".`);return t}function isDirectlySpawnable(e,t){if(t!==`win32`)return!0;let n=extname(e).toLowerCase();return n===`.exe`||n===`.com`}function replSpawnPlan(e,t,n,r=process.platform){return t!==null&&isDirectlySpawnable(t,r)?{file:t,args:codingAgentRepl(e).promptArgs(n),shell:!1,seeded:!0}:{file:e,args:[],shell:r===`win32`,seeded:!1}}async function spawnCodingAgentRepl(e){let t=e.resolvePath??resolveCodingAgentRepl,n=replSpawnPlan(e.command,await t(e.command),e.prompt);return n.seeded||e.onPromptUnseeded?.(e.prompt),new Promise(t=>{let r=spawn(n.file,n.args,{cwd:e.cwd,shell:n.shell,stdio:`inherit`}),i=!1,settle=e=>{i||(i=!0,t(e))};r.once(`error`,()=>settle(!1)),r.once(`close`,e=>settle(e===0))})}export{isCodingAgentReplAvailable,replSpawnPlan,resolveCodingAgentRepl,selectInitHandoff,spawnCodingAgentRepl};
@@ -1 +1 @@
1
- import{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{initAgentDevHandoff,initAgentInstructions,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,resolve}from"node:path";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{mkdtemp,readdir,rename,rm,stat}from"node:fs/promises";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{eveDevArguments,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function assertCanScaffoldInPlace(e){let t=blockingCreateInPlaceEntries(await readdir(e));if(t.length===0)return;let n=t.slice(0,5).join(`, `),r=t.length>5?`, and ${t.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${n}${r}. 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 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.");let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:DEFAULT_AGENT_MODEL_ID,packageManager:i.kind,evePackage:r});return{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){let o=resolve(e),s=t===`.`,c=s?o:join(o,t);if(s)await assertCanScaffoldInPlace(c);else if(await pathExists(c))throw Error(`Cannot create project because "${c}" already exists.`);let l=await mkdtemp(join(o,`.eve-init-`)),p=[];try{let e={projectName:s?basename(c):t,model:DEFAULT_AGENT_MODEL_ID,evePackage:a,targetDirectory:l,workspaceProbeDirectory:c,packageManager:n,onWorkspaceRootMutation:e=>{p.push(e)}},o=await i.scaffoldBaseProject(e);return r.channelWebNextjs===!0&&await i.ensureChannel({projectRoot:o,kind:`web`,packageManager:n,workspaceProbeDirectory:c,configureVercelServices:!1,onWorkspaceRootMutation:e=>{p.push(e)}}),s?await moveDirectoryContents(o,c):await rename(o,c),{projectPath:c,workspaceRootMutations:uniqueWorkspaceRootMutations(p)}}finally{await rm(l,{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;async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),s=startCliLiveRow(n);s.update(`Preparing project`);try{let e=await t.isCodingAgentLaunch(),c=a??`.`,l=isCurrentDirectoryTarget(c),u=l?await pathExists(join(resolve(i),`package.json`))?resolve(i):void 0:await resolveTargetDirectory(i,c),p=resolveInitEvePackageOverride(),m=u===void 0?`creating agent`:`adding agent`;s.update(u===void 0?`Creating agent`:`Adding agent`),initLog.debug(m);let h=t.now(),g;if(u===void 0){let e=l?`.`:parseProjectName(c),n=resolve(i),a=await resolveScaffoldPackageManager(e===`.`?n:join(n,e),t),o=await scaffoldProject(i,e,a,r,t,p);g={kind:`created`,packageManager:a,projectPath:o.projectPath,workspaceRootMutations:o.workspaceRootMutations}}else{let e=await addToExistingProject(u,r,t,p);g=e.nodeEngineOverride===void 0?{kind:`added`,packageManager:e.packageManager,projectPath:u}:{kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u}}let _=t.now()-h;initLog.debug(`${m} done`,{ms:_}),s.update(`Installing dependencies`,`${g.packageManager} install`),initLog.debug(`installing dependencies with ${g.packageManager}`);let v=t.now(),y=[],b=[],x=await t.runPackageManagerInstall(g.packageManager,g.projectPath,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(b.push(e.text),b.length>20&&b.shift(),NPM_NOISE_LINE.test(e.text)||y.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(g.packageManager,e);t!==void 0&&s.update(`Installing dependencies`,t)}}),S=t.now()-v;if(!x){initLog.debug(`dependency installation failed`,{ms:S}),s.stop();let e=y.length>0?y:b;for(let t of e)n.error(t);throw Error(`Failed to install dependencies in "${g.projectPath}".`)}return initLog.debug(`dependencies installed`,{ms:S}),g.kind===`created`?(s.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...g,agentElapsedMs:_,agentLaunched:e,gitResult:await t.tryInitializeGit(g.projectPath),installElapsedMs:S}):{...g,agentElapsedMs:_,agentLaunched:e,installElapsedMs:S}}finally{s.stop()}}async function runInitCommand(e,t,a,o,s=defaultDependencies){if(a===void 0&&await s.isCodingAgentLaunch()){e.log(initAgentInstructions());return}let c=await runInitSteps({dependencies:s,logger:e,options:o,parentDirectory:t,target:a});if(c.kind===`created`){e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${import_picocolors.default.bold(c.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(c.agentElapsedMs)}`)}`);for(let t of c.workspaceRootMutations)e.log(import_picocolors.default.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${import_picocolors.default.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${import_picocolors.default.bold(c.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(c.agentElapsedMs)}`)}`),c.nodeEngineOverride!==void 0&&e.log(import_picocolors.default.yellow(`⚠ ${formatNodeEngineOverrideWarning(c.nodeEngineOverride)}`));e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies ${import_picocolors.default.dim(`in ${formatElapsed(c.installElapsedMs)}`)}`),c.kind===`created`&&c.gitResult.kind===`failed`&&e.error(import_picocolors.default.yellow(`Git initialization failed: ${c.gitResult.reason}`));let l=[c.packageManager,...eveDevArguments(c.packageManager)].join(` `),d=initAgentDevHandoff({projectPath:c.projectPath,devCommand:l});if(c.agentLaunched){e.log(d);return}let f;try{f=await s.selectInitHandoff({agentName:basename(c.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(f!==`eve-dev`){if(e.log(import_picocolors.default.dim(`$ ${f}`)),!await s.spawnCodingAgentRepl({command:f,cwd:c.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(import_picocolors.default.yellow(`Could not seed ${f} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${c.projectPath}".`);return}let p=c.kind===`created`,m=p?[...eveDevArguments(c.packageManager),`--input`,`/model`]:eveDevArguments(c.packageManager);if(e.log(import_picocolors.default.dim(p?`$ eve dev --input /model`:`$ eve dev`)),!await s.spawnPackageManager(c.packageManager,c.projectPath,m))throw Error(`Development server exited unsuccessfully in "${c.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{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{initAgentDevHandoff,initAgentInstructions,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.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{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/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{eveDevArguments,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function resolveTargetDirectory(e,t){let n=resolve(e,t);return(await stat(n).catch(()=>void 0))?.isDirectory()?n:void 0}function isCurrentDirectoryTarget(e){return/^\.(?:[/\\]+\.?)*$/u.test(e.trim())}async function assertCanScaffoldInPlace(e){let t=blockingCreateInPlaceEntries(await readdir(e));if(t.length===0)return;let n=t.slice(0,5).join(`, `),r=t.length>5?`, and ${t.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${n}${r}. 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 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.");let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:DEFAULT_AGENT_MODEL_ID,packageManager:i.kind,evePackage:r});return{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){let o=resolve(e),s=t===`.`,l=s?o:join(o,t);if(s)await assertCanScaffoldInPlace(l);else if(await pathExists(l))throw Error(`Cannot create project because "${l}" already exists.`);let f=await mkdtemp(join(o,`.eve-init-`)),p=[];try{let e={projectName:s?basename(l):t,model:DEFAULT_AGENT_MODEL_ID,evePackage:a,targetDirectory:f,workspaceProbeDirectory:l,packageManager:n,onWorkspaceRootMutation:e=>{p.push(e)}},o=await i.scaffoldBaseProject(e);return r.channelWebNextjs===!0&&await i.ensureChannel({projectRoot:o,kind:`web`,packageManager:n,workspaceProbeDirectory:l,configureVercelServices:!1,onWorkspaceRootMutation:e=>{p.push(e)}}),s?await moveDirectoryContents(o,l):await rename(o,l),{projectPath:l,workspaceRootMutations:uniqueWorkspaceRootMutations(p)}}finally{await rm(f,{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;async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),s=startCliLiveRow(n);s.update(`Preparing project`);try{let e=await t.isCodingAgentLaunch(),c=a??`.`,l=isCurrentDirectoryTarget(c),u=l?await pathExists(join(resolve(i),`package.json`))?resolve(i):void 0:await resolveTargetDirectory(i,c),d=resolveInitEvePackageOverride(),f=u===void 0?`creating agent`:`adding agent`;s.update(u===void 0?`Creating agent`:`Adding agent`),initLog.debug(f);let p=t.now(),m;if(u===void 0){let e=l?`.`:parseProjectName(c),n=resolve(i),a=await resolveScaffoldPackageManager(e===`.`?n:join(n,e),t),o=await scaffoldProject(i,e,a,r,t,d);m={kind:`created`,packageManager:a,projectPath:o.projectPath,workspaceRootMutations:o.workspaceRootMutations}}else{let e=await addToExistingProject(u,r,t,d);m=e.nodeEngineOverride===void 0?{kind:`added`,packageManager:e.packageManager,projectPath:u}:{kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u}}let h=t.now()-p;initLog.debug(`${f} done`,{ms:h}),s.update(`Installing dependencies`,`${m.packageManager} install`),initLog.debug(`installing dependencies with ${m.packageManager}`);let g=t.now(),_=[],v=[],y=await t.runPackageManagerInstall(m.packageManager,m.projectPath,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(v.push(e.text),v.length>20&&v.shift(),NPM_NOISE_LINE.test(e.text)||_.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(m.packageManager,e);t!==void 0&&s.update(`Installing dependencies`,t)}}),b=t.now()-g;if(!y){initLog.debug(`dependency installation failed`,{ms:b}),s.stop();let e=_.length>0?_:v;for(let t of e)n.error(t);throw Error(`Failed to install dependencies in "${m.projectPath}".`)}return initLog.debug(`dependencies installed`,{ms:b}),m.kind===`created`?(s.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...m,agentElapsedMs:h,agentLaunched:e,gitResult:await t.tryInitializeGit(m.projectPath),installElapsedMs:b}):{...m,agentElapsedMs:h,agentLaunched:e,installElapsedMs:b}}finally{s.stop()}}async function runInitCommand(e,t,a,o,s=defaultDependencies){if(a===void 0&&await s.isCodingAgentLaunch()){e.log(initAgentInstructions());return}let c=await runInitSteps({dependencies:s,logger:e,options:o,parentDirectory:t,target:a});if(c.kind===`created`){e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${import_picocolors.default.bold(c.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(c.agentElapsedMs)}`)}`);for(let t of c.workspaceRootMutations)e.log(import_picocolors.default.yellow(`⚠ ${formatWorkspaceRootMutationWarning(t)}`))}else e.log(`${import_picocolors.default.green(`✓`)} Added an ${EVE_WORDMARK} agent to ${import_picocolors.default.bold(c.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(c.agentElapsedMs)}`)}`),c.nodeEngineOverride!==void 0&&e.log(import_picocolors.default.yellow(`⚠ ${formatNodeEngineOverrideWarning(c.nodeEngineOverride)}`));e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies ${import_picocolors.default.dim(`in ${formatElapsed(c.installElapsedMs)}`)}`),c.kind===`created`&&c.gitResult.kind===`failed`&&e.error(import_picocolors.default.yellow(`Git initialization failed: ${c.gitResult.reason}`));let l=[c.packageManager,...eveDevArguments(c.packageManager)].join(` `),u=initAgentDevHandoff({projectPath:c.projectPath,devCommand:l});if(c.agentLaunched){e.log(u);return}let d;try{d=await s.selectInitHandoff({agentName:basename(c.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d!==`eve-dev`){if(e.log(import_picocolors.default.dim(`$ ${d}`)),!await s.spawnCodingAgentRepl({command:d,cwd:c.projectPath,prompt:initAgentReplPrompt({devCommand:l}),onPromptUnseeded:t=>{e.log(import_picocolors.default.yellow(`Could not seed ${d} automatically. Paste this prompt into it:`)),e.log(t)}}))throw Error(`Coding-agent REPL exited unsuccessfully in "${c.projectPath}".`);return}let f=c.kind===`created`,p=f?[...eveDevArguments(c.packageManager),`--input`,`/model`]:eveDevArguments(c.packageManager);if(e.log(import_picocolors.default.dim(f?`$ eve dev --input /model`:`$ eve dev`)),!await s.spawnPackageManager(c.packageManager,c.projectPath,p))throw Error(`Development server exited unsuccessfully in "${c.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,4 +1,4 @@
1
- import{readDevSessionEvents}from"./logs-events.js";import{basename,join}from"node:path";import{readFile,readdir,stat}from"node:fs/promises";const LOG_DIRECTORY_SEGMENTS=[`.eve`,`logs`],LOG_DISPLAY_DIRECTORY=LOG_DIRECTORY_SEGMENTS.join(`/`),LOG_ID_PATTERN=/^dev-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}Z)-\d+\.log$/;async function listDevDiagnosticLogs(e){let t=join(e,...LOG_DIRECTORY_SEGMENTS),r;try{r=await readdir(t)}catch(e){if(e.code===`ENOENT`)return[];throw e}let s=r.filter(e=>LOG_ID_PATTERN.test(e)).sort().reverse();return Promise.all(s.map(async e=>{let r=join(t,e);return{id:e.slice(0,-4),path:r,startedAt:parseStartedAt(e),sizeBytes:(await stat(r)).size}}))}function parseStartedAt(e){let t=LOG_ID_PATTERN.exec(e);if(t===null)return;let n=t[1].replace(/T(\d{2})-(\d{2})-(\d{2})/,`T$1:$2:$3`),r=new Date(n);return Number.isNaN(r.getTime())?void 0:r}function resolveDevDiagnosticLog(e,n){let r=basename(n.replaceAll(`\\`,`/`)),i=r.endsWith(`.log`)?r.slice(0,-4):r,a=e.find(e=>e.id===i);if(a!==void 0)return a;let o=e.filter(e=>e.id.startsWith(i)||e.id.startsWith(`dev-${i}`));if(o.length===1)return o[0];throw o.length===0?Error(`No diagnostic log matches "${n}". Run \`eve logs ls\` to see available logs.`):Error([`"${n}" matches ${o.length} diagnostic logs:`,...o.map(e=>` ${e.id}`),`Pass a longer prefix or the full id.`].join(`
2
- `))}async function runLogsShowCommand(t,n,i,a={}){let o=await listDevDiagnosticLogs(n);if(o.length===0){let e=`No dev diagnostic logs found under ${LOG_DISPLAY_DIRECTORY}.`;if(i!==void 0)throw Error(e);t.log(e);return}let c=i===void 0?o[0]:resolveDevDiagnosticLog(o,i),l=await readFile(c.path,`utf8`);if(a.events===!0){let t=eventWindowForLog(o,c,a.now??(()=>new Date)),r=await(a.readEvents??readDevSessionEvents)(n,t);r.length>0&&(l=mergeLogWithEvents(l,r))}if(a.dump!==!0){t.log(l.trimEnd());return}let u=c.path.slice(0,-4)+`.dump`,d;try{d=await readFile(u,`utf8`)}catch(e){if(e.code!==`ENOENT`)throw e}if(d===void 0){t.log(l.trimEnd());return}t.log(`${d.trimEnd()}\n${l.trimEnd()}`)}function eventWindowForLog(e,t,n){let r=e.findIndex(e=>e.id===t.id),i=r>0?e[r-1].startedAt:void 0;return{from:t.startedAt??new Date(0),to:i??n()}}function mergeLogWithEvents(e,t){let n=[],r=``;for(let t of e.split(`
1
+ import{readDevSessionEvents}from"./logs-events.js";import{readFile,readdir,stat}from"node:fs/promises";import{basename,join}from"node:path";const LOG_DIRECTORY_SEGMENTS=[`.eve`,`logs`],LOG_DISPLAY_DIRECTORY=LOG_DIRECTORY_SEGMENTS.join(`/`),LOG_ID_PATTERN=/^dev-(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}\.\d{3}Z)-\d+\.log$/;async function listDevDiagnosticLogs(e){let t=join(e,...LOG_DIRECTORY_SEGMENTS),i;try{i=await readdir(t)}catch(e){if(e.code===`ENOENT`)return[];throw e}let s=i.filter(e=>LOG_ID_PATTERN.test(e)).sort().reverse();return Promise.all(s.map(async e=>{let n=join(t,e);return{id:e.slice(0,-4),path:n,startedAt:parseStartedAt(e),sizeBytes:(await stat(n)).size}}))}function parseStartedAt(e){let t=LOG_ID_PATTERN.exec(e);if(t===null)return;let n=t[1].replace(/T(\d{2})-(\d{2})-(\d{2})/,`T$1:$2:$3`),r=new Date(n);return Number.isNaN(r.getTime())?void 0:r}function resolveDevDiagnosticLog(e,t){let n=basename(t.replaceAll(`\\`,`/`)),r=n.endsWith(`.log`)?n.slice(0,-4):n,a=e.find(e=>e.id===r);if(a!==void 0)return a;let o=e.filter(e=>e.id.startsWith(r)||e.id.startsWith(`dev-${r}`));if(o.length===1)return o[0];throw o.length===0?Error(`No diagnostic log matches "${t}". Run \`eve logs ls\` to see available logs.`):Error([`"${t}" matches ${o.length} diagnostic logs:`,...o.map(e=>` ${e.id}`),`Pass a longer prefix or the full id.`].join(`
2
+ `))}async function runLogsShowCommand(n,r,i,a={}){let o=await listDevDiagnosticLogs(r);if(o.length===0){let e=`No dev diagnostic logs found under ${LOG_DISPLAY_DIRECTORY}.`;if(i!==void 0)throw Error(e);n.log(e);return}let c=i===void 0?o[0]:resolveDevDiagnosticLog(o,i),l=await readFile(c.path,`utf8`);if(a.events===!0){let t=eventWindowForLog(o,c,a.now??(()=>new Date)),n=await(a.readEvents??readDevSessionEvents)(r,t);n.length>0&&(l=mergeLogWithEvents(l,n))}if(a.dump!==!0){n.log(l.trimEnd());return}let u=c.path.slice(0,-4)+`.dump`,d;try{d=await readFile(u,`utf8`)}catch(e){if(e.code!==`ENOENT`)throw e}if(d===void 0){n.log(l.trimEnd());return}n.log(`${d.trimEnd()}\n${l.trimEnd()}`)}function eventWindowForLog(e,t,n){let r=e.findIndex(e=>e.id===t.id),i=r>0?e[r-1].startedAt:void 0;return{from:t.startedAt??new Date(0),to:i??n()}}function mergeLogWithEvents(e,t){let n=[],r=``;for(let t of e.split(`
3
3
  `))if(t.trim().length!==0){try{let e=JSON.parse(t).at;typeof e==`string`&&(r=e)}catch{}n.push({at:r,line:t})}let i=t.map(e=>({at:e.at,line:JSON.stringify(e)})),a=[],o=0,s=0;for(;o<n.length||s<i.length;){let e=n[o],t=i[s];t===void 0||e!==void 0&&e.at<=t.at?(a.push(e.line),o+=1):(a.push(t.line),s+=1)}return`${a.join(`
4
4
  `)}\n`}async function runLogsListCommand(e,t,n={}){let r=await listDevDiagnosticLogs(t);if(n.json){let t=r.map(e=>({id:e.id,path:e.path,startedAt:e.startedAt?.toISOString()??null,sizeBytes:e.sizeBytes}));e.log(JSON.stringify(t,null,2));return}if(r.length===0){e.log(`No dev diagnostic logs found under ${LOG_DISPLAY_DIRECTORY}.`);return}for(let t of r){let n=t.startedAt?.toISOString()??`unknown start`;e.log(`${t.id} ${n} ${formatSize(t.sizeBytes)}`)}}function formatSize(e){if(e<1024)return`${e} B`;let t=e/1024;return t<1024?`${t.toFixed(1)} KiB`:`${(t/1024).toFixed(1)} MiB`}export{listDevDiagnosticLogs,resolveDevDiagnosticLog,runLogsListCommand,runLogsShowCommand};
@@ -1 +1 @@
1
- function registerIntegrationCommands(e){let{appRoot:t,logger:n,program:r}=e,i=r.command(`integration`,{hidden:!0});i.command(`setup <kind>`).option(`-y, --yes`).action(async(e,r)=>{let{runIntegrationSetupCommand:i}=await import(`./integration-setup.js`);await i(n,t,e,{yes:r.yes})}),i.command(`connect <slug> <service> [canonical-name]`).action(async(e,r,i)=>{let{runIntegrationConnectCommand:a}=await import(`./integration-connect.js`);await a(n,t,e,r,i)})}export{registerIntegrationCommands};
1
+ function registerIntegrationCommands(e){let{appRoot:t,logger:n,program:r}=e,i=r.command(`integration`,{hidden:!0});i.command(`setup <kind>`).option(`-y, --yes`).action(async(e,r)=>{let{runIntegrationSetupCommand:i}=await import(`./integration-setup.js`);await i(n,t,e,{yes:r.yes})}),i.command(`connect <slug> <service> [canonical-name]`).option(`-y, --yes`).action(async(e,r,i)=>{let{runIntegrationConnectCommand:a}=await import(`./integration-connect.js`);await a(n,t,e,r,i)})}export{registerIntegrationCommands};
@@ -1 +1 @@
1
- function registerRegistryCommands(e){let{appRoot:t,logger:n,program:r}=e;r.command(`add <item>`).description(`Install a registry item; relative paths use the official eve registry.`).option(`-o, --overwrite`,`Overwrite existing files.`).option(`--skip-install`,`Run the item's setup flow without installing it.`).option(`--skip-setup`,`Skip the item's setup flow.`).option(`-y, --yes`,`Run setup and accept its recommended defaults.`).action(async(e,r)=>{let{runAddCommand:i}=await import(`./registry.js`);await i(n,t,e,r)});let i=r.command(`registry`).description(`Configure and browse extension and agent registry catalogs.`);i.command(`add <registries...>`).description(`Add registry namespace mappings to package.json.`).action(async e=>{let{runRegistryAddCommand:r}=await import(`./registry.js`);await r(n,t,e)}),i.command(`list`).description(`List items from all registries or one source.`).option(`-r, --registry <source>`,`List items from one registry.`).action(async e=>{let{runRegistryListCommand:r}=await import(`./registry.js`);await r(n,t,e.registry)}),i.command(`search <query>`).description(`Search all registries or one source.`).option(`-r, --registry <source>`,`Search one registry.`).action(async(e,r)=>{let{runRegistrySearchCommand:i}=await import(`./registry.js`);await i(n,t,e,r.registry)}),i.command(`view <item>`).description(`Print one registry item as JSON.`).action(async e=>{let{runRegistryViewCommand:r}=await import(`./registry.js`);await r(n,t,e)})}export{registerRegistryCommands};
1
+ function registerRegistryCommands(e){let{appRoot:t,logger:n,program:r}=e;r.command(`add <item>`).description(`Install a registry item; relative paths use the official eve registry.`).option(`-o, --overwrite`,`Overwrite existing files.`).option(`--skip-install`,`Run the item's setup flow without installing it.`).option(`--skip-setup`,`Skip the item's setup flow.`).option(`-y, --yes`,`Run setup and accept its recommended defaults.`).action(async(e,r)=>{let{runAddCommand:i}=await import(`./registry.js`);await i(n,t,e,r)});let i=r.command(`registry`).description(`Configure and browse extension and agent registry catalogs.`);i.command(`add <registries...>`).description(`Add registry namespace mappings to package.json.`).action(async e=>{let{runRegistryAddCommand:r}=await import(`./registry.js`);await r(n,t,e)}),i.command(`list`).description(`List items from all registries or one source.`).option(`-r, --registry <source>`,`List items from one registry.`).option(`--json`,`Output as JSON`).action(async e=>{let{runRegistryListCommand:r}=await import(`./registry.js`);await r(n,t,e.registry,e)}),i.command(`search <query>`).description(`Search all registries or one source.`).option(`-r, --registry <source>`,`Search one registry.`).option(`--json`,`Output as JSON`).action(async(e,r)=>{let{runRegistrySearchCommand:i}=await import(`./registry.js`);await i(n,t,e,r.registry,r)}),i.command(`view <item>`).description(`Print one registry item as JSON.`).action(async e=>{let{runRegistryViewCommand:r}=await import(`./registry.js`);await r(n,t,e)})}export{registerRegistryCommands};
@@ -1 +1 @@
1
- import{join}from"node:path";import{readFile,writeFile}from"node:fs/promises";function errorMessage(e){return e instanceof Error?e.message:String(e)}function isRegistrySource(e){return typeof e==`string`?!0:typeof e!=`object`||!e||!(`url`in e)?!1:typeof e.url==`string`}function parseRegistries(e,t){if(t===void 0)return{};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`${e} has an invalid registries field.`);let n={};for(let[r,i]of Object.entries(t)){if(!r.startsWith(`@`)||!isRegistrySource(i))throw Error(`${e} has an invalid registry entry for ${r}.`);n[r]=i}return n}async function readRegistryPackage(n){let r=join(n,`package.json`),i;try{i=JSON.parse(await readFile(r,`utf8`))}catch(e){throw Error(`Could not read ${r}: ${errorMessage(e)}`)}if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`${r} must contain a JSON object.`);let a=i;return{path:r,document:a,config:{registries:parseRegistries(r,a.registries)}}}function parseRegistryMapping(e){let t=e.indexOf(`=`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t+1);if(!n.startsWith(`@`))throw Error(`Registry namespaces must start with @: ${n}`);if(!r.includes(`{name}`))throw Error(`Pass a registry URL containing {name}, for example ${n}=https://example.com/r/{name}.json.`);return{namespace:n,url:r}}async function readRegistryConfig(e){return(await readRegistryPackage(e)).config}async function addRegistryMappings(e,t){if(t.length===0)throw Error(`Pass at least one registry to add.`);let r=await readRegistryPackage(e),i=t.map(parseRegistryMapping),a={...r.config.registries},o={added:[],skippedBuiltIn:[],skippedExisting:[]};for(let e of i)e.namespace===`@shadcn`?o.skippedBuiltIn.push(e.namespace):a[e.namespace]===void 0?(a[e.namespace]=e.url,o.added.push(e.namespace)):o.skippedExisting.push(e.namespace);return o.added.length>0&&await writeFile(r.path,`${JSON.stringify({...r.document,registries:a},null,2)}\n`,`utf8`),o}export{addRegistryMappings,readRegistryConfig};
1
+ import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";function errorMessage(e){return e instanceof Error?e.message:String(e)}function isRegistrySource(e){return typeof e==`string`?!0:typeof e!=`object`||!e||!(`url`in e)?!1:typeof e.url==`string`}function parseRegistries(e,t){if(t===void 0)return{};if(typeof t!=`object`||!t||Array.isArray(t))throw Error(`${e} has an invalid registries field.`);let n={};for(let[r,i]of Object.entries(t)){if(!r.startsWith(`@`)||!isRegistrySource(i))throw Error(`${e} has an invalid registry entry for ${r}.`);n[r]=i}return n}async function readRegistryPackage(t){let r=join(t,`package.json`),i;try{i=JSON.parse(await readFile(r,`utf8`))}catch(e){throw Error(`Could not read ${r}: ${errorMessage(e)}`)}if(typeof i!=`object`||!i||Array.isArray(i))throw Error(`${r} must contain a JSON object.`);let a=i;return{path:r,document:a,config:{registries:parseRegistries(r,a.registries)}}}function parseRegistryMapping(e){let t=e.indexOf(`=`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t+1);if(!n.startsWith(`@`))throw Error(`Registry namespaces must start with @: ${n}`);if(!r.includes(`{name}`))throw Error(`Pass a registry URL containing {name}, for example ${n}=https://example.com/r/{name}.json.`);return{namespace:n,url:r}}async function readRegistryConfig(e){return(await readRegistryPackage(e)).config}async function addRegistryMappings(e,n){if(n.length===0)throw Error(`Pass at least one registry to add.`);let r=await readRegistryPackage(e),i=n.map(parseRegistryMapping),a={...r.config.registries},o={added:[],skippedBuiltIn:[],skippedExisting:[]};for(let e of i)e.namespace===`@shadcn`?o.skippedBuiltIn.push(e.namespace):a[e.namespace]===void 0?(a[e.namespace]=e.url,o.added.push(e.namespace)):o.skippedExisting.push(e.namespace);return o.added.length>0&&await writeFile(r.path,`${JSON.stringify({...r.document,registries:a},null,2)}\n`,`utf8`),o}export{addRegistryMappings,readRegistryConfig};
@@ -1,2 +1,2 @@
1
- import{findPackageJSON}from"node:module";import{z}from"#compiled/zod/index.js";import{dirname,isAbsolute,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{spawn}from"node:child_process";import{WizardCancelledError}from"#setup/step.js";import{pathToFileURL}from"node:url";import{createProcessOutputBuffer}from"#setup/primitives/process-output.js";import{REGISTRY_SETUP_PROTOCOL_VERSION,isRegistrySetupChildMessage}from"#setup/registry-setup-protocol.js";const PackageJsonSchema=z.object({name:z.string().min(1),bin:z.union([z.string(),z.record(z.string(),z.string())]).optional()});function declaredBinPath(e,t){return typeof e.bin==`string`?t===e.name.slice(e.name.lastIndexOf(`/`)+1)?e.bin:void 0:e.bin?.[t]}async function resolveNodePackageBin(e,t){let s=dirname(e),c=PackageJsonSchema.parse(JSON.parse(await readFile(e,`utf8`))),l=declaredBinPath(c,t);if(l===void 0)throw Error(`Package "${c.name}" does not declare a "${t}" binary.`);let u=resolve(s,l),d=relative(s,u);if(d.startsWith(`..`)||isAbsolute(d))throw Error(`Package "${c.name}" declares its "${t}" binary outside the package directory.`);return u}function send(e,t){e.connected&&e.send(t)}async function answerPrompt(e,t,n,r){try{let i,a=n.prompt;switch(a.kind){case`text`:i=await t.text(a);break;case`password`:i=await t.password(a);break;case`select`:i=(a.options.multiple,await t.select(a.options));break;case`editable-select`:i=t.selectEditable===void 0?{kind:`selected`,value:await t.select(a.options)}:await t.selectEditable({...a.options,editable:{...a.options.editable,formatHint:e=>e}});break;case`acknowledge`:await t.acknowledge?.(a.options);break;case`choice`:{if(t.awaitChoice===void 0){i=await t.select({message:a.options.context,options:[...a.options.actions]});break}let e=t.awaitChoice(a.options);r.set(n.id,e.close);try{i=await e.choice}finally{r.delete(n.id)}break}}send(e,{type:`prompt-result`,id:n.id,value:i})}catch(t){if(t instanceof WizardCancelledError){send(e,{type:`prompt-result`,id:n.id,cancelled:!0});return}throw t}}function handlePresentation(e,t,n,r){switch(n.type){case`log`:return t.log[n.level](n.text),!0;case`note`:return t.note(n.message,n.title,{tone:n.tone}),!0;case`intro`:return t.intro(n.text,n.subtitle),!0;case`outro`:return t.outro(n.text),!0;case`result`:return!1;case`status`:if(r.get(n.id)?.(),r.delete(n.id),n.status!==void 0){let e=t.log.spinner?.(n.status);e!==void 0&&r.set(n.id,()=>e.stop())}return!0;case`close-prompt`:return r.get(n.id)?.(),r.delete(n.id),!0;case`prompt`:return answerPrompt(e,t,n,r).catch(t=>{terminateChild(e,`SIGTERM`),e.emit(`error`,t)}),!0;case`ready`:return!1}}async function runRegistrySetupCommand(t,n,r,i){let o=findPackageJSON(n.package,pathToFileURL(resolve(t,`package.json`)));if(o===void 0)throw Error(`Setup package "${n.package}" is not installed. Run \`eve add ${r}\` first.`);let c=await resolveNodePackageBin(o,n.bin);if(i===void 0)throw Error(`Registry setup commands require a parent prompter.`);return new Promise((e,a)=>{let o=spawn(process.execPath,[c,...n.args],{cwd:t,env:{...process.env,EVE_SETUP:`1`,EVE_SETUP_ITEM:r,EVE_SETUP_PROTOCOL:String(REGISTRY_SETUP_PROTOCOL_VERSION)},stdio:[`ignore`,`pipe`,`pipe`,`ipc`],detached:process.platform!==`win32`}),l=!1,f=!1,p,m=new Map,h=createProcessOutputBuffer(({text:e})=>i.prompter.log.commandOutput(e));o.stdout?.on(`data`,e=>h.write(`stdout`,e)),o.stderr?.on(`data`,e=>h.write(`stderr`,e));let g,cancel=()=>{send(o,{type:`cancel`}),g=setTimeout(()=>terminateChild(o,`SIGTERM`),3e3),g.unref()};i.signal?.addEventListener(`abort`,cancel,{once:!0});let cleanup=()=>{h.flush(),i.signal?.removeEventListener(`abort`,cancel),g!==void 0&&clearTimeout(g);for(let e of m.values())e();m.clear()};o.on(`message`,e=>{if(!isRegistrySetupChildMessage(e)){cancel(),a(Error(`Setup command sent an invalid registry protocol message.`));return}if(e.type===`ready`){if(e.version!==REGISTRY_SETUP_PROTOCOL_VERSION){cancel(),a(Error(`Setup command does not support registry setup protocol v${REGISTRY_SETUP_PROTOCOL_VERSION}.`));return}f=!0;return}if(e.type===`result`){p=e.outcome;return}handlePresentation(o,i.prompter,e,m)}),o.once(`error`,e=>{cleanup(),a(e)}),o.once(`close`,(t,n)=>{if(cleanup(),!l){if(l=!0,p?.kind===`completed`){if(t!==0){a(Error(`Setup command reported success, then exited with code ${t??`unknown`}.`));return}e({kind:`completed`,output:p.facts.map(e=>`${e.label}: ${e.value}`)});return}if(p?.kind===`cancelled`){e({kind:`cancelled`});return}if(p?.kind===`failed`){let e=p.error.details?.length?`\n${p.error.details.join(`
1
+ import{findPackageJSON}from"node:module";import{readFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{dirname,isAbsolute,relative,resolve}from"node:path";import{spawn}from"node:child_process";import{WizardCancelledError}from"#setup/step.js";import{pathToFileURL}from"node:url";import{createProcessOutputBuffer}from"#setup/primitives/process-output.js";import{REGISTRY_SETUP_PROTOCOL_VERSION,isRegistrySetupChildMessage}from"#setup/registry-setup-protocol.js";const PackageJsonSchema=z.object({name:z.string().min(1),bin:z.union([z.string(),z.record(z.string(),z.string())]).optional()});function declaredBinPath(e,t){return typeof e.bin==`string`?t===e.name.slice(e.name.lastIndexOf(`/`)+1)?e.bin:void 0:e.bin?.[t]}async function resolveNodePackageBin(e,n){let s=dirname(e),c=PackageJsonSchema.parse(JSON.parse(await readFile(e,`utf8`))),l=declaredBinPath(c,n);if(l===void 0)throw Error(`Package "${c.name}" does not declare a "${n}" binary.`);let u=resolve(s,l),d=relative(s,u);if(d.startsWith(`..`)||isAbsolute(d))throw Error(`Package "${c.name}" declares its "${n}" binary outside the package directory.`);return u}function send(e,t){e.connected&&e.send(t)}async function answerPrompt(e,t,n,r){try{let i,a=n.prompt;switch(a.kind){case`text`:i=await t.text(a);break;case`password`:i=await t.password(a);break;case`select`:i=(a.options.multiple,await t.select(a.options));break;case`editable-select`:i=t.selectEditable===void 0?{kind:`selected`,value:await t.select(a.options)}:await t.selectEditable({...a.options,editable:{...a.options.editable,formatHint:e=>e}});break;case`acknowledge`:await t.acknowledge?.(a.options);break;case`choice`:{if(t.awaitChoice===void 0){i=await t.select({message:a.options.context,options:[...a.options.actions]});break}let e=t.awaitChoice(a.options);r.set(n.id,e.close);try{i=await e.choice}finally{r.delete(n.id)}break}}send(e,{type:`prompt-result`,id:n.id,value:i})}catch(t){if(t instanceof WizardCancelledError){send(e,{type:`prompt-result`,id:n.id,cancelled:!0});return}throw t}}function handlePresentation(e,t,n,r){switch(n.type){case`log`:return t.log[n.level](n.text),!0;case`note`:return t.note(n.message,n.title,{tone:n.tone}),!0;case`intro`:return t.intro(n.text,n.subtitle),!0;case`outro`:return t.outro(n.text),!0;case`result`:return!1;case`status`:if(r.get(n.id)?.(),r.delete(n.id),n.status!==void 0){let e=t.log.spinner?.(n.status);e!==void 0&&r.set(n.id,()=>e.stop())}return!0;case`close-prompt`:return r.get(n.id)?.(),r.delete(n.id),!0;case`prompt`:return answerPrompt(e,t,n,r).catch(t=>{terminateChild(e,`SIGTERM`),e.emit(`error`,t)}),!0;case`ready`:return!1}}async function runRegistrySetupCommand(t,n,r,i){let a=findPackageJSON(n.package,pathToFileURL(resolve(t,`package.json`)));if(a===void 0)throw Error(`Setup package "${n.package}" is not installed. Run \`eve add ${r}\` first.`);let c=await resolveNodePackageBin(a,n.bin);if(i===void 0)throw Error(`Registry setup commands require a parent prompter.`);return new Promise((e,a)=>{let o=spawn(process.execPath,[c,...n.args],{cwd:t,env:{...process.env,EVE_SETUP:`1`,EVE_SETUP_ITEM:r,EVE_SETUP_PROTOCOL:String(REGISTRY_SETUP_PROTOCOL_VERSION)},stdio:[`ignore`,`pipe`,`pipe`,`ipc`],detached:process.platform!==`win32`}),l=!1,f=!1,p,m=new Map,h=createProcessOutputBuffer(({text:e})=>i.prompter.log.commandOutput(e));o.stdout?.on(`data`,e=>h.write(`stdout`,e)),o.stderr?.on(`data`,e=>h.write(`stderr`,e));let g,cancel=()=>{send(o,{type:`cancel`}),g=setTimeout(()=>terminateChild(o,`SIGTERM`),3e3),g.unref()};i.signal?.addEventListener(`abort`,cancel,{once:!0});let cleanup=()=>{h.flush(),i.signal?.removeEventListener(`abort`,cancel),g!==void 0&&clearTimeout(g);for(let e of m.values())e();m.clear()};o.on(`message`,e=>{if(!isRegistrySetupChildMessage(e)){cancel(),a(Error(`Setup command sent an invalid registry protocol message.`));return}if(e.type===`ready`){if(e.version!==REGISTRY_SETUP_PROTOCOL_VERSION){cancel(),a(Error(`Setup command does not support registry setup protocol v${REGISTRY_SETUP_PROTOCOL_VERSION}.`));return}f=!0;return}if(e.type===`result`){p=e.outcome;return}handlePresentation(o,i.prompter,e,m)}),o.once(`error`,e=>{cleanup(),a(e)}),o.once(`close`,(t,n)=>{if(cleanup(),!l){if(l=!0,p?.kind===`completed`){if(t!==0){a(Error(`Setup command reported success, then exited with code ${t??`unknown`}.`));return}e({kind:`completed`,output:p.facts.map(e=>`${e.label}: ${e.value}`)});return}if(p?.kind===`cancelled`){e({kind:`cancelled`});return}if(p?.kind===`failed`){let e=p.error.details?.length?`\n${p.error.details.join(`
2
2
  `)}`:``;a(Error(`${p.error.message}${e}`));return}if(i.signal?.aborted===!0||t===130||n===`SIGINT`){e({kind:`cancelled`});return}if(t===0&&f){a(Error(`Setup command exited without reporting a result.`));return}a(Error(n===null?`Setup command exited with code ${t??`unknown`} before reporting a result.`:`Setup command was terminated by ${n} before reporting a result.`))}})})}function terminateChild(e,t){if(process.platform!==`win32`&&e.pid!==void 0)try{process.kill(-e.pid,t);return}catch{}e.kill(t)}export{runRegistrySetupCommand};
@@ -12,6 +12,11 @@ export interface AddCommandOptions {
12
12
  /** Suppresses the registry SDK's terminal-native progress output. */
13
13
  silent?: boolean;
14
14
  }
15
+ /** Options shared by registry catalog commands. */
16
+ export interface RegistryCommandOptions {
17
+ /** Emit the underlying registry result as JSON. */
18
+ json?: boolean;
19
+ }
15
20
  export interface RegistrySetupDependencies {
16
21
  loadSetupCommandRunner(): Promise<typeof runRegistrySetupCommand>;
17
22
  }
@@ -37,6 +42,13 @@ export interface RegistryCatalogResult {
37
42
  registry: string;
38
43
  }>;
39
44
  }
45
+ /**
46
+ * Resolves the official registry URL, honoring the explicit development trust override.
47
+ *
48
+ * The override makes its registry eligible to supply setup commands, so it must be
49
+ * configured in the process environment rather than project configuration.
50
+ */
51
+ export declare function resolveOfficialRegistryUrl(configured?: string | undefined): string;
40
52
  /** Installs an official registry item without running its declared setup command. */
41
53
  export declare function installOfficialRegistryItem(appRoot: string, item: string, options?: AddCommandOptions): Promise<void>;
42
54
  /** Browses all configured catalogs, or one namespace or URL source. */
@@ -59,8 +71,8 @@ export declare function runAddCommand(logger: RegistryCommandLogger, appRoot: st
59
71
  /** Adds registry namespace mappings to the project's package.json. */
60
72
  export declare function runRegistryAddCommand(logger: RegistryCommandLogger, appRoot: string, mappings: readonly string[]): Promise<void>;
61
73
  /** Lists registry items from every configured source or one selected source. */
62
- export declare function runRegistryListCommand(logger: RegistryCommandLogger, appRoot: string, source?: string): Promise<void>;
74
+ export declare function runRegistryListCommand(logger: RegistryCommandLogger, appRoot: string, source?: string, options?: RegistryCommandOptions): Promise<void>;
63
75
  /** Searches registry items across every configured source or one selected source. */
64
- export declare function runRegistrySearchCommand(logger: RegistryCommandLogger, appRoot: string, query: string, source?: string): Promise<void>;
76
+ export declare function runRegistrySearchCommand(logger: RegistryCommandLogger, appRoot: string, query: string, source?: string, options?: RegistryCommandOptions): Promise<void>;
65
77
  /** Prints one official, configured, or URL-addressed registry item as JSON. */
66
78
  export declare function runRegistryViewCommand(logger: RegistryCommandLogger, appRoot: string, item: string): Promise<void>;
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand},OFFICIAL_REGISTRY=process.env.EVE_DEV_OFFICIAL_REGISTRY_URL??`https://eve.dev/r`,OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`,OFFICIAL_CATALOG_TITLES=new Map([[`channel/photon-imessage`,`Photon iMessage`]]);function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:i,cwd:e,overwrite:r.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let r=await readRegistryConfig(e),i=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(r)];return{result:await searchRegistries(i,{config:r,continueOnError:i.length>1,query:t.query}),sources:i}}async function browseRegistryCatalog(e,t={}){let{result:n}=await searchRegistryCatalog(e,t);return{items:n.items.map(e=>{let t={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},n=OFFICIAL_CATALOG_TITLES.get(e.name);return n!==void 0&&e.registry===OFFICIAL_CATALOG&&(t.title=n),e.type!==void 0&&(t.type=e.type),e.description!==void 0&&(t.description=e.description),t}),total:n.pagination.total,errors:n.errors??[]}}async function browseRegistryItems(e,t,n,r){let{result:i,sources:a}=await searchRegistryCatalog(t,{query:n,source:r}),o=i.errors??[];o.length<a.length&&printSearchResults(e,i,{query:n,sources:a});for(let t of o)e.error(`${t.registry}: ${t.message}`);o.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let r=await readRegistryConfig(e),i=await getRegistryItems([itemAddress(t)],{config:r});return i.length===1?i[0]:i}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let s=await a.loadSetupCommandRunner();try{let a=i.prompter??createPrompter(),c=await s(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n,{prompter:a,signal:i.signal});if(c.kind===`cancelled`)e.log(setupReminder(n,`cancelled`));else for(let t of c.output)e.log(t)}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode;if(await runAddCommand(o,e,t,{...n,yes:!0},r),process.exitCode=s,i!==void 0)throw Error(i);return a}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let o=await readRegistryConfig(t),l=itemAddress(r);if(i.skipInstall===!0){if(i.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(i.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(l))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[u]=await getRegistryItems([l],{config:o}),d=isOfficialItemAddress(l)?eveMetadataFromRegistryItem(u):void 0;if(assertCompatibleEveVersion(d?.requires),i.skipInstall===!0){if(d?.setup===void 0)throw Error(`Registry item "${r}" does not declare a setup flow.`);await runDeclaredSetup(e,t,r,d.setup,i,a);return}if(await addRegistryItems([l],{config:o,cwd:t,overwrite:i.overwrite,silent:i.silent}),d?.setup===void 0)return;let f=a.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(i.skipSetup===!0||!i.yes&&!f){e.log(setupReminder(r,`skipped`));return}if(!i.yes)try{if(await(a.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${r} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(r,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(r,`cancelled`));return}await runDeclaredSetup(e,t,r,d.setup,i,a)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n))}async function runRegistrySearchCommand(e,t,n,r){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand};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`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:i,cwd:e,overwrite:r.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(n.json){e.log(JSON.stringify(t,null,2));return}if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function searchRegistryCatalog(e,t){validateRegistrySource(t.source);let r=await readRegistryConfig(e),i=t.source?[t.source]:[OFFICIAL_CATALOG,...configuredRegistrySources(r)];return{config:r,result:await searchRegistries(i,{config:r,continueOnError:i.length>1,limit:100,query:t.query}),sources:i}}function registryManifestTitle(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.title;return typeof t==`string`?t:void 0}async function browseRegistryCatalog(e,t={}){let{config:n,result:r}=await searchRegistryCatalog(e,t),i=await Promise.all(r.items.map(async e=>{let[t]=await getRegistryItems([e.addCommandArgument],{config:n});return t}));return{items:r.items.map((e,t)=>{let n={address:e.registry===OFFICIAL_CATALOG?e.name:e.addCommandArgument,name:e.name,source:e.registry===OFFICIAL_CATALOG?`Vercel`:e.registry},r=registryManifestTitle(i[t]);return r!==void 0&&(n.title=r),e.type!==void 0&&(n.type=e.type),e.description!==void 0&&(n.description=e.description),n}),total:r.pagination.total,errors:r.errors??[]}}async function browseRegistryItems(e,t,n,r,i={}){let{result:a,sources:o}=await searchRegistryCatalog(t,{query:n,source:r}),s=a.errors??[];(i.json||s.length<o.length)&&printSearchResults(e,a,{...i,query:n,sources:o});for(let t of s)e.error(`${t.registry}: ${t.message}`);s.length>0&&(process.exitCode=1)}async function getRegistryItemManifest(e,t){let r=await readRegistryConfig(e),i=await getRegistryItems([itemAddress(t)],{config:r});return i.length===1?i[0]:i}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let s=await a.loadSetupCommandRunner();try{let a=i.prompter??createPrompter(),c=await s(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n,{prompter:a,signal:i.signal});if(c.kind===`cancelled`)e.log(setupReminder(n,`cancelled`));else for(let t of c.output)e.log(t)}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function installRegistryItem(e,t,n={},r=defaultAddCommandDependencies){let i,a=[],o={error:e=>{i=e},log:e=>a.push(e)},s=process.exitCode;if(await runAddCommand(o,e,t,{...n,yes:!0},r),process.exitCode=s,i!==void 0)throw Error(i);return a}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let o=await readRegistryConfig(t),l=itemAddress(r);if(i.skipInstall===!0){if(i.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(i.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(l))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[u]=await getRegistryItems([l],{config:o}),d=isOfficialItemAddress(l)?eveMetadataFromRegistryItem(u):void 0;if(assertCompatibleEveVersion(d?.requires),i.skipInstall===!0){if(d?.setup===void 0)throw Error(`Registry item "${r}" does not declare a setup flow.`);await runDeclaredSetup(e,t,r,d.setup,i,a);return}if(await addRegistryItems([l],{config:o,cwd:t,overwrite:i.overwrite,silent:i.silent}),d?.setup===void 0)return;let f=a.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(i.skipSetup===!0||!i.yes&&!f){e.log(setupReminder(r,`skipped`));return}if(!i.yes)try{if(await(a.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${r} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(r,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(r,`cancelled`));return}await runDeclaredSetup(e,t,r,d.setup,i,a)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n,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))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{browseRegistryCatalog,getRegistryItemManifest,installOfficialRegistryItem,installRegistryItem,resolveOfficialRegistryUrl,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -1,9 +1,8 @@
1
- import type { LocalTrace, LocalTraceSpan } from "#tracing/local-trace-reader.js";
1
+ import type { LocalTrace } from "#tracing/local-trace-reader.js";
2
2
  interface CliTraceLogger {
3
3
  error(message: string): void;
4
4
  log(message: string): void;
5
5
  }
6
- export type { LocalTrace, LocalTraceSpan };
7
6
  /**
8
7
  * Resolves an exact trace/session id or an unambiguous prefix. One session id
9
8
  * can match several traces, since a long session windows into more than one.
@@ -13,3 +12,4 @@ export declare function runTraceListCommand(logger: CliTraceLogger, appRoot: str
13
12
  readonly json?: boolean;
14
13
  }): Promise<void>;
15
14
  export declare function runTraceShowCommand(logger: CliTraceLogger, appRoot: string, reference?: string): Promise<void>;
15
+ export {};
@@ -0,0 +1,22 @@
1
+ import type { DevelopmentRequestHeaders } from "#cli/dev/url-target.js";
2
+ import type { AssistantResponseStatsMode, LogDisplayMode, TerminalPartDisplayMode } from "#cli/dev/tui/types.js";
3
+ export interface DevelopmentCliOptions {
4
+ assistantResponseStats?: AssistantResponseStatsMode;
5
+ connectionAuth?: TerminalPartDisplayMode;
6
+ contextSize?: number;
7
+ header?: DevelopmentRequestHeaders;
8
+ host?: string;
9
+ input?: string;
10
+ logs?: LogDisplayMode;
11
+ name?: string;
12
+ port?: number;
13
+ reasoning?: TerminalPartDisplayMode;
14
+ subagents?: TerminalPartDisplayMode;
15
+ tools?: TerminalPartDisplayMode;
16
+ ui?: boolean;
17
+ url?: string;
18
+ }
19
+ export interface ProductionCliOptions {
20
+ host?: string;
21
+ port?: number;
22
+ }
@@ -0,0 +1 @@
1
+ export{};
@@ -1 +1 @@
1
- import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{constants}from"node:fs";import{delimiter,join,relative,sep}from"node:path";import{access,readdir,stat,writeFile}from"node:fs/promises";import{LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH}from"#internal/workflow/local-world-data-directory.js";import{captureVercel,resolveVercelInvocation}from"#setup/primitives/run-vercel.js";function createDevDiagnosticDump(e,t,n={}){let r=t.replace(/\.log$/,`.dump`),o=n.now??(()=>new Date),s=o().getTime(),c,l,u=Promise.resolve(),d=!1,f=!1,write=()=>{if(f||d)return;let e=formatDump({at:o(),durationMs:o().getTime()-s,environment:c,stats:l});u=u.then(()=>writeFile(r,e,{encoding:`utf8`,mode:384})).catch(()=>{d=!0})};return write(),(n.environment??(()=>collectDevEnvironmentInfo(e)))().then(e=>{c=e,write()}).catch(()=>{}),{path:r,displayPath:relative(e,r).split(sep).join(`/`),updateSessionStats(e){l=e,write()},async close(){f||(write(),f=!0,await u)}}}function formatDump(e){let t={updatedAt:e.at.toISOString(),durationMs:e.durationMs,environment:e.environment??null,session:e.stats??null};return`${JSON.stringify(t,null,2)}\n`}async function collectDevEnvironmentInfo(t){let[n,r]=await Promise.all([detectVercelCli(t),measureSessionsDirectory(t)]),i={eveVersion:resolveInstalledPackageInfo().version,nodeVersion:process.version,platform:`${process.platform} ${process.arch}`,...n};return r!==void 0&&(i.sessionsDirectory=r),i}async function detectVercelCli(e){let t=resolveVercelInvocation(e),[n,r]=await Promise.all([captureVercel([`--version`],{cwd:e,nonInteractive:!0,timeoutMs:5e3}),t.command===`vercel`?findOnPath(`vercel`):Promise.resolve(t.command)]),i=n.ok?n.stdout:`${n.failure.stdout}\n${n.failure.stderr}`,a=/(\d+\.\d+\.\d+\S*)/.exec(i)?.[1],o={};return a!==void 0&&(o.vercelCliVersion=a),r!==void 0&&(o.vercelCliPath=r),o}async function findOnPath(e){let i=(process.env.PATH??``).split(delimiter).filter(e=>e.length>0);for(let n of i){let i=join(n,e);try{return await access(i,constants.X_OK),i}catch{}}}async function measureSessionsDirectory(e){let t=join(e,LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH),n;try{n=await readdir(t,{recursive:!0,withFileTypes:!0})}catch{return}let i=0,a=0;for(let e of n)if(e.isFile()){i+=1;try{a+=(await stat(join(e.parentPath,e.name))).size}catch{}}return{path:LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH,files:i,bytes:a}}export{collectDevEnvironmentInfo,createDevDiagnosticDump,measureSessionsDirectory};
1
+ import{access,readdir,stat,writeFile}from"node:fs/promises";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{constants}from"node:fs";import{delimiter,join,relative,sep}from"node:path";import{LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH}from"#internal/workflow/local-world-data-directory.js";import{captureVercel,resolveVercelInvocation}from"#setup/primitives/run-vercel.js";function createDevDiagnosticDump(e,t,n={}){let i=t.replace(/\.log$/,`.dump`),a=n.now??(()=>new Date),o=a().getTime(),s,c,l=Promise.resolve(),u=!1,d=!1,write=()=>{if(d||u)return;let e=formatDump({at:a(),durationMs:a().getTime()-o,environment:s,stats:c});l=l.then(()=>writeFile(i,e,{encoding:`utf8`,mode:384})).catch(()=>{u=!0})};return write(),(n.environment??(()=>collectDevEnvironmentInfo(e)))().then(e=>{s=e,write()}).catch(()=>{}),{path:i,displayPath:relative(e,i).split(sep).join(`/`),updateSessionStats(e){c=e,write()},async close(){d||(write(),d=!0,await l)}}}function formatDump(e){let t={updatedAt:e.at.toISOString(),durationMs:e.durationMs,environment:e.environment??null,session:e.stats??null};return`${JSON.stringify(t,null,2)}\n`}async function collectDevEnvironmentInfo(e){let[t,n]=await Promise.all([detectVercelCli(e),measureSessionsDirectory(e)]),r={eveVersion:resolveInstalledPackageInfo().version,nodeVersion:process.version,platform:`${process.platform} ${process.arch}`,...t};return n!==void 0&&(r.sessionsDirectory=n),r}async function detectVercelCli(e){let t=resolveVercelInvocation(e),[n,r]=await Promise.all([captureVercel([`--version`],{cwd:e,nonInteractive:!0,timeoutMs:5e3}),t.command===`vercel`?findOnPath(`vercel`):Promise.resolve(t.command)]),i=n.ok?n.stdout:`${n.failure.stdout}\n${n.failure.stderr}`,a=/(\d+\.\d+\.\d+\S*)/.exec(i)?.[1],o={};return a!==void 0&&(o.vercelCliVersion=a),r!==void 0&&(o.vercelCliPath=r),o}async function findOnPath(t){let n=(process.env.PATH??``).split(delimiter).filter(e=>e.length>0);for(let r of n){let n=join(r,t);try{return await access(n,constants.X_OK),n}catch{}}}async function measureSessionsDirectory(e){let r=join(e,LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH),i;try{i=await readdir(r,{recursive:!0,withFileTypes:!0})}catch{return}let a=0,o=0;for(let e of i)if(e.isFile()){a+=1;try{o+=(await stat(join(e.parentPath,e.name))).size}catch{}}return{path:LOCAL_WORKFLOW_WORLD_DATA_DIRECTORY_RELATIVE_PATH,files:a,bytes:o}}export{collectDevEnvironmentInfo,createDevDiagnosticDump,measureSessionsDirectory};
@@ -1 +1 @@
1
- import{join,relative,sep}from"node:path";import{chmod,mkdir,open}from"node:fs/promises";async function createDevDiagnosticSink(t,n={}){let o=join(t,`.eve`,`logs`);await mkdir(o,{recursive:!0,mode:448}),await chmod(o,448);let s=n.now?.()??new Date,c=n.pid??process.pid,l=join(o,`dev-${s.toISOString().replaceAll(`:`,`-`)}-${c}.log`);return createOpenSink(t,l,await open(l,`wx`,384),()=>n.now?.()??new Date)}function createOpenSink(e,r,i,a){let o=Promise.resolve(),s=!1,c=!1;return{path:r,displayPath:relative(e,r).split(sep).join(`/`),append(e){if(c||s)return;let t=formatDiagnosticEntry(e,a());o=o.then(()=>i.appendFile(t,`utf8`)).catch(()=>{s=!0})},async close(){c||(c=!0,await o,await i.close())}}}function formatDiagnosticEntry(e,t){return`${JSON.stringify({at:t.toISOString(),...e})}\n`}export{createDevDiagnosticSink};
1
+ import{chmod,mkdir,open}from"node:fs/promises";import{join,relative,sep}from"node:path";async function createDevDiagnosticSink(i,a={}){let o=join(i,`.eve`,`logs`);await mkdir(o,{recursive:!0,mode:448}),await chmod(o,448);let s=a.now?.()??new Date,c=a.pid??process.pid,l=join(o,`dev-${s.toISOString().replaceAll(`:`,`-`)}-${c}.log`);return createOpenSink(i,l,await open(l,`wx`,384),()=>a.now?.()??new Date)}function createOpenSink(e,t,n,r){let o=Promise.resolve(),s=!1,c=!1;return{path:t,displayPath:relative(e,t).split(sep).join(`/`),append(e){if(c||s)return;let t=formatDiagnosticEntry(e,r());o=o.then(()=>n.appendFile(t,`utf8`)).catch(()=>{s=!0})},async close(){c||(c=!0,await o,await n.close())}}}function formatDiagnosticEntry(e,t){return`${JSON.stringify({at:t.toISOString(),...e})}\n`}export{createDevDiagnosticSink};
@@ -1 +1 @@
1
- import{join}from"node:path";import{mkdir,readFile,readdir,rm,writeFile}from"node:fs/promises";import{stopDevelopmentSandboxResources}from"#execution/sandbox/bindings/local.js";const PREFIX=`dev-cleanup-intent.`,SUFFIX=`.json`;async function recordCleanupIntent(n,r){let a=join(n,`.eve`),c=join(a,`${PREFIX}${r.runId}${SUFFIX}`);return await mkdir(a,{recursive:!0}),await writeFile(c,`${JSON.stringify(r)}\n`,`utf8`),async()=>await rm(c,{force:!0})}async function reconcileCleanupIntents(t){let i=join(t,`.eve`),c;try{c=await readdir(i)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}await Promise.all(c.filter(e=>e.startsWith(PREFIX)&&e.endsWith(SUFFIX)).map(async r=>{try{let o=join(i,r),s=JSON.parse(await readFile(o,`utf8`));if(typeof s.runId!=`string`||typeof s.ownerPid!=`number`||!Number.isInteger(s.ownerPid)||s.ownerPid<=0||isProcessAlive(s.ownerPid))return;await stopDevelopmentSandboxResources({appRoot:t,devRunId:s.runId}),await rm(o,{force:!0})}catch{}}))}function isProcessAlive(e){try{return process.kill(e,0),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`EPERM`}}export{reconcileCleanupIntents,recordCleanupIntent};
1
+ import{mkdir,readFile,readdir,rm,writeFile}from"node:fs/promises";import{join}from"node:path";import{stopDevelopmentSandboxResources}from"#execution/sandbox/bindings/local.js";const PREFIX=`dev-cleanup-intent.`,SUFFIX=`.json`;async function recordCleanupIntent(t,n){let i=join(t,`.eve`),s=join(i,`${PREFIX}${n.runId}${SUFFIX}`);return await mkdir(i,{recursive:!0}),await writeFile(s,`${JSON.stringify(n)}\n`,`utf8`),async()=>await rm(s,{force:!0})}async function reconcileCleanupIntents(e){let r=join(e,`.eve`),s;try{s=await readdir(r)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return;throw e}await Promise.all(s.filter(e=>e.startsWith(PREFIX)&&e.endsWith(SUFFIX)).map(async n=>{try{let a=join(r,n),o=JSON.parse(await readFile(a,`utf8`));if(typeof o.runId!=`string`||typeof o.ownerPid!=`number`||!Number.isInteger(o.ownerPid)||o.ownerPid<=0||isProcessAlive(o.ownerPid))return;await stopDevelopmentSandboxResources({appRoot:e,devRunId:o.runId}),await rm(a,{force:!0})}catch{}}))}function isProcessAlive(e){try{return process.kill(e,0),!0}catch(e){return e instanceof Error&&`code`in e&&e.code===`EPERM`}}export{reconcileCleanupIntents,recordCleanupIntent};