eve 0.31.3 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/src/chunks/{use-eve-agent-CF5D6jSV.js → use-eve-agent-CX87G1vU.js} +30 -5
  3. package/dist/src/chunks/{use-eve-agent-DbYZLG0h.js → use-eve-agent-DwyRde1N.js} +30 -5
  4. package/dist/src/cli/commands/integration-connect.d.ts +1 -0
  5. package/dist/src/cli/commands/integration-connect.js +1 -1
  6. package/dist/src/cli/commands/integration-setup.d.ts +4 -0
  7. package/dist/src/cli/commands/integration-setup.js +1 -1
  8. package/dist/src/cli/commands/register-integration-commands.js +1 -1
  9. package/dist/src/cli/commands/register-registry-commands.js +1 -1
  10. package/dist/src/cli/commands/registry-declared-setups.d.ts +23 -0
  11. package/dist/src/cli/commands/registry-declared-setups.js +1 -0
  12. package/dist/src/cli/commands/registry-metadata.d.ts +69 -0
  13. package/dist/src/cli/commands/registry-metadata.js +1 -1
  14. package/dist/src/cli/commands/registry-package.d.ts +3 -3
  15. package/dist/src/cli/commands/registry-package.js +1 -1
  16. package/dist/src/cli/commands/registry-presentation.d.ts +20 -0
  17. package/dist/src/cli/commands/registry-presentation.js +7 -0
  18. package/dist/src/cli/commands/registry-search-presentation.d.ts +16 -0
  19. package/dist/src/cli/commands/registry-search-presentation.js +6 -0
  20. package/dist/src/cli/commands/registry-setup-command.d.ts +5 -2
  21. package/dist/src/cli/commands/registry-setup-command.js +1 -2
  22. package/dist/src/cli/commands/registry.d.ts +16 -7
  23. package/dist/src/cli/commands/registry.js +1 -6
  24. package/dist/src/cli/commands/setup-answers.d.ts +2 -0
  25. package/dist/src/cli/commands/setup-answers.js +1 -0
  26. package/dist/src/cli/commands/setup-headless.d.ts +79 -0
  27. package/dist/src/cli/commands/setup-headless.js +1 -0
  28. package/dist/src/cli/dev/tui/runner.js +1 -1
  29. package/dist/src/cli/dev/tui/setup-commands.js +3 -3
  30. package/dist/src/cli/dev/tui/setup-flow.d.ts +8 -1
  31. package/dist/src/cli/dev/tui/terminal-renderer.js +12 -12
  32. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +1 -1
  33. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  34. package/dist/src/client/url.d.ts +5 -0
  35. package/dist/src/client/url.js +1 -1
  36. package/dist/src/compiled/.vendor-stamp.json +8 -8
  37. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +33 -13
  38. package/dist/src/compiled/@ai-sdk/anthropic/index.js +4 -2
  39. package/dist/src/compiled/@ai-sdk/google/index.d.ts +50 -3
  40. package/dist/src/compiled/@ai-sdk/google/index.js +7 -7
  41. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +33 -3
  42. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  43. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +140 -9
  44. package/dist/src/compiled/@ai-sdk/openai/index.js +9 -6
  45. package/dist/src/compiled/@ai-sdk/otel/index.js +1 -1
  46. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +300 -6
  47. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +70 -20
  48. package/dist/src/compiled/@opentelemetry/api/index.d.ts +2 -1
  49. package/dist/src/compiled/@photon-ai/chat-adapter-imessage/index.js +1 -1
  50. package/dist/src/compiled/@vercel/otel/index.d.ts +6 -0
  51. package/dist/src/compiled/@vercel/sandbox/index.js +1 -1
  52. package/dist/src/compiled/_chunks/node/undici-CUIybhQ2.js +95 -0
  53. package/dist/src/compiled/_chunks/workflow/dist-eUxFublw.js +77 -0
  54. package/dist/src/compiled/shadcn-registry/index.js +309 -215
  55. package/dist/src/compiler/extension-compatibility.d.ts +10 -10
  56. package/dist/src/compiler/extension-compatibility.js +1 -1
  57. package/dist/src/context/build-callback-context.js +1 -1
  58. package/dist/src/execution/authorization-callback-match.d.ts +14 -0
  59. package/dist/src/execution/authorization-callback-match.js +1 -0
  60. package/dist/src/execution/next-driver-action.d.ts +1 -0
  61. package/dist/src/execution/parked-delivery-wait.d.ts +16 -1
  62. package/dist/src/execution/parked-delivery-wait.js +1 -1
  63. package/dist/src/execution/sandbox/abort-bound-session.d.ts +1 -1
  64. package/dist/src/execution/sandbox/bindings/docker.js +1 -1
  65. package/dist/src/execution/sandbox/bindings/just-bash-runtime.js +1 -1
  66. package/dist/src/execution/sandbox/bindings/microsandbox-lifecycle.js +1 -1
  67. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.d.ts +1 -0
  68. package/dist/src/execution/sandbox/bindings/microsandbox-runtime.js +1 -1
  69. package/dist/src/execution/sandbox/bindings/vercel.js +1 -1
  70. package/dist/src/execution/sandbox/ensure.js +1 -1
  71. package/dist/src/execution/session-command-inbox.d.ts +26 -1
  72. package/dist/src/execution/session-command-inbox.js +1 -1
  73. package/dist/src/execution/turn-execution-cursor.d.ts +1 -0
  74. package/dist/src/execution/turn-workflow.js +1 -1
  75. package/dist/src/execution/workflow-entry.js +1 -1
  76. package/dist/src/execution/workflow-steps.d.ts +3 -4
  77. package/dist/src/execution/workflow-steps.js +1 -1
  78. package/dist/src/harness/authorization.d.ts +24 -11
  79. package/dist/src/harness/authorization.js +1 -1
  80. package/dist/src/harness/input-extraction.js +1 -1
  81. package/dist/src/harness/input-requests.js +1 -1
  82. package/dist/src/harness/provider-tools.d.ts +1 -1
  83. package/dist/src/harness/provider-tools.js +1 -1
  84. package/dist/src/harness/tool-loop.js +2 -2
  85. package/dist/src/internal/application/package.js +1 -1
  86. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  87. package/dist/src/protocol/routes.d.ts +8 -6
  88. package/dist/src/protocol/routes.js +1 -1
  89. package/dist/src/public/channels/slack/attachments.js +1 -1
  90. package/dist/src/public/channels/slack/defaults.js +1 -1
  91. package/dist/src/public/channels/slack/hitl.d.ts +14 -1
  92. package/dist/src/public/channels/slack/hitl.js +2 -2
  93. package/dist/src/public/definitions/callback-context.d.ts +2 -2
  94. package/dist/src/public/definitions/sandbox.d.ts +1 -1
  95. package/dist/src/public/definitions/tool.d.ts +9 -9
  96. package/dist/src/public/sandbox/index.d.ts +1 -1
  97. package/dist/src/public/tools/web-search.d.ts +2 -2
  98. package/dist/src/runtime/connections/callback-route.d.ts +4 -5
  99. package/dist/src/runtime/connections/callback-route.js +1 -1
  100. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  101. package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
  102. package/dist/src/runtime/framework-tools/todo.js +1 -1
  103. package/dist/src/runtime/input/types.d.ts +1 -4
  104. package/dist/src/sandbox/state.d.ts +1 -0
  105. package/dist/src/setup/ask-editable.d.ts +22 -0
  106. package/dist/src/setup/ask-editable.js +1 -0
  107. package/dist/src/setup/ask-signals.d.ts +23 -0
  108. package/dist/src/setup/ask-signals.js +1 -0
  109. package/dist/src/setup/ask.d.ts +24 -25
  110. package/dist/src/setup/ask.js +1 -1
  111. package/dist/src/setup/boxes/deploy-project.js +1 -1
  112. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  113. package/dist/src/setup/connection-connector.js +3 -2
  114. package/dist/src/setup/flows/registry-session.d.ts +33 -0
  115. package/dist/src/setup/flows/registry-session.js +1 -0
  116. package/dist/src/setup/flows/registry.d.ts +16 -0
  117. package/dist/src/setup/flows/registry.js +1 -1
  118. package/dist/src/setup/index.js +1 -1
  119. package/dist/src/setup/integrations/discord/setup.d.ts +19 -7
  120. package/dist/src/setup/integrations/discord/setup.js +4 -3
  121. package/dist/src/setup/integrations/github/setup.d.ts +36 -7
  122. package/dist/src/setup/integrations/github/setup.js +2 -2
  123. package/dist/src/setup/integrations/linear/setup.d.ts +21 -9
  124. package/dist/src/setup/integrations/linear/setup.js +2 -2
  125. package/dist/src/setup/integrations/photon/management.d.ts +8 -1
  126. package/dist/src/setup/integrations/photon/management.js +1 -1
  127. package/dist/src/setup/integrations/photon/setup-flow.d.ts +28 -24
  128. package/dist/src/setup/integrations/photon/setup-flow.js +3 -3
  129. package/dist/src/setup/integrations/photon/setup.d.ts +1 -3
  130. package/dist/src/setup/integrations/photon/setup.js +1 -1
  131. package/dist/src/setup/integrations/registry.d.ts +1 -1
  132. package/dist/src/setup/integrations/registry.js +1 -1
  133. package/dist/src/setup/integrations/runner.d.ts +14 -11
  134. package/dist/src/setup/integrations/runner.js +1 -1
  135. package/dist/src/setup/integrations/shared/prerequisite.d.ts +17 -0
  136. package/dist/src/setup/integrations/shared/prerequisite.js +1 -0
  137. package/dist/src/setup/integrations/shared/ui.d.ts +22 -15
  138. package/dist/src/setup/integrations/shared/ui.js +2 -2
  139. package/dist/src/setup/integrations/shared/vercel-project.d.ts +11 -0
  140. package/dist/src/setup/integrations/shared/vercel-project.js +1 -0
  141. package/dist/src/setup/integrations/slack/setup.d.ts +25 -10
  142. package/dist/src/setup/integrations/slack/setup.js +1 -1
  143. package/dist/src/setup/integrations/types.d.ts +43 -13
  144. package/dist/src/setup/integrations/types.js +1 -1
  145. package/dist/src/setup/integrations/web/setup.d.ts +22 -3
  146. package/dist/src/setup/integrations/web/setup.js +1 -1
  147. package/dist/src/setup/prompter.d.ts +8 -0
  148. package/dist/src/setup/question-options.d.ts +15 -0
  149. package/dist/src/setup/question-options.js +1 -0
  150. package/dist/src/setup/registry-setup-client.d.ts +3 -4
  151. package/dist/src/setup/registry-setup-client.js +2 -2
  152. package/dist/src/setup/registry-setup-completion.d.ts +3 -0
  153. package/dist/src/setup/registry-setup-completion.js +1 -0
  154. package/dist/src/setup/registry-setup-protocol.d.ts +22 -3
  155. package/dist/src/setup/registry-setup-protocol.js +1 -1
  156. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  157. package/dist/src/setup/scaffold/create/project.js +55 -3
  158. package/dist/src/setup/scaffold/update/channels.js +1 -1
  159. package/dist/src/setup/setup-question-wire.d.ts +48 -0
  160. package/dist/src/setup/setup-question-wire.js +1 -0
  161. package/dist/src/setup/slackbot.d.ts +5 -1
  162. package/dist/src/setup/slackbot.js +1 -1
  163. package/dist/src/setup/state.d.ts +2 -2
  164. package/dist/src/shared/sandbox-backend.d.ts +6 -0
  165. package/dist/src/shared/sandbox-session.d.ts +15 -0
  166. package/dist/src/shared/tool-definition.d.ts +2 -2
  167. package/dist/src/shared/tool-schema.d.ts +5 -4
  168. package/dist/src/shared/tool-schema.js +1 -1
  169. package/dist/src/svelte/index.js +1 -1
  170. package/dist/src/svelte/use-eve-agent.js +1 -1
  171. package/dist/src/tracing/agent-otel-provider.d.ts +5 -38
  172. package/dist/src/tracing/agent-otel-provider.js +2 -2
  173. package/dist/src/tracing/agent-span-id-generator.d.ts +15 -0
  174. package/dist/src/tracing/agent-span-id-generator.js +1 -0
  175. package/dist/src/tracing/agent-trace-context-store.d.ts +1 -1
  176. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  177. package/dist/src/tracing/agent-trace-state.d.ts +41 -0
  178. package/dist/src/tracing/agent-trace-state.js +1 -0
  179. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  180. package/dist/src/vue/index.js +1 -1
  181. package/dist/src/vue/use-eve-agent.js +1 -1
  182. package/docs/channels/chat-sdk.mdx +1 -1
  183. package/docs/channels/github.mdx +1 -1
  184. package/docs/channels/linear.mdx +1 -1
  185. package/docs/channels/overview.mdx +2 -2
  186. package/docs/channels/slack.mdx +154 -40
  187. package/docs/concepts/default-harness.md +3 -3
  188. package/docs/concepts/sessions-runs-and-streaming.md +1 -1
  189. package/docs/connections/mcp.mdx +6 -0
  190. package/docs/guides/dev-tui.md +58 -142
  191. package/docs/guides/dynamic-workflows.md +2 -0
  192. package/docs/guides/frontend/overview.mdx +4 -2
  193. package/docs/guides/hooks.md +25 -3
  194. package/docs/guides/session-context.md +18 -0
  195. package/docs/install-integrations.mdx +2 -0
  196. package/docs/reference/cli.md +5 -3
  197. package/docs/reference/typescript-api.md +1 -1
  198. package/docs/sandbox.mdx +25 -5
  199. package/docs/skills.mdx +12 -1
  200. package/docs/subagents.mdx +1 -1
  201. package/docs/tools/human-in-the-loop.md +1 -1
  202. package/docs/tutorial/ship-it.mdx +1 -1
  203. package/package.json +10 -10
  204. package/dist/src/compiled/_chunks/node/undici-DWL_MYmT.js +0 -95
  205. package/dist/src/compiled/_chunks/workflow/dist-CZxNEvEs.js +0 -79
