eve 0.29.3 → 0.29.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/CHANGELOG.md +18 -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/chunks/{use-eve-agent-DaH3cf8K.js → use-eve-agent-8mofdZcO.js} +45 -10
  9. package/dist/src/chunks/{use-eve-agent-CyDt3Lny.js → use-eve-agent-bKJbH0k4.js} +45 -10
  10. package/dist/src/cli/acp/command.d.ts +22 -0
  11. package/dist/src/cli/acp/command.js +4 -0
  12. package/dist/src/cli/commands/agent-prompt/build-and-verify.md +4 -0
  13. package/dist/src/cli/commands/extension-init.js +1 -1
  14. package/dist/src/cli/commands/init-git.js +1 -1
  15. package/dist/src/cli/commands/init-repl.js +1 -1
  16. package/dist/src/cli/commands/init.js +1 -1
  17. package/dist/src/cli/commands/logs.js +2 -2
  18. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  19. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  20. package/dist/src/cli/commands/registry-project.js +1 -1
  21. package/dist/src/cli/commands/registry-setup-command.js +1 -1
  22. package/dist/src/cli/commands/registry.d.ts +14 -2
  23. package/dist/src/cli/commands/registry.js +1 -1
  24. package/dist/src/cli/commands/trace.d.ts +2 -2
  25. package/dist/src/cli/dev/command-options.d.ts +22 -0
  26. package/dist/src/cli/dev/command-options.js +1 -0
  27. package/dist/src/cli/dev/diagnostic-dump.js +1 -1
  28. package/dist/src/cli/dev/diagnostic-sink.js +1 -1
  29. package/dist/src/cli/dev/local-server-cleanup.js +1 -1
  30. package/dist/src/cli/dev/local-server-process.js +1 -1
  31. package/dist/src/cli/dev/tui/command-typeahead.js +1 -1
  32. package/dist/src/cli/dev/tui/remote-auth.d.ts +6 -3
  33. package/dist/src/cli/dev/tui/remote-connection-probe.js +1 -1
  34. package/dist/src/cli/dev/tui/runner.js +1 -1
  35. package/dist/src/cli/dev/tui/stream-format.d.ts +14 -0
  36. package/dist/src/cli/dev/tui/stream-format.js +2 -2
  37. package/dist/src/cli/dev/tui/terminal-background.d.ts +23 -0
  38. package/dist/src/cli/dev/tui/terminal-background.js +1 -0
  39. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  40. package/dist/src/cli/dev/tui/traces/trace-content.d.ts +7 -0
  41. package/dist/src/cli/dev/tui/traces/trace-content.js +2 -2
  42. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +10 -5
  43. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  44. package/dist/src/cli/dev/tui/traces/trace-store.js +1 -1
  45. package/dist/src/cli/dev/tui/traces/trace-surfaces.d.ts +40 -0
  46. package/dist/src/cli/dev/tui/traces/trace-surfaces.js +1 -0
  47. package/dist/src/cli/dev/tui/traces/trace-view.d.ts +8 -1
  48. package/dist/src/cli/dev/tui/traces/trace-view.js +2 -2
  49. package/dist/src/cli/dev/tui/traces/trace-viewer-session.d.ts +13 -0
  50. package/dist/src/cli/dev/tui/traces/trace-viewer-session.js +1 -1
  51. package/dist/src/cli/dev/tui/traces/trace-viewer-state.js +1 -1
  52. package/dist/src/cli/dev/tui/tui.js +1 -1
  53. package/dist/src/cli/invoke/invoke.js +1 -1
  54. package/dist/src/cli/invoke/result.js +1 -1
  55. package/dist/src/cli/run.d.ts +3 -0
  56. package/dist/src/cli/run.js +3 -3
  57. package/dist/src/cli/ui/terminal-text.d.ts +0 -3
  58. package/dist/src/cli/ui/terminal-text.js +1 -1
  59. package/dist/src/client/index.d.ts +1 -1
  60. package/dist/src/client/open-stream.js +1 -1
  61. package/dist/src/client/session.d.ts +15 -1
  62. package/dist/src/client/session.js +1 -1
  63. package/dist/src/client/types.d.ts +9 -0
  64. package/dist/src/compiled/.vendor-stamp.json +2 -1
  65. package/dist/src/compiled/@agentclientprotocol/sdk/LICENSE +191 -0
  66. package/dist/src/compiled/@agentclientprotocol/sdk/index.d.ts +1835 -0
  67. package/dist/src/compiled/@agentclientprotocol/sdk/index.js +65 -0
  68. package/dist/src/compiled/@agentclientprotocol/sdk/jsonrpc.d.ts +603 -0
  69. package/dist/src/compiled/@agentclientprotocol/sdk/schema/guards.gen.d.ts +199 -0
  70. package/dist/src/compiled/@agentclientprotocol/sdk/schema/index.d.ts +51 -0
  71. package/dist/src/compiled/@agentclientprotocol/sdk/schema/types.gen.d.ts +6118 -0
  72. package/dist/src/compiled/@agentclientprotocol/sdk/stream.d.ts +35 -0
  73. package/dist/src/compiler/artifacts.js +1 -1
  74. package/dist/src/compiler/extension-compatibility.js +1 -1
  75. package/dist/src/compiler/model-catalog.js +1 -1
  76. package/dist/src/compiler/normalize-sandbox.js +1 -1
  77. package/dist/src/compiler/workspace-resources.js +1 -1
  78. package/dist/src/discover/project-source.js +1 -1
  79. package/dist/src/evals/cli/eval.js +2 -2
  80. package/dist/src/evals/loaders/json.js +1 -1
  81. package/dist/src/evals/loaders/yaml.js +1 -1
  82. package/dist/src/evals/runner/artifacts.js +1 -1
  83. package/dist/src/evals/runner/discover.js +1 -1
  84. package/dist/src/evals/runner/reporters/junit.js +1 -1
  85. package/dist/src/evals/session.js +1 -1
  86. package/dist/src/execution/sandbox/bindings/docker-cli.js +1 -1
  87. package/dist/src/execution/sandbox/bindings/docker-templates.js +1 -1
  88. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  89. package/dist/src/execution/sandbox/bindings/just-bash.js +1 -1
  90. package/dist/src/execution/sandbox/bindings/local-backend-utils.js +1 -1
  91. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  92. package/dist/src/execution/sandbox/bindings/microsandbox-metadata.js +1 -1
  93. package/dist/src/execution/sandbox/bindings/microsandbox-platform.js +1 -1
  94. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  95. package/dist/src/execution/sandbox/bindings/microsandbox-templates.js +1 -1
  96. package/dist/src/execution/sandbox/development-cleanup.js +1 -1
  97. package/dist/src/execution/sandbox/template-prewarm-lock.js +1 -1
  98. package/dist/src/harness/attachment-staging.js +1 -1
  99. package/dist/src/internal/application/build-profile.js +1 -1
  100. package/dist/src/internal/application/build-workspace.js +1 -1
  101. package/dist/src/internal/application/cache-metadata.js +1 -1
  102. package/dist/src/internal/application/compiled-artifacts.js +8 -8
  103. package/dist/src/internal/application/optional-package-install.js +2 -2
  104. package/dist/src/internal/application/output-publication-artifacts.js +1 -1
  105. package/dist/src/internal/application/output-publication-journal.js +1 -1
  106. package/dist/src/internal/application/output-publication-lock.js +1 -1
  107. package/dist/src/internal/application/output-publication.js +1 -1
  108. package/dist/src/internal/application/package.js +1 -1
  109. package/dist/src/internal/application/paths.js +1 -1
  110. package/dist/src/internal/application/production-compiler-artifacts.js +1 -1
  111. package/dist/src/internal/application/tsconfig-dependencies.js +1 -1
  112. package/dist/src/internal/authored-asset-import-plugin.js +1 -1
  113. package/dist/src/internal/authored-module-loader.js +3 -3
  114. package/dist/src/internal/authored-package-tsconfig-paths.js +1 -1
  115. package/dist/src/internal/materialized-authored-modules.js +1 -1
  116. package/dist/src/internal/nitro/dev-runtime-artifacts-retention.js +1 -1
  117. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  118. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  119. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  120. package/dist/src/internal/nitro/host/build-application.js +1 -1
  121. package/dist/src/internal/nitro/host/build-extension.js +1 -1
  122. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  123. package/dist/src/internal/nitro/host/configure-nitro-routes.js +3 -3
  124. package/dist/src/internal/nitro/host/copy-host-middleware.js +1 -1
  125. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  126. package/dist/src/internal/nitro/host/cron-handler-route.js +1 -1
  127. package/dist/src/internal/nitro/host/dev-authored-rebuild-coordinator.js +1 -1
  128. package/dist/src/internal/nitro/host/dev-authored-source-watcher.js +1 -1
  129. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  130. package/dist/src/internal/nitro/host/dev-host-workspace.js +1 -1
  131. package/dist/src/internal/nitro/host/dev-server-http.js +1 -1
  132. package/dist/src/internal/nitro/host/dev-server-state.js +1 -1
  133. package/dist/src/internal/nitro/host/dev-workspace-extensions.js +1 -1
  134. package/dist/src/internal/nitro/host/extension-build-config.js +1 -1
  135. package/dist/src/internal/nitro/host/extension-declarations.js +2 -2
  136. package/dist/src/internal/nitro/host/extension-distribution.js +3 -3
  137. package/dist/src/internal/nitro/host/extension-state-usage.js +1 -1
  138. package/dist/src/internal/nitro/host/normalize-vercel-service-crons.js +1 -1
  139. package/dist/src/internal/nitro/host/start-development-server.js +2 -2
  140. package/dist/src/internal/nitro/host/start-production-server.js +2 -2
  141. package/dist/src/internal/nitro/host/types.d.ts +2 -0
  142. package/dist/src/internal/vercel/project-link.js +1 -1
  143. package/dist/src/internal/workflow/development-world-client.js +1 -1
  144. package/dist/src/internal/workflow-bundle/builder-support.js +6 -6
  145. package/dist/src/internal/workflow-bundle/builder.js +3 -3
  146. package/dist/src/internal/workflow-bundle/nitro-step-entry.js +2 -2
  147. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  148. package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
  149. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  150. package/dist/src/public/channels/discord/verify.js +1 -1
  151. package/dist/src/public/channels/github/auth.js +2 -2
  152. package/dist/src/public/channels/github/githubChannel.js +1 -1
  153. package/dist/src/public/channels/github/verify.js +1 -1
  154. package/dist/src/public/channels/linear/inbound.js +2 -2
  155. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  156. package/dist/src/public/channels/linear/verify.js +1 -1
  157. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  158. package/dist/src/public/channels/telegram/verify.js +1 -1
  159. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  160. package/dist/src/public/models/openai/chatgpt/auth.js +1 -1
  161. package/dist/src/public/next/server.js +2 -2
  162. package/dist/src/public/next/vercel-output-config.js +1 -1
  163. package/dist/src/public/nuxt/dev-server.js +1 -1
  164. package/dist/src/public/nuxt/vercel-services.js +1 -1
  165. package/dist/src/public/sveltekit/dev-server.js +1 -1
  166. package/dist/src/public/sveltekit/vercel-json.js +1 -1
  167. package/dist/src/runtime/framework-tools/file-state.js +1 -1
  168. package/dist/src/runtime/sandbox/keys.js +1 -1
  169. package/dist/src/runtime/workspace/seed-files.js +1 -1
  170. package/dist/src/setup/boxes/detect-ai-gateway.js +1 -1
  171. package/dist/src/setup/index.d.ts +1 -0
  172. package/dist/src/setup/index.js +1 -1
  173. package/dist/src/setup/integrations/discord/api.d.ts +15 -0
  174. package/dist/src/setup/integrations/discord/api.js +1 -0
  175. package/dist/src/setup/integrations/discord/connect.d.ts +24 -0
  176. package/dist/src/setup/integrations/discord/connect.js +1 -0
  177. package/dist/src/setup/integrations/discord/setup.d.ts +19 -0
  178. package/dist/src/setup/integrations/discord/setup.js +8 -0
  179. package/dist/src/setup/integrations/registry.js +1 -1
  180. package/dist/src/setup/package-manager.js +1 -1
  181. package/dist/src/setup/primitives/pm/pnpm.js +3 -3
  182. package/dist/src/setup/project-resolution.js +1 -1
  183. package/dist/src/setup/prompter.js +1 -1
  184. package/dist/src/setup/registry-setup-client.d.ts +6 -2
  185. package/dist/src/setup/registry-setup-client.js +1 -1
  186. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  187. package/dist/src/setup/scaffold/create/extension.js +1 -1
  188. package/dist/src/setup/scaffold/create/project.js +2 -9
  189. package/dist/src/setup/scaffold/files.js +1 -1
  190. package/dist/src/setup/scaffold/update/channels.js +2 -2
  191. package/dist/src/setup/scaffold/update/connections.js +1 -1
  192. package/dist/src/setup/scaffold/workspace-root.js +1 -1
  193. package/dist/src/setup/slack-connect-lifecycle.js +1 -1
  194. package/dist/src/setup/vercel-project-framework.js +1 -1
  195. package/dist/src/shared/guards.d.ts +2 -0
  196. package/dist/src/shared/guards.js +1 -1
  197. package/dist/src/shared/skill-package.js +1 -1
  198. package/dist/src/shared/skill-paths.d.ts +4 -4
  199. package/dist/src/shared/skill-paths.js +2 -2
  200. package/dist/src/shared/vercel-output-directory.js +1 -1
  201. package/dist/src/source-change/static-source-change.js +1 -1
  202. package/dist/src/svelte/index.js +1 -1
  203. package/dist/src/svelte/use-eve-agent.js +1 -1
  204. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  205. package/dist/src/tracing/local-trace-reader.d.ts +22 -5
  206. package/dist/src/tracing/local-trace-reader.js +1 -1
  207. package/dist/src/tracing/local-trace-retention.js +1 -1
  208. package/dist/src/tracing/local-trace-span-processor.js +1 -1
  209. package/dist/src/vue/index.js +1 -1
  210. package/dist/src/vue/use-eve-agent.js +1 -1
  211. package/docs/channels/discord.mdx +30 -14
  212. package/docs/guides/acp.md +91 -0
  213. package/docs/guides/client/streaming.mdx +24 -0
  214. package/docs/guides/meta.json +1 -0
  215. package/docs/reference/cli.md +3 -0
  216. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # eve
