eve 0.25.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/public/definitions/hook.d.ts +63 -12
- package/dist/src/public/hooks/index.d.ts +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/package.json +1 -1
- package/dist/src/shared/hook-definition.d.ts +0 -36
- package/dist/src/shared/hook-definition.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.25.
|
|
1
|
+
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{fileURLToPath}from"node:url";let cachedPackageInfo;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.25.1`,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 isBuildOutputPackageRoot(e){return basename(e)===`dist`&&existsSync(join(dirname(e),`package.json`))}function resolvePackageBuildRoot(){let e=dirname(realpathSync(resolveCurrentModulePath()));for(;;){if(isBuildOutputPackageRoot(e))return e;let t=dirname(e);if(t===e)return null;e=t}}function findNearestPackageRoot(e){let n=e;for(;;){if(existsSync(join(n,`package.json`))&&!isBuildOutputPackageRoot(n))return n;let r=dirname(n);if(r===n)throw Error(`Failed to resolve package root from "${e}".`);n=r}}function resolvePackageRoot(){return findNearestPackageRoot(dirname(realpathSync(resolveCurrentModulePath())))}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,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
|
|
@@ -1,7 +1,52 @@
|
|
|
1
1
|
import type { HandleMessageStreamEvent } from "../../protocol/message.js";
|
|
2
2
|
import type { SessionContext } from "./callback-context.js";
|
|
3
3
|
import type { ExactDefinition } from "./exact.js";
|
|
4
|
-
|
|
4
|
+
type ProtocolEvent<TType extends HandleMessageStreamEvent["type"]> = Extract<HandleMessageStreamEvent, {
|
|
5
|
+
type: TType;
|
|
6
|
+
}>;
|
|
7
|
+
/**
|
|
8
|
+
* Public event contract available to authored hooks.
|
|
9
|
+
*
|
|
10
|
+
* The explicit map keeps hook compatibility independent from the internal
|
|
11
|
+
* protocol union: new protocol events do not become extension hook events
|
|
12
|
+
* until eve exposes them here.
|
|
13
|
+
*/
|
|
14
|
+
export interface HookEventMap {
|
|
15
|
+
readonly "action.result": ProtocolEvent<"action.result">;
|
|
16
|
+
readonly "actions.requested": ProtocolEvent<"actions.requested">;
|
|
17
|
+
readonly "authorization.completed": ProtocolEvent<"authorization.completed">;
|
|
18
|
+
readonly "authorization.required": ProtocolEvent<"authorization.required">;
|
|
19
|
+
readonly "compaction.completed": ProtocolEvent<"compaction.completed">;
|
|
20
|
+
readonly "compaction.requested": ProtocolEvent<"compaction.requested">;
|
|
21
|
+
readonly "input.requested": ProtocolEvent<"input.requested">;
|
|
22
|
+
readonly "message.appended": ProtocolEvent<"message.appended">;
|
|
23
|
+
readonly "message.completed": ProtocolEvent<"message.completed">;
|
|
24
|
+
readonly "message.received": ProtocolEvent<"message.received">;
|
|
25
|
+
readonly "reasoning.appended": ProtocolEvent<"reasoning.appended">;
|
|
26
|
+
readonly "reasoning.completed": ProtocolEvent<"reasoning.completed">;
|
|
27
|
+
readonly "result.completed": ProtocolEvent<"result.completed">;
|
|
28
|
+
readonly "session.completed": ProtocolEvent<"session.completed">;
|
|
29
|
+
readonly "session.failed": ProtocolEvent<"session.failed">;
|
|
30
|
+
readonly "session.started": ProtocolEvent<"session.started">;
|
|
31
|
+
readonly "session.waiting": ProtocolEvent<"session.waiting">;
|
|
32
|
+
readonly "step.completed": ProtocolEvent<"step.completed">;
|
|
33
|
+
readonly "step.failed": ProtocolEvent<"step.failed">;
|
|
34
|
+
readonly "step.started": ProtocolEvent<"step.started">;
|
|
35
|
+
readonly "subagent.called": ProtocolEvent<"subagent.called">;
|
|
36
|
+
readonly "subagent.completed": ProtocolEvent<"subagent.completed">;
|
|
37
|
+
readonly "subagent.event": ProtocolEvent<"subagent.event">;
|
|
38
|
+
readonly "subagent.started": ProtocolEvent<"subagent.started">;
|
|
39
|
+
readonly "turn.cancelled": ProtocolEvent<"turn.cancelled">;
|
|
40
|
+
readonly "turn.completed": ProtocolEvent<"turn.completed">;
|
|
41
|
+
readonly "turn.failed": ProtocolEvent<"turn.failed">;
|
|
42
|
+
readonly "turn.started": ProtocolEvent<"turn.started">;
|
|
43
|
+
}
|
|
44
|
+
/** Event type discriminators available to authored hooks. */
|
|
45
|
+
export type HookEventType = keyof HookEventMap;
|
|
46
|
+
/** Authored hook event keys, including the wildcard subscriber. */
|
|
47
|
+
export type HookEventKey = HookEventType | "*";
|
|
48
|
+
/** Event received by a handler for one authored hook event key. */
|
|
49
|
+
export type HookEvent<TKey extends HookEventKey = HookEventType> = TKey extends HookEventType ? HookEventMap[TKey] : HookEventMap[HookEventType];
|
|
5
50
|
/**
|
|
6
51
|
* Every hook handler receives this context.
|
|
7
52
|
*
|
|
@@ -21,9 +66,9 @@ export interface HookContext extends SessionContext {
|
|
|
21
66
|
/**
|
|
22
67
|
* Side-effect-only handler for one accepted runtime stream event.
|
|
23
68
|
*
|
|
24
|
-
* `TEvent` is one variant of
|
|
25
|
-
*
|
|
26
|
-
*
|
|
69
|
+
* `TEvent` is one variant of {@link HookEvent}. {@link StreamEventHooks}
|
|
70
|
+
* infers it from the event key. The typed event is the first argument, `ctx`
|
|
71
|
+
* is the last.
|
|
27
72
|
*/
|
|
28
73
|
export type StreamEventHook<TEvent> = (event: TEvent, ctx: HookContext) => void | Promise<void>;
|
|
29
74
|
/**
|
|
@@ -32,7 +77,9 @@ export type StreamEventHook<TEvent> = (event: TEvent, ctx: HookContext) => void
|
|
|
32
77
|
* `*` matches every accepted runtime stream event and runs after the
|
|
33
78
|
* typed handler for that event (if any).
|
|
34
79
|
*/
|
|
35
|
-
export type StreamEventHooks =
|
|
80
|
+
export type StreamEventHooks<TKey extends HookEventKey = HookEventKey> = {
|
|
81
|
+
readonly [TKey_ in TKey]?: StreamEventHook<HookEvent<TKey_>>;
|
|
82
|
+
};
|
|
36
83
|
/**
|
|
37
84
|
* Public hook definition authored in `agent/hooks/*.ts`.
|
|
38
85
|
*
|
|
@@ -42,12 +89,16 @@ export type StreamEventHooks = GenericStreamEventHooks<HandleMessageStreamEvent,
|
|
|
42
89
|
* contribute runtime model messages, use `defineDynamic` +
|
|
43
90
|
* `defineInstructions` in `agent/instructions/`.
|
|
44
91
|
*/
|
|
45
|
-
export
|
|
92
|
+
export interface HookDefinition<TKey extends HookEventKey = HookEventKey> {
|
|
93
|
+
readonly events?: StreamEventHooks<TKey>;
|
|
94
|
+
}
|
|
95
|
+
type DefinedHookEventKeys<TDefinition extends HookDefinition> = Extract<keyof NonNullable<TDefinition["events"]>, HookEventKey>;
|
|
46
96
|
/**
|
|
47
|
-
* Identity-with-types helper. Returns the passed definition unchanged
|
|
48
|
-
*
|
|
49
|
-
* any
|
|
50
|
-
*
|
|
51
|
-
*
|
|
97
|
+
* Identity-with-types helper. Returns the passed definition unchanged at
|
|
98
|
+
* runtime while preserving its authored event keys behind the public
|
|
99
|
+
* {@link HookDefinition} boundary and rejecting any key outside `events`.
|
|
100
|
+
* Authors export
|
|
101
|
+
* `defineHook({ events: { "session.started": (event, ctx) => { ... } } })`.
|
|
52
102
|
*/
|
|
53
|
-
export declare function defineHook<T extends HookDefinition>(definition: ExactDefinition<T, HookDefinition>): T
|
|
103
|
+
export declare function defineHook<const T extends HookDefinition>(definition: ExactDefinition<T, HookDefinition>): HookDefinition<DefinedHookEventKeys<T>>;
|
|
104
|
+
export {};
|
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
* See {@link defineHook} for the authoring shape and
|
|
6
6
|
* {@link HookContext} for the runtime context every handler receives.
|
|
7
7
|
*/
|
|
8
|
-
export { type HookContext, type HookDefinition, type StreamEventHook, type StreamEventHooks, defineHook, } from "#public/definitions/hook.js";
|
|
8
|
+
export { type HookContext, type HookDefinition, type HookEvent, type HookEventKey, type HookEventMap, type HookEventType, type StreamEventHook, type StreamEventHooks, defineHook, } from "#public/definitions/hook.js";
|
|
@@ -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.26`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.25.
|
|
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.26`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.0`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.25.1`,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__",
|
package/package.json
CHANGED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
type BaseEvent = {
|
|
2
|
-
type: string;
|
|
3
|
-
};
|
|
4
|
-
/**
|
|
5
|
-
* Side-effect-only handler for one accepted runtime stream event.
|
|
6
|
-
*
|
|
7
|
-
* `TEvent` is one variant of the runtime stream-event union.
|
|
8
|
-
* {@link GenericStreamEventHooks} infers `TEvent` from the event key.
|
|
9
|
-
*/
|
|
10
|
-
export type GenericStreamEventHook<TEvent extends BaseEvent, TContext> = (event: TEvent, ctx: TContext) => void | Promise<void>;
|
|
11
|
-
/**
|
|
12
|
-
* Map of stream-event subscribers an authored hook file may declare.
|
|
13
|
-
*
|
|
14
|
-
* `*` matches every accepted runtime stream event and runs after the
|
|
15
|
-
* typed handler for that event (if any).
|
|
16
|
-
*/
|
|
17
|
-
export type GenericStreamEventHooks<TEvent extends BaseEvent, TContext> = {
|
|
18
|
-
readonly "*"?: GenericStreamEventHook<TEvent, TContext>;
|
|
19
|
-
} & {
|
|
20
|
-
readonly [K in TEvent["type"]]?: GenericStreamEventHook<Extract<TEvent, {
|
|
21
|
-
type: K;
|
|
22
|
-
}>, TContext>;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Public hook definition authored in `agent/hooks/*.ts`.
|
|
26
|
-
*
|
|
27
|
-
* Hook files declare stream-event subscribers (under `events:`) that
|
|
28
|
-
* fire after eve has accepted and durably recorded each event.
|
|
29
|
-
* Handlers are observe-only: they cannot inject model context. To
|
|
30
|
-
* contribute runtime model messages, use `defineDynamic` +
|
|
31
|
-
* `defineInstructions` in `agent/instructions/`.
|
|
32
|
-
*/
|
|
33
|
-
export interface GenericHookDefinition<TEvent extends BaseEvent, TContext> {
|
|
34
|
-
readonly events?: GenericStreamEventHooks<TEvent, TContext>;
|
|
35
|
-
}
|
|
36
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{};
|