eve 0.39.0 → 0.39.1

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 (88) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/src/channel/channel-address.d.ts +1 -1
  3. package/dist/src/channel/channel-operations.d.ts +4 -3
  4. package/dist/src/channel/channel-operations.js +1 -1
  5. package/dist/src/chunks/{use-eve-agent-Bh-oE6hp.js → use-eve-agent-CTI9fHaO.js} +20 -0
  6. package/dist/src/chunks/{use-eve-agent-pDXW_bLy.js → use-eve-agent-DlkXRQVo.js} +20 -0
  7. package/dist/src/cli/commands/agent-instructions.d.ts +2 -0
  8. package/dist/src/cli/commands/agent-instructions.js +4 -3
  9. package/dist/src/cli/commands/deploy.d.ts +7 -4
  10. package/dist/src/cli/commands/deploy.js +1 -1
  11. package/dist/src/cli/commands/extension-init.js +1 -1
  12. package/dist/src/cli/commands/init.js +1 -1
  13. package/dist/src/cli/commands/link.d.ts +4 -3
  14. package/dist/src/cli/commands/link.js +1 -1
  15. package/dist/src/cli/commands/register-project-commands.js +1 -1
  16. package/dist/src/cli/commands/vercel-non-interactive.d.ts +25 -0
  17. package/dist/src/cli/commands/vercel-non-interactive.js +1 -0
  18. package/dist/src/client/index.d.ts +1 -1
  19. package/dist/src/client/message-reducer.js +1 -1
  20. package/dist/src/compiler/extension-compatibility.d.ts +14 -14
  21. package/dist/src/compiler/extension-compatibility.js +1 -1
  22. package/dist/src/compiler/normalize-agent-config.js +1 -1
  23. package/dist/src/context/keys.d.ts +2 -0
  24. package/dist/src/context/keys.js +1 -1
  25. package/dist/src/evals/mock-model.d.ts +3 -3
  26. package/dist/src/evals/mock-model.js +1 -1
  27. package/dist/src/execution/tasks/parent/agent-views.js +1 -1
  28. package/dist/src/execution/workflow-steps.js +1 -1
  29. package/dist/src/harness/hitl/approval-prompt.d.ts +11 -0
  30. package/dist/src/harness/hitl/approval-prompt.js +2 -0
  31. package/dist/src/harness/tool-loop.js +2 -2
  32. package/dist/src/internal/application/package.js +1 -1
  33. package/dist/src/internal/materialized-authored-modules.d.ts +19 -1
  34. package/dist/src/internal/materialized-authored-modules.js +1 -1
  35. package/dist/src/internal/nitro/dev-runtime-artifacts.js +1 -1
  36. package/dist/src/internal/nitro/dev-runtime-source-snapshot-copy.js +1 -1
  37. package/dist/src/internal/nitro/dev-runtime-source-snapshot.d.ts +3 -11
  38. package/dist/src/internal/nitro/dev-runtime-source-snapshot.js +1 -1
  39. package/dist/src/internal/nitro/development-generation.js +1 -1
  40. package/dist/src/internal/nitro/host/start-development-server.js +1 -1
  41. package/dist/src/protocol/message.d.ts +31 -2
  42. package/dist/src/protocol/message.js +2 -2
  43. package/dist/src/public/channels/slack/defaults.js +2 -2
  44. package/dist/src/public/channels/slack/hitl.d.ts +1 -0
  45. package/dist/src/public/channels/slack/hitl.js +1 -1
  46. package/dist/src/public/channels/slack/input-response.d.ts +5 -1
  47. package/dist/src/public/channels/slack/input-response.js +1 -1
  48. package/dist/src/public/channels/slack/interactions.d.ts +3 -17
  49. package/dist/src/public/channels/slack/interactions.js +1 -1
  50. package/dist/src/public/channels/slack/privacy.d.ts +8 -0
  51. package/dist/src/public/channels/slack/privacy.js +1 -0
  52. package/dist/src/public/channels/slack/session-operations.d.ts +1 -1
  53. package/dist/src/public/channels/slack/slackChannel.d.ts +5 -1
  54. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  55. package/dist/src/public/definitions/hook.d.ts +1 -0
  56. package/dist/src/setup/boxes/deploy-project.js +1 -1
  57. package/dist/src/setup/flows/install-vercel-cli.js +1 -1
  58. package/dist/src/setup/flows/model.js +1 -1
  59. package/dist/src/setup/integrations/shared/scaffold.js +1 -1
  60. package/dist/src/setup/primitives/index.d.ts +2 -1
  61. package/dist/src/setup/primitives/index.js +1 -1
  62. package/dist/src/setup/primitives/pm/process-result.d.ts +34 -0
  63. package/dist/src/setup/primitives/pm/process-result.js +1 -0
  64. package/dist/src/setup/primitives/pm/run.d.ts +24 -21
  65. package/dist/src/setup/primitives/pm/run.js +1 -1
  66. package/dist/src/setup/run-vercel-link.d.ts +1 -1
  67. package/dist/src/setup/run-vercel-link.js +1 -1
  68. package/dist/src/setup/scaffold/create/add-to-project.d.ts +1 -0
  69. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  70. package/dist/src/setup/scaffold/create/project.js +76 -11
  71. package/dist/src/svelte/index.js +1 -1
  72. package/dist/src/svelte/use-eve-agent.js +1 -1
  73. package/dist/src/tracing/agent-action-instrumentation.d.ts +1 -7
  74. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  75. package/dist/src/tracing/agent-otel-provider.js +2 -2
  76. package/dist/src/tracing/otel-declaration.d.ts +1 -1
  77. package/dist/src/tracing/otel-registration.js +1 -1
  78. package/dist/src/vue/index.js +1 -1
  79. package/dist/src/vue/use-eve-agent.js +1 -1
  80. package/docs/channels/mcp.mdx +33 -19
  81. package/docs/channels/slack.mdx +3 -4
  82. package/docs/concepts/sessions-runs-and-streaming.md +1 -0
  83. package/docs/guides/client/messages.mdx +2 -0
  84. package/docs/guides/client/streaming.mdx +1 -0
  85. package/docs/guides/frontend/overview.mdx +1 -1
  86. package/docs/reference/cli.md +9 -3
  87. package/docs/tools/human-in-the-loop.md +1 -1
  88. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # eve
2
2
 
3
+ ## 0.39.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 9965cfc: Use `@vercel/otel`'s automatic context propagators when no custom propagators are configured.
8
+ - 1d857ca: Report agent files, dependencies, and configuration files changed when `eve init` adds an agent to an existing project, including when dependency installation later fails.
9
+ - c9d3e25: Wait for tool approval settlement before marking Slack approval cards as answered, so rejected approval responses leave the shared card open.
10
+ - 075dc1f: Tell coding agents that content-only instruction edits do not require reading the framework docs, while preserving docs-first guidance for eve framework changes.
11
+ - c6d6b3e: Add non-interactive `eve link` and `eve deploy` options for linking a named Vercel project and deploying from CI or coding agents without terminal prompts.
12
+ - e739c28: Coding-agent `eve init` runs now report the selected model and generated instructions file without changing the interactive human flow.
13
+ - 8a3288d: Parent `agent.action` OpenTelemetry spans to their replay-stable `agent.step` boundary instead of directly to the turn.
14
+ - 69c6f12: Let parent agents process background-task notifications without requiring a user-visible channel message. Human messages and input responses remain required delivery.
15
+ - 7995d57: Add `ctx.isDMOrPrivateChannel()` to Slack message handlers so agents can detect DMs, group DMs, and private channels without parsing raw events or implementing their own Slack API fallback.
16
+ - 8180633: Use `Private message` as the Slack run title for DMs and private channels so sensitive message text never appears in run titles.
17
+ - 822dbff: Dev runtime generations now retain the compiled authored module graph instead of recursively copying the app and workspace source trees. Local rebuilds keep immutable runtime behavior while using substantially less disk space.
18
+ - 1473e2a: Capture package-manager command identity, termination, bounded in-memory output, and workspace probes as structured process results for consistent setup diagnostics.
19
+ - 97d166a: New eve projects now give coding agents direct documentation routes and a bounded authoring loop, including a local recipe for routine typed tools. This reduces redundant project and package discovery while preserving deeper guidance for approvals and other advanced behavior.
20
+ - e1ebb53: Emit durable `input.resolved` stream events with server-accepted human-input outcomes and responses so clients can persist and replay HITL state.
21
+ - f02bc3d: Keep pending tool approvals visible across follow-up turns and prevent those turns from issuing duplicate tool calls.
22
+
3
23
  ## 0.39.0
4
24
 
5
25
  ### Minor Changes
@@ -15,7 +15,7 @@ interface BaseChannelAddressDeliveryOptions {
15
15
  }
16
16
  /** Delivery options for a channel address whose continuation token is already bound. */
17
17
  export type ChannelAddressDeliveryOptions<TState = undefined> = [TState] extends [undefined] ? BaseChannelAddressDeliveryOptions : BaseChannelAddressDeliveryOptions & {
18
- readonly state?: TState;
18
+ readonly state?: Partial<TState>;
19
19
  };
20
20
  /**
21
21
  * Dynamic handle for whichever durable session currently owns one channel-local address.
@@ -22,19 +22,20 @@ interface BaseChannelSendOptions {
22
22
  export type ChannelSendOptions<TState = undefined> = [TState] extends [undefined] ? BaseChannelSendOptions : BaseChannelSendOptions & {
23
23
  readonly state: TState;
24
24
  };
25
- interface BaseChannelRespondOptions {
25
+ interface BaseChannelRespondOptions<TState = undefined> {
26
26
  readonly auth: SessionAuthContext | null;
27
27
  readonly context?: readonly string[];
28
28
  readonly outputSchema?: JsonObject;
29
+ readonly state?: Partial<TState>;
29
30
  }
30
31
  /** Options for answering pending input requests at an existing continuation address. */
31
- export type ChannelRespondOptions = BaseChannelRespondOptions;
32
+ export type ChannelRespondOptions<TState = undefined> = BaseChannelRespondOptions<TState>;
32
33
  /** Dynamic handle for whichever session currently owns one channel-local address. */