2
2
 
3
+ ## 0.29.4
4
+
5
+ ### Patch Changes
6
+
7
+ - e90a8c2: Launch local or deployed eve applications as stable ACP v1 agents with `eve acp [url]`, including streamed messages, tool activity, human input, cancellation, concurrent sessions, and verified Vercel authentication.
8
+ - cec672d: Add guided Discord setup through `eve add channel/discord`, including Vercel Connect provisioning, trigger attachment, interactions endpoint configuration, slash-command registration, and channel scaffolding.
9
+ - ed328e7: Render registry item titles with their exact registry-provided casing by loading manifests for each page of catalog results.
10
+ - c875a67: Update the generated `AGENTS.md` to direct coding agents to the eve registry for discovering and installing integrations.
11
+ - 5153b13: Add JSON output to `eve registry list` and `eve registry search` for scripts that inspect registry catalogs.
12
+ - 155d46a: Connection registry items now configure their Vercel Connect connector during `eve add`, and registry setup commands close their IPC channel after reporting an outcome so `/add` returns instead of remaining stuck.
13
+ - 6f3daca: Add `ClientSession.snapshot()` for reading a finite, cursor-consistent session event prefix that can hydrate server-rendered applications.
14
+ - 67bfc76: Resolve sandbox skill roots and seed-file paths through the same `$HOME` resolver the file tools use, so the skills location is spelled once instead of twice.
15
+ - a5acde8: Ensure exiting the dev TUI shuts down its owned server and any surviving workflow processes before the CLI exits. Persisted workflow messages now reach the ready worker during restart instead of being rejected while the file watcher starts.
16
+ - 731464f: Give the local trace spool's on-disk layout a single owner: the shared trace reader now exposes the listing and segment-read primitives that `eve traces` and the `/traces` viewer both use, and payload formatting is shared between the detail panel and the conversation view.
17
+ - f7ba3b3: Derive the `/traces` conversation viewer's line geometry from one prefix-sum helper so scroll, click, and wheel math cannot disagree, and reset the view through a single factory when the viewed trace changes.
18
+ - 3f4bb9c: The `/traces` viewer now follows your terminal's colors instead of forcing a hardcoded black/grey truecolor palette. It probes the terminal's default background (OSC 11) and derives its card surfaces from your own theme — subtly elevated bands on dark and light backgrounds alike, with red bands for failures, and card titles that invert to black on light backgrounds so they stay legible. Terminals that don't answer the probe get a clean gutter-rail rendering drawn entirely with the shared TUI theme.
19
+ - f5d0533: Derive the dev TUI's slash-command suggestion window from the command registry instead of a hand-maintained constant, and collapse the duplicated cursor step in the terminal line-wrap loop.
20
+
3
21
  ## 0.29.3