@@ -1,25 +1,28 @@
1
- import type { RegistrySetupFact } from "#setup/registry-setup-protocol.js";
2
- import { detectDeployment } from "#setup/project-resolution.js";
1
+ import { type Asker } from "#setup/ask.js";
2
+ import { detectDeployment, type VercelProjectReference } from "#setup/project-resolution.js";
3
3
  import type { Prompter } from "#setup/prompter.js";
4
4
  import { getVercelAuthStatus } from "#setup/vercel-project.js";
5
+ import type { IntegrationSetupResult, SetupExternalAction } from "./types.js";
5
6
  /** Inputs shared by every registry-owned integration setup flow. */
6
7
  export interface RunIntegrationSetupOptions {
7
8
  appRoot: string;
8
9
  prompter: Prompter;
10
+ /** Defaults to the interactive adapter; agent drivers inject an answer-backed asker. */
11
+ asker?: Asker;
9
12
  signal?: AbortSignal;
10
- yes?: boolean;
13
+ force?: boolean;
14
+ beginExternalAction?: (input: {
15
+ url: string;
16
+ userCode?: string;
17
+ message: string;
18
+ }) => SetupExternalAction;
19
+ resolveVercelProject?: SetupProjectResolver;
11
20
  }
12
21
  /** Effects shared by the built-in integration setup runner. */
22
+ export type SetupProjectResolver = (integration: string) => Promise<VercelProjectReference>;
13
23
  export interface IntegrationSetupRunnerDeps {
14
24
  detectDeployment: typeof detectDeployment;
15
25
  getVercelAuthStatus: typeof getVercelAuthStatus;
16
26
  }
17
- /** Outcome returned by one registry-owned integration setup flow. */
18
- export type IntegrationSetupOutcome = {
19
- kind: "cancelled";
20
- } | {
21
- kind: "done";
22
- facts?: readonly RegistrySetupFact[];
23
- };
24
27
  /** Runs one built-in integration setup flow selected by its registry setup name. */
25
- export declare function runIntegrationSetup(kind: string, options: RunIntegrationSetupOptions, deps?: IntegrationSetupRunnerDeps): Promise<IntegrationSetupOutcome>;
28
+ export declare function runIntegrationSetup(kind: string, options: RunIntegrationSetupOptions, deps?: IntegrationSetupRunnerDeps): Promise<IntegrationSetupResult>;
@@ -1 +1 @@
1
- import{createIntegrationSetupUi}from"./shared/ui.js";import{setupIntegration}from"./registry.js";import{describeIntegrationSetupEnvironment,integrationSetupEnvironment}from"./shared/environment.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";import{interactiveAsker}from"#setup/ask.js";const defaultDeps={detectDeployment,getVercelAuthStatus};async function runIntegrationSetup(e,t,n=defaultDeps){let r=setupIntegration(e);t.prompter.intro(`Set up ${r.label}`),t.prompter.log.message(`Checking Vercel setup...`);let[i,a]=await Promise.all([n.detectDeployment(t.appRoot,{signal:t.signal}),n.getVercelAuthStatus(t.appRoot,{signal:t.signal})]),o=integrationSetupEnvironment(a,projectResolutionFromDeployment(i));return t.prompter.log.info(describeIntegrationSetupEnvironment(o)),await r.setup({environment:o,appRoot:t.appRoot,ui:createIntegrationSetupUi({asker:interactiveAsker(t.prompter),prompter:t.prompter}),yes:t.yes,signal:t.signal})}export{runIntegrationSetup};
1
+ import{createSetupContexts}from"./shared/ui.js";import{setupIntegration}from"./registry.js";import{describeIntegrationSetupEnvironment,integrationSetupEnvironment}from"./shared/environment.js";import{resolveIntegrationVercelProject}from"./shared/vercel-project.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{interactiveAsker}from"#setup/ask.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const defaultDeps={detectDeployment,getVercelAuthStatus};async function runIntegrationSetup(t,n,r=defaultDeps){let i=setupIntegration(t);n.prompter.intro(`Set up ${i.label}`),n.prompter.log.message(`Checking Vercel setup...`);let[a,o]=await Promise.all([r.detectDeployment(n.appRoot,{signal:n.signal}),r.getVercelAuthStatus(n.appRoot,{signal:n.signal})]),s=integrationSetupEnvironment(o,projectResolutionFromDeployment(a));return n.prompter.log.info(describeIntegrationSetupEnvironment(s)),i.run(createSetupContexts({appRoot:n.appRoot,asker:n.asker??interactiveAsker(n.prompter),environment:s,prompter:n.prompter,resolveVercelProject:n.resolveVercelProject??(e=>resolveIntegrationVercelProject({appRoot:n.appRoot,integration:e,signal:n.signal})),signal:n.signal,force:n.force,beginExternalAction:n.beginExternalAction}))}export{runIntegrationSetup};
@@ -0,0 +1,17 @@
1
+ export type SetupPrerequisite = {
2
+ kind: "command";
3
+ code: string;
4
+ message: string;
5
+ command: string;
6
+ } | {
7
+ kind: "environment";
8
+ code: string;
9
+ message: string;
10
+ variable: string;
11
+ sensitive: true;
12
+ };
13
+ /** A setup blocker whose prerequisite must be satisfied by the caller. */
14
+ export declare class SetupPrerequisiteRequired extends Error {
15
+ readonly prerequisite: SetupPrerequisite;
16
+ constructor(prerequisite: SetupPrerequisite);
17
+ }
@@ -0,0 +1 @@
1
+ var SetupPrerequisiteRequired=class extends Error{prerequisite;constructor(e){super(e.message),this.name=`SetupPrerequisiteRequired`,this.prerequisite=e}};export{SetupPrerequisiteRequired};
@@ -1,18 +1,25 @@
1
- import { type Asker } from "../../ask.js";
1
+ import type { Asker } from "../../ask.js";
2
2
  import type { Prompter } from "../../prompter.js";
