eve 0.13.5 → 0.13.6

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 (107) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/src/channel/send.d.ts +3 -1
  3. package/dist/src/channel/send.js +1 -1
  4. package/dist/src/channel/types.d.ts +6 -0
  5. package/dist/src/chunks/{use-eve-agent-_dbX0ASK.js → use-eve-agent-8X2UMr8q.js} +26 -2
  6. package/dist/src/chunks/{use-eve-agent-BjAM8_a3.js → use-eve-agent-9ZNiSFMb.js} +26 -2
  7. package/dist/src/cli/dev/tui/blocks.d.ts +1 -1
  8. package/dist/src/cli/dev/tui/blocks.js +1 -1
  9. package/dist/src/cli/dev/tui/prompt-command-handler.d.ts +5 -1
  10. package/dist/src/cli/dev/tui/prompt-command-handler.js +1 -1
  11. package/dist/src/cli/dev/tui/prompt-commands.d.ts +7 -7
  12. package/dist/src/cli/dev/tui/prompt-commands.js +2 -2
  13. package/dist/src/cli/dev/tui/remote-auth-command.d.ts +11 -0
  14. package/dist/src/cli/dev/tui/remote-auth-command.js +3 -0
  15. package/dist/src/cli/dev/tui/remote-auth-result.d.ts +5 -0
  16. package/dist/src/cli/dev/tui/remote-auth-result.js +2 -1
  17. package/dist/src/cli/dev/tui/remote-auth.d.ts +30 -0
  18. package/dist/src/cli/dev/tui/remote-auth.js +1 -0
  19. package/dist/src/cli/dev/tui/remote-connection-probe.d.ts +3 -1
  20. package/dist/src/cli/dev/tui/remote-connection-probe.js +1 -1
  21. package/dist/src/cli/dev/tui/remote-connection-types.d.ts +2 -1
  22. package/dist/src/cli/dev/tui/remote-connection.js +1 -1
  23. package/dist/src/cli/dev/tui/runner.d.ts +18 -1
  24. package/dist/src/cli/dev/tui/runner.js +1 -1
  25. package/dist/src/cli/dev/tui/setup-commands.d.ts +4 -4
  26. package/dist/src/cli/dev/tui/setup-commands.js +2 -2
  27. package/dist/src/cli/dev/tui/setup-issues.d.ts +1 -1
  28. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  29. package/dist/src/cli/dev/tui/status-line.d.ts +6 -14
  30. package/dist/src/cli/dev/tui/status-line.js +1 -1
  31. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +8 -1
  32. package/dist/src/cli/dev/tui/terminal-renderer.js +9 -9
  33. package/dist/src/cli/dev/tui/test/index.d.ts +1 -0
  34. package/dist/src/cli/dev/tui/test/index.js +1 -1
  35. package/dist/src/cli/dev/tui/tui.d.ts +1 -1
  36. package/dist/src/cli/dev/tui/tui.js +1 -1
  37. package/dist/src/cli/dev/tui/vercel-trusted-sources.js +1 -1
  38. package/dist/src/cli/run.js +1 -1
  39. package/dist/src/client/agent-info-error.d.ts +17 -0
  40. package/dist/src/client/agent-info-error.js +1 -0
  41. package/dist/src/client/client.d.ts +4 -0
  42. package/dist/src/client/client.js +1 -1
  43. package/dist/src/client/index.d.ts +1 -0
  44. package/dist/src/client/index.js +1 -1
  45. package/dist/src/client/ndjson.js +3 -3
  46. package/dist/src/context/keys.d.ts +1 -0
  47. package/dist/src/context/keys.js +1 -1
  48. package/dist/src/evals/cli/eval-client.js +1 -1
  49. package/dist/src/execution/delegated-parent-notification.js +1 -1
  50. package/dist/src/execution/durable-session-store.js +1 -1
  51. package/dist/src/execution/eve-workflow-attributes.d.ts +8 -0
  52. package/dist/src/execution/eve-workflow-attributes.js +1 -1
  53. package/dist/src/execution/ndjson-stream.d.ts +19 -0
  54. package/dist/src/execution/ndjson-stream.js +3 -0
  55. package/dist/src/execution/runtime-context.js +1 -1
  56. package/dist/src/execution/subagent-adapter.js +1 -1
  57. package/dist/src/execution/turn-workflow.js +1 -1
  58. package/dist/src/execution/workflow-entry.js +1 -1
  59. package/dist/src/execution/workflow-runtime.d.ts +1 -1
  60. package/dist/src/execution/workflow-runtime.js +1 -3
  61. package/dist/src/execution/workflow-steps.js +1 -1
  62. package/dist/src/internal/application/package.js +1 -1
  63. package/dist/src/internal/nitro/host/configure-nitro-routes.js +1 -1
  64. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  65. package/dist/src/internal/workflow/configure-world.js +1 -1
  66. package/dist/src/internal/workflow/queue-namespace.d.ts +0 -1
  67. package/dist/src/internal/workflow/queue-namespace.js +1 -1
  68. package/dist/src/internal/workflow/runtime.d.ts +4 -0
  69. package/dist/src/internal/workflow/runtime.js +1 -0
  70. package/dist/src/internal/workflow-bundle/builder-support.js +6 -6
  71. package/dist/src/internal/workflow-bundle/builder.js +2 -2
  72. package/dist/src/internal/workflow-bundle/vercel-workflow-output.js +1 -1
  73. package/dist/src/public/channels/github/dispatch.d.ts +22 -1
  74. package/dist/src/public/channels/github/dispatch.js +1 -1
  75. package/dist/src/public/channels/github/githubChannel.d.ts +21 -3
  76. package/dist/src/public/channels/github/githubChannel.js +1 -1
  77. package/dist/src/public/channels/github/inbound.d.ts +46 -1
  78. package/dist/src/public/channels/github/inbound.js +2 -2
  79. package/dist/src/public/channels/github/index.d.ts +1 -1
  80. package/dist/src/public/channels/github/state.d.ts +3 -1
  81. package/dist/src/public/channels/github/state.js +1 -1
  82. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  83. package/dist/src/runtime/connections/callback-route.js +1 -1
  84. package/dist/src/runtime/session-callback-route.js +1 -1
  85. package/dist/src/services/dev-client/request-headers.d.ts +2 -0
  86. package/dist/src/services/dev-client/request-headers.js +1 -1
  87. package/dist/src/services/dev-client/vercel-auth-error.d.ts +12 -14
  88. package/dist/src/services/dev-client/vercel-auth-error.js +9 -2
  89. package/dist/src/setup/flows/install-vercel-cli.d.ts +1 -1
  90. package/dist/src/setup/flows/login.d.ts +3 -1
  91. package/dist/src/setup/flows/login.js +1 -1
  92. package/dist/src/setup/scaffold/create/project.js +1 -1
  93. package/dist/src/setup/vercel-deployment.d.ts +12 -5
  94. package/dist/src/setup/vercel-deployment.js +1 -1
  95. package/dist/src/setup/vercel-project-api.d.ts +13 -2
  96. package/dist/src/setup/vercel-project-api.js +1 -1
  97. package/dist/src/setup/vercel-project.d.ts +5 -1
  98. package/dist/src/setup/vercel-project.js +0 -0
  99. package/dist/src/setup/verified-remote-client.js +1 -1
  100. package/dist/src/svelte/index.js +1 -1
  101. package/dist/src/svelte/use-eve-agent.js +1 -1
  102. package/dist/src/vue/index.js +1 -1
  103. package/dist/src/vue/use-eve-agent.js +1 -1
  104. package/docs/channels/github.mdx +13 -1
  105. package/docs/channels/slack.mdx +1 -1
  106. package/docs/guides/dev-tui.md +22 -12
  107. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_AI_PACKAGE_VERSION=`7.0.0-beta.178`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.2.2`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.13.5`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{basename,join,resolve}from"node:path";import{mkdir,readdir,stat}from"node:fs/promises";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,ALLOWED_CREATE_IN_PLACE_ENTRIES=new Set([`.DS_Store`,`.git`,`.gitkeep`,`.hg`]),DEFAULT_AI_PACKAGE_VERSION=`7.0.0-beta.178`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.2.2`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.13.6`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