4
22
 
5
23
  ### Patch Changes
@@ -0,0 +1,43 @@
1
+ import { type AgentContext, type InitializeRequest, type InitializeResponse, type NewSessionRequest, type NewSessionResponse, type PromptRequest, type PromptResponse } from "#compiled/@agentclientprotocol/sdk/index.js";
2
+ import type { ClientOptions, SendTurnInput, SessionState } from "#client/types.js";
3
+ import type { HandleMessageStreamEvent } from "#protocol/message.js";
4
+ interface AdapterClientSession {
5
+ readonly state: SessionState;
6
+ send(input: SendTurnInput): Promise<AsyncIterable<HandleMessageStreamEvent>>;
7
+ cancel(options?: {
8
+ turnId?: string;
9
+ }): Promise<unknown>;
10
+ reset(): Promise<unknown>;
11
+ }
12
+ interface AdapterClient {
13
+ session(): AdapterClientSession;
14
+ }
15
+ /** Configuration for translating one ACP client connection to an eve server. */
16
+ export interface EveAcpAdapterOptions {
17
+ readonly eveVersion: string;
18
+ readonly auth?: ClientOptions["auth"];
19
+ readonly headers?: ClientOptions["headers"];
20
+ readonly serverUrl: string;
21
+ /** Local workspace root to enforce; omit when connecting to a remote deployment. */
22
+ readonly workspaceRoot?: string;
23
+ /** @internal Test seam for the public eve client boundary. */
24
+ readonly client?: AdapterClient;
25
+ }
26
+ /**
27
+ * Translates stable ACP v1 sessions onto the public eve HTTP client.
28
+ *
29
+ * The adapter owns only process-local ACP identities. Conversation durability,
30
+ * event cursors, cancellation, and reset behavior remain owned by
31
+ * {@link ClientSession}.
32
+ */
33
+ export declare class EveAcpAdapter {
34
+ #private;
35
+ constructor(options: EveAcpAdapterOptions);
36
+ initialize(params: InitializeRequest): InitializeResponse;
37
+ newSession(params: NewSessionRequest): Promise<NewSessionResponse>;
38
+ prompt(params: PromptRequest, client: AgentContext, signal: AbortSignal): Promise<PromptResponse>;
39
+ cancel(sessionId: string): Promise<void>;
40
+ closeSession(sessionId: string): Promise<void>;
41
+ close(): Promise<void>;
42
+ }
43
+ export {};
@@ -0,0 +1 @@
1
+ import{randomUUID}from"node:crypto";import{realpath}from"node:fs/promises";import{PROTOCOL_VERSION,RequestError,methods}from"#compiled/@agentclientprotocol/sdk/index.js";import{Client,ClientError}from"#client/index.js";const ANSWER_FIELD=`answer`,ERROR_CODE_EVE=-32002;var EveAcpAdapter=class{#e;#t;#n;#r=!1;#i=new Map;constructor(e){this.#t=e.eveVersion,this.#n=e.workspaceRoot,this.#e=e.client??new Client({auth:e.auth,headers:e.headers,host:e.serverUrl,preserveCompletedSessions:!0,redirect:`manual`})}initialize(e){return this.#r=e.clientCapabilities?.elicitation?.form!==void 0,{protocolVersion:PROTOCOL_VERSION,agentCapabilities:{loadSession:!1,promptCapabilities:{},sessionCapabilities:{close:{}}},agentInfo:{name:`eve`,title:`eve`,version:this.#t},authMethods:[]}}async newSession(t){if(t.mcpServers.length>0)throw unsupported(`Client-provided MCP servers are not supported by eve ACP mode.`);if((t.additionalDirectories?.length??0)>0)throw unsupported(`Additional workspace directories are not supported by eve ACP mode.`);if(this.#n!==void 0){let e=await normalizedRealpath(t.cwd,`session/new.cwd`),n=await normalizedRealpath(this.#n,`the eve application root`);if(e!==n)throw RequestError.invalidParams({cwd:t.cwd,workspaceRoot:n},`ACP cwd must be the eve application root`)}let n=randomUUID();return this.#i.set(n,{client:this.#e.session(),tools:new Map}),{sessionId:n}}async prompt(e,t,n){let i=this.#s(e.sessionId);if(i.active!==void 0)throw new RequestError(-32001,`ACP session ${e.sessionId} already has an active prompt.`);let a=promptContent(e);i.tools.clear();let o=Promise.withResolvers(),s={cancelRequested:!1,protocolCancelled:!1,outboundController:new AbortController,settled:o.promise,resolveSettled:o.resolve};i.active=s;let onProtocolCancel=()=>{s.protocolCancelled=!0,this.#o(i).catch(()=>void 0)};n.aborted?onProtocolCancel():n.addEventListener(`abort`,onProtocolCancel,{once:!0});try{if(s.protocolCancelled)throw RequestError.requestCancelled({sessionId:e.sessionId});let o={message:a};for(;;){let a=await i.client.send(o);(s.cancelRequested||s.protocolCancelled)&&await this.#o(i);let c=[],l=!1,u,d;for await(let n of a){let r=`data`in n&&`turnId`in n.data?n.data.turnId:void 0;typeof r==`string`&&(s.turnId=r),n.type===`input.requested`&&c.push(...n.data.requests),n.type===`authorization.required`&&(d=unsupported(`Connection authorization cannot be completed through eve ACP mode.`)),n.type===`turn.cancelled`&&(l=!0),(n.type===`turn.failed`||n.type===`session.failed`)&&(u=n),await this.#c(e.sessionId,i,n,t)}if(s.protocolCancelled)throw RequestError.requestCancelled({sessionId:e.sessionId});if(l||s.cancelRequested)return{stopReason:`cancelled`};if(u!==void 0)throw eveFailure(u);if(d!==void 0)throw d;if(c.length===0)return{stopReason:`end_turn`};let f;try{f=await Promise.all(c.map(r=>this.#l(e.sessionId,i,r,t,n)))}catch(t){if(s.protocolCancelled)throw RequestError.requestCancelled({sessionId:e.sessionId});if(s.cancelRequested)return{stopReason:`cancelled`};throw t}if(s.protocolCancelled)throw RequestError.requestCancelled({sessionId:e.sessionId});if(s.cancelRequested)return{stopReason:`cancelled`};o={inputResponses:f}}}catch(e){throw acpRequestError(e)}finally{n.removeEventListener(`abort`,onProtocolCancel),i.tools.clear(),s.resolveSettled(),i.active===s&&(i.active=void 0)}}async cancel(e){let t=this.#i.get(e);t===void 0||t.active===void 0||(t.active.cancelRequested=!0,await this.#o(t))}async closeSession(e){let t=this.#s(e);this.#i.delete(e),await this.#a(t)}async close(){let e=[...this.#i.values()];this.#i.clear(),await Promise.allSettled(e.map(e=>this.#a(e)))}async#a(e){let t;if(e.active!==void 0){let n=e.active;n.cancelRequested=!0;try{await this.#o(e)}catch(e){t=e}await n.settled}try{await e.client.reset()}catch(e){throw t===void 0?e:AggregateError([t,e],`Could not cancel or reset the eve session`)}if(t!==void 0)throw t}async#o(e){e.active?.outboundController.abort(),e.client.state.sessionId!==void 0&&await e.client.cancel(e.active?.turnId===void 0?void 0:{turnId:e.active.turnId})}#s(e){let t=this.#i.get(e);if(t===void 0)throw RequestError.invalidParams({sessionId:e},`Unknown or closed ACP session`);return t}async#c(e,t,n,r){switch(n.type){case`message.appended`:await notifyUpdate(r,e,{sessionUpdate:`agent_message_chunk`,content:{type:`text`,text:n.data.messageDelta},messageId:`${n.data.turnId}:message:${n.data.stepIndex}`});return;case`reasoning.appended`:await notifyUpdate(r,e,{sessionUpdate:`agent_thought_chunk`,content:{type:`text`,text:n.data.reasoningDelta},messageId:`${n.data.turnId}:thought:${n.data.stepIndex}`});return;case`actions.requested`:for(let i of n.data.actions){let n=toolCallForAction(i);t.tools.set(i.callId,n),await notifyUpdate(r,e,{sessionUpdate:`tool_call`,...n})}return;case`action.result`:{let t=n.data.result,i=n.data.status!==`completed`||t.isError?`failed`:`completed`;await notifyUpdate(r,e,{sessionUpdate:`tool_call_update`,toolCallId:t.callId,status:i,content:[{type:`content`,content:{type:`text`,text:stringifyOutput(t.output)}}],rawOutput:t.output});return}default:return}}async#l(e,t,n,a,o){let c=AbortSignal.any([o,t.active.outboundController.signal]);if(n.display===`confirmation`){let o=`${n.requestId}:approve`,s=`${n.requestId}:deny`,l=t.tools.get(n.action.callId)??toolCallForAction(n.action),u=await a.request(methods.client.session.requestPermission,{sessionId:e,toolCall:l,options:[{kind:`allow_once`,name:`Approve`,optionId:o},{kind:`reject_once`,name:`Deny`,optionId:s}]},{cancellationSignal:c});if(u.outcome.outcome===`cancelled`)return this.#u(t),{requestId:n.requestId};if(u.outcome.optionId===o)return{requestId:n.requestId,optionId:`approve`};if(u.outcome.optionId===s)return{requestId:n.requestId,optionId:`deny`};throw RequestError.invalidParams({optionId:u.outcome.optionId},`Unknown ACP permission option`)}if(!this.#r)throw unsupported(`The ACP client does not support form elicitation required by this eve question.`);let l=elicitationProperty(n),u=await a.request(methods.client.elicitation.create,{mode:`form`,sessionId:e,message:n.prompt,requestedSchema:{type:`object`,properties:{[ANSWER_FIELD]:l},required:[ANSWER_FIELD]}},{cancellationSignal:c});if(u.action!==`accept`)return this.#u(t),{requestId:n.requestId};let d=u.content?.[ANSWER_FIELD];if(typeof d!=`string`)throw RequestError.invalidParams(u.content,`ACP elicitation response must contain a string answer`);if(n.display===`select`){if(!n.options?.some(e=>e.id===d))throw RequestError.invalidParams({answer:d},`Unknown eve question option`);return{requestId:n.requestId,optionId:d}}return{requestId:n.requestId,text:d}}#u(e){let t=e.active;t.cancelRequested=!0,t.outboundController.abort()}};async function normalizedRealpath(e,n){try{return await realpath(e)}catch(t){throw RequestError.invalidParams({path:e},`Could not resolve ${n}: ${errorMessage(t)}`)}}function promptContent(e){let t=e.prompt.map(e=>{if(e.type!==`text`)throw unsupported(`ACP prompt content type ${JSON.stringify(e.type)} is not supported.`);return{type:`text`,text:e.text}});if(t.every(e=>e.text.length===0))throw RequestError.invalidParams(e.prompt,`ACP prompt must contain at least one non-empty text block`);return t}function toolCallForAction(e){let t=e.kind===`tool-call`?e.toolName:e.kind===`load-skill`?`Load skill`:e.name;return{toolCallId:e.callId,title:t,kind:`other`,status:`pending`,rawInput:e.input}}function elicitationProperty(e){if(e.display===`select`&&e.allowFreeform!==!0&&e.options?.length)return{type:`string`,title:e.prompt,oneOf:e.options.map(e=>({const:e.id,title:e.label,description:e.description}))};if(e.display===`text`&&e.allowFreeform!==!1)return{type:`string`,title:e.prompt,minLength:1};throw unsupported(`This eve question shape cannot be represented by ACP form elicitation.`)}async function notifyUpdate(e,t,n){await e.notify(methods.client.session.update,{sessionId:t,update:n})}function stringifyOutput(e){return typeof e==`string`?e:JSON.stringify(e,null,2)}function unsupported(e){return new RequestError(-32003,e)}function eveFailure(e){return new RequestError(ERROR_CODE_EVE,e.data.message,{code:e.data.code,details:e.data.details})}function acpRequestError(e){return e instanceof RequestError?e:e instanceof ClientError?new RequestError(ERROR_CODE_EVE,e.message,{httpStatus:e.status}):new RequestError(ERROR_CODE_EVE,errorMessage(e))}function errorMessage(e){return e instanceof Error?e.message:String(e)}export{EveAcpAdapter};
@@ -0,0 +1,3 @@
1
+ export declare const ACP_MAX_LINE_BYTES: number;
2
+ /** Rejects an ACP stdio line before the SDK's line buffer can grow without bound. */
3
+ export declare function limitAcpLineBytes(maximumBytes?: number): TransformStream<Uint8Array, Uint8Array>;
@@ -0,0 +1 @@
1
+ const ACP_MAX_LINE_BYTES=10*1024*1024;function limitAcpLineBytes(t=ACP_MAX_LINE_BYTES){let n=0;return new TransformStream({transform(e,r){for(let i of e){if(i===10){n=0;continue}if(n+=1,n>t){r.error(Error(`ACP message exceeds the ${t}-byte line limit.`));return}}r.enqueue(e)}})}export{ACP_MAX_LINE_BYTES,limitAcpLineBytes};
@@ -0,0 +1,24 @@
1
+ import { Readable, Writable } from "node:stream";
2
+ import { type EveAcpAdapterOptions } from "#acp/adapter.js";
3
+ import type { ClientOptions } from "#client/types.js";
4
+ /** Configuration for one ACP stdio connection backed by an eve server. */
5
+ export interface RunAcpServerOptions {
6
+ readonly auth?: ClientOptions["auth"];
7
+ readonly eveVersion: string;
8
+ readonly headers?: ClientOptions["headers"];
9
+ readonly serverUrl: string;
10
+ readonly signal?: AbortSignal;
11
+ /** Local workspace root to enforce; omit when connecting to a remote deployment. */
12
+ readonly workspaceRoot?: string;
13
+ /** @internal Test seam for the public eve client boundary. */
14
+ readonly client?: EveAcpAdapterOptions["client"];
15
+ }
16
+ /** Node streams for one ACP stdio connection. */
17
+ export interface AcpServerStreams {
18
+ readonly input: Readable;
19
+ readonly output: Writable;
20
+ }
21
+ /** Serves one stable ACP v1 connection over process stdio until the client disconnects. */
22
+ export declare function runAcpServer(options: RunAcpServerOptions): Promise<void>;
23
+ /** Serves one stable ACP v1 connection over the supplied Node streams. */
24
+ export declare function runAcpServerOnStreams(options: RunAcpServerOptions, streams: AcpServerStreams): Promise<void>;
@@ -0,0 +1 @@
1
+ import{agent,methods,ndJsonStream}from"#compiled/@agentclientprotocol/sdk/index.js";import{Readable,Writable}from"node:stream";import{EveAcpAdapter}from"#acp/adapter.js";import{limitAcpLineBytes}from"#acp/line-limit.js";async function runAcpServer(e){await runAcpServerOnStreams(e,{input:process.stdin,output:process.stdout})}async function runAcpServerOnStreams(r,i){let a=new EveAcpAdapter(r),o=agent({name:`eve`}).onRequest(methods.agent.initialize,({params:e})=>a.initialize(e)).onRequest(methods.agent.session.new,({params:e})=>a.newSession(e)).onRequest(methods.agent.session.prompt,({params:e,client:t,signal:n})=>a.prompt(e,t,n)).onRequest(methods.agent.session.close,({params:e})=>a.closeSession(e.sessionId)).onNotification(methods.agent.session.cancel,({params:e})=>a.cancel(e.sessionId)),s=Writable.toWeb(i.output),c=Readable.toWeb(i.input).pipeThrough(limitAcpLineBytes()),l=o.connect(ndJsonStream(s,c)),close=()=>l.close();r.signal?.aborted?close():r.signal?.addEventListener(`abort`,close,{once:!0});try{await l.closed}finally{r.signal?.removeEventListener(`abort`,close),await a.close()}}export{runAcpServer,runAcpServerOnStreams};
@@ -679,6 +679,7 @@ async function openStreamBody(input) {
679
679
  let response;
680
680
  try {
681
681
  response = await fetch(url, {
682
+ cache: "no-store",
682
683
  headers,
683
684
  redirect: input.redirect,
684
685
  signal: input.signal ?? null
@@ -810,6 +811,33 @@ var ClientSession = class {
810
811
  get state() {
811
812
  return this.#state;
812
813
  }
814
+ async snapshot(options) {
815
+ options?.signal?.throwIfAborted();
816
+ const initialState = this.#state;
817
+ const sessionId = initialState.sessionId;
818
+ if (!sessionId) throw new Error("Session has no session ID. Send a message first.");
819
+ const events = [];
820
+ for await (const event of this.#readStream({
821
+ follow: false,
822
+ sessionId,
823
+ signal: options?.signal,
824
+ startIndex: 0
825
+ })) events.push(event);
826
+ options?.signal?.throwIfAborted();
827
+ const lastEvent = events.at(-1);
828
+ const continuationToken = lastEvent?.type === "session.waiting" ? lastEvent.data.continuationToken : lastEvent?.type === "session.completed" && this.#context.preserveCompletedSessions ? initialState.continuationToken : void 0;
829
+ return {
830
+ events,
831
+ session: continuationToken === void 0 ? {
832
+ sessionId,
833
+ streamIndex: events.length
834
+ } : {
835
+ continuationToken,
836
+ sessionId,
837
+ streamIndex: events.length
838
+ }
839
+ };
840
+ }
813
841
  async send(input) {
814
842
  const payload = normalizeSendTurnInput(input);
815
843
  const state = this.#state;
@@ -923,10 +951,8 @@ var ClientSession = class {
923
951
  async *#createEventStream(sessionId, continuationToken, initialState, input) {
924
952
  const events = [];
925
953
  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,
954
+ for await (const event of this.#readStream({
955
+ headers: input.headers,
930
956
  streamReconnectPolicy: input.streamReconnectPolicy,
931
957
  sessionId,
932
958
  signal: input.signal,
@@ -951,15 +977,12 @@ var ClientSession = class {
951
977
  const streamIndex = options?.startIndex ?? initialState.streamIndex;
952
978
  const events = [];
953
979
  try {
954
- for await (const event of followStreamIterable({
980
+ for await (const event of this.#readStream({
955
981
  follow: options?.follow,
956
- host: this.#context.host,
957
- resolveHeaders: () => this.#context.resolveHeaders(),
958
- redirect: this.#context.redirect,
959
- streamReconnectPolicy: options?.streamReconnectPolicy,
960
982
  sessionId,
961
983
  signal: options?.signal,
962
- startIndex: streamIndex
984
+ startIndex: streamIndex,
985
+ streamReconnectPolicy: options?.streamReconnectPolicy
963
986
  })) {
964
987
  events.push(event);
965
988
  yield event;
@@ -978,6 +1001,18 @@ var ClientSession = class {
978
1001
  });
979
1002
  }
980
1003
  }
1004
+ #readStream(input) {
1005
+ return followStreamIterable({
1006
+ follow: input.follow,
1007
+ host: this.#context.host,
1008
+ resolveHeaders: () => this.#context.resolveHeaders(input.headers),
1009
+ redirect: this.#context.redirect,
1010
+ streamReconnectPolicy: input.streamReconnectPolicy,
1011
+ sessionId: input.sessionId,
1012
+ signal: input.signal,
1013
+ startIndex: input.startIndex
1014
+ });
1015
+ }
981
1016
  };
982
1017
  async function postTurnWithRetry(input) {
983
1018
  const attempts = input.mustDeliver ? DELIVER_RETRY_ATTEMPTS : 1;
@@ -679,6 +679,7 @@ async function openStreamBody(input) {
679
679
  let response;
680
680
  try {
681
681
  response = await fetch(url, {
682
+ cache: "no-store",
682
683
  headers,
683
684
  redirect: input.redirect,
684
685
  signal: input.signal ?? null
@@ -810,6 +811,33 @@ var ClientSession = class {
810
811
  get state() {
811
812
  return this.#state;
812
813
  }
814
+ async snapshot(options) {
815
+ options?.signal?.throwIfAborted();
816
+ const initialState = this.#state;
817
+ const sessionId = initialState.sessionId;
818
+ if (!sessionId) throw new Error("Session has no session ID. Send a message first.");
819
+ const events = [];
820
+ for await (const event of this.#readStream({
821
+ follow: false,
822
+ sessionId,
823
+ signal: options?.signal,
824
+ startIndex: 0
825
+ })) events.push(event);
826
+ options?.signal?.throwIfAborted();
827
+ const lastEvent = events.at(-1);
828
+ const continuationToken = lastEvent?.type === "session.waiting" ? lastEvent.data.continuationToken : lastEvent?.type === "session.completed" && this.#context.preserveCompletedSessions ? initialState.continuationToken : void 0;
829
+ return {
830
+ events,
831
+ session: continuationToken === void 0 ? {
832
+ sessionId,
833
+ streamIndex: events.length
834
+ } : {
835
+ continuationToken,
836
+ sessionId,
837
+ streamIndex: events.length
838
+ }
839
+ };
840
+ }
813
841
  async send(input) {
814
842
  const payload = normalizeSendTurnInput(input);
815
843
  const state = this.#state;
@@ -923,10 +951,8 @@ var ClientSession = class {
923
951
  async *#createEventStream(sessionId, continuationToken, initialState, input) {
924
952
  const events = [];
925
953
  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,
954
+ for await (const event of this.#readStream({
955
+ headers: input.headers,
930
956
  streamReconnectPolicy: input.streamReconnectPolicy,
931
957
  sessionId,
932
958
  signal: input.signal,
@@ -951,15 +977,12 @@ var ClientSession = class {
951
977
  const streamIndex = options?.startIndex ?? initialState.streamIndex;
952
978
  const events = [];
953
979
  try {
954
- for await (const event of followStreamIterable({
980
+ for await (const event of this.#readStream({
955
981
  follow: options?.follow,
956
- host: this.#context.host,
957
- resolveHeaders: () => this.#context.resolveHeaders(),
958
- redirect: this.#context.redirect,
959
- streamReconnectPolicy: options?.streamReconnectPolicy,
960
982
  sessionId,
961
983
  signal: options?.signal,
962
- startIndex: streamIndex
984
+ startIndex: streamIndex,
985
+ streamReconnectPolicy: options?.streamReconnectPolicy
963
986
  })) {
964
987
  events.push(event);
965
988
  yield event;
@@ -978,6 +1001,18 @@ var ClientSession = class {
978
1001
  });
979
1002
  }
980
1003
  }
1004
+ #readStream(input) {
1005
+ return followStreamIterable({
1006
+ follow: input.follow,
1007
+ host: this.#context.host,
1008
+ resolveHeaders: () => this.#context.resolveHeaders(input.headers),
1009
+ redirect: this.#context.redirect,
1010
+ streamReconnectPolicy: input.streamReconnectPolicy,
1011
+ sessionId: input.sessionId,
1012
+ signal: input.signal,
1013
+ startIndex: input.startIndex
1014
+ });
1015
+ }
981
1016
  };
982
1017
  async function postTurnWithRetry(input) {
983
1018
  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>;