3
- /** UI capabilities available to a channel-owned setup hook. */
4
- export interface IntegrationSetupUi {
5
- readonly asker: Asker;
6
- readonly prompter: Prompter;
7
- confirm(input: {
8
- key: string;
9
- message: string;
10
- recommended?: boolean;
11
- }): Promise<boolean>;
12
- nextSteps(lines: readonly string[]): void;
13
- }
14
- /** Adapts the shared setup asker and prompter to the channel hook UI. */
15
- export declare function createIntegrationSetupUi(input: {
3
+ import type { SetupApplyContext, SetupExternalAction, SetupPrepareContext, SetupPresenter } from "../types.js";
4
+ export declare function createSetupPresenter(prompter: Prompter, beginExternalAction?: (input: {
5
+ url: string;
6
+ userCode?: string;
7
+ message: string;
8
+ }) => SetupExternalAction): SetupPresenter;
9
+ export declare function createSetupContexts(input: {
10
+ appRoot: string;
16
11
  asker: Asker;
12
+ environment: SetupPrepareContext["environment"];
17
13
  prompter: Prompter;
18
- }): IntegrationSetupUi;
14
+ resolveVercelProject: SetupPrepareContext["resolveVercelProject"];
15
+ signal?: AbortSignal;
16
+ force?: boolean;
17
+ beginExternalAction?: (input: {
18
+ url: string;
19
+ userCode?: string;
20
+ message: string;
21
+ }) => SetupExternalAction;
22
+ }): {
23
+ prepare: SetupPrepareContext;
24
+ apply: SetupApplyContext;
25
+ };
@@ -1,2 +1,2 @@
1
- import{SkippedSignal,confirm}from"../../ask.js";function createIntegrationSetupUi(n){return{...n,async confirm(r){try{return await n.asker.ask(confirm(r))}catch(t){if(t instanceof SkippedSignal)return!1;throw t}},nextSteps(e){e.length!==0&&n.prompter.note(e.join(`
2
- `),`Next steps`,{tone:`success`})}}}export{createIntegrationSetupUi};
1
+ function createSetupPresenter(e,t){return{log:e.log,note:e.note.bind(e),nextSteps(t){t.length>0&&e.note(t.join(`
2
+ `),`Next steps`,{tone:`success`})},beginExternalAction(n){return t===void 0?(e.log.message(n.message),e.log.message(n.url),n.userCode!==void 0&&e.log.message(`Code: ${n.userCode}`),{complete(){}}):t(n)}}}function createSetupContexts(e){let t=createSetupPresenter(e.prompter,e.beginExternalAction),n={appRoot:e.appRoot,presenter:t};return e.signal!==void 0&&(n.signal=e.signal),e.force!==void 0&&(n.force=e.force),{prepare:{...n,asker:e.asker,environment:e.environment,resolveVercelProject:e.resolveVercelProject},apply:n}}export{createSetupContexts,createSetupPresenter};
@@ -0,0 +1,11 @@
1
+ import { readProjectLink, type VercelProjectReference } from "#setup/project-resolution.js";
2
+ export interface IntegrationVercelProjectDeps {
3
+ readProjectLink: typeof readProjectLink;
4
+ }
5
+ /** Requires the caller to link a Vercel project before integration setup begins applying. */
6
+ export declare function resolveIntegrationVercelProject(input: {
7
+ appRoot: string;
8
+ integration: string;
9
+ signal?: AbortSignal;
10
+ deps?: IntegrationVercelProjectDeps;
11
+ }): Promise<VercelProjectReference>;
@@ -0,0 +1 @@
1
+ import{SetupPrerequisiteRequired}from"./prerequisite.js";import{readProjectLink}from"#setup/project-resolution.js";const defaultDeps={readProjectLink};async function resolveIntegrationVercelProject(e){e.signal?.throwIfAborted();let t=await(e.deps??defaultDeps).readProjectLink(e.appRoot);if(t!==void 0)return t;throw new SetupPrerequisiteRequired({kind:`command`,code:`vercel-project-link`,message:`Vercel Connect setup requires a linked Vercel project. Run \`eve link\`, then retry ${e.integration} setup.`,command:`eve link`})}export{resolveIntegrationVercelProject};
@@ -1,16 +1,31 @@
1
- import { deriveSlackConnectorSlug, ensureChannel } from "#setup/scaffold/index.js";
2
- import { ensureVercelProject } from "#setup/flows/ensure-vercel-project.js";
3
- import { provisionSlackbot, reconcileSlackUid } from "#setup/slackbot.js";
4
- import type { IntegrationSetupContext, IntegrationSetupResult, SetupIntegration } from "../types.js";
5
- /** Effects used by Slack setup. */
1
+ import type { VercelProjectReference } from "#setup/project-resolution.js";
2
+ import { deriveSlackConnectorSlug, ensureChannel, type SlackConnectorSlug } from "#setup/scaffold/index.js";
3
+ import { inspectSlackbotConnectors, provisionSlackbot, reconcileSlackUid, type SlackConnectorSelection } from "#setup/slackbot.js";
4
+ import { type SetupApplyContext, type SetupPrepareContext } from "../types.js";
6
5
  export interface SlackSetupDeps {
7
6
  deriveSlackConnectorSlug: typeof deriveSlackConnectorSlug;
8
7
  ensureChannel: typeof ensureChannel;
9
- ensureVercelProject: typeof ensureVercelProject;
8
+ inspectConnectors: typeof inspectSlackbotConnectors;
10
9
  provisionSlackbot: typeof provisionSlackbot;
11
10
  reconcileSlackUid: typeof reconcileSlackUid;
12
11
  }