2
2
 
3
3
  export default defineAgent({
4
4
  model: "__EVE_INIT_MODEL__",
@@ -1,5 +1,5 @@
1
1
  import { captureVercel, type VercelCaptureFailure } from "#setup/primitives/index.js";
2
- import { readProjectLink, type VercelProjectReference } from "#setup/project-resolution.js";
2
+ import type { VercelProjectReference } from "#setup/project-resolution.js";
3
3
  declare const verifiedVercelTargetBrand: unique symbol;
4
4
  export interface ResolvedVercelDeployment {
5
5
  readonly provider: "vercel";
@@ -27,7 +27,7 @@ export type VercelDeploymentResolution = {
27
27
  } | {
28
28
  readonly kind: "not-found";
29
29
  } | {
30
- readonly kind: "unscoped";
30
+ readonly kind: "forbidden";
31
31
  } | {
32
32
  readonly kind: "project-mismatch";
33
33
  readonly expectedProjectId: string;
@@ -40,14 +40,21 @@ export type VercelDeploymentResolution = {
40
40
  };
41
41
  export interface VercelDeploymentResolutionDeps {
42
42
  readonly captureVercel: typeof captureVercel;
43
- readonly readProjectLink: typeof readProjectLink;
44
43
  }
44
+ type VercelDeploymentLookupScope = {
45
+ /** An explicit Vercel scope selected for this lookup. */
46
+ readonly scope?: string;
47
+ readonly source?: never;
48
+ } | {
49
+ /** A known project source, which also cross-checks the returned project id. */
50
+ readonly scope?: never;
51
+ readonly source: Pick<VercelProjectReference, "orgId" | "projectId">;
52
+ };
45
53
  /** Resolves a Vercel deployment URL to its project and target environment. */
46
54
  export declare function resolveVercelDeployment(input: {
47
55
  readonly workspaceRoot: string;
48
56
  readonly host: string;
49
- readonly source?: Pick<VercelProjectReference, "orgId" | "projectId">;
50
57
  readonly signal?: AbortSignal;
51
58
  readonly deps?: Partial<VercelDeploymentResolutionDeps>;
52
- }): Promise<VercelDeploymentResolution>;
59
+ } & VercelDeploymentLookupScope): Promise<VercelDeploymentResolution>;
53
60
  export {};
@@ -1 +1 @@
1
- import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{isNotFoundApiFailure,normalizeVercelApiResult}from"./vercel-api-failure.js";import{projectReferenceFromEnvironment,readProjectLink}from"#setup/project-resolution.js";import{captureVercel}from"#setup/primitives/index.js";const VercelDeploymentSchema=object({projectId:string().min(1),name:string().min(1),target:string().nullable().optional(),customEnvironment:object({slug:string().min(1)}).nullable().optional()}),verifiedVercelTargetBrand=Symbol(`VerifiedVercelTarget`),defaultDeps={captureVercel,readProjectLink};function environmentForDeployment(e){return e.customEnvironment!==null&&e.customEnvironment!==void 0?e.customEnvironment.slug:e.target===`production`?`production`:`preview`}async function resolveVercelDeployment(e){let t={...defaultDeps,...e.deps},n=e.source??projectReferenceFromEnvironment(process.env)??await t.readProjectLink(e.workspaceRoot);if(n===void 0)return{kind:`unscoped`};let r=normalizeVercelApiResult(await t.captureVercel([`api`,`/v13/deployments/${encodeURIComponent(e.host)}`,`--scope`,n.orgId,`--raw`],{cwd:e.workspaceRoot,nonInteractive:!0,signal:e.signal,timeoutMs:1e4}));if(!r.ok)return e.signal?.aborted===!0||r.failure.errno===`ABORT_ERR`?{kind:`cancelled`}:isNotFoundApiFailure(r.failure)?{kind:`not-found`}:{kind:`failed`,failure:{cause:`vercel`,failure:r.failure}};let i;try{i=JSON.parse(r.stdout)}catch{return{kind:`failed`,failure:{cause:`invalid-json`,message:`Vercel returned invalid deployment JSON.`}}}let a=VercelDeploymentSchema.safeParse(i);if(!a.success)return{kind:`failed`,failure:{cause:`invalid-shape`,message:`Vercel returned an invalid deployment response.`}};if(a.data.projectId!==n.projectId)return{kind:`project-mismatch`,expectedProjectId:n.projectId,actualProjectId:a.data.projectId};let o=`https://${new URL(`https://${e.host}`).host}`;return{kind:`resolved`,target:{[verifiedVercelTargetBrand]:!0,origin:o,deployment:{provider:`vercel`,ownerId:n.orgId,projectId:a.data.projectId,projectName:a.data.name,environment:environmentForDeployment(a.data)}}}}export{resolveVercelDeployment};
1
+ import{object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{isForbiddenApiFailure,isNotFoundApiFailure,normalizeVercelApiResult}from"./vercel-api-failure.js";import{captureVercel}from"#setup/primitives/index.js";const VercelDeploymentSchema=object({ownerId:string().min(1),projectId:string().min(1),name:string().min(1),target:string().nullable().optional(),customEnvironment:object({slug:string().min(1)}).nullable().optional()}),verifiedVercelTargetBrand=Symbol(`VerifiedVercelTarget`),defaultDeps={captureVercel};function environmentForDeployment(e){return e.customEnvironment!==null&&e.customEnvironment!==void 0?e.customEnvironment.slug:e.target===`production`?`production`:`preview`}async function resolveVercelDeployment(e){let t={...defaultDeps,...e.deps},n=e.source,r=e.scope??n?.orgId,i=normalizeVercelApiResult(await t.captureVercel([`api`,`/v13/deployments/${encodeURIComponent(e.host)}`,...r===void 0?[]:[`--scope`,r],`--raw`],{cwd:e.workspaceRoot,nonInteractive:!0,signal:e.signal,timeoutMs:1e4}));if(!i.ok)return e.signal?.aborted===!0||i.failure.errno===`ABORT_ERR`?{kind:`cancelled`}:isNotFoundApiFailure(i.failure)?{kind:`not-found`}:isForbiddenApiFailure(i.failure)?{kind:`forbidden`}:{kind:`failed`,failure:{cause:`vercel`,failure:i.failure}};let a;try{a=JSON.parse(i.stdout)}catch{return{kind:`failed`,failure:{cause:`invalid-json`,message:`Vercel returned invalid deployment JSON.`}}}let o=VercelDeploymentSchema.safeParse(a);if(!o.success)return{kind:`failed`,failure:{cause:`invalid-shape`,message:`Vercel returned an invalid deployment response.`}};if(n!==void 0&&o.data.projectId!==n.projectId)return{kind:`project-mismatch`,expectedProjectId:n.projectId,actualProjectId:o.data.projectId};let s=`https://${new URL(`https://${e.host}`).host}`;return{kind:`resolved`,target:{[verifiedVercelTargetBrand]:!0,origin:s,deployment:{provider:`vercel`,ownerId:o.data.ownerId,projectId:o.data.projectId,projectName:o.data.name,environment:environmentForDeployment(o.data)}}}}export{resolveVercelDeployment};
@@ -2,6 +2,8 @@ import { type VercelCaptureFailure } from "#setup/primitives/index.js";
2
2
  import { z } from "zod";
3
3
  import type { VercelProjectOperationOptions } from "./project-resolution.js";
4
4
  export type { VercelProjectOperationOptions };
5
+ /** Shared deadline for Vercel project list and exact-lookup requests. */
6
+ export declare const VERCEL_PROJECT_REQUEST_TIMEOUT_MS = 15000;
5
7
  declare const VercelTeamListEntrySchema: z.ZodObject<{
6
8
  name: z.ZodString;
7
9
  slug: z.ZodString;
@@ -13,6 +15,11 @@ declare const VercelProjectListEntrySchema: z.ZodObject<{
13
15
  id: z.ZodString;
14
16
  }, z.core.$strip>;
15
17
  export type VercelProjectListEntry = z.infer<typeof VercelProjectListEntrySchema>;
18
+ /** One ranked Vercel project search page and its optional continuation cursor. */
19
+ export interface VercelProjectSearchPage {
20
+ readonly projects: VercelProjectListEntry[];
21
+ readonly next?: number;
22
+ }
16
23
  /** Parses one JSON response captured from the Vercel CLI. */
17
24
  export declare function parseVercelJson(stdout: string, description: string): unknown;
18
25
  /** Converts a scoped API denial into the Vercel re-authentication action. */
@@ -21,5 +28,9 @@ export declare function requireVercelTeamAccess(failure: VercelCaptureFailure):
21
28
  export declare function listTeams(projectRoot: string, options?: VercelProjectOperationOptions): Promise<VercelTeamListEntry[]>;
22
29
  /** Lists the 20 most recent Vercel projects in one account scope. */
23
30
  export declare function listRecentProjects(projectRoot: string, team: string, options?: VercelProjectOperationOptions): Promise<VercelProjectListEntry[]>;
24
- /** Searches every matching Vercel project page in one account scope. */
25
- export declare function searchProjects(projectRoot: string, team: string, query: string, options?: VercelProjectOperationOptions): Promise<VercelProjectListEntry[]>;
31
+ /** Ranks exact and prefix project-name matches ahead of substring matches. */
32
+ export declare function rankProjectSearchResults(projects: readonly VercelProjectListEntry[], query: string): VercelProjectListEntry[];
33
+ /** Searches one ranked Vercel project page and retains its continuation cursor. */
34
+ export declare function searchProjects(projectRoot: string, team: string, query: string, options?: VercelProjectOperationOptions & {
35
+ readonly next?: number;
36
+ }): Promise<VercelProjectSearchPage>;
@@ -1 +1 @@
1
- import{array,boolean,number,object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{isForbiddenApiFailure}from"./vercel-api-failure.js";import{captureVercel}from"#setup/primitives/index.js";import{HumanActionRequiredError}from"#setup/human-action.js";const VercelTeamListEntrySchema=object({name:string(),slug:string(),current:boolean()}),VercelProjectListEntrySchema=object({name:string(),id:string()}),VercelPaginationSchema=object({next:number().int().nonnegative().nullable().optional()}),VercelTeamPageSchema=object({teams:array(VercelTeamListEntrySchema),pagination:VercelPaginationSchema.optional()}).transform(e=>({items:e.teams,next:e.pagination?.next??void 0})),VercelProjectPageSchema=object({projects:array(VercelProjectListEntrySchema),pagination:VercelPaginationSchema.optional()}).transform(e=>({items:e.projects,next:e.pagination?.next??void 0}));function parseVercelJson(e,t){try{return JSON.parse(e)}catch{throw Error(`Could not parse ${t} JSON from Vercel CLI output.`)}}async function drainPages(e,t,n){let r=new Map,i=new Set,a;for(;;){let o=await n(a);for(let e of o.items)r.set(t(e),e);if(o.next===void 0)return[...r.values()];if(i.has(o.next))throw Error(`Vercel returned a repeated pagination cursor for ${e}.`);i.add(o.next),a=o.next}}function requireVercelTeamAccess(e){let t=e.stderr.trim();throw new HumanActionRequiredError({kind:`vercel-forbidden`,command:`vercel login`,reason:`Vercel denied access to this scope.${t?` ${t}`:``} Re-authenticate (for example to complete a team's SSO) or switch to a team you can access.`})}async function fetchTeamPage(e,t,n){let r=[`teams`,`ls`,`--format`,`json`];n!==void 0&&r.push(`--next`,String(n));let i=await captureVercel(r,{cwd:e,signal:t.signal});if(t.signal?.throwIfAborted(),!i.ok)throw isForbiddenApiFailure(i.failure)&&requireVercelTeamAccess(i.failure),Error(`Could not list Vercel teams. ${i.failure.message}`);let s=VercelTeamPageSchema.safeParse(parseVercelJson(i.stdout,`teams`));if(!s.success)throw Error(`Could not read teams from Vercel CLI JSON output.`);return s.data}async function listTeams(e,t={}){return drainPages(`Vercel teams`,e=>e.slug,n=>fetchTeamPage(e,t,n))}async function fetchProjectPage(e,t,n){let r=[`project`,`ls`,`--format`,`json`,`--scope`,t];n.search!==void 0&&r.push(`--filter`,n.search),n.next!==void 0&&r.push(`--next`,String(n.next));let i=await captureVercel(r,{cwd:e,signal:n.signal,timeoutMs:15e3});if(n.signal?.throwIfAborted(),!i.ok)throw isForbiddenApiFailure(i.failure)&&requireVercelTeamAccess(i.failure),Error(`Could not list Vercel projects in ${t}. ${i.failure.message}`);let s=VercelProjectPageSchema.safeParse(parseVercelJson(i.stdout,`projects`));if(!s.success)throw Error(`Could not read projects from Vercel CLI JSON output.`);return s.data}async function listRecentProjects(e,t,n={}){return(await fetchProjectPage(e,t,n)).items}async function searchProjects(e,t,n,r={}){let i=n.trim();if(i.length===0)throw Error(`Project search query cannot be empty.`);return drainPages(`project search in ${t}`,e=>e.id,n=>fetchProjectPage(e,t,{...r,search:i,next:n}))}export{listRecentProjects,listTeams,parseVercelJson,requireVercelTeamAccess,searchProjects};
1
+ import{array,boolean,number,object,string}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{isForbiddenApiFailure}from"./vercel-api-failure.js";import{captureVercel}from"#setup/primitives/index.js";import{HumanActionRequiredError}from"#setup/human-action.js";const VERCEL_PROJECT_REQUEST_TIMEOUT_MS=15e3,VercelTeamListEntrySchema=object({name:string(),slug:string(),current:boolean()}),VercelProjectListEntrySchema=object({name:string(),id:string()}),VercelPaginationSchema=object({next:number().int().nonnegative().nullable().optional()}),VercelTeamPageSchema=object({teams:array(VercelTeamListEntrySchema),pagination:VercelPaginationSchema.optional()}).transform(e=>({items:e.teams,next:e.pagination?.next??void 0})),VercelProjectPageSchema=object({projects:array(VercelProjectListEntrySchema),pagination:VercelPaginationSchema.optional()}).transform(e=>({items:e.projects,next:e.pagination?.next??void 0}));function parseVercelJson(e,t){try{return JSON.parse(e)}catch{throw Error(`Could not parse ${t} JSON from Vercel CLI output.`)}}async function drainPages(e,t,n){let r=new Map,i=new Set,a;for(;;){let o=await n(a);for(let e of o.items)r.set(t(e),e);if(o.next===void 0)return[...r.values()];if(i.has(o.next))throw Error(`Vercel returned a repeated pagination cursor for ${e}.`);i.add(o.next),a=o.next}}function requireVercelTeamAccess(e){let t=e.stderr.trim();throw new HumanActionRequiredError({kind:`vercel-forbidden`,command:`vercel login`,reason:`Vercel denied access to this scope.${t?` ${t}`:``} Re-authenticate (for example to complete a team's SSO) or switch to a team you can access.`})}async function fetchTeamPage(e,t,n){let r=[`teams`,`ls`,`--format`,`json`];n!==void 0&&r.push(`--next`,String(n));let i=await captureVercel(r,{cwd:e,signal:t.signal});if(t.signal?.throwIfAborted(),!i.ok)throw isForbiddenApiFailure(i.failure)&&requireVercelTeamAccess(i.failure),Error(`Could not list Vercel teams. ${i.failure.message}`);let s=VercelTeamPageSchema.safeParse(parseVercelJson(i.stdout,`teams`));if(!s.success)throw Error(`Could not read teams from Vercel CLI JSON output.`);return s.data}async function listTeams(e,t={}){return drainPages(`Vercel teams`,e=>e.slug,n=>fetchTeamPage(e,t,n))}async function fetchProjectPage(e,t,n){let r=[`project`,`ls`,`--format`,`json`,`--scope`,t];n.search!==void 0&&r.push(`--filter`,n.search),n.next!==void 0&&r.push(`--next`,String(n.next));let i=await captureVercel(r,{cwd:e,signal:n.signal,timeoutMs:VERCEL_PROJECT_REQUEST_TIMEOUT_MS});if(n.signal?.throwIfAborted(),!i.ok)throw isForbiddenApiFailure(i.failure)&&requireVercelTeamAccess(i.failure),Error(`Could not list Vercel projects in ${t}. ${i.failure.message}`);let s=VercelProjectPageSchema.safeParse(parseVercelJson(i.stdout,`projects`));if(!s.success)throw Error(`Could not read projects from Vercel CLI JSON output.`);return s.data}async function listRecentProjects(e,t,n={}){return(await fetchProjectPage(e,t,n)).items}function projectSearchRank(e,t){let n=e.name.toLowerCase(),r=t.toLowerCase();return n===r?0:n.startsWith(r)?1:2}function rankProjectSearchResults(e,t){let n=t.trim();return[...e].sort((e,t)=>projectSearchRank(e,n)-projectSearchRank(t,n))}async function searchProjects(e,t,n,r={}){let i=n.trim();if(i.length===0)throw Error(`Project search query cannot be empty.`);let a=await fetchProjectPage(e,t,{...r,search:i}),o=rankProjectSearchResults(a.items,i);return a.next===void 0?{projects:o}:{projects:o,next:a.next}}export{VERCEL_PROJECT_REQUEST_TIMEOUT_MS,listRecentProjects,listTeams,parseVercelJson,rankProjectSearchResults,requireVercelTeamAccess,searchProjects};
@@ -8,6 +8,10 @@ export interface PickProjectOptions extends VercelProjectOperationOptions {
8
8
  /** Whether an empty project list may fall back to entering a name to create. */
9
9
  allowCreateWhenEmpty?: boolean;
10
10
  }
11
+ export interface PickTeamOptions extends VercelProjectOperationOptions {
12
+ /** Builds the team selector heading from the current team's display name. */
13
+ selectMessage?: (currentTeam: string) => string;
14
+ }
11
15
  export declare function unresolvedProject(): ProjectResolution;
12
16
  /** Resolves the linked project id from a resolution, if any. */
13
17
  export declare function projectIdFromResolution(project: ProjectResolution): string | undefined;
@@ -74,7 +78,7 @@ export declare function validateTeam(prompter: Prompter, projectRoot: string, te
74
78
  * zero or one team the current scope is used without prompting; otherwise the
75
79
  * user filters and chooses from the list with a single-selection picker.
76
80
  */
77
- export declare function pickTeam(prompter: Prompter, projectRoot: string, presetTeam: string | undefined, options?: VercelProjectOperationOptions): Promise<string>;
81
+ export declare function pickTeam(prompter: Prompter, projectRoot: string, presetTeam: string | undefined, options?: PickTeamOptions): Promise<string>;
78
82
  /** Picks an existing project under a team, or a name to create when none exist. */
79
83
  export declare function pickProject(prompter: Prompter, projectRoot: string, team: string, options?: PickProjectOptions): Promise<ResolvedVercelProjectSpec>;
80
84
  /** Returns a project name for a new Vercel project, prompting when the default exists. */
Binary file
@@ -1 +1 @@
1
- import{resolveVercelDeployment}from"./vercel-deployment.js";import{resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";import{resolveDevelopmentOidcToken}from"#services/dev-client/request-headers.js";const defaultDeps={resolveVercelDeployment,resolveDevelopmentOidcToken};async function resolveVerifiedRemoteDevelopmentClient(e){let n={...defaultDeps,...e.deps},r=createDevelopmentCredentialGate(e.serverUrl),i=await n.resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:new URL(e.serverUrl).host});if(i.kind===`resolved`){let{ownerId:e,projectId:t}=i.target.deployment;r.authorize({target:i.target,resolveToken:()=>n.resolveDevelopmentOidcToken({ownerId:e,projectId:t})})}return{options:resolveRemoteDevelopmentClientOptions({serverUrl:e.serverUrl,credentials:r}),lastOidcTokenFailure:r.lastTokenFailure}}export{resolveVerifiedRemoteDevelopmentClient};
1
+ import{resolveVercelDeployment}from"./vercel-deployment.js";import{resolveDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";const defaultDeps={resolveVercelDeployment,resolveDevelopmentOidcToken};async function resolveVerifiedRemoteDevelopmentClient(e){let t={...defaultDeps,...e.deps},r=createDevelopmentCredentialGate(e.serverUrl),i=await t.resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:new URL(e.serverUrl).host});if(i.kind===`resolved`){let{ownerId:e,projectId:n}=i.target.deployment;r.authorize({target:i.target,resolveToken:()=>t.resolveDevelopmentOidcToken({ownerId:e,projectId:n})})}return{options:resolveRemoteDevelopmentClientOptions({serverUrl:e.serverUrl,credentials:r}),lastOidcTokenFailure:r.lastTokenFailure}}export{resolveVerifiedRemoteDevelopmentClient};
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-_dbX0ASK.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-8X2UMr8q.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-_dbX0ASK.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-8X2UMr8q.js";
2
2
 
3
3
  export { useEveAgent };
@@ -1,3 +1,3 @@
1
- import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-BjAM8_a3.js";
1
+ import { n as defaultMessageReducer, t as useEveAgent } from "../chunks/use-eve-agent-9ZNiSFMb.js";
2
2
 
3
3
  export { defaultMessageReducer, useEveAgent };
@@ -1,3 +1,3 @@
1
- import { t as useEveAgent } from "../chunks/use-eve-agent-BjAM8_a3.js";
1
+ import { t as useEveAgent } from "../chunks/use-eve-agent-9ZNiSFMb.js";
2
2
 
3
3
  export { useEveAgent };
@@ -32,7 +32,7 @@ GITHUB_APP_SLUG=... # supplies botName when it is not set in config
32
32
 
33
33
  `appId`/`privateKey`/`webhookSecret` also take a lazy resolver function if you'd rather fetch them on demand.
34
34
 
35
- Point the GitHub App webhook URL at `https://<deployment>/eve/v1/github`. For mention-driven turns, subscribe to `issue_comment` and `pull_request_review_comment`; add `issues` / `pull_request` if you wire up their opt-in hooks. A comment that `@mention`s `botName` starts a turn.
35
+ Point the GitHub App webhook URL at `https://<deployment>/eve/v1/github`. For mention-driven turns, subscribe to `issue_comment` and `pull_request_review_comment`; add `issues`, `pull_request`, `check_suite`, `check_run`, or `workflow_run` if you wire up their opt-in hooks. A comment that `@mention`s `botName` starts a turn.
36
36
 
37
37
  ## How the channel handles messages
38
38
 
@@ -50,9 +50,21 @@ export default githubChannel({
50
50
  // Opt in; no default dispatch on these events.
51
51
  onIssue: (ctx, issue) => (issue.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null),
52
52
  onPullRequest: (ctx, pr) => (pr.action === "opened" ? { auth: defaultGitHubAuth(ctx) } : null),
53
+ onCheckSuite: (ctx, suite) =>
54
+ suite.action === "completed" &&
55
+ suite.conclusion === "failure" &&
56
+ suite.app.slug === "github-actions" &&
57
+ suite.pullRequests.length > 0
58
+ ? {
59
+ auth: defaultGitHubAuth(ctx),
60
+ context: [`Triage failed check suite ${suite.checkSuiteId} at ${suite.headSha}.`],
61
+ }
62
+ : null,
53
63
  });
54
64
  ```
55
65
 
66
+ The CI hooks expose normalized `action`, `status`, `conclusion`, `app.slug`, `headSha`, and `pullRequests` fields, plus `checkSuiteId`, `checkRunId`, or `workflowRunId`. `workflow_run` is a GitHub Actions-only event, so its normalized `app.slug` is `"github-actions"`. A dispatched CI turn is anchored to the first number in `pullRequests`; the hook still runs when the array is empty, but it must return `null` because there is no issue or PR thread for the session.
67
+
56
68
  ### Delivery
57
69
 
58
70
  When a turn starts, the channel adds an `eyes` reaction to the triggering comment (turn this off with `progress: { reactions: false }`). The reply comes back as a comment, on the timeline or in the review thread, and splits across multiple comments when it runs long. If the turn fails, you get a short error comment carrying an error id.
@@ -80,7 +80,7 @@ export default slackChannel({
80
80
 
81
81
  The default handlers reply in-thread and show progress. Typing indicators post automatically: `Thinking…` on inbound, `Working…` on `turn.started`, a truncated reasoning snippet on `reasoning.appended`, and tool status on `actions.requested`. Reasoning snippets build progressively: extensions of at least four characters appear immediately, while smaller streamed deltas use the five-second refresh interval to avoid one Slack request per token. Override `events["reasoning.appended"]` if you prefer generic wording. Override `onAppMention` or the `events` handlers to customize.
82
82
 
83
- When a session starts without a `threadTs` (say, from a schedule or `receive(slack, ...)`), it anchors on the first agent post, and later posts and mentions resume that same session. Pass `initialMessage` with a `Card` to land a structured anchor first instead. `threadTs` and `initialMessage` are mutually exclusive.
83
+ When a session starts without a `threadTs` (say, from a schedule or `receive(slack, ...)`), eve gives it a unique temporary continuation token. The first agent post anchors the session to the Slack message timestamp, and later posts and mentions resume that same session. Pass `initialMessage` with a `Card` to land a structured anchor first instead. `threadTs` and `initialMessage` are mutually exclusive.
84
84
 
85
85
  The example below overrides `onAppMention` to gate on an authored message and posts the completed reply to the thread. Event handlers receive `(eventData, channel, ctx)`, with Slack platform handles on `channel.thread` and `channel.slack`:
86
86
 
@@ -24,23 +24,25 @@ The conversation streams straight into your terminal's normal scrollback, so you
24
24
 
25
25
  Each turn renders without boxes. A colored gutter glyph marks who is speaking, tool calls collapse to a one-line summary (`✓ get_weather city="SF" → 73°F`), and a subagent's work is indented beneath its `◆` header. When input is ready, the prompt stays bare until you type. A green circle-dot pulses while the agent is waiting to answer and disappears when reasoning or answer content begins.
26
26
 
27
- A persistent line beneath the prompt or status shows the model, the session's token flow (`↑ 394.4K ↓ 4.3K`), the linked Vercel project and team (`▲ my-agent (acme)`), and a yellow `/deploy pending` marker once a channel added this session still needs `/deploy`. The Vercel segment stays hidden until the directory is linked.
27
+ A persistent line beneath the prompt or status shows the model, the session's token flow (`↑ 394.4K ↓ 4.3K`), the linked Vercel project, and a yellow `/deploy pending` marker once a channel added this session still needs `/deploy`. The Vercel segment stays hidden until the directory is linked. Remote sessions lead with a padded `↗ project (environment)` badge, or the host when Vercel cannot resolve the deployment. The badge is gray while checking or unavailable, yellow while authentication is required or failed, and blue when connected. Remote status lines omit AI Gateway endpoint state.
28
28
 
29
29
  Errors render compactly with docs links highlighted. A code bug escaping your agent's own code shows its stack trace dim beneath the error headline. Dev-server rebuilds condense into one status row that updates in place (`tui/setup-panel.ts changed · rebuilding…`, then `· rebuilt`); only the latest rebuild shows, and paths shrink to their last two components.
30
30
 
31
31
  ## Slash commands
32
32
 
33
- Each command echoes as an invocation line, asks through a bordered panel that takes the input area's place (one question at a time, separate from the chat transcript), and finishes with a one-line `⎿` result. Loading states stay on the ephemeral status line instead of piling into the transcript; model and channel setup use the same green square pulse as the build phase. Setup menus render the selected option with a filled arrow and an inverse label padded by one space on each side. Text prompts use a blinking block cursor over the character at the caret. The selected label is blue normally and yellow for warning rows.
33
+ Each command echoes as an invocation line, asks through a bordered panel that takes the input area's place (one question at a time, separate from the chat transcript), and finishes with a one-line `⎿` result. Loading states stay on the ephemeral status line instead of piling into the transcript; model, channel, and the Vercel CLI commands (`/vc:install`, `/vc:login`) use the same green square pulse as the build phase, while `/deploy` keeps a spinner. Setup menus render the selected option with a filled arrow and an inverse label padded by one space on each side. Text prompts use a blinking block cursor over the character at the caret. The selected label is blue normally and yellow for warning rows.
34
34
 
35
- | Command | Does |
36
- | ----------- | --------------------------------------------------------------------------------------------------------------------------------- |
37
- | `/model` | Opens a configure menu that loops until Done (or Esc). See [Configure the model and provider](#configure-the-model-and-provider). |
38
- | `/channels` | Shows the agent's channel list and adds the one you pick. See [Add a channel](#add-a-channel). |
39
- | `/deploy` | Ships the agent to Vercel production, linking the directory first when it is unlinked. |
40
- | `/loglevel` | Switches which logs the transcript shows. See [Control what logs show](#control-what-logs-show). |
41
- | `/new` | Starts a fresh session. |
42
- | `/exit` | Quits the TUI. |
43
- | `/help` | Lists every command. |
35
+ | Command | Does |
36
+ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
37
+ | `/model` | Opens a configure menu that loops until Done (or Esc). See [Configure the model and provider](#configure-the-model-and-provider). |
38
+ | `/channels` | Shows the agent's channel list and adds the one you pick. See [Add a channel](#add-a-channel). |
39
+ | `/deploy` | Ships the agent to Vercel production, linking the directory first when it is unlinked. |
40
+ | `/vc:install` | Installs the Vercel CLI. Available locally and on a remote session. |
41
+ | `/vc:login` | Logs in to Vercel locally. On a remote session, resolves the deployment's project, refreshes its OIDC token, and confirms any required Trusted Sources rule. |
42
+ | `/loglevel` | Switches which logs the transcript shows. See [Control what logs show](#control-what-logs-show). |
43
+ | `/new` | Starts a fresh session. |
44
+ | `/exit` | Quits the TUI. |
45
+ | `/help` | Lists the commands available for the current local or remote session. |
44
46
 
45
47
  `/model`, `/channels`, and `/deploy` manage the project and are available only when `eve dev` runs the server locally, not when connected to a remote server with `--url`.
46
48
 
@@ -119,7 +121,15 @@ Pass a URL and the TUI talks to a running deployment instead of starting a local
119
121
  eve dev https://<your-app>
120
122
  ```
121
123
 
122
- The bare URL is shorthand for `--url`; `--host`, `--port`, and `--no-ui` cannot be combined with a remote target. Eve gets the expected Vercel owner and project from `VERCEL_ORG_ID` and `VERCEL_PROJECT_ID` when both are set, or from the current directory's Vercel link otherwise. It verifies the exact deployment origin before attaching a freshly resolved project-scoped OIDC token or `VERCEL_AUTOMATION_BYPASS_SECRET`. Unverified URLs remain anonymous, and credential-bearing requests do not follow redirects. See [Deployment](./deployment) for the smoke-test flow.
124
+ The bare URL is shorthand for `--url`; it cannot be combined with `--host`, `--port`, or `--no-ui`.
125
+
126
+ At startup the TUI asks Vercel to resolve the remote origin under the active scope. A resolved response is the authority for a project-scoped OIDC token—refreshing an expired development token when refresh credentials exist—or an automation-bypass secret. An unresolved host is probed anonymously. The TUI then requests `/eve/v1/info`, with a ten-second timeout. A successful response marks the remote ready. An eve OIDC challenge, Vercel Deployment Protection challenge, or `TRUSTED_SOURCES_ENVIRONMENT_MISMATCH` opens `/vc:login` automatically; ordinary network failures and server errors remain remote-availability errors and do not start an authentication flow. Esc or Ctrl-C cancels the authentication flow.
127
+
128
+ In a remote session, `/vc:login` first resolves the deployment's Vercel project from its URL. If the active Vercel scope cannot resolve it, the flow asks for another team and reruns the lookup in that team's scope. If the CLI is logged out, the same panel runs the browser login first. The flow asks before adding any required Trusted Sources rule and requests a project-scoped token through `@vercel/oidc`. It does not relink the directory or modify `.env.local`. Finally, it retries `/eve/v1/info` to prove the credential works. A failure reports any login or Trusted Sources update that completed before it stopped.
129
+
130
+ The project-scoped token represents the resolved project's Development environment. Vercel already allows a project's Development environment to call its own Preview deployments by default. For a Production or custom-environment target, `/vc:login` shows the exact Development-to-target rule before changing that project's Trusted Sources. Eve preserves existing entries. When it creates an explicit rule, it also carries Vercel's default self-access rows forward because saved rules replace those defaults. See Vercel's [Trusted Sources guide](https://vercel.com/docs/deployment-protection/methods-to-bypass-deployment-protection/trusted-sources), [error reference](https://vercel.com/docs/errors/trusted_sources_environment_mismatch), and [OIDC token anatomy](https://vercel.com/docs/oidc/reference#oidc-token-anatomy).
131
+
132
+ `VERCEL_AUTOMATION_BYPASS_SECRET` remains available for a Protection Bypass for Automation token. See [Deployment](./deployment) for the smoke-test flow.
123
133
 
124
134
  ## What to read next
125
135
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.13.5",
3
+ "version": "0.13.6",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [