eve 0.27.12 → 0.27.13

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # eve
2
2
 
3
+ ## 0.27.13
4
+
5
+ ### Patch Changes
6
+
7
+ - c1bf6d4: Fix `eve dev` startup for bundled extensions whose output declares `__filename` without `__dirname`.
8
+ - 5d25b16: Render user-scoped connection authorization in Linear Agent Sessions. Linear users now receive the native account-linking affordance, and the channel posts the authorization outcome before a parked turn resumes.
9
+ - d257866: `eve add` now asks before running an official registry item's setup and prints a resumable command when setup is skipped or cancelled. Run `eve add <item> --skip-install` to launch setup later without reinstalling the item.
10
+
3
11
  ## 0.27.12
4
12
 
5
13
  ### Patch Changes
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject,listAuthoredChannels}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";const KNOWN_CHANNEL_KINDS=[`slack`,`web`];function parseChannelKind(e){if(KNOWN_CHANNEL_KINDS.includes(e))return e;throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`)}const defaultChannelsAddDependencies={createPrompter,loadAddCommand:async()=>(await import(`./registry.js`)).runAddCommand,loadChannelsFlow:async()=>(await import(`#setup/flows/channels.js`)).runChannelsFlow};async function runChannelsAddCompatibilityCommand(n,r,o,s=defaultChannelsAddDependencies){if(!await isEveProject(r)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{if(o.kind!==void 0){let e=parseChannelKind(o.kind),t=await s.loadAddCommand(),i={};o.options.force===!0&&(i.overwrite=!0),o.options.yes===!0&&(i.setupArgs=[`--yes`]),await t(n,r,`channel/${e}`,i);return}if(o.options.yes||!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Pass a channel kind: \`eve channels add <${KNOWN_CHANNEL_KINDS.join(`|`)}>\`.`);await(await s.loadChannelsFlow())({appRoot:r,prompter:s.createPrompter()})}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}async function runChannelsListCommand(r,i,a){if(!await isEveProject(i)){r.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let o=await listAuthoredChannels(i);if(a.json){r.log(JSON.stringify({channels:o},null,2));return}if(o.length===0){r.log("No channels defined. Run `eve channels add` to add one.");return}for(let e of o)r.log(e)}export{runChannelsAddCompatibilityCommand,runChannelsListCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject,listAuthoredChannels}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";const KNOWN_CHANNEL_KINDS=[`slack`,`web`];function parseChannelKind(e){if(KNOWN_CHANNEL_KINDS.includes(e))return e;throw Error(`Unknown channel kind "${e}". Known: ${KNOWN_CHANNEL_KINDS.join(`, `)}.`)}const defaultChannelsAddDependencies={createPrompter,loadAddCommand:async()=>(await import(`./registry.js`)).runAddCommand,loadChannelsFlow:async()=>(await import(`#setup/flows/channels.js`)).runChannelsFlow};async function runChannelsAddCompatibilityCommand(n,r,o,s=defaultChannelsAddDependencies){if(!await isEveProject(r)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{if(o.kind!==void 0){let e=parseChannelKind(o.kind),t=await s.loadAddCommand(),i={};o.options.force===!0&&(i.overwrite=!0),o.options.yes===!0&&(i.yes=!0),await t(n,r,`channel/${e}`,i);return}if(o.options.yes||!process.stdin.isTTY||!process.stdout.isTTY)throw Error(`Pass a channel kind: \`eve channels add <${KNOWN_CHANNEL_KINDS.join(`|`)}>\`.`);await(await s.loadChannelsFlow())({appRoot:r,prompter:s.createPrompter()})}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}async function runChannelsListCommand(r,i,a){if(!await isEveProject(i)){r.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}let o=await listAuthoredChannels(i);if(a.json){r.log(JSON.stringify({channels:o},null,2));return}if(o.length===0){r.log("No channels defined. Run `eve channels add` to add one.");return}for(let e of o)r.log(e)}export{runChannelsAddCompatibilityCommand,runChannelsListCommand};
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{interactiveAsker}from"#setup/ask.js";import{deployChannelSetup}from"#setup/channel-setup-deployment.js";import{channelSetupEnvironment,describeChannelSetupEnvironment}from"#setup/channel-setup-environment.js";import{channelSetupIntegration,createChannelSetupUi}from"#setup/channel-setup-integrations.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createDefaultSetupState}from"#setup/state.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const defaultIntegrationSetupDependencies={detectDeployment,getVercelAuthStatus};async function runIntegrationSetupCommand(n,r,a,o={},s=defaultIntegrationSetupDependencies){if(!await isEveProject(r)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{if(a!==`slack`&&a!==`web`)throw Error(`Integration setup "${a}" is not available in this version of eve. Upgrade eve and try again.`);let e=a,t=s.createPrompter?.()??createPrompter();t.intro(`Set up ${channelSetupIntegration(e).label}`),t.log.message(`Checking Vercel setup...`);let[n,i]=await Promise.all([s.detectDeployment(r),s.getVercelAuthStatus(r)]),c=projectResolutionFromDeployment(n),l=channelSetupEnvironment(i,c);t.log.info(describeChannelSetupEnvironment(l));let u={...createDefaultSetupState(),project:c,projectPath:{kind:`resolved`,inPlace:!0,path:r},channelSelection:[e]},d=await channelSetupIntegration(e).setup({environment:l,state:u,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetCreateSlackbot:o.yes?!0:void 0,presetPortableCredentials:o.yes?!0:void 0,skipDependencyMutation:!0,deps:s.addChannelsDeps});if(d.kind===`cancelled`)return;let f=d.state;(f.slackbotAttached||l.vercel.kind===`available`&&f.channels.includes(`web`))&&(f=await deployChannelSetup({state:f,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetDeploy:o.yes===!0?!0:!process.stdin.isTTY||!process.stdout.isTTY?!1:void 0,deps:s.deployProjectDeps})),t.outro(f.channels.includes(e)?`Integration set up.`:`No changes made.`)}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}export{runIntegrationSetupCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{interactiveAsker}from"#setup/ask.js";import{deployChannelSetup}from"#setup/channel-setup-deployment.js";import{channelSetupEnvironment,describeChannelSetupEnvironment}from"#setup/channel-setup-environment.js";import{channelSetupIntegration,createChannelSetupUi}from"#setup/channel-setup-integrations.js";import{detectDeployment,projectResolutionFromDeployment}from"#setup/project-resolution.js";import{createDefaultSetupState}from"#setup/state.js";import{getVercelAuthStatus}from"#setup/vercel-project.js";const defaultIntegrationSetupDependencies={detectDeployment,getVercelAuthStatus};async function runIntegrationSetupCommand(n,r,a,o={},s=defaultIntegrationSetupDependencies){if(!await isEveProject(r)){n.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{if(a!==`slack`&&a!==`web`)throw Error(`Integration setup "${a}" is not available in this version of eve. Upgrade eve and try again.`);let e=a,t=s.createPrompter?.()??createPrompter();t.intro(`Set up ${channelSetupIntegration(e).label}`),t.log.message(`Checking Vercel setup...`);let[n,i]=await Promise.all([s.detectDeployment(r),s.getVercelAuthStatus(r)]),c=projectResolutionFromDeployment(n),l=channelSetupEnvironment(i,c);t.log.info(describeChannelSetupEnvironment(l));let u={...createDefaultSetupState(),project:c,projectPath:{kind:`resolved`,inPlace:!0,path:r},channelSelection:[e]},d=await channelSetupIntegration(e).setup({environment:l,state:u,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetCreateSlackbot:o.yes?!0:void 0,presetPortableCredentials:o.yes?!0:void 0,skipDependencyMutation:!0,deps:s.addChannelsDeps});if(d.kind===`cancelled`){process.env.EVE_SETUP===`1`&&(process.exitCode=130);return}let f=d.state;(f.slackbotAttached||l.vercel.kind===`available`&&f.channels.includes(`web`))&&(f=await deployChannelSetup({state:f,ui:createChannelSetupUi({asker:interactiveAsker(t),prompter:t}),presetDeploy:o.yes===!0?!0:!process.stdin.isTTY||!process.stdout.isTTY?!1:void 0,deps:s.deployProjectDeps})),t.outro(f.channels.includes(e)?`Integration set up.`:`No changes made.`)}catch(e){n.error(e instanceof Error?e.message:String(e)),process.exitCode=1}}export{runIntegrationSetupCommand};
@@ -1 +1 @@
1
- function registerRegistryCommands(e){let{appRoot:t,logger:n,program:r}=e;r.command(`add <item>`).description(`Install a registry item; relative paths use the official eve registry.`).option(`-o, --overwrite`,`Overwrite existing files.`).action(async(e,r)=>{let{runAddCommand:i}=await import(`./registry.js`);await i(n,t,e,r)});let i=r.command(`registry`).description(`Configure and browse extension and agent registry catalogs.`);i.command(`add <registries...>`).description(`Add registry namespace mappings to package.json.`).action(async e=>{let{runRegistryAddCommand:r}=await import(`./registry.js`);await r(n,t,e)}),i.command(`list`).description(`List items from all registries or one source.`).option(`-r, --registry <source>`,`List items from one registry.`).action(async e=>{let{runRegistryListCommand:r}=await import(`./registry.js`);await r(n,t,e.registry)}),i.command(`search <query>`).description(`Search all registries or one source.`).option(`-r, --registry <source>`,`Search one registry.`).action(async(e,r)=>{let{runRegistrySearchCommand:i}=await import(`./registry.js`);await i(n,t,e,r.registry)}),i.command(`view <item>`).description(`Print one registry item as JSON.`).action(async e=>{let{runRegistryViewCommand:r}=await import(`./registry.js`);await r(n,t,e)})}export{registerRegistryCommands};
1
+ function registerRegistryCommands(e){let{appRoot:t,logger:n,program:r}=e;r.command(`add <item>`).description(`Install a registry item; relative paths use the official eve registry.`).option(`-o, --overwrite`,`Overwrite existing files.`).option(`--skip-install`,`Run the item's setup flow without installing it.`).option(`--skip-setup`,`Skip the item's setup flow.`).option(`-y, --yes`,`Run setup and accept its recommended defaults.`).action(async(e,r)=>{let{runAddCommand:i}=await import(`./registry.js`);await i(n,t,e,r)});let i=r.command(`registry`).description(`Configure and browse extension and agent registry catalogs.`);i.command(`add <registries...>`).description(`Add registry namespace mappings to package.json.`).action(async e=>{let{runRegistryAddCommand:r}=await import(`./registry.js`);await r(n,t,e)}),i.command(`list`).description(`List items from all registries or one source.`).option(`-r, --registry <source>`,`List items from one registry.`).action(async e=>{let{runRegistryListCommand:r}=await import(`./registry.js`);await r(n,t,e.registry)}),i.command(`search <query>`).description(`Search all registries or one source.`).option(`-r, --registry <source>`,`Search one registry.`).action(async(e,r)=>{let{runRegistrySearchCommand:i}=await import(`./registry.js`);await i(n,t,e,r.registry)}),i.command(`view <item>`).description(`Print one registry item as JSON.`).action(async e=>{let{runRegistryViewCommand:r}=await import(`./registry.js`);await r(n,t,e)})}export{registerRegistryCommands};
@@ -1,6 +1,8 @@
1
1
  export interface RegistrySetupCommand {
2
- command: string;
2
+ package: string;
3
+ bin: string;
3
4
  args: string[];
4
5
  }
5
- /** Executes a trusted registry setup command in the consuming project. */
6
- export declare function runRegistrySetupCommand(appRoot: string, setup: RegistrySetupCommand): Promise<void>;
6
+ export type RegistrySetupCommandResult = "completed" | "cancelled";
7
+ /** Executes a trusted registry setup command from an installed package's declared Node binary. */
8
+ export declare function runRegistrySetupCommand(appRoot: string, setup: RegistrySetupCommand, item: string): Promise<RegistrySetupCommandResult>;
@@ -1 +1 @@
1
- import{spawn}from"node:child_process";function runRegistrySetupCommand(t,n){let r=n.command,i=n.args;return new Promise((n,a)=>{let o=spawn(r,i,{cwd:t,stdio:`inherit`});o.once(`error`,a),o.once(`close`,(e,t)=>{if(e===0){n();return}a(Error(t===null?`Setup command exited with code ${e??`unknown`}.`:`Setup command was terminated by ${t}.`))})})}export{runRegistrySetupCommand};
1
+ import{findPackageJSON}from"node:module";import{z}from"#compiled/zod/index.js";import{dirname,isAbsolute,relative,resolve}from"node:path";import{readFile}from"node:fs/promises";import{spawn}from"node:child_process";import{pathToFileURL}from"node:url";const PackageJsonSchema=z.object({name:z.string().min(1),bin:z.union([z.string(),z.record(z.string(),z.string())]).optional()});function declaredBinPath(e,t){return typeof e.bin==`string`?t===e.name.slice(e.name.lastIndexOf(`/`)+1)?e.bin:void 0:e.bin?.[t]}async function resolveNodePackageBin(e,t){let s=dirname(e),c=PackageJsonSchema.parse(JSON.parse(await readFile(e,`utf8`))),l=declaredBinPath(c,t);if(l===void 0)throw Error(`Package "${c.name}" does not declare a "${t}" binary.`);let u=resolve(s,l),d=relative(s,u);if(d.startsWith(`..`)||isAbsolute(d))throw Error(`Package "${c.name}" declares its "${t}" binary outside the package directory.`);return u}async function runRegistrySetupCommand(t,n,r){let i=findPackageJSON(n.package,pathToFileURL(resolve(t,`package.json`)));if(i===void 0)throw Error(`Setup package "${n.package}" is not installed. Run \`eve add ${r}\` first.`);let o=await resolveNodePackageBin(i,n.bin);return new Promise((e,i)=>{let a=spawn(process.execPath,[o,...n.args],{cwd:t,env:{...process.env,EVE_SETUP:`1`,EVE_SETUP_ITEM:r},stdio:`inherit`});a.once(`error`,i),a.once(`close`,(t,n)=>{if(t===0){e(`completed`);return}if(t===130||n===`SIGINT`){e(`cancelled`);return}i(Error(n===null?`Setup command exited with code ${t??`unknown`}.`:`Setup command was terminated by ${n}.`))})})}export{runRegistrySetupCommand};
@@ -1,16 +1,22 @@
1
+ import { type Prompter } from "#setup/prompter.js";
1
2
  import type { runRegistrySetupCommand } from "./registry-setup-command.js";
2
3
  export interface RegistryCommandLogger {
3
4
  error(message: string): void;
4
5
  log(message: string): void;
5
6
  }
6
7
  export interface AddCommandOptions {
8
+ skipInstall?: boolean;
7
9
  overwrite?: boolean;
8
- /** Arguments forwarded to a trusted setup command after installation. */
9
- setupArgs?: string[];
10
+ skipSetup?: boolean;
11
+ yes?: boolean;
10
12
  }
11
- export interface AddCommandDependencies {
13
+ export interface RegistrySetupDependencies {
12
14
  loadSetupCommandRunner(): Promise<typeof runRegistrySetupCommand>;
13
15
  }
16
+ export interface AddCommandDependencies extends RegistrySetupDependencies {
17
+ createPrompter?: () => Prompter;
18
+ isInteractive?: () => boolean;
19
+ }
14
20
  /** Installs an official registry item without running its declared setup command. */
15
21
  export declare function installOfficialRegistryItem(appRoot: string, item: string, options?: AddCommandOptions): Promise<void>;
16
22
  /** Installs an official, configured, or URL-addressed registry item. */
@@ -1 +1 @@
1
- import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand},OFFICIAL_REGISTRY=`https://eve.dev/r`,OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{...r,config:i,cwd:e})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({command:z.literal(`eve`),args:z.tuple([z.literal(`integration`),z.literal(`setup`),z.string().min(1)])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function browseRegistryItems(e,t,r,i){validateRegistrySource(i);let a=await readRegistryConfig(t),o=i?[i]:[OFFICIAL_CATALOG,...configuredRegistrySources(a)],s=await searchRegistries(o,{config:a,continueOnError:o.length>1,query:r}),l=s.errors??[];l.length<o.length&&printSearchResults(e,s,{query:r,sources:o});for(let t of l)e.error(`${t.registry}: ${t.message}`);l.length>0&&(process.exitCode=1)}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let e=await readRegistryConfig(t),c=itemAddress(r),[l]=await getRegistryItems([c],{config:e}),u=isOfficialItemAddress(c)?eveMetadataFromRegistryItem(l):void 0;assertCompatibleEveVersion(u?.requires);let d={config:e,cwd:t,overwrite:i.overwrite};await addRegistryItems([c],d),u?.setup!==void 0&&await(await a.loadSetupCommandRunner())(t,{...u.setup,args:[...u.setup.args,...i.setupArgs??[]]})})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n))}async function runRegistrySearchCommand(e,t,n,r){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{installOfficialRegistryItem,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
1
+ import{NOT_AN_AGENT_MESSAGE}from"./preconditions.js";import{addRegistryMappings,readRegistryConfig}from"./registry-project.js";import{z}from"#compiled/zod/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveProject}from"#setup/scaffold/index.js";import{createPrompter}from"#setup/prompter.js";import{WizardCancelledError}from"#setup/step.js";import{addRegistryItems,getRegistryItems,searchRegistries}from"#compiled/shadcn-registry/index.js";import semver from"#compiled/semver/index.js";const defaultAddCommandDependencies={createPrompter,isInteractive:()=>process.stdin.isTTY===!0&&process.stdout.isTTY===!0,loadSetupCommandRunner:async()=>(await import(`./registry-setup-command.js`)).runRegistrySetupCommand},OFFICIAL_REGISTRY=`https://eve.dev/r`,OFFICIAL_CATALOG=`${OFFICIAL_REGISTRY}/registry.json`;function isRegistryAddress(e){return e.startsWith(`@`)||/^https?:\/\//.test(e)}function itemAddress(e){return isRegistryAddress(e)?e:`${OFFICIAL_REGISTRY}/${e}.json`}async function installOfficialRegistryItem(e,t,r={}){let i=await readRegistryConfig(e);await addRegistryItems([itemAddress(t)],{config:i,cwd:e,overwrite:r.overwrite})}const EveRegistryItemMetadataSchema=z.object({meta:z.object({eve:z.object({requires:z.string().optional(),setup:z.object({package:z.string().min(1),bin:z.string().min(1),args:z.array(z.string()).default([])}).optional()}).optional()}).optional()});function eveMetadataFromRegistryItem(e){return EveRegistryItemMetadataSchema.parse(e).meta?.eve}function setupResumeCommand(e){return`eve add ${/^[\w@./:-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`} --skip-install`}function setupReminder(e,t){return`${t===`cancelled`?`Setup cancelled.`:`Setup skipped.`} Run \`${setupResumeCommand(e)}\` when you're ready.`}function assertCompatibleEveVersion(e){if(e===void 0)return;let t=resolveInstalledPackageInfo().version;if(semver.validRange(e)===null)throw Error(`Registry item has an invalid eve version requirement: ${e}.`);if(!semver.subset(t,e))throw Error(`This registry item requires eve ${e}, but this project is using eve ${t}. Upgrade eve and run the command again.`)}function isOfficialItemAddress(e){return e.startsWith(`${OFFICIAL_REGISTRY}/`)}function errorMessage(e){return e instanceof Error?e.message:String(e)}async function runRegistryAction(t,n,r){if(!await isEveProject(n)){t.error(NOT_AN_AGENT_MESSAGE),process.exitCode=1;return}try{await r()}catch(e){t.error(errorMessage(e)),process.exitCode=1}}function configuredRegistrySources(e){return Object.keys(e.registries??{})}function validateRegistrySource(e){if(e!==void 0&&!isRegistryAddress(e))throw Error(`Registry sources must be a namespace or URL: ${e}`)}function printSearchResults(e,t,n){if(t.items.length===0){e.log(`No registry items found.`);return}let r=`${t.pagination.total} item${t.pagination.total===1?``:`s`}`,i=n.query===void 0?``:` matching "${n.query}"`,a=`${n.sources.length} registr${n.sources.length===1?`y`:`ies`}`;e.log(`Found ${r}${i} in ${a}`),e.log(``);for(let r of t.items){let t=r.registry===OFFICIAL_CATALOG?r.name:r.addCommandArgument,i=n.query===void 0&&r.description?` — ${r.description}`:``;e.log(`${t}${i}`)}}async function browseRegistryItems(e,t,r,i){validateRegistrySource(i);let a=await readRegistryConfig(t),o=i?[i]:[OFFICIAL_CATALOG,...configuredRegistrySources(a)],s=await searchRegistries(o,{config:a,continueOnError:o.length>1,query:r}),c=s.errors??[];c.length<o.length&&printSearchResults(e,s,{query:r,sources:o});for(let t of c)e.error(`${t.registry}: ${t.message}`);c.length>0&&(process.exitCode=1)}async function runDeclaredSetup(e,t,n,r,i,a){if(r===void 0)return;let o=await a.loadSetupCommandRunner();try{await o(t,{...r,args:[...r.args,...i.yes?[`--yes`]:[]]},n)===`cancelled`&&e.log(setupReminder(n,`cancelled`))}catch(e){throw Error(`${errorMessage(e)} Try again with \`${setupResumeCommand(n)}\`.`)}}async function runAddCommand(e,t,r,i,a=defaultAddCommandDependencies){await runRegistryAction(e,t,async()=>{let o=await readRegistryConfig(t),l=itemAddress(r);if(i.skipInstall===!0){if(i.overwrite===!0)throw Error(`--overwrite cannot be used with --skip-install.`);if(i.skipSetup===!0)throw Error(`--skip-install cannot be used with --skip-setup.`);if(!isOfficialItemAddress(l))throw Error(`Setup flows are currently supported only for official eve registry items.`)}let[u]=await getRegistryItems([l],{config:o}),d=isOfficialItemAddress(l)?eveMetadataFromRegistryItem(u):void 0;if(assertCompatibleEveVersion(d?.requires),i.skipInstall===!0){if(d?.setup===void 0)throw Error(`Registry item "${r}" does not declare a setup flow.`);await runDeclaredSetup(e,t,r,d.setup,i,a);return}if(await addRegistryItems([l],{config:o,cwd:t,overwrite:i.overwrite}),d?.setup===void 0)return;let f=a.isInteractive?.()??defaultAddCommandDependencies.isInteractive();if(i.skipSetup===!0||!i.yes&&!f){e.log(setupReminder(r,`skipped`));return}if(!i.yes)try{if(await(a.createPrompter?.()??defaultAddCommandDependencies.createPrompter()).select({message:`Set up ${r} now?`,initialValue:`yes`,options:[{value:`yes`,label:`Yes`},{value:`no`,label:`No`}]})===`no`){e.log(setupReminder(r,`skipped`));return}}catch(t){if(!(t instanceof WizardCancelledError))throw t;e.log(setupReminder(r,`cancelled`));return}await runDeclaredSetup(e,t,r,d.setup,i,a)})}async function runRegistryAddCommand(e,n,r){await runRegistryAction(e,n,async()=>{let i=await addRegistryMappings(n,r);for(let t of i.skippedBuiltIn)e.log(`Skipped ${t} because it is built in.`);for(let t of i.skippedExisting)e.log(`Skipped ${t} because it is already configured.`);i.added.length>0&&e.log(`Added ${i.added.join(`, `)} to package.json.`)})}async function runRegistryListCommand(e,t,n){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,void 0,n))}async function runRegistrySearchCommand(e,t,n,r){await runRegistryAction(e,t,()=>browseRegistryItems(e,t,n,r))}async function runRegistryViewCommand(e,t,r){await runRegistryAction(e,t,async()=>{let i=await readRegistryConfig(t),a=await getRegistryItems([itemAddress(r)],{config:i});e.log(JSON.stringify(a.length===1?a[0]:a,null,2))})}export{installOfficialRegistryItem,runAddCommand,runRegistryAddCommand,runRegistryListCommand,runRegistrySearchCommand,runRegistryViewCommand};
@@ -1 +1 @@
1
- import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.27.12`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function tryResolveVerifiedPackageRoot(e){try{let t=realpathSync.native(e);return tryReadInstalledPackageInfo(t,EVE_PACKAGE_NAME)===void 0?void 0:dirname(t)}catch{return}}function findNearestVerifiedPackageRoot(e){let t=e;for(;;){let e=tryResolveVerifiedPackageRoot(join(t,`package.json`));if(e!==void 0)return e;let n=dirname(t);if(n===t)return;t=n}}function tryResolveDirectBuildLocation(e){let t=dirname(e);for(;;){if(basename(t)===`dist`){let e=tryResolveVerifiedPackageRoot(join(dirname(t),`package.json`));if(e!==void 0)return{packageBuildRoot:t,packageRoot:e}}let e=dirname(t);if(e===t)return;t=e}}function isSourceCheckout(e){return existsSync(join(e,`src`,`internal`,`application`,`package.ts`))}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let n=join(e,`dist`);if(existsSync(n))return{packageBuildRoot:n,packageRoot:e}}function resolveSelfPackageJsonPath(t){return createRequire(t).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),i=tryResolveDirectBuildLocation(n);if(i!==void 0)return i;let a=findNearestVerifiedPackageRoot(dirname(n));if(a!==void 0&&isSourceCheckout(a))return{packageBuildRoot:null,packageRoot:a};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let o=a===void 0?void 0:tryCreatePackageLocation(a);if(o!==void 0)return o;throw Error(`Failed to resolve the eve package root from "${e}".`)}function resolvePackageLocation(){return cachedPackageLocation??=resolvePackageLocationFromModulePath(resolveCurrentModulePath()),cachedPackageLocation}function resolvePackageBuildRoot(){return resolvePackageLocation().packageBuildRoot}function resolvePackageRoot(){return resolvePackageLocation().packageRoot}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
1
+ import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.27.13`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function tryResolveVerifiedPackageRoot(e){try{let t=realpathSync.native(e);return tryReadInstalledPackageInfo(t,EVE_PACKAGE_NAME)===void 0?void 0:dirname(t)}catch{return}}function findNearestVerifiedPackageRoot(e){let t=e;for(;;){let e=tryResolveVerifiedPackageRoot(join(t,`package.json`));if(e!==void 0)return e;let n=dirname(t);if(n===t)return;t=n}}function tryResolveDirectBuildLocation(e){let t=dirname(e);for(;;){if(basename(t)===`dist`){let e=tryResolveVerifiedPackageRoot(join(dirname(t),`package.json`));if(e!==void 0)return{packageBuildRoot:t,packageRoot:e}}let e=dirname(t);if(e===t)return;t=e}}function isSourceCheckout(e){return existsSync(join(e,`src`,`internal`,`application`,`package.ts`))}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let n=join(e,`dist`);if(existsSync(n))return{packageBuildRoot:n,packageRoot:e}}function resolveSelfPackageJsonPath(t){return createRequire(t).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),i=tryResolveDirectBuildLocation(n);if(i!==void 0)return i;let a=findNearestVerifiedPackageRoot(dirname(n));if(a!==void 0&&isSourceCheckout(a))return{packageBuildRoot:null,packageRoot:a};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let o=a===void 0?void 0:tryCreatePackageLocation(a);if(o!==void 0)return o;throw Error(`Failed to resolve the eve package root from "${e}".`)}function resolvePackageLocation(){return cachedPackageLocation??=resolvePackageLocationFromModulePath(resolveCurrentModulePath()),cachedPackageLocation}function resolvePackageBuildRoot(){return resolvePackageLocation().packageBuildRoot}function resolvePackageRoot(){return resolvePackageLocation().packageRoot}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
@@ -1,4 +1,4 @@
1
- const BANNER_LINES=[{importLine:`import { fileURLToPath as __eveFileURLToPath } from "node:url";`,declarationLine:`const __filename = __eveFileURLToPath(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+__filename(?![\w$])/m},{importLine:`import { dirname as __eveDirname } from "node:path";`,declarationLine:`const __dirname = __eveDirname(__filename);`,bindingPattern:/^(?:const|let|var)\s+__dirname(?![\w$])/m}],REQUIRE_LINE={importLine:`import { createRequire as __eveCreateRequire } from "node:module";`,declarationLine:`const require = __eveCreateRequire(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+require(?![\w$])/m};function buildNodeEsmCompatBanner(n,r={}){let i=[...BANNER_LINES];r.includeRequire===!0&&i.push(REQUIRE_LINE);let a=[],o=[];for(let e of i)e.bindingPattern.test(n)||(a.push(e.importLine),o.push(e.declarationLine));return o.length===0?``:[...a,...o].join(`
1
+ const BANNER_LINES=[{importLine:`import { fileURLToPath as __eveFileURLToPath } from "node:url";`,declarationLine:`const __filename = __eveFileURLToPath(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+__filename(?![\w$])/m},{importLine:`import { dirname as __eveDirname } from "node:path";`,declarationLine:`const __dirname = __eveDirname(__filename);`,bindingPattern:/^(?:const|let|var)\s+__dirname(?![\w$])/m}],FILENAME_BANNER_LINE=BANNER_LINES[0],DIRNAME_BANNER_LINE=BANNER_LINES[1],REQUIRE_LINE={importLine:`import { createRequire as __eveCreateRequire } from "node:module";`,declarationLine:`const require = __eveCreateRequire(import.meta.url);`,bindingPattern:/^(?:const|let|var)\s+require(?![\w$])/m};function buildNodeEsmCompatBanner(i,a={}){let o=[...BANNER_LINES];a.includeRequire===!0&&o.push(REQUIRE_LINE);let s=[],c=[],l=FILENAME_BANNER_LINE.bindingPattern.test(i),u=DIRNAME_BANNER_LINE.bindingPattern.test(i);for(let e of o)e.bindingPattern.test(i)||(s.push(e.importLine),c.push(e===DIRNAME_BANNER_LINE&&l?`const __dirname = __eveDirname(__eveFileURLToPath(import.meta.url));`:e.declarationLine));return l&&!u&&s.unshift(FILENAME_BANNER_LINE.importLine),c.length===0?``:[...s,...c].join(`
2
2
  `)}function createNodeEsmCompatBannerPlugin(e={}){return{name:`eve-node-esm-compat-banner`,renderChunk(t,n){let r=buildNodeEsmCompatBanner(t,e);return r===``?null:{code:`${r}\n${t}`,map:createPrependedLineSourceMap({insertedLineCount:r.split(`
3
3
  `).length,source:n?.fileName??`eve-node-esm-compat-banner-input`,sourceContent:t})}}}}function createPrependedLineSourceMap({insertedLineCount:e,source:t,sourceContent:n}){let r=n.split(`
4
4
  `).length,i=Array.from({length:r},(e,t)=>encodeVlqFields(t===0?[0,0,0,0]:[0,0,1,0]));return{version:3,sources:[t],sourcesContent:[n],names:[],mappings:`${`;`.repeat(e)}${i.join(`;`)}`}}function encodeVlqFields(e){return e.map(e=>encodeVlqInteger(e)).join(``)}function encodeVlqInteger(e){let t=e<0?(-e<<1)+1:e<<1,n=``;do{let e=t&31;t>>>=5,t>0&&(e|=32),n+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`[e]}while(t>0);return n}export{buildNodeEsmCompatBanner,createNodeEsmCompatBannerPlugin};
@@ -1,3 +1,5 @@
1
- import{extractErrorId,formatErrorHint}from"#internal/logging.js";import{createLinearAgentActivity}from"#public/channels/linear/api.js";import{linearInputRequestSignal,renderLinearInputRequests}from"#public/channels/linear/hitl.js";function defaultLinearAuth(e){let t=e.agentActivity?.user??e.agentSession.creator,n=e.agentActivity?.userId??e.agentSession.creatorId??t?.id??`unknown`,r={action:e.action,agent_session_id:e.agentSession.id,organization_id:e.organizationId??e.agentSession.organizationId??``};if(e.delivery.id!==void 0&&(r.delivery_id=e.delivery.id),e.agentSession.issueId!==void 0&&e.agentSession.issueId!==null&&(r.issue_id=e.agentSession.issueId),e.agentSession.issue?.identifier!==void 0&&(r.issue_identifier=e.agentSession.issue.identifier),t!==void 0){let e=linearUserLabel(t);e!==void 0&&(r.user=e)}return{attributes:r,authenticator:`linear-agent-webhook`,issuer:e.organizationId?`linear:${e.organizationId}`:`linear`,principalId:`linear:${n}`,principalType:`user`,subject:n}}function defaultOnAgentSession(e,t){return t.action!==`created`&&t.action!==`prompted`?null:{auth:defaultLinearAuth(t)}}function createDefaultEvents(n={}){return{async"turn.started"(e,t,r){t.state.pendingToolCallMessage=null,await postActivity(t,n,{body:`Working on this.`,type:`thought`},{ephemeral:!0})},async"actions.requested"(e,t,r){let i=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,i){await postActivity(t,n,{body:i,type:`thought`},{ephemeral:!0});return}if(e.actions.length!==0){if(e.actions.length>1){await postActivity(t,n,{action:`Running`,parameter:e.actions.map(actionLabel).join(`, `),type:`action`},{ephemeral:!0});return}for(let r of e.actions)await postActivity(t,n,{action:actionLabel(r),parameter:actionParameter(r),type:`action`},{ephemeral:!0})}},async"input.requested"(e,t,a){let o=linearInputRequestSignal(e.requests);await postActivity(t,n,{body:renderLinearInputRequests(e.requests),type:`elicitation`},o)},async"message.completed"(e,t,r){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null;return}t.state.pendingToolCallMessage=null,e.message&&await postActivity(t,n,{body:e.message,type:`response`})},async"session.failed"(r,i){let a=formatErrorHint(r),o=extractErrorId(r.details);await postActivity(i,n,{body:[`This session could not recover from an error${a}.`,``,`Start a new Linear agent session to continue.`,...o?[``,`Error id: ${o}`]:[]].join(`
1
+ import{extractErrorId,formatErrorHint}from"#internal/logging.js";import{createLinearAgentActivity}from"#public/channels/linear/api.js";import{linearInputRequestSignal,renderLinearInputRequests}from"#public/channels/linear/hitl.js";function defaultLinearAuth(e){let t=e.agentActivity?.user??e.agentSession.creator,n=e.agentActivity?.userId??e.agentSession.creatorId??t?.id??`unknown`,r={action:e.action,agent_session_id:e.agentSession.id,organization_id:e.organizationId??e.agentSession.organizationId??``};if(e.delivery.id!==void 0&&(r.delivery_id=e.delivery.id),e.agentSession.issueId!==void 0&&e.agentSession.issueId!==null&&(r.issue_id=e.agentSession.issueId),e.agentSession.issue?.identifier!==void 0&&(r.issue_identifier=e.agentSession.issue.identifier),t!==void 0){let e=linearUserLabel(t);e!==void 0&&(r.user=e)}return{attributes:r,authenticator:`linear-agent-webhook`,issuer:e.organizationId?`linear:${e.organizationId}`:`linear`,principalId:`linear:${n}`,principalType:`user`,subject:n}}function defaultOnAgentSession(e,t){return t.action!==`created`&&t.action!==`prompted`?null:{auth:defaultLinearAuth(t)}}function createDefaultEvents(n={}){return{async"turn.started"(e,t,r){t.state.pendingToolCallMessage=null,await postActivity(t,n,{body:`Working on this.`,type:`thought`},{ephemeral:!0})},async"actions.requested"(e,t,r){let i=t.state.pendingToolCallMessage;if(t.state.pendingToolCallMessage=null,i){await postActivity(t,n,{body:i,type:`thought`},{ephemeral:!0});return}if(e.actions.length!==0){if(e.actions.length>1){await postActivity(t,n,{action:`Running`,parameter:e.actions.map(actionLabel).join(`, `),type:`action`},{ephemeral:!0});return}for(let r of e.actions)await postActivity(t,n,{action:actionLabel(r),parameter:actionParameter(r),type:`action`},{ephemeral:!0})}},async"input.requested"(e,t,a){let o=linearInputRequestSignal(e.requests);await postActivity(t,n,{body:renderLinearInputRequests(e.requests),type:`elicitation`},o)},async"authorization.required"(e,t,r){let i=authorizationDisplayName(e.name,e.authorization?.displayName),a=e.authorization?.url,o=linearUserId(r),s;if(a!==void 0){let e={providerName:i,url:a};o!==void 0&&(e.userId=o),s={signal:`auth`,signalMetadata:e}}await postActivity(t,n,{body:authorizationRequiredBody({displayName:i,instructions:e.authorization?.instructions,userCode:e.authorization?.userCode}),type:`elicitation`},s)},async"authorization.completed"(e,t,r){let i=authorizationDisplayName(e.name,e.authorization?.displayName);if(e.outcome===`authorized`){await postActivity(t,n,{body:`Connected to ${i}. Resuming.`,type:`thought`},{ephemeral:!0});return}let a=e.reason===void 0?``:` (${e.reason})`;await postActivity(t,n,{body:`${i} authorization ${formatAuthorizationOutcome(e.outcome)}${a}.`,type:`thought`})},async"message.completed"(e,t,r){if(e.finishReason===`tool-calls`){t.state.pendingToolCallMessage=e.message?firstNonEmptyLine(e.message)??null:null;return}t.state.pendingToolCallMessage=null,e.message&&await postActivity(t,n,{body:e.message,type:`response`})},async"session.failed"(r,i){let a=formatErrorHint(r),o=extractErrorId(r.details);await postActivity(i,n,{body:[`This session could not recover from an error${a}.`,``,`Start a new Linear agent session to continue.`,...o?[``,`Error id: ${o}`]:[]].join(`
2
2
  `),type:`error`})},async"turn.failed"(r,i,a){let o=formatErrorHint(r),s=extractErrorId(r.details);await postActivity(i,n,{body:[`I hit an error while handling your request${o}.`,``,`Please try again, rephrase, or reach out if it keeps failing.`,...s?[``,`Error id: ${s}`]:[]].join(`
3
- `),type:`error`})}}}function postActivity(e,t,r,i={}){return createLinearAgentActivity({api:t.api,credentials:t.credentials,activity:{agentSessionId:requireAgentSessionId(e.state.agentSessionId),content:r,ephemeral:i.ephemeral,signal:i.signal,signalMetadata:i.signalMetadata}})}function requireAgentSessionId(e){if(e===null)throw Error(`linearChannel: cannot post Agent Activity without an Agent Session id.`);return e}function linearUserLabel(e){return e.displayName??e.name??e.email}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function actionLabel(e){return e.kind===`tool-call`&&e.toolName?e.toolName:e.kind}function actionParameter(e){if(e.description)return e.description;if(e.name)return e.name;if(e.input!==void 0)try{return JSON.stringify(e.input)}catch{return``}return``}export{createDefaultEvents,defaultLinearAuth,defaultOnAgentSession};
3
+ `),type:`error`})}}}function postActivity(e,t,r,i={}){return createLinearAgentActivity({api:t.api,credentials:t.credentials,activity:{agentSessionId:requireAgentSessionId(e.state.agentSessionId),content:r,ephemeral:i.ephemeral,signal:i.signal,signalMetadata:i.signalMetadata}})}function requireAgentSessionId(e){if(e===null)throw Error(`linearChannel: cannot post Agent Activity without an Agent Session id.`);return e}function linearUserLabel(e){return e.displayName??e.name??e.email}function authorizationDisplayName(e,t){return t===void 0?e.length===0?e:e.charAt(0).toUpperCase()+e.slice(1):t}function authorizationRequiredBody(e){return[`Authorization required for ${e.displayName}.`,e.instructions,e.userCode===void 0?void 0:`Code: ${e.userCode}`].filter(e=>e!==void 0&&e.length>0).join(`
4
+
5
+ `)}function linearUserId(e){let t=e.session.auth.current;return t?.authenticator===`linear-agent-webhook`?t.subject:void 0}function formatAuthorizationOutcome(e){return e===`timed-out`?`timed out`:e}function firstNonEmptyLine(e){for(let t of e.split(/\r?\n/u)){let e=t.trim();if(e.length>0)return e}}function actionLabel(e){return e.kind===`tool-call`&&e.toolName?e.toolName:e.kind}function actionParameter(e){if(e.description)return e.description;if(e.name)return e.name;if(e.input!==void 0)try{return JSON.stringify(e.input)}catch{return``}return``}export{createDefaultEvents,defaultLinearAuth,defaultOnAgentSession};
@@ -1,4 +1,4 @@
1
- import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.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.38`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.2`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.27.12`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
1
+ import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.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.38`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.2`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.27.13`,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__",
@@ -82,6 +82,10 @@ Turn start posts an ephemeral `thought`, tool calls post ephemeral `action` acti
82
82
 
83
83
  Human-in-the-loop (HITL) input requests render as Linear `elicitation` activities. When the user replies to the Agent Session, the channel resolves that prompt back to the pending eve input request and resumes with `inputResponses`.
84
84
 
85
+ ### Connection authorization
86
+
87
+ When a user-scoped connection needs authorization, the default channel posts Linear's native `auth` elicitation with the provider's sign-in URL, targeted to the Linear user who started the session. URL-less device flows render their instructions and user code as a plain elicitation. After authorization finishes, the channel posts a thought with the outcome; successful authorization indicates that the parked turn is resuming.
88
+
85
89
  ### Proactive sessions
86
90
 
87
91
  Start a session without an inbound webhook with `receive(linear, { target })`. See [Proactive sessions](#proactive-sessions) below for the target shape and examples.
@@ -3,7 +3,9 @@ title: "Extensions"
3
3
  description: "Package reusable eve capabilities and mount them from npm or a monorepo workspace."
4
4
  ---
5
5
 
6
- Extensions package eve tools, connections, skills, instruction fragments, and hooks. An author builds an extension package; each agent that uses it declares the package as a dependency and mounts it. The package can be published to a registry or kept private inside a monorepo workspace.
6
+ Extensions package eve tools, connections, skills, instruction fragments, and hooks. An author builds an extension package; each agent that uses it declares the package as a dependency and mounts it. The package can be published to a package registry or kept private inside a monorepo workspace.
7
+
8
+ Ready-made extensions can also be distributed through an eve integration registry. See [Install Integrations](./install-integrations) to discover and add one with `eve add`; this page explains how extension packages are authored, mounted, configured, and overridden.
7
9
 
8
10
  This enables sharing many different capability sets. A browser extension might include several tools for navigating a site. A memory extension could use hooks to capture context and tools to recall it. A self-improving extension could pair hooks with dynamic instructions.
9
11
 
@@ -18,6 +18,8 @@ eve add instrumentation/braintrust
18
18
 
19
19
  Extensions may create a mount under `agent/extensions/`. Connections write their initial definition under `agent/connections/` and install `@vercel/connect` when required. Instrumentation providers write `agent/instrumentation.ts`; because an agent has one instrumentation file, compose multiple exporters there by hand. Configure generated files and required environment variables before running your agent.
20
20
 
21
+ When an official item has an interactive setup flow, eve asks whether to run it after installation. Run the printed `eve add <item> --skip-install` command to resume a skipped or cancelled setup later.
22
+
21
23
  ## Find an integration
22
24
 
23
25
  Browse the [Integrations directory](/integrations) to see the official integrations available from the eve registry.
@@ -44,7 +46,7 @@ eve registry view extension/agent-browser
44
46
 
45
47
  ## Add a third-party source
46
48
 
47
- Give a registry a namespace and an integration URL template:
49
+ Use the integration URL template provided by the registry publisher and give the source a namespace:
48
50
 
49
51
  ```bash
50
52
  eve registry add @acme=https://registry.acme.com/r/{name}.json
@@ -71,6 +73,79 @@ Install a known integration URL directly when you do not need a namespace:
71
73
  eve add https://registry.acme.com/r/analytics.json
72
74
  ```
73
75
 
76
+ ## Contribute an official integration
77
+
78
+ Community contributions to the official registry are welcome. Open an issue and get maintainer agreement before submitting a pull request, then follow the [registry contribution guide](https://github.com/vercel/eve/blob/main/CONTRIBUTING.md#adding-an-integration-to-the-registry) for the required source files, metadata, validation, and extension requirements.
79
+
80
+ ## Host your own registry
81
+
82
+ Hosting your own registry is the publishing side of the [third-party source workflow](#add-a-third-party-source). Once it is deployed, other eve projects can give it a namespace and pull integrations from it.
83
+
84
+ An eve registry is a standard [shadcn registry](https://ui.shadcn.com/docs/registry), so it can be hosted by any service that serves JSON over HTTP. It needs two kinds of endpoint:
85
+
86
+ - A catalog such as `https://registry.acme.com/r/registry.json` for `eve registry list` and `eve registry search`
87
+ - One JSON document per integration, such as `https://registry.acme.com/r/analytics.json`, for `eve registry view` and `eve add`
88
+
89
+ Start with a source file for the integration and a `registry.json` that describes where to install it:
90
+
91
+ ```text
92
+ registry.json
93
+ registry/
94
+ └── analytics.ts
95
+ ```
96
+
97
+ ```json title="registry.json"
98
+ {
99
+ "$schema": "https://ui.shadcn.com/schema/registry.json",
100
+ "name": "acme",
101
+ "homepage": "https://registry.acme.com",
102
+ "items": [
103
+ {
104
+ "name": "analytics",
105
+ "type": "registry:item",
106
+ "title": "Acme Analytics",
107
+ "description": "Add Acme analytics tools to an eve agent.",
108
+ "dependencies": ["@acme/eve-analytics"],
109
+ "envVars": {
110
+ "ACME_API_KEY": ""
111
+ },
112
+ "files": [
113
+ {
114
+ "path": "registry/analytics.ts",
115
+ "type": "registry:file",
116
+ "target": "agent/extensions/analytics.ts"
117
+ }
118
+ ]
119
+ }
120
+ ]
121
+ }
122
+ ```
123
+
124
+ `files[].path` is relative to `registry.json`. `files[].target` is relative to the root of the eve project that installs the item. Use `registry:item` with explicit `registry:file` targets for eve integrations so installation does not depend on a UI framework or shadcn project aliases.
125
+
126
+ Validate the source registry, then build its static JSON:
127
+
128
+ ```bash
129
+ pnpm dlx shadcn@latest registry validate
130
+ pnpm dlx shadcn@latest build
131
+ ```
132
+
133
+ By default, the build writes the catalog to `public/r/registry.json` and each item to `public/r/<name>.json`. Deploy the `public` directory to a static host, or use the shadcn registry APIs to serve the same payloads from dynamic routes.
134
+
135
+ Before sharing the registry, test its deployed catalog and item endpoints from an eve project:
136
+
137
+ ```bash
138
+ eve registry list --registry https://registry.acme.com/r/registry.json
139
+ eve registry view https://registry.acme.com/r/analytics.json
140
+ ```
141
+
142
+ Share the item URL template with consumers. From another eve project, they can add the hosted registry as a third-party source and pull the integration through its namespace:
143
+
144
+ ```bash
145
+ eve registry add @acme=https://registry.acme.com/r/{name}.json
146
+ eve add @acme/analytics
147
+ ```
148
+
74
149
  ## Configure generated files
75
150
 
76
151
  Integrations add project files. Read the generated mount before you run the agent, then add the configuration the extension requires.
@@ -87,6 +87,7 @@ Commands for installing and discovering [shadcn registry](https://ui.shadcn.com/
87
87
 
88
88
  ```bash
89
89
  eve add extension/agent-browser
90
+ eve add channel/slack --skip-install
90
91
  eve add https://example.com/r/my-extension.json --overwrite
91
92
  eve registry add @acme=https://example.com/r/{name}.json
92
93
  eve registry search browser
@@ -95,6 +96,8 @@ eve registry view @acme/my-extension
95
96
  eve add @acme/my-extension
96
97
  ```
97
98
 
99
+ `eve add` asks before running setup declared by an official item and prints the matching `eve add <item> --skip-install` command when setup is skipped or cancelled. `--skip-install` reruns setup without reinstalling the item.
100
+
98
101
  `eve registry add` records configured sources in `package.json#registries`. `eve registry list` and `search` aggregate the official catalog and all configured sources by default, or browse one supplied URL or namespace. Official and other universal items with explicit file targets do not require shadcn project configuration.
99
102
 
100
103
  ## `eve info`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eve",
3
- "version": "0.27.12",
3
+ "version": "0.27.13",
4
4
  "private": false,
5
5
  "description": "Filesystem-first framework for durable backend AI agents that run anywhere.",
6
6
  "keywords": [