13
- /** Runs the Slack setup flow. Exported for direct integration tests. */
14
- export declare function setupSlack(context: IntegrationSetupContext, deps?: SlackSetupDeps): Promise<IntegrationSetupResult>;
15
- /** Slack setup registration. */
16
- export declare const SLACK_SETUP: SetupIntegration;
12
+ type SlackSetupPlan = {
13
+ credentials: "environment";
14
+ slug: SlackConnectorSlug;
15
+ } | {
16
+ credentials: "vercel-connect";
17
+ slug: SlackConnectorSlug;
18
+ project: VercelProjectReference;
19
+ connector: SlackConnectorSelection;
20
+ };
21
+ export declare function prepareSlackSetup(context: SetupPrepareContext, deps?: SlackSetupDeps): Promise<SlackSetupPlan>;
22
+ export declare function applySlackSetup(plan: SlackSetupPlan, context: SetupApplyContext, deps?: SlackSetupDeps): Promise<{
23
+ facts: {
24
+ label: string;
25
+ value: string;
26
+ kind: "url";
27
+ }[];
28
+ deploymentRequired: true;
29
+ }>;
30
+ export declare const SLACK_SETUP: import("../types.js").SetupIntegration;
31
+ export {};
@@ -1 +1 @@
1
- import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{deriveSlackConnectorSlug,ensureChannel}from"#setup/scaffold/index.js";import{WizardCancelledError}from"#setup/step.js";import{ensureVercelProject}from"#setup/flows/ensure-vercel-project.js";import{provisionSlackbot,reconcileSlackUid}from"#setup/slackbot.js";function slackbotFailureCopy(e){switch(e.state){case`not-installed`:return{reason:`Slackbot is not connected to a Slack workspace. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` after the workspace install is complete."};case`cleanup-failed`:return{reason:`The abandoned Slack connector could not be removed. Slack channel was not added.`,followUp:`Resolve the cleanup warning above before trying again.`};case`connector-lookup-failed`:return{reason:`Existing Slack connectors could not be inspected. Slack channel was not added.`,followUp:"Restore Vercel CLI access, then re-run `eve add channel/slack`."};case`installation-check-failed`:return{reason:`Slack workspace installation could not be verified. Slack channel was not added.`,followUp:"Verify Vercel Connect is reachable, then re-run `eve add channel/slack`."};case`existing-not-installed`:return{reason:`The existing Slack connector is not connected to a Slack workspace. Slack channel was not added.`,followUp:`Resolve the existing connector warning above before trying again.`};case`detach-failed`:return{reason:`Slackbot provisioning could not replace the existing trigger destination. Slack channel was not added.`,followUp:"Run the `vercel connect detach` and `vercel connect attach` commands above."};case`attach-failed`:return{reason:`Slackbot provisioning did not attach this project. Slack channel was not added.`,followUp:"Finish event delivery with the `vercel connect attach` command above."};case`create-failed`:return{reason:`Slackbot creation failed.`,followUp:"Add it later with `eve add channel/slack`."}}}const defaultDeps={deriveSlackConnectorSlug,ensureChannel,ensureVercelProject,provisionSlackbot,reconcileSlackUid};async function chooseCredentials(e){if(e.yes)return`vercel-connect`;try{return await e.ui.prompter.select({message:`How would you like to configure Slack?`,options:[{value:`vercel`,label:`Set up Vercel Connect`,hint:`Sign in and link this project`},{value:`portable`,label:`Use portable credentials`,hint:`Read Slack tokens from environment variables`}]})===`portable`?`environment`:`vercel-connect`}catch(e){if(e instanceof WizardCancelledError)return`cancelled`;throw e}}async function provisionSlack(e,t,n){let r={selectConnector:async(t,n)=>{if(e.yes)return n??t[0];let r=await e.ui.prompter.select({message:`Which Slack app would you like to use?`,options:[...t.map(e=>{let t={value:e.uid,label:`Use ${e.uid}`};return e.uid===n?.uid&&(t.hint=`Matches this agent`),t}),{value:`create`,label:`Create a new Slack app`}],initialValue:n?.uid});return r===`create`?`create`:t.find(e=>e.uid===r)}};e.signal!==void 0&&(r.signal=e.signal),e.ui.prompter.awaitChoice!==void 0&&(r.awaitChoice=e.ui.prompter.awaitChoice);let a=await t.provisionSlackbot(e.ui.prompter.log,e.appRoot,n,void 0,r);if(e.signal?.throwIfAborted(),a.state===`cancelled`)throw new WizardCancelledError;if(a.state!==`attached`){let e=slackbotFailureCopy(a);throw Error(`${e.reason} ${e.followUp}`)}return a}async function setupSlack(n,r=defaultDeps){let i=await chooseCredentials(n);if(i===`cancelled`)return{kind:`cancelled`};if(i===`vercel-connect`&&n.environment.vercel.kind===`unavailable`)throw Error("Vercel Connect requires an authenticated Vercel CLI. Run `vercel login`, then retry Slack setup.");let a=await r.deriveSlackConnectorSlug(n.appRoot);if(i===`environment`){let e=await r.ensureChannel({projectRoot:n.appRoot,kind:`slack`,slackConnectorSlug:a,slackCredentials:`environment`,force:n.force,skipDependencyMutation:!0});return reportOverwrittenFiles(n.ui.prompter.log,e.filesOverwritten),n.ui.prompter.log.success(`Scaffolded channel: slack`),n.ui.nextSteps([`Set SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET in .env.local (listed in .env.example).`,`Configure your Slack app to send events to /eve/v1/slack on your public agent URL.`]),{kind:`done`}}if((await r.ensureVercelProject({appRoot:n.appRoot,prompter:n.ui.prompter,signal:n.signal})).projectId.length===0)throw Error(`Slack setup with Vercel Connect requires a linked Vercel project.`);let o=await provisionSlack(n,r,a),s=await r.ensureChannel({projectRoot:n.appRoot,kind:`slack`,slackConnectorUid:o.connectorUid,slackConnectorSlug:a,force:n.force,skipDependencyMutation:!0});if(reportOverwrittenFiles(n.ui.prompter.log,s.filesOverwritten),s.action===`skipped`&&!await r.reconcileSlackUid(n.ui.prompter.log,n.appRoot,o,`slack/${a}`))throw Error(`Slack connector UID update is required before deployment.`);return n.ui.prompter.log.success(`Scaffolded channel: slack`),await installScaffoldDependencies({changed:s.packageJsonUpdated.length>0,log:n.ui.prompter.log,projectPath:n.appRoot,signal:n.signal}),{kind:`done`}}const SLACK_SETUP={kind:`slack`,label:`Slack`,hint:`Slack app mentions and DMs`,setup:setupSlack};export{SLACK_SETUP,setupSlack};
1
+ import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{deriveSlackConnectorSlug,ensureChannel}from"#setup/scaffold/index.js";import{WizardCancelledError}from"#setup/step.js";import{select}from"#setup/ask.js";import{inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid}from"#setup/slackbot.js";import{slackMessageDeepLink}from"#setup/slack-connect.js";function slackbotFailureCopy(e){switch(e.state){case`not-installed`:return{reason:`Slackbot is not connected to a Slack workspace. Slack channel was not added.`,followUp:"Re-run `eve add channel/slack` after the workspace install is complete."};case`cleanup-failed`:return{reason:`The abandoned Slack connector could not be removed. Slack channel was not added.`,followUp:`Resolve the cleanup warning above before trying again.`};case`connector-lookup-failed`:return{reason:`Existing Slack connectors could not be inspected. Slack channel was not added.`,followUp:"Restore Vercel CLI access, then re-run `eve add channel/slack`."};case`installation-check-failed`:return{reason:`Slack workspace installation could not be verified. Slack channel was not added.`,followUp:"Verify Vercel Connect is reachable, then re-run `eve add channel/slack`."};case`existing-not-installed`:return{reason:`The existing Slack connector is not connected to a Slack workspace. Slack channel was not added.`,followUp:`Resolve the existing connector warning above before trying again.`};case`detach-failed`:return{reason:`Slackbot provisioning could not replace the existing trigger destination. Slack channel was not added.`,followUp:"Run the `vercel connect detach` and `vercel connect attach` commands above."};case`attach-failed`:return{reason:`Slackbot provisioning did not attach this project. Slack channel was not added.`,followUp:"Finish event delivery with the `vercel connect attach` command above."};case`create-failed`:return{reason:`Slackbot creation failed.`,followUp:"Add it later with `eve add channel/slack`."}}}const defaultDeps={deriveSlackConnectorSlug,ensureChannel,inspectConnectors:inspectSlackbotConnectors,provisionSlackbot,reconcileSlackUid};async function chooseConnector(e,t,n){return t.length===0?`create`:e.asker.ask(select({key:`slack-connector`,message:`Which Slack app would you like to use?`,options:[...t.map(e=>({id:e.uid,value:e,label:`Use ${e.uid}`,hint:e.uid===n?.uid?`Matches this agent`:void 0})),{id:`create`,value:`create`,label:`Create a new Slack app`}],recommended:n??t[0]??`create`,required:!0}))}async function prepareSlackSetup(e,t=defaultDeps){let n=await e.asker.ask(select({key:`slack-credentials`,message:`How would you like to configure Slack?`,options:[{id:`vercel`,value:`vercel-connect`,label:`Set up Vercel Connect`,hint:`Use a linked Vercel project`},{id:`portable`,value:`environment`,label:`Use portable credentials`,hint:`Read Slack tokens from environment variables`}],recommended:`vercel-connect`,required:!0})),r=await t.deriveSlackConnectorSlug(e.appRoot);if(n===`environment`)return{credentials:n,slug:r};if(e.environment.vercel.kind===`unavailable`)throw Error("Vercel Connect requires an authenticated Vercel CLI. Run `vercel login`, then retry Slack setup.");let i=await e.resolveVercelProject(`Slack`);if(i.projectId.length===0)throw Error(`Slack setup with Vercel Connect requires a linked Vercel project.`);let a=await t.inspectConnectors(e.presenter.log,e.appRoot,r,e.signal);return{credentials:n,slug:r,project:i,connector:a.state===`found`?await chooseConnector(e,a.connectors,a.preferred):`create`}}async function applySlackSetup(e,r,i=defaultDeps){if(e.credentials===`environment`){let t=await i.ensureChannel({projectRoot:r.appRoot,kind:`slack`,slackConnectorSlug:e.slug,slackCredentials:`environment`,force:r.force,skipDependencyMutation:!0});return reportOverwrittenFiles(r.presenter.log,t.filesOverwritten),r.presenter.log.success(`Scaffolded channel: slack`),r.presenter.nextSteps([`Set SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET in .env.local (listed in .env.example).`,`Configure your Slack app to send events to /eve/v1/slack on your public agent URL.`]),{facts:[],deploymentRequired:!0}}let o=await i.provisionSlackbot(r.presenter.log,r.appRoot,e.slug,void 0,{signal:r.signal,selectConnector:async()=>e.connector});if(r.signal?.throwIfAborted(),o.state===`cancelled`)throw new WizardCancelledError;if(o.state!==`attached`){let e=slackbotFailureCopy(o);throw Error(`${e.reason} ${e.followUp}`)}let s=await i.ensureChannel({projectRoot:r.appRoot,kind:`slack`,slackConnectorUid:o.connectorUid,slackConnectorSlug:e.slug,force:r.force,skipDependencyMutation:!0});if(reportOverwrittenFiles(r.presenter.log,s.filesOverwritten),s.action===`skipped`&&!await i.reconcileSlackUid(r.presenter.log,r.appRoot,o,`slack/${e.slug}`))throw Error(`Slack connector UID update is required before deployment.`);return r.presenter.log.success(`Scaffolded channel: slack`),await installScaffoldDependencies({changed:s.packageJsonUpdated.length>0,log:r.presenter.log,projectPath:r.appRoot,signal:r.signal}),{facts:o.chatUrl===void 0?[]:[{label:`Agent Slack DM`,value:slackMessageDeepLink(o.chatUrl),kind:`url`}],deploymentRequired:!0}}const SLACK_SETUP=defineSetupIntegration({kind:`slack`,label:`Slack`,hint:`Slack app mentions and DMs`,prepare:prepareSlackSetup,apply:applySlackSetup});export{SLACK_SETUP,applySlackSetup,prepareSlackSetup};
@@ -1,26 +1,56 @@
1
- import type { RegistrySetupFact } from "#setup/registry-setup-protocol.js";
1
+ import type { Asker } from "#setup/ask.js";
2
+ import type { Prompter } from "#setup/prompter.js";
3
+ import type { VercelProjectReference } from "#setup/project-resolution.js";
4
+ import type { RegistrySetupCompletion } from "#setup/registry-setup-protocol.js";
2
5
  import type { IntegrationSetupEnvironment } from "./shared/environment.js";
3
- import type { IntegrationSetupUi } from "./shared/ui.js";
4
- /** Inputs available to one registry-owned integration setup flow. */
5
- export interface IntegrationSetupContext {
6
+ export interface SetupExternalAction {
7
+ complete(): void;
8
+ }
9
+ export type SetupPresenter = Pick<Prompter, "log" | "note"> & {
10
+ nextSteps(lines: readonly string[]): void;
11
+ beginExternalAction(input: {
12
+ url: string;
13
+ userCode?: string;
14
+ message: string;
15
+ }): SetupExternalAction;
16
+ };
17
+ export interface SetupPrepareContext {
6
18
  readonly appRoot: string;
19
+ readonly asker: Asker;
7
20
  readonly environment: IntegrationSetupEnvironment;
8
- readonly ui: IntegrationSetupUi;
9
- readonly signal?: AbortSignal;
10
- readonly force?: boolean;
11
- readonly yes?: boolean;
21
+ readonly presenter: SetupPresenter;
22
+ readonly resolveVercelProject: (integration: string) => Promise<VercelProjectReference>;
23
+ signal?: AbortSignal;
24
+ force?: boolean;
25
+ }
26
+ export interface SetupApplyContext {
27
+ readonly appRoot: string;
28
+ readonly presenter: SetupPresenter;
29
+ signal?: AbortSignal;
30
+ force?: boolean;
12
31
  }
13
- /** Outcome from one registry-owned integration setup flow. */
14
32
  export type IntegrationSetupResult = {
15
33
  readonly kind: "done";
16
- readonly facts?: readonly RegistrySetupFact[];
34
+ readonly completion: RegistrySetupCompletion;
17
35
  } | {
18
36
  readonly kind: "cancelled";
19
37
  };
20
- /** One built-in registry-owned integration setup flow. */
21
- export interface SetupIntegration {
38
+ interface SetupIntegrationDefinition<Plan> {
22
39
  readonly kind: string;
23
40
  readonly label: string;
24
41
  readonly hint?: string;
25
- setup(context: IntegrationSetupContext): Promise<IntegrationSetupResult>;
42
+ prepare(context: SetupPrepareContext): Promise<Plan>;
43
+ apply(plan: Plan, context: SetupApplyContext): Promise<RegistrySetupCompletion>;
44
+ }
45
+ export interface SetupIntegration {
46
+ readonly kind: string;
47
+ readonly label: string;
48
+ hint?: string;
49
+ run(input: {
50
+ prepare: SetupPrepareContext;
51
+ apply: SetupApplyContext;
52
+ }): Promise<IntegrationSetupResult>;
26
53
  }
54
+ /** Captures an integration's private plan type behind one executable lifecycle. */
55
+ export declare function defineSetupIntegration<Plan>(definition: SetupIntegrationDefinition<Plan>): SetupIntegration;
56
+ export {};
@@ -1 +1 @@
1
- export{};
1
+ import{WizardCancelledError}from"#setup/step.js";function defineSetupIntegration(t){let n={kind:t.kind,label:t.label,async run(n){try{let e=await t.prepare(n.prepare);return{kind:`done`,completion:await t.apply(e,n.apply)}}catch(t){if(t instanceof WizardCancelledError)return{kind:`cancelled`};throw t}}};return t.hint!==void 0&&(n.hint=t.hint),n}export{defineSetupIntegration};
@@ -1,3 +1,22 @@
1
- import type { SetupIntegration } from "../types.js";
2
- /** Web Chat scaffolding. */
3
- export declare const WEB_SETUP: SetupIntegration;
1
+ import { detectPackageManager } from "#setup/package-manager.js";
2
+ import { ensureChannel } from "#setup/scaffold/index.js";
3
+ import { installScaffoldDependencies } from "../shared/scaffold.js";
4
+ import { type SetupApplyContext, type SetupPrepareContext } from "../types.js";
5
+ export interface WebSetupDeps {
6
+ detectPackageManager: typeof detectPackageManager;
7
+ ensureChannel: typeof ensureChannel;
8
+ installScaffoldDependencies: typeof installScaffoldDependencies;
9
+ }
10
+ export interface WebSetupPlan {
11
+ configureVercelServices: boolean;
12
+ packageManager: Awaited<ReturnType<typeof detectPackageManager>>["kind"];
13
+ }
14
+ export declare function prepareWebSetup(context: SetupPrepareContext, deps?: WebSetupDeps): Promise<WebSetupPlan>;
15
+ export declare function applyWebSetup(plan: WebSetupPlan, context: SetupApplyContext, deps?: WebSetupDeps): Promise<{
16
+ facts: never[];
17
+ deploymentRequired?: undefined;
18
+ } | {
19
+ facts: never[];
20
+ deploymentRequired: true;
21
+ }>;
22
+ export declare const WEB_SETUP: import("../types.js").SetupIntegration;
@@ -1 +1 @@
1
- import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{ensureChannel}from"#setup/scaffold/index.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectPackageManager}from"#setup/package-manager.js";function reportCompetingNextConfigFiles(e,t){for(let n of t??[])e.warning(`Found competing Next.js config at ${n}; merge any needed settings into next.config.ts and remove it before starting the preview, or Next.js may ignore the generated eve rewrite.`)}const WEB_SETUP={kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,async setup(r){r.ui.prompter.log.message(`Scaffolding Web Chat channel files...`);let i=await ensureChannel({projectRoot:r.appRoot,kind:`web`,packageManager:(await detectPackageManager(r.appRoot)).kind,configureVercelServices:r.environment.vercel.kind===`available`,force:r.force,skipDependencyMutation:!0});return reportOverwrittenFiles(r.ui.prompter.log,i.filesOverwritten),i.kind===`web`&&i.action!==`skipped`&&i.nodeEngineOverride!==void 0&&r.ui.prompter.log.warning(formatNodeEngineOverrideWarning(i.nodeEngineOverride)),reportCompetingNextConfigFiles(r.ui.prompter.log,`competingNextConfigFiles`in i?i.competingNextConfigFiles:void 0),i.action===`skipped`?(r.ui.prompter.log.info(`Next.js project detected. Skipping Web Chat scaffolding.`),{kind:`done`}):(r.ui.prompter.log.success(`Scaffolded channel: web`),await installScaffoldDependencies({changed:i.packageJsonUpdated.length>0,log:r.ui.prompter.log,projectPath:r.appRoot,signal:r.signal}),{kind:`done`})}};export{WEB_SETUP};
1
+ import{defineSetupIntegration}from"../types.js";import{installScaffoldDependencies,reportOverwrittenFiles}from"../shared/scaffold.js";import{ensureChannel}from"#setup/scaffold/index.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectPackageManager}from"#setup/package-manager.js";function reportCompetingNextConfigFiles(e,t){for(let n of t??[])e.warning(`Found competing Next.js config at ${n}; merge any needed settings into next.config.ts and remove it before starting the preview, or Next.js may ignore the generated eve rewrite.`)}const defaultDeps={detectPackageManager,ensureChannel,installScaffoldDependencies};async function prepareWebSetup(e,t=defaultDeps){return{packageManager:(await t.detectPackageManager(e.appRoot)).kind,configureVercelServices:e.environment.vercel.kind===`available`}}async function applyWebSetup(e,t,r=defaultDeps){t.presenter.log.message(`Scaffolding Web Chat channel files...`);let i={projectRoot:t.appRoot,kind:`web`,packageManager:e.packageManager,configureVercelServices:e.configureVercelServices,force:t.force,skipDependencyMutation:!0},a=await r.ensureChannel(i);return reportOverwrittenFiles(t.presenter.log,a.filesOverwritten),a.kind===`web`&&a.action!==`skipped`&&a.nodeEngineOverride!==void 0&&t.presenter.log.warning(formatNodeEngineOverrideWarning(a.nodeEngineOverride)),reportCompetingNextConfigFiles(t.presenter.log,`competingNextConfigFiles`in a?a.competingNextConfigFiles:void 0),a.action===`skipped`?(t.presenter.log.info(`Next.js project detected. Skipping Web Chat scaffolding.`),{facts:[]}):(t.presenter.log.success(`Scaffolded channel: web`),await r.installScaffoldDependencies({changed:a.packageJsonUpdated.length>0,log:t.presenter.log,projectPath:t.appRoot,signal:t.signal}),{facts:[],deploymentRequired:!0})}const WEB_SETUP=defineSetupIntegration({kind:`web`,label:`Web Chat`,hint:`Browser-based chat interface`,prepare:prepareWebSetup,apply:applyWebSetup});export{WEB_SETUP,applyWebSetup,prepareWebSetup};
@@ -211,6 +211,14 @@ export interface Prompter {
211
211
  intro(title: string, subtitle?: string): void;
212
212
  /** Prints a final green ● end-cap with the message. */
213
213
  outro(message: string): void;
214
+ /** Replaces transient setup output with one compact current-item summary. */
215
+ replaceContent?(content?: {
216
+ headline: string;
217
+ facts: readonly {
218
+ label: string;
219
+ value: string;
220
+ }[];
221
+ }): void;
214
222
  /** Temporarily hands terminal ownership to a command that inherits stdio. */
215
223
  withInheritedStdio?<T>(task: () => Promise<T>): Promise<T>;
216
224
  /** Gives a setup subprocess exclusive terminal and development-host ownership. */
@@ -0,0 +1,15 @@
1
+ export interface QuestionOption {
2
+ id: string;
3
+ value: unknown;
4
+ }
5
+ interface QuestionWithOptions<O extends QuestionOption> {
6
+ key: string;
7
+ options: readonly O[];
8
+ }
9
+ /** Finds an option by the stable id used by prompt and wire boundaries. */
10
+ export declare function optionById<O extends QuestionOption>(question: QuestionWithOptions<O>, id: unknown): O | undefined;
11
+ /** Finds an option by its in-process rich value. */
12
+ export declare function optionByValue<O extends QuestionOption>(question: QuestionWithOptions<O>, value: O["value"]): O | undefined;
13
+ /** Maps a rich value to its stable id, rejecting an invalid question definition. */
14
+ export declare function requiredOptionId<O extends QuestionOption>(question: QuestionWithOptions<O>, value: O["value"], role: string): string;
15
+ export {};
@@ -0,0 +1 @@
1
+ function optionById(e,t){return e.options.find(e=>e.id===String(t))}function optionByValue(e,t){return e.options.find(e=>e.value===t)}function requiredOptionId(e,t,n){let r=optionByValue(e,t);if(r===void 0)throw Error(`Question "${e.key}" has a ${n} that is not one of its options.`);return r.id}export{optionById,optionByValue,requiredOptionId};
@@ -1,6 +1,6 @@
1
1
  import type { Prompter } from "./prompter.js";
2
- import { type RegistrySetupChildMessage, type RegistrySetupFact, type RegistrySetupParentMessage } from "./registry-setup-protocol.js";
3
- interface SetupProcess {
2
+ import { type RegistrySetupChildMessage, type RegistrySetupCompletion, type RegistrySetupParentMessage } from "./registry-setup-protocol.js";
3
+ export interface SetupProcess {
4
4
  connected?: boolean;
5
5
  send?: (message: RegistrySetupChildMessage) => boolean;
6
6
  disconnect?: () => void;
@@ -10,7 +10,7 @@ interface SetupProcess {
10
10
  export interface RegistrySetupClient {
11
11
  prompter: Prompter;
12
12
  signal: AbortSignal;
13
- complete(facts?: readonly RegistrySetupFact[]): void;
13
+ complete(completion?: RegistrySetupCompletion): void;
14
14
  cancel(): void;
15
15
  fail(error: unknown): void;
16
16
  }
@@ -19,4 +19,3 @@ export declare function createRegistrySetupClient(input?: {
19
19
  process?: SetupProcess;
20
20
  signal?: AbortSignal;
21
21
  }): RegistrySetupClient | undefined;
22
- export {};
@@ -1,2 +1,2 @@
1
- import{WizardCancelledError}from"./step.js";import"./registry-setup-protocol.js";function send(e,t){if(e.send===void 0||!e.connected)throw Error(`The registry setup host disconnected.`);e.send(t)}function registrySetupError(e){if(!(e instanceof Error))return{message:String(e)};let t=e.stack?.split(`
2
- `).slice(1).map(e=>e.trim()).filter(Boolean);return t===void 0||t.length===0?{message:e.message}:{message:e.message,details:t}}function createRegistrySetupClient(t={}){let n=t.process??process;if(n.send===void 0||process.env.EVE_SETUP_PROTOCOL===void 0)return;let r=new AbortController;t.signal!==void 0&&t.signal.addEventListener(`abort`,()=>r.abort(t.signal?.reason),{once:!0});let i=1,a=new Map,onMessage=t=>{if(t.type===`cancel`){r.abort(new WizardCancelledError);for(let e of a.values())e({type:`cancel`});a.clear();return}a.get(t.id)?.(t)};n.on(`message`,onMessage),send(n,{type:`ready`,version:1});async function prompt(t){r.signal.throwIfAborted();let o=i++,s=await new Promise(e=>{a.set(o,e),send(n,{type:`prompt`,id:o,prompt:t})});if(a.delete(o),s.type===`cancel`||s.cancelled===!0)throw new WizardCancelledError;return s.value}async function validatedText(e,t){let n=t.notices;for(;;){let r=await prompt({kind:e,message:t.message,placeholder:t.placeholder,defaultValue:t.defaultValue,notices:n}),i=t.validate?.(r);if(i===void 0)return r;n=[{tone:`error`,text:i}]}}function select(e){return prompt({kind:`select`,options:e})}let o={text:e=>validatedText(`text`,e),password:e=>validatedText(`password`,e),select,async selectEditable(e){let t=await prompt({kind:`editable-select`,options:{...e,editable:{value:e.editable.value,defaultValue:e.editable.defaultValue}}});if(t.kind===`selected`)return{kind:`selected`,value:t.value};let n=e.editable.validate?.(t.text);if(n!==void 0)throw Error(n);return{kind:`edited`,value:t.value,text:t.text}},acknowledge:e=>prompt({kind:`acknowledge`,options:e}),awaitChoice(t){let r=i++;return{choice:new Promise((i,o)=>{a.set(r,t=>{a.delete(r),t.type===`cancel`||t.cancelled===!0?o(new WizardCancelledError):i(t.value)}),send(n,{type:`prompt`,id:r,prompt:{kind:`choice`,options:t}})}),close:()=>{a.delete(r),send(n,{type:`close-prompt`,id:r})}}},note(e,t,r){send(n,{type:`note`,message:e,title:t,tone:r?.tone})},intro(e,t){send(n,{type:`intro`,text:e,subtitle:t})},outro(e){send(n,{type:`outro`,text:e})},log:{message:e=>send(n,{type:`log`,level:`message`,text:e}),info:e=>send(n,{type:`log`,level:`info`,text:e}),success:e=>send(n,{type:`log`,level:`success`,text:e}),warning:e=>send(n,{type:`log`,level:`warning`,text:e}),error:e=>send(n,{type:`log`,level:`error`,text:e}),commandOutput:e=>send(n,{type:`log`,level:`commandOutput`,text:e}),spinner(e,t){let r=i++;return send(n,{type:`status`,id:r,status:e,intent:t?.kind===`external-action`?t:void 0}),{stop:()=>send(n,{type:`status`,id:r})}}}},s=!1,finish=e=>{s||(s=!0,send(n,{type:`result`,outcome:e}),n.off(`message`,onMessage),n.disconnect?.())};return{prompter:o,signal:r.signal,complete:(e=[])=>finish({kind:`completed`,facts:e}),cancel:()=>finish({kind:`cancelled`}),fail:e=>finish({kind:`failed`,error:registrySetupError(e)})}}export{createRegistrySetupClient};
1
+ import{InteractionRequired,InvalidAnswerError}from"./ask-signals.js";import{SetupPrerequisiteRequired}from"./integrations/shared/prerequisite.js";import"./ask.js";import{WizardCancelledError}from"./step.js";import{setupQuestionToWire}from"./setup-question-wire.js";import"./registry-setup-protocol.js";function send(e,t){if(e.send===void 0||!e.connected)throw Error(`The registry setup host disconnected.`);e.send(t)}function registrySetupBlocker(r){if(r instanceof InteractionRequired)return{status:`input_required`,question:setupQuestionToWire(r.question)};if(r instanceof InvalidAnswerError)return{status:`input_required`,question:setupQuestionToWire(r.question),issue:{code:`invalid_answer`,message:r.message}};if(r instanceof SetupPrerequisiteRequired)return{status:`prerequisite_required`,prerequisite:r.prerequisite}}function registrySetupError(e){if(!(e instanceof Error))return{message:String(e)};let t=e.stack?.split(`
2
+ `).slice(1).map(e=>e.trim()).filter(Boolean);return t===void 0||t.length===0?{message:e.message}:{message:e.message,details:t}}function createRegistrySetupClient(e={}){let t=e.process??process;if(t.send===void 0||process.env.EVE_SETUP_PROTOCOL===void 0)return;let n=new AbortController;e.signal!==void 0&&e.signal.addEventListener(`abort`,()=>n.abort(e.signal?.reason),{once:!0});let i=1,a=new Map,onMessage=e=>{if(e.type===`cancel`){n.abort(new WizardCancelledError);for(let e of a.values())e({type:`cancel`});a.clear();return}a.get(e.id)?.(e)};t.on(`message`,onMessage),send(t,{type:`ready`,version:2});async function prompt(e){n.signal.throwIfAborted();let o=i++,s=await new Promise(n=>{a.set(o,n),send(t,{type:`prompt`,id:o,prompt:e})});if(a.delete(o),s.type===`cancel`||s.cancelled===!0)throw new WizardCancelledError;return s.value}async function validatedText(e,t){let n=t.notices;for(;;){let r=await prompt({kind:e,message:t.message,placeholder:t.placeholder,defaultValue:t.defaultValue,notices:n}),i=t.validate?.(r);if(i===void 0)return r;n=[{tone:`error`,text:i}]}}function select(e){return prompt({kind:`select`,options:e})}let o={text:e=>validatedText(`text`,e),password:e=>validatedText(`password`,e),select,async selectEditable(e){let t=await prompt({kind:`editable-select`,options:{...e,editable:{value:e.editable.value,defaultValue:e.editable.defaultValue}}});if(t.kind===`selected`)return{kind:`selected`,value:t.value};let n=e.editable.validate?.(t.text);if(n!==void 0)throw Error(n);return{kind:`edited`,value:t.value,text:t.text}},acknowledge:e=>prompt({kind:`acknowledge`,options:e}),awaitChoice(e){let n=i++;return{choice:new Promise((i,o)=>{a.set(n,e=>{a.delete(n),e.type===`cancel`||e.cancelled===!0?o(new WizardCancelledError):i(e.value)}),send(t,{type:`prompt`,id:n,prompt:{kind:`choice`,options:e}})}),close:()=>{a.delete(n),send(t,{type:`close-prompt`,id:n})}}},note(e,n,r){send(t,{type:`note`,message:e,title:n,tone:r?.tone})},intro(e,n){send(t,{type:`intro`,text:e,subtitle:n})},outro(e){send(t,{type:`outro`,text:e})},log:{message:e=>send(t,{type:`log`,level:`message`,text:e}),info:e=>send(t,{type:`log`,level:`info`,text:e}),success:e=>send(t,{type:`log`,level:`success`,text:e}),warning:e=>send(t,{type:`log`,level:`warning`,text:e}),error:e=>send(t,{type:`log`,level:`error`,text:e}),commandOutput:e=>send(t,{type:`log`,level:`commandOutput`,text:e}),spinner(e,n){let r=i++;return send(t,{type:`status`,id:r,status:e,intent:n?.kind===`external-action`?n:void 0}),{stop:()=>send(t,{type:`status`,id:r})}}}},s=!1,finish=e=>{s||(s=!0,send(t,{type:`result`,outcome:e}),t.off(`message`,onMessage),t.disconnect?.())};return{prompter:o,signal:n.signal,complete:(e={facts:[]})=>finish({kind:`completed`,...e}),cancel:()=>finish({kind:`cancelled`}),fail(e){let t=registrySetupBlocker(e);finish(t===void 0?{kind:`failed`,error:registrySetupError(e)}:{kind:`blocked`,blocker:t})}}}export{createRegistrySetupClient};
@@ -0,0 +1,3 @@
1
+ import type { RegistrySetupCompletion } from "./registry-setup-protocol.js";
2
+ /** Combines setup completions while preserving their facts and deployment requirement. */
3
+ export declare function mergeRegistrySetupCompletions(...completions: readonly RegistrySetupCompletion[]): RegistrySetupCompletion;
@@ -0,0 +1 @@
1
+ function mergeRegistrySetupCompletions(...e){let t=e.flatMap(e=>e.facts);return e.some(e=>e.deploymentRequired===!0)?{facts:t,deploymentRequired:!0}:{facts:t}}export{mergeRegistrySetupCompletions};
@@ -1,17 +1,36 @@
1
1
  import type { AcknowledgeOptions, MultiSelectOptions, PrompterValue, SelectCommonOptions, SelectNotice, SelectOption, SingleSelectOptions } from "./prompter.js";
2
- export declare const REGISTRY_SETUP_PROTOCOL_VERSION = 1;
2
+ import type { SetupPrerequisite } from "./integrations/shared/prerequisite.js";
3
+ import type { SetupWireQuestion } from "./setup-question-wire.js";
4
+ export declare const REGISTRY_SETUP_PROTOCOL_VERSION = 2;
3
5
  export type RegistrySetupFact = {
4
6
  label: string;
5
7
  value: string;
6
8
  kind?: "text" | "url" | "phone";
7
9
  };
10
+ export type RegistrySetupCompletion = {
11
+ facts: readonly RegistrySetupFact[];
12
+ deploymentRequired?: true;
13
+ };
14
+ export type RegistrySetupBlocker = {
15
+ status: "input_required";
16
+ question: SetupWireQuestion;
17
+ issue?: {
18
+ code: "invalid_answer";
19
+ message: string;
20
+ };
21
+ } | {
22
+ status: "prerequisite_required";
23
+ prerequisite: SetupPrerequisite;
24
+ };
8
25
  export type RegistrySetupError = {
9
26
  message: string;
10
27
  details?: readonly string[];
11
28
  };
12
- export type RegistrySetupOutcome = {
29
+ export type RegistrySetupOutcome = ({
13
30
  kind: "completed";
14
- facts: readonly RegistrySetupFact[];
31
+ } & RegistrySetupCompletion) | {
32
+ kind: "blocked";
33
+ blocker: RegistrySetupBlocker;
15
34
  } | {
16
35
  kind: "cancelled";
17
36
  } | {
@@ -1 +1 @@
1
- const REGISTRY_SETUP_PROTOCOL_VERSION=1;function isRegistrySetupChildMessage(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`ready`||t===`prompt`||t===`close-prompt`||t===`log`||t===`note`||t===`intro`||t===`outro`||t===`result`||t===`status`}export{REGISTRY_SETUP_PROTOCOL_VERSION,isRegistrySetupChildMessage};
1
+ const REGISTRY_SETUP_PROTOCOL_VERSION=2;function isRegistrySetupChildMessage(e){if(typeof e!=`object`||!e)return!1;let t=e.type;return t===`ready`||t===`prompt`||t===`close-prompt`||t===`log`||t===`note`||t===`intro`||t===`outro`||t===`result`||t===`status`}export{REGISTRY_SETUP_PROTOCOL_VERSION,isRegistrySetupChildMessage};
@@ -1 +1 @@
1
- import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"../update/package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{agentTemplateFiles,formatEveDependencySpecifier,resolveEvePackageContract}from"./project.js";import{readFile}from"node:fs/promises";import{join}from"node:path";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(i){let a=i.packageManager??`pnpm`,o=join(i.projectRoot,`package.json`);if(!await pathExists(o))throw Error(`Cannot add an eve agent to "${i.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let s=agentTemplateFiles(i.model),c=[];for(let t of Object.keys(s))await pathExists(join(i.projectRoot,t))&&c.push(t);if(c.length===0&&await pathExists(join(i.projectRoot,`agent`))&&c.push(`agent/`),c.length>0)throw Error(`Cannot add an eve agent to "${i.projectRoot}" because it already has: ${c.join(`, `)}.`);let l=resolveEvePackageContract(i.evePackage),u=resolveVersionToken(`aiPackageVersion`,i.aiPackageVersion??`^7.0.38`),d=resolveVersionToken(`connectPackageVersion`,i.connectPackageVersion??`0.4.3`),f=resolveVersionToken(`zodPackageVersion`,i.zodPackageVersion??`4.4.3`),p=[];for(let[e,n]of Object.entries(s)){let r=join(i.projectRoot,e);await writeTextFile(r,n),p.push(r)}let m=JSON.parse(await readFile(o,`utf8`)),h={"@vercel/connect":d,ai:u,eve:formatEveDependencySpecifier(l.version),zod:f},g={};for(let[e,t]of Object.entries(h))hasDeclaredDependency(m,e)||(g[e]=t);let _={};Object.keys(g).length>0&&(_.dependencies=g),isPackageManagerWorkspaceMember(a,i.projectRoot)||(_.nodeEngineRequirement=l.nodeEngine);let v=await patchPackageJson(o,_),y=(await patchWorkspaceRootPackageJson(a,i.projectRoot,{aiPackageVersion:u,nodeEngineRequirement:l.nodeEngine})).nodeEngineOverride??v.nodeEngineOverride;return await applyPackageManagerWorkspaceConfiguration({packageManager:a,projectRoot:i.projectRoot}),{filesWritten:p,dependenciesAdded:Object.keys(g).sort(),nodeEngineOverride:y}}export{addAgentToProject};
1
+ import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"../update/package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{agentTemplateFiles,formatEveDependencySpecifier,resolveEvePackageContract}from"./project.js";import{readFile}from"node:fs/promises";import{join}from"node:path";const DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`,`optionalDependencies`,`peerDependencies`];function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function hasDeclaredDependency(e,t){if(!isJsonObject(e))return!1;for(let n of DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function addAgentToProject(i){let a=i.packageManager??`pnpm`,o=join(i.projectRoot,`package.json`);if(!await pathExists(o))throw Error(`Cannot add an eve agent to "${i.projectRoot}" because it has no package.json. Run \`eve init <name>\` to create a new project instead.`);let s=agentTemplateFiles(i.model),c=[];for(let t of Object.keys(s))await pathExists(join(i.projectRoot,t))&&c.push(t);if(c.length===0&&await pathExists(join(i.projectRoot,`agent`))&&c.push(`agent/`),c.length>0)throw Error(`Cannot add an eve agent to "${i.projectRoot}" because it already has: ${c.join(`, `)}.`);let l=resolveEvePackageContract(i.evePackage),u=resolveVersionToken(`aiPackageVersion`,i.aiPackageVersion??`^7.0.58`),d=resolveVersionToken(`connectPackageVersion`,i.connectPackageVersion??`0.4.3`),f=resolveVersionToken(`zodPackageVersion`,i.zodPackageVersion??`4.4.3`),p=[];for(let[e,n]of Object.entries(s)){let r=join(i.projectRoot,e);await writeTextFile(r,n),p.push(r)}let m=JSON.parse(await readFile(o,`utf8`)),h={"@vercel/connect":d,ai:u,eve:formatEveDependencySpecifier(l.version),zod:f},g={};for(let[e,t]of Object.entries(h))hasDeclaredDependency(m,e)||(g[e]=t);let _={};Object.keys(g).length>0&&(_.dependencies=g),isPackageManagerWorkspaceMember(a,i.projectRoot)||(_.nodeEngineRequirement=l.nodeEngine);let v=await patchPackageJson(o,_),y=(await patchWorkspaceRootPackageJson(a,i.projectRoot,{aiPackageVersion:u,nodeEngineRequirement:l.nodeEngine})).nodeEngineOverride??v.nodeEngineOverride;return await applyPackageManagerWorkspaceConfiguration({packageManager:a,projectRoot:i.projectRoot}),{filesWritten:p,dependenciesAdded:Object.keys(g).sort(),nodeEngineOverride:y}}export{addAgentToProject};
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.38`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.31.3`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.58`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.32.0`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -71,7 +71,59 @@ dist
71
71
  .output
72
72
  .nitro
73
73
  dist
74
- `,"AGENTS.md":"# eve Agent App\n\nThis project uses the eve framework. Before writing code, read the relevant guide\nfrom the installed eve package docs. In most installs, those docs are at\n`node_modules/eve/docs/`. In workspaces or local package installs, resolve the\ninstalled `eve` package location first and read its `docs/` directory. If\npackage docs are unavailable, use https://eve.dev/docs as a fallback.\n\nBefore implementing an integration yourself, use\n`eve registry search <query>` or `eve registry list` to discover available\nintegrations. Inspect one with `eve registry view <item>`, then install it with\n`eve add <item>`.\n","CLAUDE.md":`@AGENTS.md
74
+ `,"AGENTS.md":`# eve Agent App
75
+
76
+ This project uses the eve framework. Before writing code, read the relevant guide
77
+ from the installed eve package docs. In most installs, those docs are at
78
+ \`node_modules/eve/docs/\`. In workspaces or local package installs, resolve the
79
+ installed \`eve\` package location first and read its \`docs/\` directory. If
80
+ package docs are unavailable, use https://eve.dev/docs as a fallback.
81
+
82
+ ## Adding integrations
83
+
84
+ Before implementing an integration yourself, discover existing integrations:
85
+
86
+ \`\`\`sh
87
+ eve registry search <query> --json
88
+ eve registry view <item>
89
+ \`\`\`
90
+
91
+ Prefer registry items whose \`implementation\` is \`native\`; use Chat SDK adapters when no
92
+ native channel fits. \`registry view\` provides the selected item's documentation link.
93
+
94
+ Install and configure one without driving interactive terminal prompts:
95
+
96
+ \`\`\`sh
97
+ eve add <item> --non-interactive
98
+ \`\`\`
99
+
100
+ Exit code 0 means setup completed, 1 means setup failed, and 2 means setup needs
101
+ input or a prerequisite. On exit 2, parse the final NDJSON event and use its
102
+ \`next.command\` as the continuation.
103
+
104
+ Every \`--answer\` value is JSON, so strings need JSON quotes. For an editable
105
+ question, you may supply its nested \`editable.key\` with the parent key in one
106
+ invocation:
107
+
108
+ \`\`\`sh
109
+ eve add channel/photon-imessage --non-interactive \\
110
+ --answer 'photon-project-source="create"' \\
111
+ --answer 'photon-project-name="eve · my-agent"'
112
+ \`\`\`
113
+
114
+ Add \`--yes\` to accept recommended setup values and reduce setup round trips;
115
+ explicit \`--answer\` values take precedence. Use the reported \`--skip-install\`
116
+ continuation after installation.
117
+ A Vercel Connect setup may report \`eve link\` as a prerequisite; run it and
118
+ retry the continuation. Never pass secrets in \`--answer\`; use the documented
119
+ environment variable or secret store.
120
+
121
+ An \`external_action\` event with \`blocking: true\` means the command is still
122
+ running while it waits for the user. Surface its URL and code, keep the process
123
+ alive, and wait for its matching \`external_action_resolved\` event or a terminal
124
+ event. Do not start a continuation. When a completed event has
125
+ \`deploymentRequired: true\`, recommend its \`next\` command to deploy the changes.
126
+ `,"CLAUDE.md":`@AGENTS.md
75
127
  `};function templateFiles(e){return{"agent/agent.ts":e.byokProvider?`import { defineAgent } from "eve";
76
128
 
77
129
  export default defineAgent({
@@ -86,4 +138,4 @@ export default defineAgent({
86
138
  },
87
139
  },
88
140
  });
89
- `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate({includeRootOnlyFields:e.includeRootOnlyPackageJsonFields,packageManager:e.packageManager})}}async function assertCanCreateInPlace(e,t){if(!await pathExists(e))return;let r=blockingCreateInPlaceEntries(await readdir(e));if(r.length>0&&!t){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(t){let i=resolve(t.targetDirectory??process.cwd(),t.projectName),c=t.projectName===`.`,l=t.overwriteExisting??!1,u=t.byokProvider??!1,d=t.packageManager??`pnpm`,f=resolveEvePackageContract(t.evePackage),p=pinnedNodeEngineMajor(f.nodeEngine),m=resolve(t.workspaceProbeDirectory??i),h=isPackageManagerWorkspaceMember(d,m);if(c)await assertCanCreateInPlace(i,l);else if(await pathExists(i))throw Error(`Cannot create project because "${i}" already exists.`);let g={appName:basename(i),model:t.model,eveVersion:f.version,aiPackageVersion:resolveVersionToken(`aiPackageVersion`,t.aiPackageVersion??`^7.0.38`),connectPackageVersion:resolveVersionToken(`connectPackageVersion`,t.connectPackageVersion??`0.4.3`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,t.zodPackageVersion??`4.4.3`),typescriptPackageVersion:resolveVersionToken(`typescriptPackageVersion`,t.typescriptPackageVersion??`7.0.2`),nodeTypesVersion:p,nodeEngine:p};await mkdir(i,{recursive:!0});for(let[e,a]of Object.entries(templateFiles({byokProvider:u,includeRootOnlyPackageJsonFields:!h,packageManager:d}))){let o=`${i}/${e}`,s=await pathExists(o);await writeTextFile(o,renderTemplate(a,g),{force:c&&l}),s&&await t.onOverwriteFile?.(o)}return await applyPackageManagerWorkspaceConfiguration({packageManager:d,projectRoot:i,workspaceProbeRoot:m,onWorkspaceRootMutation:t.onWorkspaceRootMutation}),await patchWorkspaceRootPackageJson(d,m,{aiPackageVersion:g.aiPackageVersion,nodeEngineRequirement:f.nodeEngine,onWorkspaceRootMutation:t.onWorkspaceRootMutation}),i}async function isEveProject(e){for(let n of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${n}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_CONNECT_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_CONTRACT,DEFAULT_ZOD_PACKAGE_VERSION,ROOT_ONLY_PACKAGE_JSON_TEMPLATE_SUFFIX,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,resolveEvePackageContract,scaffoldBaseProject};
141
+ `:BASE_AGENT_TEMPLATE,...SHARED_TEMPLATE_FILES,"package.json":packageJsonTemplate({includeRootOnlyFields:e.includeRootOnlyPackageJsonFields,packageManager:e.packageManager})}}async function assertCanCreateInPlace(e,t){if(!await pathExists(e))return;let r=blockingCreateInPlaceEntries(await readdir(e));if(r.length>0&&!t){let e=r.slice(0,5).join(`, `),t=r.length>5?`, and ${r.length-5} more`:``;throw Error(`Cannot create project in current directory because it is not empty. Found: ${e}${t}. Use an empty directory.`)}}async function scaffoldBaseProject(t){let i=resolve(t.targetDirectory??process.cwd(),t.projectName),c=t.projectName===`.`,l=t.overwriteExisting??!1,u=t.byokProvider??!1,d=t.packageManager??`pnpm`,f=resolveEvePackageContract(t.evePackage),p=pinnedNodeEngineMajor(f.nodeEngine),m=resolve(t.workspaceProbeDirectory??i),h=isPackageManagerWorkspaceMember(d,m);if(c)await assertCanCreateInPlace(i,l);else if(await pathExists(i))throw Error(`Cannot create project because "${i}" already exists.`);let g={appName:basename(i),model:t.model,eveVersion:f.version,aiPackageVersion:resolveVersionToken(`aiPackageVersion`,t.aiPackageVersion??`^7.0.58`),connectPackageVersion:resolveVersionToken(`connectPackageVersion`,t.connectPackageVersion??`0.4.3`),zodPackageVersion:resolveVersionToken(`zodPackageVersion`,t.zodPackageVersion??`4.4.3`),typescriptPackageVersion:resolveVersionToken(`typescriptPackageVersion`,t.typescriptPackageVersion??`7.0.2`),nodeTypesVersion:p,nodeEngine:p};await mkdir(i,{recursive:!0});for(let[e,a]of Object.entries(templateFiles({byokProvider:u,includeRootOnlyPackageJsonFields:!h,packageManager:d}))){let o=`${i}/${e}`,s=await pathExists(o);await writeTextFile(o,renderTemplate(a,g),{force:c&&l}),s&&await t.onOverwriteFile?.(o)}return await applyPackageManagerWorkspaceConfiguration({packageManager:d,projectRoot:i,workspaceProbeRoot:m,onWorkspaceRootMutation:t.onWorkspaceRootMutation}),await patchWorkspaceRootPackageJson(d,m,{aiPackageVersion:g.aiPackageVersion,nodeEngineRequirement:f.nodeEngine,onWorkspaceRootMutation:t.onWorkspaceRootMutation}),i}async function isEveProject(e){for(let n of SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS)try{return await stat(join(e,`agent`,`agent${n}`)),!0}catch{}return!1}export{CURRENT_DIRECTORY_PROJECT_NAME,DEFAULT_AI_PACKAGE_VERSION,DEFAULT_CONNECT_PACKAGE_VERSION,DEFAULT_EVE_PACKAGE_CONTRACT,DEFAULT_ZOD_PACKAGE_VERSION,ROOT_ONLY_PACKAGE_JSON_TEMPLATE_SUFFIX,agentTemplateFiles,byokProviderEnvVar,formatEveDependencySpecifier,isEveProject,modelProviderSlug,resolveEvePackageContract,scaffoldBaseProject};
@@ -1,4 +1,4 @@
1
- import{appendEnv}from"../../append-env.js";import{pinnedNodeEngineMajor}from"../../node-engine.js";import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"./package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES,WEB_APP_TEMPLATE_PACKAGE_JSON}from"../create/web-template.js";import{DEFAULT_EVE_PACKAGE_CONTRACT,resolveEvePackageContract}from"../create/project.js";import{readFile,readdir,unlink,writeFile}from"node:fs/promises";import{basename,join,resolve}from"node:path";const SLACK_CHANNEL_DEFAULT_ROUTE=`/eve/v1/slack`,DEFAULT_SLACK_CONNECTOR_SLUG=`my-agent`,NEXT_PACKAGE_NAME=`next`,PACKAGE_DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`],WEB_NEXT_CONFIG_PATH=`next.config.ts`,WEB_COMPETING_NEXT_CONFIG_PATHS=[`next.config.js`,`next.config.mjs`,WEB_NEXT_CONFIG_PATH,`next.config.mts`].filter(e=>e!==WEB_NEXT_CONFIG_PATH);function toSlackConnectorSlug(e){return e}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function readPackageJsonObject(e){if(!await pathExists(e))return;let t=JSON.parse(await readFile(e,`utf8`));return isJsonObject(t)?t:void 0}async function readDependencyVersion(e,t){let n=await readPackageJsonObject(e);if(n===void 0||!isJsonObject(n.dependencies))return;let r=n.dependencies[t];return typeof r==`string`?r:void 0}function packageJsonHasDependency(e,t){for(let n of PACKAGE_DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function hasPackageDependency(e,t){let n=await readPackageJsonObject(e);return n!==void 0&&packageJsonHasDependency(n,t)}async function isNextJsProject(e){return hasPackageDependency(join(e,`package.json`),NEXT_PACKAGE_NAME)}const VERCEL_HOST_FRAMEWORK_PRESETS={"@sveltejs/kit":`sveltekit`,[NEXT_PACKAGE_NAME]:`nextjs`,nuxt:`nuxtjs`,nuxt3:`nuxtjs`,"nuxt-edge":`nuxtjs`,"nuxt-nightly":`nuxtjs`};async function resolveVercelHostFrameworkPreset(e){let t=await readPackageJsonObject(join(e,`package.json`));if(t!==void 0){for(let[e,n]of Object.entries(VERCEL_HOST_FRAMEWORK_PRESETS))if(packageJsonHasDependency(t,e))return n}}async function hasVercelHostFramework(e){return await resolveVercelHostFrameworkPreset(e)!==void 0}async function ensurePackageDependency(e,t,n){return!await pathExists(e)||await readDependencyVersion(e,t)===n?[]:(await patchPackageJson(e,{dependencies:{[t]:n}}),[{path:e,dependencies:[t],devDependencies:[],scripts:[]}])}function resolveWebPackageVersions(e){return{evePackage:e?.evePackage??DEFAULT_EVE_PACKAGE_CONTRACT,aiPackageVersion:e?.aiPackageVersion??`^7.0.38`,nextPackageVersion:e?.nextPackageVersion??`16.3.0-preview.6`,reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.4.3`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}async function patchWebPackageJson(e,n,r,a,c,d=!0){let p=join(e,`package.json`);if(!await pathExists(p))return{mutations:[]};let h=resolveEvePackageContract(a.evePackage),g=pinnedNodeEngineMajor(h.nodeEngine),_={...WEB_APP_TEMPLATE_PACKAGE_JSON.dependencies,ai:resolveVersionToken(`aiPackageVersion`,a.aiPackageVersion),eve:formatEveDependencySpecifier(h.version),next:resolveVersionToken(`nextPackageVersion`,a.nextPackageVersion),react:resolveVersionToken(`reactPackageVersion`,a.reactPackageVersion),"react-dom":resolveVersionToken(`reactDomPackageVersion`,a.reactDomPackageVersion),streamdown:resolveVersionToken(`streamdownPackageVersion`,a.streamdownPackageVersion),zod:resolveVersionToken(`zodPackageVersion`,a.zodPackageVersion)},v={...WEB_APP_TEMPLATE_PACKAGE_JSON.devDependencies,"@types/node":g,"@types/react":resolveVersionToken(`typesReactPackageVersion`,a.typesReactPackageVersion),"@types/react-dom":resolveVersionToken(`typesReactDomPackageVersion`,a.typesReactDomPackageVersion),typescript:`6.0.3`},y=WEB_APP_TEMPLATE_PACKAGE_JSON.scripts,b=isPackageManagerWorkspaceMember(n,r),x={scripts:y};d&&(x.dependencies=_,x.devDependencies=v),b||(x.nodeEngineRequirement=h.nodeEngine);let S=await patchPackageJson(p,x),C=(await patchWorkspaceRootPackageJson(n,r,{aiPackageVersion:_.ai,nodeEngineRequirement:h.nodeEngine,onWorkspaceRootMutation:c})).nodeEngineOverride??S.nodeEngineOverride;return{mutations:[{path:p,dependencies:d?Object.keys(_):[],devDependencies:d?Object.keys(v):[],scripts:Object.keys(y)}],nodeEngineOverride:C}}function normalizeSlackConnectorSlug(e){return toSlackConnectorSlug((e.trim().replace(/^@/,``).split(`/`).at(-1)??``).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`).replace(/^[^a-z0-9]+/,``).replace(/[^a-z0-9]+$/,``).slice(0,100).replace(/[^a-z0-9]+$/,``)||`my-agent`)}async function deriveSlackConnectorSlug(e,t){if(t!==void 0&&t.length>0&&t!==`.`)return normalizeSlackConnectorSlug(t);try{let t=await readFile(join(e,`package.json`),`utf8`),n=JSON.parse(t);if(typeof n.name==`string`&&n.name.length>0)return normalizeSlackConnectorSlug(n.name)}catch{}return normalizeSlackConnectorSlug(basename(resolve(e))||`my-agent`)}function buildSlackConnectTemplate(e){if(!e.startsWith(`slack/`)||e.length===6)throw Error(`Invalid Slack connector UID "${e}".`);return`import { connectSlackCredentials } from "@vercel/connect/eve";
1
+ import{appendEnv}from"../../append-env.js";import{pinnedNodeEngineMajor}from"../../node-engine.js";import{getSupportedModuleBaseName,matchesSupportedModuleBaseName}from"./module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{patchPackageJson}from"./package-json.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES,WEB_APP_TEMPLATE_PACKAGE_JSON}from"../create/web-template.js";import{DEFAULT_EVE_PACKAGE_CONTRACT,resolveEvePackageContract}from"../create/project.js";import{readFile,readdir,unlink,writeFile}from"node:fs/promises";import{basename,join,resolve}from"node:path";const SLACK_CHANNEL_DEFAULT_ROUTE=`/eve/v1/slack`,DEFAULT_SLACK_CONNECTOR_SLUG=`my-agent`,NEXT_PACKAGE_NAME=`next`,PACKAGE_DEPENDENCY_FIELDS=[`dependencies`,`devDependencies`],WEB_NEXT_CONFIG_PATH=`next.config.ts`,WEB_COMPETING_NEXT_CONFIG_PATHS=[`next.config.js`,`next.config.mjs`,WEB_NEXT_CONFIG_PATH,`next.config.mts`].filter(e=>e!==WEB_NEXT_CONFIG_PATH);function toSlackConnectorSlug(e){return e}function isJsonObject(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function readPackageJsonObject(e){if(!await pathExists(e))return;let t=JSON.parse(await readFile(e,`utf8`));return isJsonObject(t)?t:void 0}async function readDependencyVersion(e,t){let n=await readPackageJsonObject(e);if(n===void 0||!isJsonObject(n.dependencies))return;let r=n.dependencies[t];return typeof r==`string`?r:void 0}function packageJsonHasDependency(e,t){for(let n of PACKAGE_DEPENDENCY_FIELDS){let r=e[n];if(isJsonObject(r)&&typeof r[t]==`string`)return!0}return!1}async function hasPackageDependency(e,t){let n=await readPackageJsonObject(e);return n!==void 0&&packageJsonHasDependency(n,t)}async function isNextJsProject(e){return hasPackageDependency(join(e,`package.json`),NEXT_PACKAGE_NAME)}const VERCEL_HOST_FRAMEWORK_PRESETS={"@sveltejs/kit":`sveltekit`,[NEXT_PACKAGE_NAME]:`nextjs`,nuxt:`nuxtjs`,nuxt3:`nuxtjs`,"nuxt-edge":`nuxtjs`,"nuxt-nightly":`nuxtjs`};async function resolveVercelHostFrameworkPreset(e){let t=await readPackageJsonObject(join(e,`package.json`));if(t!==void 0){for(let[e,n]of Object.entries(VERCEL_HOST_FRAMEWORK_PRESETS))if(packageJsonHasDependency(t,e))return n}}async function hasVercelHostFramework(e){return await resolveVercelHostFrameworkPreset(e)!==void 0}async function ensurePackageDependency(e,t,n){return!await pathExists(e)||await readDependencyVersion(e,t)===n?[]:(await patchPackageJson(e,{dependencies:{[t]:n}}),[{path:e,dependencies:[t],devDependencies:[],scripts:[]}])}function resolveWebPackageVersions(e){return{evePackage:e?.evePackage??DEFAULT_EVE_PACKAGE_CONTRACT,aiPackageVersion:e?.aiPackageVersion??`^7.0.58`,nextPackageVersion:e?.nextPackageVersion??`16.3.0-preview.6`,reactPackageVersion:e?.reactPackageVersion??`19.2.6`,reactDomPackageVersion:e?.reactDomPackageVersion??`19.2.6`,streamdownPackageVersion:e?.streamdownPackageVersion??`2.5.0`,zodPackageVersion:e?.zodPackageVersion??`4.4.3`,typesReactPackageVersion:e?.typesReactPackageVersion??`19.2.15`,typesReactDomPackageVersion:e?.typesReactDomPackageVersion??`19.2.3`}}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}async function patchWebPackageJson(e,n,r,a,c,d=!0){let p=join(e,`package.json`);if(!await pathExists(p))return{mutations:[]};let h=resolveEvePackageContract(a.evePackage),g=pinnedNodeEngineMajor(h.nodeEngine),_={...WEB_APP_TEMPLATE_PACKAGE_JSON.dependencies,ai:resolveVersionToken(`aiPackageVersion`,a.aiPackageVersion),eve:formatEveDependencySpecifier(h.version),next:resolveVersionToken(`nextPackageVersion`,a.nextPackageVersion),react:resolveVersionToken(`reactPackageVersion`,a.reactPackageVersion),"react-dom":resolveVersionToken(`reactDomPackageVersion`,a.reactDomPackageVersion),streamdown:resolveVersionToken(`streamdownPackageVersion`,a.streamdownPackageVersion),zod:resolveVersionToken(`zodPackageVersion`,a.zodPackageVersion)},v={...WEB_APP_TEMPLATE_PACKAGE_JSON.devDependencies,"@types/node":g,"@types/react":resolveVersionToken(`typesReactPackageVersion`,a.typesReactPackageVersion),"@types/react-dom":resolveVersionToken(`typesReactDomPackageVersion`,a.typesReactDomPackageVersion),typescript:`6.0.3`},y=WEB_APP_TEMPLATE_PACKAGE_JSON.scripts,b=isPackageManagerWorkspaceMember(n,r),x={scripts:y};d&&(x.dependencies=_,x.devDependencies=v),b||(x.nodeEngineRequirement=h.nodeEngine);let S=await patchPackageJson(p,x),C=(await patchWorkspaceRootPackageJson(n,r,{aiPackageVersion:_.ai,nodeEngineRequirement:h.nodeEngine,onWorkspaceRootMutation:c})).nodeEngineOverride??S.nodeEngineOverride;return{mutations:[{path:p,dependencies:d?Object.keys(_):[],devDependencies:d?Object.keys(v):[],scripts:Object.keys(y)}],nodeEngineOverride:C}}function normalizeSlackConnectorSlug(e){return toSlackConnectorSlug((e.trim().replace(/^@/,``).split(`/`).at(-1)??``).toLowerCase().replace(/[^a-z0-9_-]+/g,`-`).replace(/^[^a-z0-9]+/,``).replace(/[^a-z0-9]+$/,``).slice(0,100).replace(/[^a-z0-9]+$/,``)||`my-agent`)}async function deriveSlackConnectorSlug(e,t){if(t!==void 0&&t.length>0&&t!==`.`)return normalizeSlackConnectorSlug(t);try{let t=await readFile(join(e,`package.json`),`utf8`),n=JSON.parse(t);if(typeof n.name==`string`&&n.name.length>0)return normalizeSlackConnectorSlug(n.name)}catch{}return normalizeSlackConnectorSlug(basename(resolve(e))||`my-agent`)}function buildSlackConnectTemplate(e){if(!e.startsWith(`slack/`)||e.length===6)throw Error(`Invalid Slack connector UID "${e}".`);return`import { connectSlackCredentials } from "@vercel/connect/eve";
2
2
  import { slackChannel } from "eve/channels/slack";
3
3
 
4
4
  export default slackChannel({