33
34
  export interface ChannelSource<TState = undefined> {
34
35
  /** Starts or resumes a turn with a user message. May create a session. */
35
36
  send(message: string | UserContent, options: ChannelSendOptions<TState>): Promise<Session>;
36
37
  /** Answers pending input requests. Never creates a session. */
37
- respond(inputResponses: readonly InputResponse[], options: ChannelRespondOptions): Promise<Session>;
38
+ respond(inputResponses: readonly InputResponse[], options: ChannelRespondOptions<TState>): Promise<Session>;
38
39
  /** Cooperatively cancels the active turn without creating a session. */
39
40
  cancel(options?: {
40
41
  readonly turnId?: string;
@@ -1 +1 @@
1
- import{createChannelAddressFn}from"#channel/channel-address.js";const INTERNAL_CHANNEL_DELIVER=Symbol(`eve.internal.channel-deliver`);function createChannelOperations(n){let r=createChannelAddressFn(n);return{from(e){let n=r(e);return{async send(e,t){return await n.deliver({context:t.context,message:e,outputSchema:t.outputSchema},t)},async respond(e,t){if(e.length===0)throw Error(`respond() requires at least one input response.`);return await n.deliver({context:t.context,inputResponses:e,outputSchema:t.outputSchema},t)},async cancel(e){return await n.cancel(e)},async compact(){return await n.compact()},async clear(){return await n.clear()},async reset(e){return await n.reset(e)},async[INTERNAL_CHANNEL_DELIVER](e,t){return await n.deliver(e,t)}}},async resolveSession(e){return await r(e).resolveSession()}}}export{INTERNAL_CHANNEL_DELIVER,createChannelOperations};
1
+ import{createChannelAddressFn}from"#channel/channel-address.js";const INTERNAL_CHANNEL_DELIVER=Symbol(`eve.internal.channel-deliver`);function createChannelOperations(n){let r=createChannelAddressFn(n);return{from(e){let n=r(e);return{async send(e,t){return await n.deliver({context:t.context,message:e,outputSchema:t.outputSchema},t)},async respond(e,t){if(e.length===0)throw Error(`respond() requires at least one input response.`);return await n.deliver({context:t.context,inputResponses:e,outputSchema:t.outputSchema,state:t.state},t)},async cancel(e){return await n.cancel(e)},async compact(){return await n.compact()},async clear(){return await n.clear()},async reset(e){return await n.reset(e)},async[INTERNAL_CHANNEL_DELIVER](e,t){return await n.deliver(e,t)}}},async resolveSession(e){return await r(e).resolveSession()}}}export{INTERNAL_CHANNEL_DELIVER,createChannelOperations};
@@ -1803,6 +1803,11 @@ function reduceMessageData(data, event) {
1803
1803
  for (const response of event.data.responses) next = respondToInputRequest(next, response);
1804
1804
  return next;
1805
1805
  }
1806
+ case "input.resolved": {
1807
+ let next = data;
1808
+ for (const resolution of event.data.resolutions) next = resolveInputRequest(next, resolution);
1809
+ return next;
1810
+ }
1806
1811
  case "message.received": return upsertMessage(data, {
1807
1812
  id: `${event.data.turnId}:user`,
1808
1813
  metadata: {
@@ -2005,6 +2010,21 @@ function respondToInputRequest(data, response) {
2005
2010
  type: "dynamic-tool"
2006
2011
  });
2007
2012
  }
2013
+ function resolveInputRequest(data, resolution) {
2014
+ if (resolution.response !== void 0) return respondToInputRequest(data, resolution.response);
2015
+ const existing = findToolPartByApprovalId(data, resolution.requestId);
2016
+ if (!existing) return data;
2017
+ return updateToolPart(data, existing.toolCallId, {
2018
+ input: existing.input,
2019
+ output: { status: resolution.outcome },
2020
+ state: "output-available",
2021
+ stepIndex: existing.stepIndex,
2022
+ toolCallId: existing.toolCallId,
2023
+ toolMetadata: existing.toolMetadata,
2024
+ toolName: existing.toolName,
2025
+ type: "dynamic-tool"
2026
+ });
2027
+ }
2008
2028
  function updateAssistantMessage(data, turnId, update) {
2009
2029
  return upsertMessage(data, update(data.messages.find((message) => message.role === "assistant" && message.metadata?.turnId === turnId) ?? createAssistantMessage(turnId)));
2010
2030
  }
@@ -1803,6 +1803,11 @@ function reduceMessageData(data, event) {
1803
1803
  for (const response of event.data.responses) next = respondToInputRequest(next, response);
1804
1804
  return next;
1805
1805
  }
1806
+ case "input.resolved": {
1807
+ let next = data;
1808
+ for (const resolution of event.data.resolutions) next = resolveInputRequest(next, resolution);
1809
+ return next;
1810
+ }
1806
1811
  case "message.received": return upsertMessage(data, {
1807
1812
  id: `${event.data.turnId}:user`,
1808
1813
  metadata: {
@@ -2005,6 +2010,21 @@ function respondToInputRequest(data, response) {
2005
2010
  type: "dynamic-tool"
2006
2011
  });
2007
2012
  }
2013
+ function resolveInputRequest(data, resolution) {
2014
+ if (resolution.response !== void 0) return respondToInputRequest(data, resolution.response);
2015
+ const existing = findToolPartByApprovalId(data, resolution.requestId);
2016
+ if (!existing) return data;
2017
+ return updateToolPart(data, existing.toolCallId, {
2018
+ input: existing.input,
2019
+ output: { status: resolution.outcome },
2020
+ state: "output-available",
2021
+ stepIndex: existing.stepIndex,
2022
+ toolCallId: existing.toolCallId,
2023
+ toolMetadata: existing.toolMetadata,
2024
+ toolName: existing.toolName,
2025
+ type: "dynamic-tool"
2026
+ });
2027
+ }
2008
2028
  function updateAssistantMessage(data, turnId, update) {
2009
2029
  return upsertMessage(data, update(data.messages.find((message) => message.role === "assistant" && message.metadata?.turnId === turnId) ?? createAssistantMessage(turnId)));
2010
2030
  }
@@ -8,6 +8,8 @@ export declare const HANDOFF_SECTIONS: readonly ["intro-handoff.md", "collect-in
8
8
  * than a launcher-specific command.
9
9
  */
10
10
  export declare function initAgentInstructions(): string;
11
+ /** Concise scaffold facts printed only when a coding agent launched `eve init`. */
12
+ export declare function initAgentReadySummary(model: string | undefined, projectPath: string): string;
11
13
  /** The post-scaffold handoff printed after a coding agent runs `eve init`. */
12
14
  export declare function initAgentDevHandoff(options: {
13
15
  projectPath: string;
@@ -1,5 +1,6 @@
1
- import{readFileSync}from"node:fs";const SETUP_SECTIONS=[`intro-setup.md`,`collect-intent.md`,`vercel-connect.md`,`scaffold.md`,`build-and-verify.md`],HANDOFF_SECTIONS=[`intro-handoff.md`,`collect-intent.md`,`vercel-connect.md`,`build-and-verify.md`];function compose(t,n){let r=t.map(t=>readFileSync(new URL(`./agent-prompt/${t}`,import.meta.url),`utf8`).trim()).join(`
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{join}from"node:path";import{readFileSync}from"node:fs";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";var import_picocolors=__toESM(require_picocolors(),1);const SETUP_SECTIONS=[`intro-setup.md`,`collect-intent.md`,`vercel-connect.md`,`scaffold.md`,`build-and-verify.md`],HANDOFF_SECTIONS=[`intro-handoff.md`,`collect-intent.md`,`vercel-connect.md`,`build-and-verify.md`];function compose(e,t){let n=e.map(e=>readFileSync(new URL(`./agent-prompt/${e}`,import.meta.url),`utf8`).trim()).join(`
2
2
 
3
- `).replaceAll(`{{devCommand}}`,()=>n.devCommand),{workingDirectory:i}=n;return i===void 0?r:r.replaceAll(`{{workingDirectory}}`,()=>i)}function initAgentInstructions(){return compose(SETUP_SECTIONS,{devCommand:`npx eve dev`})}function initAgentDevHandoff(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:e.projectPath})}function initAgentReplPrompt(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:`.`})}function initExtensionInstructions(){return[`You are scaffolding an eve extension package (a reusable package of tools,`,`connections, skills, and hooks that a consuming agent mounts under`,`agent/extensions/).`,``,`Ask the user for a package directory name, then run:`,``,` npx eve@latest extension init <name>`,``,`That creates the package, installs dependencies, and initializes Git. It`,`prints what was set up and how to author, build, and mount the extension —`,`it does not start eve dev (extensions are not standalone agents).`,``,"Build with `eve extension build` (or the package `build` script)."].join(`
3
+ `).replaceAll(`{{devCommand}}`,()=>t.devCommand),{workingDirectory:i}=t;return i===void 0?n:n.replaceAll(`{{workingDirectory}}`,()=>i)}function initAgentInstructions(){return compose(SETUP_SECTIONS,{devCommand:`npx eve dev`})}function initAgentReadySummary(e,t){let r=e??DEFAULT_AGENT_MODEL_ID,a=e===void 0?import_picocolors.default.dim(` (eve default)`):``;return[`${import_picocolors.default.green(`✓`)} Model ${import_picocolors.default.bold(r)}${a}`,`${import_picocolors.default.green(`✓`)} Instructions ${import_picocolors.default.bold(join(t,`agent/instructions.md`))}`].join(`
4
+ `)}function initAgentDevHandoff(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:e.projectPath})}function initAgentReplPrompt(e){return compose(HANDOFF_SECTIONS,{devCommand:e.devCommand,workingDirectory:`.`})}function initExtensionInstructions(){return[`You are scaffolding an eve extension package (a reusable package of tools,`,`connections, skills, and hooks that a consuming agent mounts under`,`agent/extensions/).`,``,`Ask the user for a package directory name, then run:`,``,` npx eve@latest extension init <name>`,``,`That creates the package, installs dependencies, and initializes Git. It`,`prints what was set up and how to author, build, and mount the extension —`,`it does not start eve dev (extensions are not standalone agents).`,``,"Build with `eve extension build` (or the package `build` script)."].join(`
4
5
  `)}function initExtensionHandoff(e){return[``,`What we set up:`,` - package.json with eve.extension source/dist roots, peer+dev eve, and zod`,` - extension/extension.ts (config schema via defineExtension)`,` - build/prepare scripts → eve extension build`,``,`Next:`,` - Add tools, skills, hooks, or connections under extension/`,` (see AGENTS.md and node_modules/eve/docs/extensions.md)`,` - ${`${e.packageManager} run build`} # builds dist/extension and package exports`,` - Mount from a consumer agent:`,` // agent/extensions/${e.packageName}.ts`,` import ext from "${e.packageName}";`,` export default ext({ apiKey: process.env.API_KEY });`,``,`Working directory: ${e.projectPath}`].join(`
5
- `)}export{HANDOFF_SECTIONS,SETUP_SECTIONS,initAgentDevHandoff,initAgentInstructions,initAgentReplPrompt,initExtensionHandoff,initExtensionInstructions};
6
+ `)}export{HANDOFF_SECTIONS,SETUP_SECTIONS,initAgentDevHandoff,initAgentInstructions,initAgentReadySummary,initAgentReplPrompt,initExtensionHandoff,initExtensionInstructions};
@@ -1,5 +1,6 @@
1
1
  import { type DeployFlowDeps } from "#setup/flows/deploy.js";
2
2
  import { type Prompter } from "#setup/prompter.js";
3
+ import { type VercelProjectCliOptions } from "./vercel-non-interactive.js";
3
4
  export interface DeployCliLogger {
4
5
  error(message: string): void;
5
6
  log(message: string): void;
@@ -12,9 +13,11 @@ export interface DeployCommandDependencies {
12
13
  }
13
14
  /**
14
15
  * `eve deploy`: deploy the agent to Vercel production. An already-linked
15
- * project deploys straight away (interactively or not); an unlinked one walks
16
- * the same team/project pickers as onboarding when a terminal is present, and
17
- * refuses with `eve link` guidance otherwise. The flow itself is
16
+ * project deploys straight away (interactively or not); an unlinked interactive
17
+ * run walks the same team/project pickers as onboarding. A non-interactive
18
+ * caller can name a project to link before deployment. The flow itself is
18
19
  * {@link runDeployFlow}, shared with the dev TUI's `/deploy`.
19
20
  */
20
- export declare function runDeployCommand(logger: DeployCliLogger, appRoot: string, dependencies?: DeployCommandDependencies): Promise<void>;
21
+ export declare function runDeployCommand(logger: DeployCliLogger, appRoot: string, dependencies?: DeployCommandDependencies, options?: VercelProjectCliOptions & {
22
+ yes?: boolean;
23
+ }): Promise<void>;
@@ -1 +1 @@
1
- import{hasInteractiveTerminal}from"./preconditions.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal};async function runDeployCommand(e,r,i=defaultDependencies){let a=i.createPrompter?.()??createPrompter();a.intro(`Deploy your eve agent to Vercel`);try{let n=await runDeployFlow({appRoot:r,prompter:a,interactive:i.hasInteractiveTerminal(),deps:i.flowDeps});if(n.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first (or `vercel link --project <name> --yes --non-interactive` in CI), then re-run `eve deploy`."),process.exitCode=1;return}if(n.kind===`local-model`){e.error("ChatGPT subscription models use local Codex credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}a.outro(n.kind===`cancelled`?`Cancelled.`:n.productionUrl===void 0?`Deployed.`:`Deployed: ${n.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{runDeployFlow}from"#setup/flows/deploy.js";import{createPrompter}from"#setup/prompter.js";const defaultDependencies={hasInteractiveTerminal};async function runDeployCommand(e,r,i=defaultDependencies,a={}){if(isNonInteractiveProjectCommand(a)){if(a.yes!==!0){e.error("`eve deploy --non-interactive` requires `--yes` to confirm production deployment."),process.exitCode=1;return}if(a.project!==void 0&&!await runNonInteractiveLink({logger:e,appRoot:r,options:a}))return}let o=i.createPrompter?.()??createPrompter();o.intro(`Deploy your eve agent to Vercel`);try{let n=await runDeployFlow({appRoot:r,prompter:o,interactive:!isNonInteractiveProjectCommand(a)&&i.hasInteractiveTerminal(),deps:i.flowDeps});if(n.kind===`needs-link`){e.error("This directory is not linked to a Vercel project. Run `eve link` first (or `vercel link --project <name> --yes --non-interactive` in CI), then re-run `eve deploy`."),process.exitCode=1;return}if(n.kind===`local-model`){e.error("ChatGPT subscription models use local Codex credentials and cannot be deployed. Switch to an AI Gateway or server-authenticated model before running `eve deploy`."),process.exitCode=1;return}o.outro(n.kind===`cancelled`?`Cancelled.`:n.productionUrl===void 0?`Deployed.`:`Deployed: ${n.productionUrl}`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runDeployCommand};
@@ -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{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
+ 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{packageManagerInstallFailureMessage,packageManagerInstallSucceeded,runPackageManagerInstall}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{parseProjectName}from"#setup/project-name.js";import{blockingCreateInPlaceEntries}from"#setup/scaffold/create-in-place.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";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,!packageManagerInstallSucceeded(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);if(t.length===0){let t=packageManagerInstallFailureMessage(C);t!==void 0&&e.error(t)}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{__toESM}from"../../_virtual/_rolldown/runtime.js";import{require_picocolors}from"../../node_modules/.pnpm/picocolors@1.1.1/node_modules/picocolors/picocolors.js";import{initAgentDevHandoff,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,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{eveDevArguments,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.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";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}function initDevArguments(e){let t=[...eveDevArguments(e)];return e===`pnpm`?[`--config.minimum-release-age=0`,...t]:t}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),h=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let d={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{h.push(e)}},f=await a.scaffoldBaseProject(d);return i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:f,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{h.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(f,e):await rename(f,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(h)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,c=isLogLevelEnabled(`debug`),l=await t.isCodingAgentLaunch(),d=await resolveInitTarget({parentDirectory:i,target:a}),f=resolveInitEvePackageOverride(),p=startCliLiveRow(n);p.update(`Preparing project`);try{let e=d.kind===`fresh`?`creating agent`:`adding agent`;p.update(d.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(d.kind===`fresh`){let e=await resolveScaffoldPackageManager(d.projectPath,t),n=isPackageManagerWorkspaceMember(e,d.projectPath),i;try{i=await scaffoldProject(d.projectPath,d.projectName,d.createInPlace,e,r,t,f,d.overwriteExisting)}catch(e){if(d.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(d.projectPath,d.failurePolicy,d.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${d.projectPath}" to its original state.`:`eve could not completely clean "${d.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(d.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:d.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:d.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${d.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(d.projectPath,r,t,f);a=e.nodeEngineOverride===void 0?{failurePolicy:`preserve`,kind:`added`,packageManager:e.packageManager,projectPath:d.projectPath}:{failurePolicy:`preserve`,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:d.projectPath}}let u=t.now()-i;initLog.debug(`${e} done`,{ms:u}),p.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let m=t.now(),h=[],g=[],_=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!c,onOutput:e=>{e.text.trim()!==``&&(g.push(e.text),g.length>20&&g.shift(),NPM_NOISE_LINE.test(e.text)||h.push(e.text)),c&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),v=t.now()-m;if(!_){initLog.debug(`dependency installation failed`,{ms:v}),p.stop();let e=h.length>0?h:g;for(let t of e)n.error(t);if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:v}),a.kind===`created`?(p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:u,agentLaunched:l,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:v}):{...a,agentElapsedMs:u,agentLaunched:l,installElapsedMs:v}}finally{p.stop()}}async function runInitCommand(e,t,i,a,o=defaultDependencies){let s;try{s=await runInitSteps({dependencies:o,logger:e,options:a,parentDirectory:t,target:i})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(s.kind===`created`){e.log(`${import_picocolors.default.green(`✓`)} Created an ${EVE_WORDMARK} agent in ${import_picocolors.default.bold(s.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`);for(let t of s.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(s.projectPath)} ${import_picocolors.default.dim(`in ${formatElapsed(s.agentElapsedMs)}`)}`),s.nodeEngineOverride!==void 0&&e.log(import_picocolors.default.yellow(`⚠ ${formatNodeEngineOverrideWarning(s.nodeEngineOverride)}`));e.log(`${import_picocolors.default.green(`✓`)} Installed dependencies ${import_picocolors.default.dim(`in ${formatElapsed(s.installElapsedMs)}`)}`),s.kind===`created`&&s.gitResult.kind===`failed`&&(e.error(import_picocolors.default.yellow(`Git initialization failed during ${s.gitResult.stage}: ${s.gitResult.reason}`)),s.gitResult.stage===`commit`&&e.error(import_picocolors.default.yellow(`The Git repository and staged files were preserved at "${s.projectPath}".\n\nResolve the Git error above, then retry:\n git -C ${JSON.stringify(s.projectPath)} commit -m "Initial commit from eve"`)));let c=initDevArguments(s.packageManager),l=[s.packageManager,...c].join(` `),u=initAgentDevHandoff({projectPath:s.projectPath,devCommand:l});if(s.agentLaunched){e.log(u);return}let d;try{d=await o.selectInitHandoff({agentName:basename(s.projectPath)})}catch(e){if(e instanceof WizardCancelledError)return;throw e}if(d===`exit`)return;if(d!==`eve-dev`){if(e.log(import_picocolors.default.dim(`$ ${d}`)),!await o.spawnCodingAgentRepl({command:d,cwd:s.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 "${s.projectPath}".`);return}let f=s.kind===`created`,p=f?[...c,`--input`,`/model`]:c;if(e.log(import_picocolors.default.dim(f?`$ eve dev --input /model`:`$ eve dev`)),!await o.spawnPackageManager(s.packageManager,s.projectPath,p))throw Error(`Development server exited unsuccessfully in "${s.projectPath}".`)}function resolveInitEvePackageOverride(){let e=process.env[EVE_INIT_PACKAGE_SPEC_ENV]?.trim();if(!(e===void 0||e.length===0))return{nodeEngine:DEFAULT_EVE_PACKAGE_CONTRACT.nodeEngine,version:e}}export{EVE_INIT_PACKAGE_SPEC_ENV,runInitCommand};
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,initAgentReadySummary,initAgentReplPrompt}from"./agent-instructions.js";import{tryInitializeGit}from"./init-git.js";import{confirmInitInNonEmptyDirectory}from"./init-confirm.js";import{cleanupFreshInitTarget,workspaceFailureNote}from"./init-recovery.js";import{selectInitHandoff,spawnCodingAgentRepl}from"./init-repl.js";import{resolveInitTarget}from"./init-target.js";import{mkdtemp,readdir,rename,rm}from"node:fs/promises";import{createLogger,isLogLevelEnabled}from"#internal/logging.js";import{basename,join,relative,resolve}from"node:path";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{ensureChannel,scaffoldBaseProject}from"#setup/scaffold/index.js";import{eveDevArguments,packageManagerInstallFailureMessage,packageManagerInstallSucceeded,resultSucceeded,runPackageManagerInstall,spawnPackageManager}from"#setup/primitives/index.js";import{performance}from"node:perf_hooks";import{isCodingAgentLaunch}from"#cli/agent-detection.js";import{EVE_WORDMARK}from"#cli/banner.js";import{formatElapsed}from"#cli/format-elapsed.js";import{startCliLiveRow}from"#cli/ui/live-row.js";import{formatNodeEngineOverrideWarning}from"#setup/node-engine.js";import{detectInvokingPackageManager,detectPackageManager}from"#setup/package-manager.js";import{pathExists}from"#setup/path-exists.js";import{DEFAULT_EVE_PACKAGE_CONTRACT}from"#setup/scaffold/create/project.js";import{addAgentToProject}from"#setup/scaffold/create/add-to-project.js";import{WizardCancelledError}from"#setup/step.js";import{validateModelSlug}from"#setup/flows/model-source-change.js";import{isPackageManagerWorkspaceMember}from"#setup/scaffold/workspace-root.js";var import_picocolors=__toESM(require_picocolors(),1);const defaultDependencies={addAgentToProject,confirmInitInNonEmptyDirectory,detectInvokingPackageManager,detectPackageManager,ensureChannel,isCodingAgentLaunch,now:()=>performance.now(),runPackageManagerInstall,scaffoldBaseProject,selectInitHandoff,spawnCodingAgentRepl,spawnPackageManager,tryInitializeGit,validateModelSlug},EVE_INIT_PACKAGE_SPEC_ENV=`EVE_INIT_PACKAGE_SPEC`,initLog=createLogger(`init`);async function moveDirectoryContents(e,t){for(let n of await readdir(e))await rename(join(e,n),join(t,n))}function uniqueWorkspaceRootMutations(e){let t=new Map;for(let n of e){let e=`${n.kind}:${n.path}`,r=t.get(e);t.set(e,{...n,nodeEngineOverride:n.nodeEngineOverride??r?.nodeEngineOverride})}return[...t.values()]}function formatWorkspaceRootMutationWarning(e){let t=e.kind===`package-json`?`package.json`:`configuration`,n=e.nodeEngineOverride===void 0?``:` (${formatNodeEngineOverrideWarning(e.nodeEngineOverride)})`;return`Updated workspace root ${t} at ${e.path}${n}`}function initDevArguments(e){let t=[...eveDevArguments(e)];return e===`pnpm`?[`--config.minimum-release-age=0`,...t]:t}async function addToExistingProject(e,t,n,r){if(t.channelWebNextjs===!0)throw Error("`--channel-web-nextjs` is not supported when adding an agent to an existing project. Run `eve add channel/web` from the project afterwards instead.");if(t.model!==void 0){let r=await n.validateModelSlug(e,t.model);if(r!==null)throw Error(r)}let i=await n.detectPackageManager(e),a=await n.addAgentToProject({projectRoot:e,model:t.model??DEFAULT_AGENT_MODEL_ID,reasoning:t.reasoning,packageManager:i.kind,evePackage:r});return{configurationFilesChanged:a.configurationFilesChanged,dependenciesAdded:a.dependenciesAdded,filesWritten:a.filesWritten,packageManager:i.kind,nodeEngineOverride:a.nodeEngineOverride}}async function resolveScaffoldPackageManager(e,t){let n=await t.detectPackageManager(e);return n.source==="default"?t.detectInvokingPackageManager()??`pnpm`:n.kind}async function scaffoldProject(e,t,n,r,i,a,o,s){let c=resolve(e,`..`),l=!n&&await pathExists(e)&&(await readdir(e)).length===0;if(!n&&await pathExists(e)&&!l)throw Error(`Cannot create project because "${e}" already exists.`);let u=n&&s?void 0:await mkdtemp(join(c,`.eve-init-`)),d=[];try{let c=u??e;if(i.model!==void 0){let e=await a.validateModelSlug(c,i.model);if(e!==null)throw Error(e)}let f={projectName:u===void 0?`.`:n?basename(e):t,model:i.model??DEFAULT_AGENT_MODEL_ID,reasoning:i.reasoning,evePackage:o,targetDirectory:c,overwriteExisting:s,workspaceProbeDirectory:e,packageManager:r,onWorkspaceRootMutation:e=>{d.push(e)}},p=await a.scaffoldBaseProject(f);return i.channelWebNextjs===!0&&await a.ensureChannel({projectRoot:p,kind:`web`,packageManager:r,force:s,workspaceProbeDirectory:e,configureVercelServices:!1,onWorkspaceRootMutation:e=>{d.push(e)}}),u!==void 0&&(n||l?await moveDirectoryContents(p,e):await rename(p,e)),{projectPath:e,workspaceRootMutations:uniqueWorkspaceRootMutations(d)}}finally{u!==void 0&&await rm(u,{recursive:!0,force:!0})}}function installProgressDetail(e,t){let n=t.text.trim();if(n===``||e!==`npm`)return n||void 0;let r=/^npm silly fetch manifest (.+)$/u.exec(n);if(r!==null)return`Resolving ${r[1]}`;let i=/^npm http fetch \S+ \S+ attempt (\d+) failed with (\S+)$/u.exec(n);if(i!==null)return`npm registry · attempt ${i[1]} failed: ${i[2]}`;if(t.stream===`stdout`||/^npm (?:error|warn)\b/u.test(n))return n}const NPM_NOISE_LINE=/^\s*npm (?:silly|verbose|http|timing)\b/u;function reportExistingProjectChanges(e,t){e.log(`Updated existing project:`);for(let n of t.filesWritten)e.log(` Created ${relative(t.projectPath,n).replaceAll(`\\`,`/`)}`);t.dependenciesAdded.length>0&&e.log(` Added dependencies: ${t.dependenciesAdded.join(`, `)}`);for(let n of t.configurationFilesChanged)e.log(` Updated ${n}`);t.nodeEngineOverride!==void 0&&e.log(import_picocolors.default.yellow(` ⚠ ${formatNodeEngineOverrideWarning(t.nodeEngineOverride)}`))}async function runInitSteps(e){let{dependencies:t,logger:n,options:r,parentDirectory:i,target:a}=e,o=isLogLevelEnabled(`debug`),l=await t.isCodingAgentLaunch(),u=await resolveInitTarget({parentDirectory:i,target:a}),f=resolveInitEvePackageOverride(),p=startCliLiveRow(n);p.update(`Preparing project`);try{let e=u.kind===`fresh`?`creating agent`:`adding agent`;p.update(u.kind===`fresh`?`Creating agent`:`Adding agent`),initLog.debug(e);let i=t.now(),a;if(u.kind===`fresh`){let e=await resolveScaffoldPackageManager(u.projectPath,t),n=isPackageManagerWorkspaceMember(e,u.projectPath),i;try{i=await scaffoldProject(u.projectPath,u.projectName,u.createInPlace,e,r,t,f,u.overwriteExisting)}catch(e){if(u.failurePolicy===`clear`){let t=await cleanupFreshInitTarget(u.projectPath,u.failurePolicy,u.preservedEntries),r=e instanceof Error?e.message:String(e),i=t?`eve restored "${u.projectPath}" to its original state.`:`eve could not completely clean "${u.projectPath}".`;throw Error(`${r}\n\n${i}${workspaceFailureNote(n)}`)}if(u.failurePolicy===`remove`&&n){let t=e instanceof Error?e.message:String(e);throw Error(`${t}${workspaceFailureNote(!0)}`)}throw e}a={failurePolicy:u.failurePolicy,kind:`created`,packageManager:e,preservedTargetEntries:u.preservedEntries,projectPath:i.projectPath,retryCommand:`eve init ${u.projectPath}`,workspaceMember:n,workspaceRootMutations:i.workspaceRootMutations}}else{let e=await addToExistingProject(u.projectPath,r,t,f);a=e.nodeEngineOverride===void 0?{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,packageManager:e.packageManager,projectPath:u.projectPath}:{configurationFilesChanged:e.configurationFilesChanged,dependenciesAdded:e.dependenciesAdded,failurePolicy:`preserve`,filesWritten:e.filesWritten,kind:`added`,nodeEngineOverride:e.nodeEngineOverride,packageManager:e.packageManager,projectPath:u.projectPath}}let d=t.now()-i;initLog.debug(`${e} done`,{ms:d}),a.kind===`added`&&(p.stop(),reportExistingProjectChanges(n,a),p=startCliLiveRow(n)),p.update(`Installing dependencies`,`${a.packageManager} install`),initLog.debug(`installing dependencies with ${a.packageManager}`);let m=t.now(),h=[],g=[],_=await t.runPackageManagerInstall(a.packageManager,a.projectPath,{bypassMinimumReleaseAge:!0,progressDetails:process.stdout.isTTY===!0&&!o,onOutput:e=>{e.text.trim()!==``&&(g.push(e.text),g.length>20&&g.shift(),NPM_NOISE_LINE.test(e.text)||h.push(e.text)),o&&initLog.debug(e.text);let t=installProgressDetail(a.packageManager,e);t!==void 0&&p.update(`Installing dependencies`,t)}}),v=t.now()-m;if(!packageManagerInstallSucceeded(_)){initLog.debug(`dependency installation failed`,{ms:v}),p.stop();let e=h.length>0?h:g;for(let t of e)n.error(t);if(e.length===0){let e=packageManagerInstallFailureMessage(_);e!==void 0&&n.error(e)}if(a.failurePolicy!==`preserve`){if(await cleanupFreshInitTarget(a.projectPath,a.failurePolicy,a.preservedTargetEntries)){let e=a.failurePolicy===`remove`?`eve removed the incomplete project at "${a.projectPath}".`:`eve restored "${a.projectPath}" to its original state.`,t=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies.\n\n${e}\n\nResolve the package-manager error above, then retry:\n ${a.retryCommand}${workspaceFailureNote(t)}`)}let e=a.workspaceMember||a.workspaceRootMutations.length>0;throw Error(`Failed to install dependencies, and eve could not completely clean "${a.projectPath}".\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in that directory. Or clean the target manually before rerunning eve init.${workspaceFailureNote(e)}`)}throw Error(`The eve agent was added, but dependency installation failed.\n\nResolve the package-manager error above, then install dependencies with ${a.packageManager} in "${a.projectPath}".\n\nDo not rerun eve init; the agent is already configured.`)}return initLog.debug(`dependencies installed`,{ms:v}),a.kind===`created`?(p.update(`Initializing Git repository`),initLog.debug(`initializing git repository`),{...a,agentElapsedMs:d,agentLaunched:l,gitResult:await t.tryInitializeGit(a.projectPath),installElapsedMs:v}):{...a,agentElapsedMs:d,agentLaunched:l,installElapsedMs:v}}finally{p.stop()}}async function runInitCommand(e,t,a,o,s=defaultDependencies){let c;try{c=await runInitSteps({dependencies:s,logger:e,options:o,parentDirectory:t,target:a})}catch(e){if(e instanceof WizardCancelledError)return;throw e}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)}`)}`);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 during ${c.gitResult.stage}: ${c.gitResult.reason}`)),c.gitResult.stage===`commit`&&e.error(import_picocolors.default.yellow(`The Git repository and staged files were preserved at "${c.projectPath}".\n\nResolve the Git error above, then retry:\n git -C ${JSON.stringify(c.projectPath)} commit -m "Initial commit from eve"`)));let l=initDevArguments(c.packageManager),u=[c.packageManager,...l].join(` `),d=initAgentDevHandoff({projectPath:c.projectPath,devCommand:u});if(c.agentLaunched){e.log(initAgentReadySummary(o.model,c.projectPath)),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===`exit`)return;if(f!==`eve-dev`){if(e.log(import_picocolors.default.dim(`$ ${f}`)),!await s.spawnCodingAgentRepl({command:f,cwd:c.projectPath,prompt:initAgentReplPrompt({devCommand:u}),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?[...l,`--input`,`/model`]:l;if(e.log(import_picocolors.default.dim(p?`$ eve dev --input /model`:`$ eve dev`)),!resultSucceeded(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,5 +1,6 @@
1
1
  import { type LinkFlowDeps } from "#setup/flows/link.js";
2
2
  import { type Prompter } from "#setup/prompter.js";
3
+ import { type VercelProjectCliOptions } from "./vercel-non-interactive.js";
3
4
  export interface LinkCliLogger {
4
5
  error(message: string): void;
5
6
  log(message: string): void;
@@ -15,7 +16,7 @@ export interface LinkCommandDependencies {
15
16
  * when one is already linked), run `vercel link` for the resolved project,
16
17
  * then pull env so the AI Gateway credential lands in `.env.local`. The flow
17
18
  * itself is {@link runLinkFlow}, shared with the dev TUI `/model` menu's
18
- * provider row. Interactive only: the pickers are the point of the command, so
19
- * a non-TTY run refuses with guidance instead of guessing a project.
19
+ * provider row. Non-interactive callers name the Vercel project explicitly;
20
+ * interactive callers use the eve-owned pickers.
20
21
  */
21
- export declare function runLinkCommand(logger: LinkCliLogger, appRoot: string, dependencies?: LinkCommandDependencies): Promise<void>;
22
+ export declare function runLinkCommand(logger: LinkCliLogger, appRoot: string, dependencies?: LinkCommandDependencies, options?: VercelProjectCliOptions): Promise<void>;
@@ -1 +1 @@
1
- import{hasInteractiveTerminal}from"./preconditions.js";import{createPrompter}from"#setup/prompter.js";import{runLinkFlow}from"#setup/flows/link.js";const defaultDependencies={hasInteractiveTerminal};async function runLinkCommand(e,n,r=defaultDependencies){if(!r.hasInteractiveTerminal()){e.error("`eve link` needs an interactive terminal to pick the team and project. In CI, run `vercel link --project <name> --yes --non-interactive` instead."),process.exitCode=1;return}let i=r.createPrompter?.()??createPrompter();i.intro(`Link your eve agent to Vercel`);try{let e=await runLinkFlow({appRoot:n,prompter:i,projectSelection:`create-or-link`,deps:r.flowDeps});i.outro(e.kind===`cancelled`?`Cancelled.`:`Project linked.`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runLinkCommand};
1
+ import{hasInteractiveTerminal}from"./preconditions.js";import{isNonInteractiveProjectCommand,runNonInteractiveLink}from"./vercel-non-interactive.js";import{createPrompter}from"#setup/prompter.js";import{runLinkFlow}from"#setup/flows/link.js";const defaultDependencies={hasInteractiveTerminal};async function runLinkCommand(e,n,r=defaultDependencies,i={}){if(isNonInteractiveProjectCommand(i)){await runNonInteractiveLink({logger:e,appRoot:n,options:i});return}if(!r.hasInteractiveTerminal()){e.error("`eve link` needs an interactive terminal to pick the team and project. In CI, run `vercel link --project <name> --yes --non-interactive` instead."),process.exitCode=1;return}let a=r.createPrompter?.()??createPrompter();a.intro(`Link your eve agent to Vercel`);try{let e=await runLinkFlow({appRoot:n,prompter:a,projectSelection:`create-or-link`,deps:r.flowDeps});a.outro(e.kind===`cancelled`?`Cancelled.`:`Project linked.`)}catch(t){e.error(t instanceof Error?t.message:String(t)),process.exitCode=1}}export{runLinkCommand};
@@ -1 +1 @@
1
- import{applicationCommand}from"#cli/application-command.js";function registerProjectCommands(t){applicationCommand(t.program.command(`link`),t.applicationContext).description(`Link this directory to a Vercel project and pull AI Gateway credentials.`).action(async()=>{let{runLinkCommand:e}=await import(`./link.js`);await e(t.logger,t.applicationContext.root)}),applicationCommand(t.program.command(`deploy`),t.applicationContext).description(`Deploy the agent to Vercel production (links first if needed).`).action(async()=>{let{runDeployCommand:e}=await import(`./deploy.js`);await e(t.logger,t.applicationContext.root)})}export{registerProjectCommands};
1
+ import{applicationCommand}from"#cli/application-command.js";function registerProjectCommands(t){applicationCommand(t.program.command(`link`),t.applicationContext).description(`Link this directory to a Vercel project and pull AI Gateway credentials.`).option(`--non-interactive`,`Run without interactive prompts`).option(`--project <name-or-id>`,`Vercel project name or ID`).option(`--team <team-id-or-slug>`,`Vercel team ID or slug`).action(async e=>{let{runLinkCommand:n}=await import(`./link.js`);await n(t.logger,t.applicationContext.root,void 0,e)}),applicationCommand(t.program.command(`deploy`),t.applicationContext).description(`Deploy the agent to Vercel production (links first if needed).`).option(`--non-interactive`,`Run without interactive prompts`).option(`--project <name-or-id>`,`Vercel project name or ID`).option(`--team <team-id-or-slug>`,`Vercel team ID or slug`).option(`-y, --yes`,`Confirm a non-interactive production deployment`).action(async e=>{let{runDeployCommand:n}=await import(`./deploy.js`);await n(t.logger,t.applicationContext.root,void 0,e)})}export{registerProjectCommands};
@@ -0,0 +1,25 @@
1
+ import { runVercelEnvPull } from "#setup/run-vercel-link.js";
2
+ import { isEveProject } from "#setup/scaffold/index.js";
3
+ import { runVercel } from "#setup/primitives/index.js";
4
+ export interface VercelNonInteractiveLogger {
5
+ error(message: string): void;
6
+ log(message: string): void;
7
+ }
8
+ export interface VercelProjectCliOptions {
9
+ nonInteractive?: boolean;
10
+ project?: string;
11
+ team?: string;
12
+ }
13
+ export interface NonInteractiveLinkDependencies {
14
+ isEveProject: typeof isEveProject;
15
+ runVercel: typeof runVercel;
16
+ runVercelEnvPull: typeof runVercelEnvPull;
17
+ }
18
+ export declare function isNonInteractiveProjectCommand(options: VercelProjectCliOptions): boolean;
19
+ /** Links a named Vercel project and refreshes its local environment without a prompt. */
20
+ export declare function runNonInteractiveLink(input: {
21
+ logger: VercelNonInteractiveLogger;
22
+ appRoot: string;
23
+ options: VercelProjectCliOptions;
24
+ dependencies?: NonInteractiveLinkDependencies;
25
+ }): Promise<boolean>;
@@ -0,0 +1 @@
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{runVercelEnvPull}from"#setup/run-vercel-link.js";import{runVercel}from"#setup/primitives/index.js";const defaultDependencies={isEveProject,runVercel,runVercelEnvPull};function isNonInteractiveProjectCommand(e){return e.nonInteractive===!0}async function runNonInteractiveLink(t){let{appRoot:n,logger:r,options:i}=t,a=t.dependencies??defaultDependencies;if(!await a.isEveProject(n))return r.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1,!1;if(i.project===void 0)return r.error("`eve link --non-interactive` requires `--project <name-or-id>`."),process.exitCode=1,!1;let o=[`link`,`--project`,i.project,...i.team===void 0?[]:[`--team`,i.team],`--yes`];return await a.runVercel(o,{cwd:n,nonInteractive:!0})?await a.runVercelEnvPull(n,void 0,void 0,!0)?(r.log(`Project linked.`),!0):(r.error(`Vercel project linked, but pulling environment variables did not complete.`),process.exitCode=1,!1):(process.exitCode=1,!1)}export{isNonInteractiveProjectCommand,runNonInteractiveLink};
@@ -11,7 +11,7 @@ export type { EveAgentStoreCallbacks, EveAgentStoreInit, EveAgentStoreSnapshot,
11
11
  export type { AgentInfoEntry, AgentInfoChannelEntry, AgentInfoChannels, AgentInfoConnectionEntry, AgentInfoDynamicResolverEntry, AgentInfoFrameworkChannelEntry, AgentInfoFrameworkToolEntry, AgentInfoHookEntry, AgentInfoInstructions, AgentInfoInstructionsEntry, AgentInfoResult, AgentInfoSandboxEntry, AgentInfoScheduleEntry, AgentInfoSkillEntry, AgentInfoSource, AgentInfoSubagentEntry, AgentInfoToolEntry, AgentInfoTools, CancelSessionResult, ClearResult, CompactResult, ClientAuth, ClientOptions, ClientRedirectPolicy, HeadersValue, HealthResult, MessageResult, RespondTurnOptions, ResetResult, ResolvedStreamReconnectPolicy, SendTurnInput, SendTurnOptions, SessionSnapshot, ClientSessionState, StreamOptions, StreamReconnectPolicy, StreamReconnectRetryPolicy, TokenValue, } from "#client/types.js";
12
12
  export type { EveAgentReducer, EveAgentReducerEvent, ClientInputRespondedEvent, ClientMessageFailedEvent, ClientMessageSubmittedEvent, } from "#client/reducer.js";
13
13
  export type { EveAuthorizationChallenge, EveAuthorizationOutcome, EveAuthorizationPart, EveMessageData, EveDynamicToolPart, EveMessageInputRequest, EveMessage, EveMessageMetadata, EveMessagePart, EveMessageToolMetadata, } from "#client/message-reducer.js";
14
- export type { ActionPartialStreamEvent, ActionResultStreamEvent, ActionsRequestedStreamEvent, AssistantStepFinishReason, AuthorizationOutcome, CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, AuthorizationCompletedStreamEvent, ConnectionAuthorizationOutcome, AuthorizationRequiredStreamEvent, HandleMessageStreamEvent, MessageStreamEventMeta, InputRequestedStreamEvent, MessageAppendedStreamEvent, MessageCompletedStreamEvent, MessageReceivedPart, MessageReceivedStreamEvent, ReasoningAppendedStreamEvent, ReasoningCompletedStreamEvent, ResultCompletedStreamEvent, RuntimeTraceContext, SessionCompletedStreamEvent, SessionFailedStreamEvent, SessionStartedStreamEvent, SessionWaitingStreamEvent, MessageStreamEvent, StepCompletedStreamEvent, StepFailedStreamEvent, StepStartedStreamEvent, SubagentCalledStreamEvent, SubagentChildEventStreamEvent, SubagentCompletedStreamEvent, SubagentStartedStreamEvent, TurnCancelledStreamEvent, TurnCompletedStreamEvent, TurnFailedStreamEvent, TurnStartedStreamEvent, TurnFailureStreamEvent, } from "#protocol/message.js";
14
+ export type { ActionPartialStreamEvent, ActionResultStreamEvent, ActionsRequestedStreamEvent, AssistantStepFinishReason, AuthorizationOutcome, CompactionCompletedStreamEvent, CompactionRequestedStreamEvent, AuthorizationCompletedStreamEvent, ConnectionAuthorizationOutcome, AuthorizationRequiredStreamEvent, HandleMessageStreamEvent, MessageStreamEventMeta, InputResolution, InputResolutionOutcome, InputResolvedStreamEvent, InputRequestedStreamEvent, MessageAppendedStreamEvent, MessageCompletedStreamEvent, MessageReceivedPart, MessageReceivedStreamEvent, ReasoningAppendedStreamEvent, ReasoningCompletedStreamEvent, ResultCompletedStreamEvent, RuntimeTraceContext, SessionCompletedStreamEvent, SessionFailedStreamEvent, SessionStartedStreamEvent, SessionWaitingStreamEvent, MessageStreamEvent, StepCompletedStreamEvent, StepFailedStreamEvent, StepStartedStreamEvent, SubagentCalledStreamEvent, SubagentChildEventStreamEvent, SubagentCompletedStreamEvent, SubagentStartedStreamEvent, TurnCancelledStreamEvent, TurnCompletedStreamEvent, TurnFailedStreamEvent, TurnStartedStreamEvent, TurnFailureStreamEvent, } from "#protocol/message.js";
15
15
  export { isCurrentTurnBoundaryEvent, isTurnFailureEvent } from "#protocol/message.js";
16
16
  export type { InputOption, InputRequest, InputRequestKind, InputResponse, } from "#runtime/input/types.js";
17
17
  export { inputOptionSchema, inputRequestKindSchema, inputRequestSchema, inputResponseSchema, isInputRequest, isInputResponse, } from "#runtime/input/types.js";
@@ -1 +1 @@
1
- import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";import{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest}from"#client/message-action-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,c){switch(c.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of c.data.responses)t=respondToInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${c.data.turnId}:user`,metadata:{status:`complete`,turnId:c.data.turnId},parts:projectReceivedParts(c.data.parts,c.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,c.data.turnId,e=>ensureStepStartPart(e,c.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of c.data.actions){let n=normalizeActionRequest(e);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:c.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(n),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of c.data.requests){let n=normalizeActionRequest(e.action);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:c.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(n,{inputRequest:toMessageInputRequest(e)}),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`approval.candidate`:return e;case`approval.settled`:{let t=findToolPartByApprovalId(e,c.data.requestId);return t===void 0?e:c.data.outcome===`approved`?updateToolPart(e,t.toolCallId,{approval:{approved:!0,id:c.data.requestId,reason:void 0},input:t.input,state:`approval-responded`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`}):updateToolPart(e,t.toolCallId,{approval:{approved:!1,id:c.data.requestId,reason:`Tool execution was cancelled.`},input:t.input,state:`output-denied`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`})}case`action.result`:{let t=normalizeActionResult(c.data.result),a=findToolPart(e,c.data.result.callId),s=c.data.error?.code===`TOOL_EXECUTION_DENIED`,l=c.data.status===`failed`&&!s,u=a?.approval?.id??c.data.result.callId,d=mergeToolMetadata(a?.toolMetadata,createToolMetadata(t)),f={input:a?.input,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:d,toolName:a?.toolName??t.toolName,type:`dynamic-tool`},p;return p=s?{...f,approval:{approved:!1,id:u,reason:c.data.error?.message},state:`output-denied`}:l?{...f,approval:approvedApproval(a),errorText:c.data.error?.message??stringifyUnknown(c.data.result.output),state:`output-error`}:{...f,approval:approvedApproval(a),output:c.data.result.output,state:`output-available`},a===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),p)):updateToolPart(e,c.data.result.callId,p)}case`action.partial`:{let t=findToolPart(e,c.data.result.callId);if(t!==void 0&&isSettledToolPart(t))return e;let a=normalizeActionResult(c.data.result),o={approval:approvedApproval(t),input:t?.input,output:c.data.result.output,partial:!0,state:`output-available`,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:mergeToolMetadata(t?.toolMetadata,createToolMetadata(a)),toolName:t?.toolName??a.toolName,type:`dynamic-tool`};return t===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),o)):updateToolPart(e,c.data.result.callId,o)}case`authorization.required`:return updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),createAuthorizationRequiredPart(c)));case`authorization.completed`:return completeAuthorization(e,c);case`message.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,c.data.turnId,e=>c.data.message===null?removeTextPart(e,c.data.stepIndex):upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,c.data.turnId,{result:c.data.result});case`turn.completed`:return updateAssistantMetadata(e,c.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,c.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function upsertRun(e,t){let n=-1;for(let r=e.parts.length-1;r>=0;--r){let i=e.parts[r];if(i?.type===t.type&&i.stepIndex===t.stepIndex){n=r;break}}let r=n!==-1&&e.parts[n].state===`streaming`?[...e.parts.slice(0,n),t,...e.parts.slice(n+1)]:[...e.parts,t];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function isSettledToolPart(e){return e.state===`output-denied`||e.state===`output-error`||e.state===`output-available`&&e.partial!==!0}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}export{defaultMessageReducer};
1
+ import{createAuthorizationCompletedPart,createAuthorizationRequiredPart}from"#client/authorization-message-parts.js";import{approvedApproval,createToolMetadata,mergeToolMetadata,normalizeActionRequest,normalizeActionResult,stringifyUnknown,toMessageInputRequest}from"#client/message-action-parts.js";function defaultMessageReducer(){return{initial(){return{messages:[]}},reduce(e,t){return reduceMessageData(e,t)}}}function reduceMessageData(e,c){switch(c.type){case`client.message.submitted`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`submitted`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.message.failed`:return upsertMessage(e,{id:optimisticUserMessageId(c.data.submissionId),metadata:{optimistic:!0,status:`failed`},parts:[{type:`text`,text:c.data.message}],role:`user`});case`client.input.responded`:{let t=e;for(let e of c.data.responses)t=respondToInputRequest(t,e);return t}case`input.resolved`:{let t=e;for(let e of c.data.resolutions)t=resolveInputRequest(t,e);return t}case`message.received`:return upsertMessage(e,{id:`${c.data.turnId}:user`,metadata:{status:`complete`,turnId:c.data.turnId},parts:projectReceivedParts(c.data.parts,c.data.message),role:`user`});case`step.started`:return updateAssistantMessage(e,c.data.turnId,e=>ensureStepStartPart(e,c.data.stepIndex));case`reasoning.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.reasoningSoFar,type:`reasoning`}));case`reasoning.completed`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.reasoning,type:`reasoning`}));case`actions.requested`:{let t=e;for(let e of c.data.actions){let n=normalizeActionRequest(e);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{input:`input`in e?e.input:void 0,state:`input-available`,stepIndex:c.data.stepIndex,toolCallId:e.callId,toolMetadata:createToolMetadata(n),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`input.requested`:{let t=e;for(let e of c.data.requests){let n=normalizeActionRequest(e.action);t=updateAssistantMessage(t,c.data.turnId,t=>upsertPart(ensureStepStartPart(t,c.data.stepIndex),{approval:{id:e.requestId},input:e.action.input,state:`approval-requested`,stepIndex:c.data.stepIndex,toolCallId:e.action.callId,toolMetadata:createToolMetadata(n,{inputRequest:toMessageInputRequest(e)}),toolName:n.toolName,type:`dynamic-tool`}))}return t}case`approval.candidate`:return e;case`approval.settled`:{let t=findToolPartByApprovalId(e,c.data.requestId);return t===void 0?e:c.data.outcome===`approved`?updateToolPart(e,t.toolCallId,{approval:{approved:!0,id:c.data.requestId,reason:void 0},input:t.input,state:`approval-responded`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`}):updateToolPart(e,t.toolCallId,{approval:{approved:!1,id:c.data.requestId,reason:`Tool execution was cancelled.`},input:t.input,state:`output-denied`,stepIndex:t.stepIndex,toolCallId:t.toolCallId,toolMetadata:t.toolMetadata,toolName:t.toolName,type:`dynamic-tool`})}case`action.result`:{let t=normalizeActionResult(c.data.result),a=findToolPart(e,c.data.result.callId),s=c.data.error?.code===`TOOL_EXECUTION_DENIED`,l=c.data.status===`failed`&&!s,u=a?.approval?.id??c.data.result.callId,d=mergeToolMetadata(a?.toolMetadata,createToolMetadata(t)),f={input:a?.input,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:d,toolName:a?.toolName??t.toolName,type:`dynamic-tool`},p;return p=s?{...f,approval:{approved:!1,id:u,reason:c.data.error?.message},state:`output-denied`}:l?{...f,approval:approvedApproval(a),errorText:c.data.error?.message??stringifyUnknown(c.data.result.output),state:`output-error`}:{...f,approval:approvedApproval(a),output:c.data.result.output,state:`output-available`},a===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),p)):updateToolPart(e,c.data.result.callId,p)}case`action.partial`:{let t=findToolPart(e,c.data.result.callId);if(t!==void 0&&isSettledToolPart(t))return e;let a=normalizeActionResult(c.data.result),o={approval:approvedApproval(t),input:t?.input,output:c.data.result.output,partial:!0,state:`output-available`,stepIndex:c.data.stepIndex,toolCallId:c.data.result.callId,toolMetadata:mergeToolMetadata(t?.toolMetadata,createToolMetadata(a)),toolName:t?.toolName??a.toolName,type:`dynamic-tool`};return t===void 0?updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),o)):updateToolPart(e,c.data.result.callId,o)}case`authorization.required`:return updateAssistantMessage(e,c.data.turnId,e=>upsertPart(ensureStepStartPart(e,c.data.stepIndex),createAuthorizationRequiredPart(c)));case`authorization.completed`:return completeAuthorization(e,c);case`message.appended`:return updateAssistantMessage(e,c.data.turnId,e=>upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`streaming`,stepIndex:c.data.stepIndex,text:c.data.messageSoFar,type:`text`}));case`message.completed`:return updateAssistantMessage(e,c.data.turnId,e=>c.data.message===null?removeTextPart(e,c.data.stepIndex):upsertRun(ensureStepStartPart(e,c.data.stepIndex),{state:`done`,stepIndex:c.data.stepIndex,text:c.data.message,type:`text`}));case`result.completed`:return updateAssistantMetadata(e,c.data.turnId,{result:c.data.result});case`turn.completed`:return updateAssistantMetadata(e,c.data.turnId,{status:`complete`});case`turn.cancelled`:return updateAssistantMessage(e,c.data.turnId,e=>({...e,metadata:{...e.metadata,status:`complete`},parts:e.parts.map(e=>(e.type===`text`||e.type===`reasoning`)&&e.state===`streaming`?{...e,state:`done`}:e)}));case`turn.failed`:case`session.failed`:return e;default:return e}}function respondToInputRequest(e,t){let n=findToolPartByApprovalId(e,t.requestId);if(!n)return e;let r={id:t.requestId};return t.text!==void 0&&(r.reason=t.text),updateToolPart(e,n.toolCallId,{approval:r,input:n.input,state:`approval-responded`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:mergeToolMetadata(n.toolMetadata,{eve:{inputResponse:t,kind:n.toolMetadata?.eve?.kind??`unknown`,name:n.toolMetadata?.eve?.name??n.toolName}}),toolName:n.toolName,type:`dynamic-tool`})}function resolveInputRequest(e,t){if(t.response!==void 0)return respondToInputRequest(e,t.response);let n=findToolPartByApprovalId(e,t.requestId);return n?updateToolPart(e,n.toolCallId,{input:n.input,output:{status:t.outcome},state:`output-available`,stepIndex:n.stepIndex,toolCallId:n.toolCallId,toolMetadata:n.toolMetadata,toolName:n.toolName,type:`dynamic-tool`}):e}function updateAssistantMessage(e,t,n){return upsertMessage(e,n(e.messages.find(e=>e.role===`assistant`&&e.metadata?.turnId===t)??createAssistantMessage(t)))}function updateAssistantMetadata(e,t,n){return updateAssistantMessage(e,t,e=>({...e,metadata:{...e.metadata,...n}}))}function createAssistantMessage(e){return{id:`${e}:assistant`,metadata:{status:`streaming`,turnId:e},parts:[],role:`assistant`}}function ensureStepStartPart(e,t){let n=e.parts.filter(e=>e.type===`step-start`).length;if(n>t)return e;let r=t-n+1;return{...e,parts:[...e.parts,...Array.from({length:r},()=>({type:`step-start`}))]}}function upsertPart(e,t){let n=e.parts.findIndex(e=>partKey(e)===partKey(t)),r=n===-1?[...e.parts,t]:[...e.parts.slice(0,n),t,...e.parts.slice(n+1)];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function upsertRun(e,t){let n=-1;for(let r=e.parts.length-1;r>=0;--r){let i=e.parts[r];if(i?.type===t.type&&i.stepIndex===t.stepIndex){n=r;break}}let r=n!==-1&&e.parts[n].state===`streaming`?[...e.parts.slice(0,n),t,...e.parts.slice(n+1)]:[...e.parts,t];return{...e,metadata:{...e.metadata,status:t.type===`text`&&t.state===`done`?`complete`:`streaming`},parts:r}}function removeTextPart(e,t){let n=e.parts.filter(e=>e.type!==`text`||e.stepIndex!==t);return n.length===e.parts.length?e:{...e,metadata:{...e.metadata,status:`complete`},parts:n}}function updateToolPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e.type===`dynamic-tool`&&e.toolCallId===t));return r?upsertMessage(e,upsertPart(r,n)):e}function completeAuthorization(t,n){let r=findLatestPendingAuthorizationPart(t,n.data.name),i=createAuthorizationCompletedPart(n,r);return r===void 0?updateAssistantMessage(t,n.data.turnId,e=>upsertPart(ensureStepStartPart(e,n.data.stepIndex),i)):updateAuthorizationPart(t,r,i)}function updateAuthorizationPart(e,t,n){let r=e.messages.find(e=>e.role===`assistant`&&e.parts.some(e=>e===t));return r?upsertMessage(e,upsertPart(r,n)):e}function findToolPart(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.toolCallId===t)return e}function isSettledToolPart(e){return e.state===`output-denied`||e.state===`output-error`||e.state===`output-available`&&e.partial!==!0}function findLatestPendingAuthorizationPart(e,t){for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n];if(r?.role===`assistant`)for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(n?.type===`authorization`&&n.state===`required`&&n.name===t)return n}}}function findToolPartByApprovalId(e,t){for(let n of e.messages)for(let e of n.parts)if(e.type===`dynamic-tool`&&e.approval?.id===t)return e}function projectReceivedParts(e,t){return e?.map(e=>e.type===`text`?{state:`done`,text:e.text,type:`text`}:{filename:e.filename,mediaType:e.mediaType,size:e.size,type:`file`,url:e.url})??[{state:`done`,text:t,type:`text`}]}function partKey(e){switch(e.type){case`text`:return`text:${e.stepIndex??0}`;case`reasoning`:return`reasoning:${e.stepIndex??0}`;case`file`:return`file:${e.stepIndex??0}:${e.filename??e.url??e.mediaType}`;case`step-start`:return`step-start`;case`authorization`:return`authorization:${e.turnId}:${e.stepIndex}:${e.name}`;case`dynamic-tool`:return`dynamic-tool:${e.toolCallId}`}}function upsertMessage(e,t){let n=e.messages.findIndex(e=>e.id===t.id);return n===-1?{messages:[...e.messages,t]}:{messages:[...e.messages.slice(0,n),t,...e.messages.slice(n+1)]}}function optimisticUserMessageId(e){return`optimistic:${e}:user`}export{defaultMessageReducer};
@@ -16,23 +16,23 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
16
16
  readonly dropped: {};
17
17
  };
18
18
  readonly dynamicTool: {
19
- readonly current: 17;
20
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17];
19
+ readonly current: 18;
20
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
21
21
  readonly dropped: {};
22
22
  };
23
23
  readonly channel: {
24
- readonly current: 1;
25
- readonly supported: readonly [1];
24
+ readonly current: 3;
25
+ readonly supported: readonly [1, 2, 3];
26
26
  readonly dropped: {};
27
27
  };
28
28
  readonly schedule: {
29
- readonly current: 1;
30
- readonly supported: readonly [1];
29
+ readonly current: 2;
30
+ readonly supported: readonly [1, 2];
31
31
  readonly dropped: {};
32
32
  };
33
33
  readonly subagent: {
34
- readonly current: 1;
35
- readonly supported: readonly [1];
34
+ readonly current: 2;
35
+ readonly supported: readonly [1, 2];
36
36
  readonly dropped: {};
37
37
  };
38
38
  readonly connection: {
@@ -41,8 +41,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
41
41
  readonly dropped: {};
42
42
  };
43
43
  readonly hook: {
44
- readonly current: 13;
45
- readonly supported: readonly [10, 11, 12, 13];
44
+ readonly current: 14;
45
+ readonly supported: readonly [10, 11, 12, 13, 14];
46
46
  readonly dropped: {
47
47
  readonly 1: "Model identity moved from session.started runtime metadata to step.started call attribution.";
48
48
  readonly 2: "Model identity moved from session.started runtime metadata to step.started call attribution.";
@@ -61,8 +61,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
61
61
  readonly dropped: {};
62
62
  };
63
63
  readonly dynamicSkill: {
64
- readonly current: 11;
65
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
64
+ readonly current: 12;
65
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
66
66
  readonly dropped: {};
67
67
  };
68
68
  readonly instructions: {
@@ -71,8 +71,8 @@ declare const EXTENSION_CAPABILITY_CONTRACTS: {
71
71
  readonly dropped: {};
72
72
  };
73
73
  readonly dynamicInstructions: {
74
- readonly current: 12;
75
- readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
74
+ readonly current: 13;
75
+ readonly supported: readonly [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
76
76
  readonly dropped: {};
77
77
  };
78
78
  readonly config: {
@@ -1 +1 @@
1
- import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:13,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13],dropped:{}},dynamicTool:{current:17,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],dropped:{}},channel:{current:1,supported:[1],dropped:{}},schedule:{current:1,supported:[1],dropped:{}},subagent:{current:1,supported:[1],dropped:{}},connection:{current:5,supported:[1,2,3,4,5],dropped:{}},hook:{current:13,supported:[10,11,12,13],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:11,supported:[1,2,3,4,5,6,7,8,9,10,11],dropped:{}},instructions:{current:2,supported:[1,2],dropped:{}},dynamicInstructions:{current:12,supported:[1,2,3,4,5,6,7,8,9,10,11,12],dropped:{}},config:{current:1,supported:[1],dropped:{}},state:{current:3,supported:[1,2,3],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestSchema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict();function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(t){return parseExtensionCompatibilityManifest(await readFile(t,`utf8`),t)}async function writeExtensionCompatibilityManifest(e,n){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(n),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};
1
+ import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=1,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:13,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13],dropped:{}},dynamicTool:{current:18,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],dropped:{}},channel:{current:3,supported:[1,2,3],dropped:{}},schedule:{current:2,supported:[1,2],dropped:{}},subagent:{current:2,supported:[1,2],dropped:{}},connection:{current:5,supported:[1,2,3,4,5],dropped:{}},hook:{current:14,supported:[10,11,12,13,14],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:12,supported:[1,2,3,4,5,6,7,8,9,10,11,12],dropped:{}},instructions:{current:2,supported:[1,2],dropped:{}},dynamicInstructions:{current:13,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13],dropped:{}},config:{current:1,supported:[1],dropped:{}},state:{current:3,supported:[1,2,3],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestSchema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict();function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(t){return parseExtensionCompatibilityManifest(await readFile(t,`utf8`),t)}async function writeExtensionCompatibilityManifest(e,n){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(n),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};
@@ -1 +1 @@
1
- import{isAbsolute,join,relative,resolve}from"node:path";import{normalizeLogicalPath}from"#discover/filesystem.js";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{toErrorMessage}from"#shared/errors.js";import{serializeOutputSchema}from"#shared/tool-schema.js";import{classifyModelRouting}from"#internal/classify-model-routing.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{isChatGptModelRouting}from"#shared/chatgpt-model.js";import{parseJsonObject}from"#shared/json.js";import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";async function compileAgentConfig(e,t,n={}){let r=e.configModule,i=r===void 0?void 0:formatAgentConfigModulePath(e,r),o=normalizeAgentDefinition(Object.hasOwn(n,`definition`)?n.definition:r===void 0?{model:DEFAULT_AGENT_MODEL_ID}:await loadModuleBackedDefinition({agentRoot:e.agentRoot,displayPath:i,kind:`agent config`,source:r}),r===void 0?`Expected the default agent config to match the public eve shape.`:`Expected the agent config export "${r.exportName??`default`}" from "${i}" to match the public eve shape.`),s=isDynamicModelDefinition(o.model)?o.model:void 0,c=s===void 0?await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,contextWindowTokens:o.modelContextWindowTokens,providerOptions:o.modelOptions?.providerOptions,source:r,sourcePath:i,value:o.model}):void 0,l={},u={compaction:l,name:e.agentId};o.description!==void 0&&(u.description=o.description);let d;if(s!==void 0){if(r===void 0)throw Error(`Expected dynamic model definitions to be authored in agent.ts.`);d={eventNames:Object.keys(s.events),exportName:r.exportName,sourceKind:`module`,logicalPath:r.logicalPath,sourceId:r.sourceId}}let f=normalizeExperimentalDefinition(o.experimental);if(f!==void 0&&(u.experimental=f),o.build!==void 0&&(u.build={externalDependencies:o.build.externalDependencies===void 0?void 0:[...o.build.externalDependencies]}),o.outputSchema!==void 0&&(u.outputSchema=serializeOutputSchema(o.outputSchema)),o.reasoning!==void 0&&(u.reasoning=o.reasoning),o.limits!==void 0&&(u.limits={maxInputTokensPerSession:o.limits.maxInputTokensPerSession,maxOutputTokensPerSession:o.limits.maxOutputTokensPerSession,sessionTimeoutMs:o.limits.sessionTimeoutMs}),r!==void 0&&(u.source={exportName:r.exportName,sourceKind:`module`,logicalPath:r.logicalPath,sourceId:r.sourceId}),o.compaction?.model!==void 0&&(l.model=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,contextWindowTokens:o.compaction.modelContextWindowTokens,providerOptions:o.modelOptions?.providerOptions,source:r,sourcePath:i,value:o.compaction.model})),o.compaction?.thresholdPercent!==void 0&&(l.thresholdPercent=o.compaction.thresholdPercent),d!==void 0)return{...u,dynamicModel:d};if(c===void 0)throw Error(`Expected a static agent model to compile to a concrete model reference.`);return{...u,model:c}}function normalizeExperimentalDefinition(e){if(e===void 0)return;let t={};return e.instrumentationProviders!==void 0&&(t.instrumentationProviders=e.instrumentationProviders),e.subagentPersistentSessions!==void 0&&(t.subagentPersistentSessions=e.subagentPersistentSessions),e.tasks!==void 0&&(t.tasks=e.tasks),e.workflow!==void 0&&(t.workflow={world:e.workflow.world}),t}async function normalizeAuthoredModelReference(e){if(typeof e.value==`string`)return await withCompiledRuntimeModelLimits({id:formatLanguageModelGatewayId(e.value),providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(e.value,e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${e.sourcePath??t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:formatLanguageModelGatewayId(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(n,e.providerOptions)};if(e.contextWindowTokens===void 0){if(isChatGptModelRouting(i.routing))return{...i,contextWindowTokens:2e5};try{let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens,maxOutputTokens:t.limits.maxOutputTokens}}catch{}}return await withCompiledRuntimeModelLimits(i,e)}function formatAgentConfigModulePath(e,r){let a=join(e.agentRoot,r.logicalPath);return normalizeLogicalPath(relative(resolveTopLevelAgentRoot(e),a))}function resolveTopLevelAgentRoot(e){let t=resolve(e.appRoot),n=resolve(t,`agent`);return isPathInsideOrEqual(n,resolve(e.agentRoot))?n:t}function isPathInsideOrEqual(t,r){let i=relative(t,r);return i===``||!i.startsWith(`..`)&&!isAbsolute(i)}async function withCompiledRuntimeModelLimits(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${toErrorMessage(n)}`)}if(n===null)throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`);return{...e,contextWindowTokens:n.contextWindowTokens,maxOutputTokens:n.maxOutputTokens}}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{compileAgentConfig};
1
+ import{isAbsolute,join,relative,resolve}from"node:path";import{DEFAULT_AGENT_MODEL_ID}from"#shared/default-agent-model.js";import{normalizeLogicalPath}from"#discover/filesystem.js";import{toErrorMessage}from"#shared/errors.js";import{serializeOutputSchema}from"#shared/tool-schema.js";import{classifyModelRouting}from"#internal/classify-model-routing.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{isChatGptModelRouting}from"#shared/chatgpt-model.js";import{parseJsonObject}from"#shared/json.js";import{isDynamicModelDefinition}from"#shared/agent-definition.js";import{loadModuleBackedDefinition}from"#compiler/normalize-helpers.js";async function compileAgentConfig(e,t,n={}){let r=e.configModule,a=r===void 0?void 0:formatAgentConfigModulePath(e,r),o=normalizeAgentDefinition(Object.hasOwn(n,`definition`)?n.definition:r===void 0?{model:DEFAULT_AGENT_MODEL_ID}:await loadModuleBackedDefinition({agentRoot:e.agentRoot,displayPath:a,kind:`agent config`,source:r}),r===void 0?`Expected the default agent config to match the public eve shape.`:`Expected the agent config export "${r.exportName??`default`}" from "${a}" to match the public eve shape.`),s=isDynamicModelDefinition(o.model)?o.model:void 0,c=s===void 0?await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the primary compaction trigger model`,contextWindowTokens:o.modelContextWindowTokens,providerOptions:o.modelOptions?.providerOptions,source:r,sourcePath:a,value:o.model}):void 0,l={},u={compaction:l,name:e.agentId};o.description!==void 0&&(u.description=o.description);let d;if(s!==void 0){if(r===void 0)throw Error(`Expected dynamic model definitions to be authored in agent.ts.`);d={eventNames:Object.keys(s.events),exportName:r.exportName,sourceKind:`module`,logicalPath:r.logicalPath,sourceId:r.sourceId}}let f=normalizeExperimentalDefinition(o.experimental);if(f!==void 0&&(u.experimental=f),o.build!==void 0&&(u.build={externalDependencies:o.build.externalDependencies===void 0?void 0:[...o.build.externalDependencies]}),o.outputSchema!==void 0&&(u.outputSchema=serializeOutputSchema(o.outputSchema)),o.reasoning!==void 0&&(u.reasoning=o.reasoning),o.limits!==void 0&&(u.limits={maxInputTokensPerSession:o.limits.maxInputTokensPerSession,maxOutputTokensPerSession:o.limits.maxOutputTokensPerSession,sessionTimeoutMs:o.limits.sessionTimeoutMs}),r!==void 0&&(u.source={exportName:r.exportName,sourceKind:`module`,logicalPath:r.logicalPath,sourceId:r.sourceId}),o.compaction?.model!==void 0&&(l.model=await normalizeAuthoredModelReference({modelCatalog:t.modelCatalog,purpose:`the compaction summary model`,contextWindowTokens:o.compaction.modelContextWindowTokens,providerOptions:o.modelOptions?.providerOptions,source:r,sourcePath:a,value:o.compaction.model})),o.compaction?.thresholdPercent!==void 0&&(l.thresholdPercent=o.compaction.thresholdPercent),d!==void 0)return{...u,dynamicModel:d};if(c===void 0)throw Error(`Expected a static agent model to compile to a concrete model reference.`);return{...u,model:c}}function normalizeExperimentalDefinition(e){if(e===void 0)return;let t={};return e.instrumentationProviders!==void 0&&(t.instrumentationProviders=e.instrumentationProviders),e.subagentPersistentSessions!==void 0&&(t.subagentPersistentSessions=e.subagentPersistentSessions),e.tasks!==void 0&&(t.tasks=e.tasks),e.workflow!==void 0&&(t.workflow={world:e.workflow.world}),t}async function normalizeAuthoredModelReference(e){if(typeof e.value==`string`)return await withCompiledRuntimeModelLimits({id:formatLanguageModelGatewayId(e.value),providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(e.value,e.providerOptions)},e);let t=e.source;if(t===void 0)throw Error(`Expected ${e.purpose} to provide a valid AI SDK language model reference.`);let n=e.value,r=n.specificationVersion;if(r!==`v2`&&r!==`v3`&&r!==`v4`||typeof n.provider!=`string`||typeof n.modelId!=`string`||typeof n.doGenerate!=`function`||typeof n.doStream!=`function`)throw Error(`Expected the authored agent config export "${t.exportName??`default`}" from "${e.sourcePath??t.logicalPath}" to provide a valid AI SDK language model.`);let i={id:formatLanguageModelGatewayId(n),source:{exportName:t.exportName,sourceKind:`module`,logicalPath:t.logicalPath,sourceId:t.sourceId},providerOptions:parseProviderOptionsRecord(e.providerOptions),routing:classifyModelRouting(n,e.providerOptions)};if(e.contextWindowTokens===void 0){if(isChatGptModelRouting(i.routing))return{...i,contextWindowTokens:2e5};try{let t=await e.modelCatalog.getByProviderModelId(n.provider,n.modelId);if(t)return{...i,id:t.slug,contextWindowTokens:t.limits.contextWindowTokens,maxOutputTokens:t.limits.maxOutputTokens}}catch{}}return await withCompiledRuntimeModelLimits(i,e)}function formatAgentConfigModulePath(e,r){let i=join(e.agentRoot,r.logicalPath);return normalizeLogicalPath(relative(resolveTopLevelAgentRoot(e),i))}function resolveTopLevelAgentRoot(e){let t=resolve(e.appRoot),n=resolve(t,`agent`);return isPathInsideOrEqual(n,resolve(e.agentRoot))?n:t}function isPathInsideOrEqual(t,r){let i=relative(t,r);return i===``||!i.startsWith(`..`)&&!isAbsolute(i)}async function withCompiledRuntimeModelLimits(e,t){if(t.contextWindowTokens!==void 0)return{...e,contextWindowTokens:t.contextWindowTokens};let n;try{n=await t.modelCatalog.getModelLimits(e.id)}catch(n){throw Error(`Failed to load AI Gateway model metadata for ${t.purpose} "${e.id}". ${toErrorMessage(n)}`)}if(n===null)throw Error(`Cannot compile agent compaction because ${t.purpose} "${e.id}" does not have known AI Gateway context window metadata.`);return{...e,contextWindowTokens:n.contextWindowTokens,maxOutputTokens:n.maxOutputTokens}}function parseProviderOptionsRecord(e){if(e===void 0)return;let t={};for(let[n,r]of Object.entries(e))t[n]=parseJsonObject(r);return t}export{compileAgentConfig};
@@ -46,6 +46,8 @@ export declare const SessionIdKey: ContextKey<string>;
46
46
  export declare const ContinuationTokenKey: ContextKey<string>;
47
47
  export declare const ChannelRequestIdKey: ContextKey<string>;
48
48
  export declare const ChannelDeliveryKey: ContextKey<ChannelDeliveryMetadata>;
49
+ /** Whether the active turn began from a task-addressed durable delivery. */
50
+ export declare const TurnTaskDeliveryKey: ContextKey<boolean>;
49
51
  export interface ActiveChannelDelivery {
50
52
  readonly agentName?: string;
51
53
  readonly delivery: InstrumentationChannelDeliveryRef;
@@ -1 +1 @@
1
- import{ContextKey}from"#context/key.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),ActiveChannelDeliveriesKey=new ContextKey(`eve.activeChannelDeliveries`),ChannelInstrumentationKey=new ContextKey(`eve.channelInstrumentation`),ModeKey=new ContextKey(`eve.mode`),ParentSessionKey=new ContextKey(`eve.parentSession`),ParentTraceContextKey=new ContextKey(`eve.parentTraceContext`),SubagentDepthKey=new ContextKey(`eve.subagentDepth`),CapabilitiesKey=new ContextKey(`eve.capabilities`),SessionCallbackKey=new ContextKey(`eve.sessionCallback`),SessionKey=new ContextKey(`eve.session`),SandboxKey=new ContextKey(`eve.sandbox`),SessionDynamicModelReferenceKey=new ContextKey(`eve.sessionDynamicModelReference`),TurnDynamicModelReferenceKey=new ContextKey(`eve.turnDynamicModelReference`),RuntimeModelMetadataCacheKey=new ContextKey(`eve.runtimeModelMetadataCache`),LiveStepDynamicModelSelectionKey=new ContextKey(`eve.liveStepDynamicModelSelection`),SessionDynamicToolMetadataKey=new ContextKey(`eve.sessionDynamicToolMetadata`),SessionDynamicToolRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicToolRuntimeRevision`),TurnDynamicToolMetadataKey=new ContextKey(`eve.turnDynamicToolMetadata`),LiveStepToolsKey=new ContextKey(`eve.liveStepTools`),SessionDynamicSubagentSelectionsKey=new ContextKey(`eve.sessionDynamicSubagentSelections`),TurnDynamicSubagentSelectionsKey=new ContextKey(`eve.turnDynamicSubagentSelections`),SessionDynamicSubagentRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicSubagentRuntimeRevision`),DynamicSubagentAgentConfigKey=new ContextKey(`eve.dynamicSubagentAgentConfig`),DynamicSkillManifestKey=new ContextKey(`eve.dynamicSkillManifest`),SessionDynamicInstructionsKey=new ContextKey(`eve.sessionDynamicInstructions`),TurnDynamicInstructionsKey=new ContextKey(`eve.turnDynamicInstructions`),DynamicInstructionResolveMessagesKey=new ContextKey(`eve.dynamicInstructionResolveMessages`),PendingDynamicInstructionUserMessagesKey=new ContextKey(`eve.pendingDynamicInstructionUserMessages`);export{ActiveChannelDeliveriesKey,AuthKey,CapabilitiesKey,ChannelDeliveryKey,ChannelInstrumentationKey,ChannelRequestIdKey,ContinuationTokenKey,DynamicInstructionResolveMessagesKey,DynamicSkillManifestKey,DynamicSubagentAgentConfigKey,InitiatorAuthKey,LiveStepDynamicModelSelectionKey,LiveStepToolsKey,ModeKey,ParentSessionKey,ParentTraceContextKey,PendingDynamicInstructionUserMessagesKey,RuntimeModelMetadataCacheKey,SandboxKey,SessionCallbackKey,SessionDynamicInstructionsKey,SessionDynamicModelReferenceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicSubagentSelectionsKey,SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,SessionKey,SubagentDepthKey,TurnDynamicInstructionsKey,TurnDynamicModelReferenceKey,TurnDynamicSubagentSelectionsKey,TurnDynamicToolMetadataKey};
1
+ import{ContextKey}from"#context/key.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),TurnTaskDeliveryKey=new ContextKey(`eve.turnTaskDelivery`),ActiveChannelDeliveriesKey=new ContextKey(`eve.activeChannelDeliveries`),ChannelInstrumentationKey=new ContextKey(`eve.channelInstrumentation`),ModeKey=new ContextKey(`eve.mode`),ParentSessionKey=new ContextKey(`eve.parentSession`),ParentTraceContextKey=new ContextKey(`eve.parentTraceContext`),SubagentDepthKey=new ContextKey(`eve.subagentDepth`),CapabilitiesKey=new ContextKey(`eve.capabilities`),SessionCallbackKey=new ContextKey(`eve.sessionCallback`),SessionKey=new ContextKey(`eve.session`),SandboxKey=new ContextKey(`eve.sandbox`),SessionDynamicModelReferenceKey=new ContextKey(`eve.sessionDynamicModelReference`),TurnDynamicModelReferenceKey=new ContextKey(`eve.turnDynamicModelReference`),RuntimeModelMetadataCacheKey=new ContextKey(`eve.runtimeModelMetadataCache`),LiveStepDynamicModelSelectionKey=new ContextKey(`eve.liveStepDynamicModelSelection`),SessionDynamicToolMetadataKey=new ContextKey(`eve.sessionDynamicToolMetadata`),SessionDynamicToolRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicToolRuntimeRevision`),TurnDynamicToolMetadataKey=new ContextKey(`eve.turnDynamicToolMetadata`),LiveStepToolsKey=new ContextKey(`eve.liveStepTools`),SessionDynamicSubagentSelectionsKey=new ContextKey(`eve.sessionDynamicSubagentSelections`),TurnDynamicSubagentSelectionsKey=new ContextKey(`eve.turnDynamicSubagentSelections`),SessionDynamicSubagentRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicSubagentRuntimeRevision`),DynamicSubagentAgentConfigKey=new ContextKey(`eve.dynamicSubagentAgentConfig`),DynamicSkillManifestKey=new ContextKey(`eve.dynamicSkillManifest`),SessionDynamicInstructionsKey=new ContextKey(`eve.sessionDynamicInstructions`),TurnDynamicInstructionsKey=new ContextKey(`eve.turnDynamicInstructions`),DynamicInstructionResolveMessagesKey=new ContextKey(`eve.dynamicInstructionResolveMessages`),PendingDynamicInstructionUserMessagesKey=new ContextKey(`eve.pendingDynamicInstructionUserMessages`);export{ActiveChannelDeliveriesKey,AuthKey,CapabilitiesKey,ChannelDeliveryKey,ChannelInstrumentationKey,ChannelRequestIdKey,ContinuationTokenKey,DynamicInstructionResolveMessagesKey,DynamicSkillManifestKey,DynamicSubagentAgentConfigKey,InitiatorAuthKey,LiveStepDynamicModelSelectionKey,LiveStepToolsKey,ModeKey,ParentSessionKey,ParentTraceContextKey,PendingDynamicInstructionUserMessagesKey,RuntimeModelMetadataCacheKey,SandboxKey,SessionCallbackKey,SessionDynamicInstructionsKey,SessionDynamicModelReferenceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicSubagentSelectionsKey,SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,SessionKey,SubagentDepthKey,TurnDynamicInstructionsKey,TurnDynamicModelReferenceKey,TurnDynamicSubagentSelectionsKey,TurnDynamicToolMetadataKey,TurnTaskDeliveryKey};
@@ -30,11 +30,11 @@ export interface MockModelToolResult {
30
30
  export interface MockModelRequest {
31
31
  /** Every prompt message in order, with text content extracted. */
32
32
  readonly messages: readonly MockModelMessage[];
33
- /** All user-message text in order. */
33
+ /** Authored user-message text in order, excluding framework scaffolding. */
34
34
  readonly userMessages: readonly string[];
35
- /** The latest user-message text, or `null` before the first user message. */
35
+ /** The latest authored user-message text, or `null` before the first user message. */
36
36
  readonly lastUserMessage: string | null;
37
- /** Number of user messages in the prompt. */
37
+ /** Number of authored user messages in the prompt. */
38
38
  readonly userMessageCount: number;
39
39
  /** Tools available for this model call. */
40
40
  readonly tools: readonly MockModelTool[];