eve 0.29.4 → 0.29.5
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 +13 -0
- package/dist/src/channel/clear-session.d.ts +4 -0
- package/dist/src/channel/clear-session.js +1 -0
- package/dist/src/channel/compact-session.d.ts +4 -0
- package/dist/src/channel/compact-session.js +1 -0
- package/dist/src/channel/routes.d.ts +34 -6
- package/dist/src/channel/types.d.ts +61 -9
- package/dist/src/chunks/{use-eve-agent-8mofdZcO.js → use-eve-agent-BXMIf5fR.js} +85 -1
- package/dist/src/chunks/{use-eve-agent-bKJbH0k4.js → use-eve-agent-k-XHfrJT.js} +85 -1
- package/dist/src/cli/dev/tui/message-queue.d.ts +9 -13
- package/dist/src/cli/dev/tui/message-queue.js +1 -1
- package/dist/src/cli/dev/tui/prompt-commands.d.ts +13 -5
- package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
- package/dist/src/cli/dev/tui/runner.d.ts +7 -7
- package/dist/src/cli/dev/tui/runner.js +1 -1
- package/dist/src/cli/dev/tui/subagent-pump.d.ts +5 -5
- package/dist/src/cli/dev/tui/terminal-renderer.js +1 -1
- package/dist/src/client/agent-info-schema.d.ts +2 -2
- package/dist/src/client/agent-info-schema.js +1 -1
- package/dist/src/client/index.d.ts +1 -1
- package/dist/src/client/session.d.ts +15 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/types.d.ts +20 -0
- package/dist/src/compiler/extension-compatibility.d.ts +8 -8
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +11 -22
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.d.ts +3 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/compiler/normalize-subagent.d.ts +1 -0
- package/dist/src/compiler/normalize-subagent.js +1 -1
- package/dist/src/compiler/remote-agent-node.d.ts +3 -0
- package/dist/src/context/dynamic-subagent-lifecycle.d.ts +22 -0
- package/dist/src/context/dynamic-subagent-lifecycle.js +1 -0
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/context/keys.d.ts +13 -2
- package/dist/src/context/keys.js +1 -1
- package/dist/src/context/run-step.js +1 -1
- package/dist/src/execution/create-session-step.d.ts +2 -0
- package/dist/src/execution/create-session-step.js +1 -1
- package/dist/src/execution/delegation-tool.d.ts +3 -0
- package/dist/src/execution/delegation-tool.js +1 -0
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/dispatch-workflow-runtime-actions-step.js +1 -1
- package/dist/src/execution/effective-agent-config.d.ts +12 -0
- package/dist/src/execution/effective-agent-config.js +1 -0
- package/dist/src/execution/node-step.d.ts +4 -0
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/runtime-context.d.ts +2 -0
- package/dist/src/execution/runtime-context.js +1 -1
- package/dist/src/execution/session-callback-request.d.ts +5 -0
- package/dist/src/execution/session-callback-request.js +1 -0
- package/dist/src/execution/session-delivery-hook.d.ts +1 -0
- package/dist/src/execution/session-delivery-hook.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/subagent-event-proxy-step.js +1 -1
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +2 -0
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/agent-handles.d.ts +238 -0
- package/dist/src/harness/agent-handles.js +2 -0
- package/dist/src/harness/compaction.d.ts +1 -1
- package/dist/src/harness/compaction.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/types.d.ts +16 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/core.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +1 -1
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
- package/dist/src/internal/vercel-agent-summary.d.ts +1 -1
- package/dist/src/protocol/clear-session.d.ts +14 -0
- package/dist/src/protocol/clear-session.js +1 -0
- package/dist/src/protocol/compact-session.d.ts +14 -0
- package/dist/src/protocol/compact-session.js +1 -0
- package/dist/src/protocol/message.d.ts +19 -1
- package/dist/src/protocol/message.js +1 -1
- package/dist/src/protocol/routes.d.ts +10 -0
- package/dist/src/protocol/routes.js +1 -1
- package/dist/src/public/channels/eve.js +1 -1
- package/dist/src/public/channels/index.d.ts +1 -1
- package/dist/src/public/definitions/agent.d.ts +32 -1
- package/dist/src/public/definitions/agent.js +1 -1
- package/dist/src/public/definitions/channel.d.ts +5 -2
- package/dist/src/public/definitions/channel.js +1 -1
- package/dist/src/public/definitions/hook.d.ts +1 -0
- package/dist/src/public/definitions/tool.d.ts +4 -1
- package/dist/src/public/index.d.ts +1 -2
- package/dist/src/public/index.js +1 -1
- package/dist/src/runtime/framework-tools/connection-search-dynamic.d.ts +2 -18
- package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
- package/dist/src/runtime/framework-tools/index.d.ts +7 -2
- package/dist/src/runtime/framework-tools/index.js +1 -1
- package/dist/src/runtime/resolve-agent-graph.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/runtime/resolve-dynamic-subagent.d.ts +12 -0
- package/dist/src/runtime/resolve-dynamic-subagent.js +1 -0
- package/dist/src/runtime/resolve-dynamic-tool.d.ts +15 -0
- package/dist/src/runtime/resolve-dynamic-tool.js +1 -1
- package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +22 -0
- package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -0
- package/dist/src/runtime/subagents/registry.d.ts +10 -2
- package/dist/src/runtime/subagents/registry.js +1 -1
- package/dist/src/runtime/types.d.ts +11 -2
- package/dist/src/setup/flows/registry.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +7 -0
- package/dist/src/shared/agent-turn-outcome.d.ts +47 -0
- package/dist/src/shared/agent-turn-outcome.js +1 -0
- package/dist/src/shared/dynamic-tool-definition.d.ts +1 -5
- package/dist/src/shared/dynamic-tool-definition.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/channels/custom.mdx +41 -1
- package/docs/channels/eve.mdx +26 -1
- package/docs/concepts/default-harness.md +4 -0
- package/docs/guides/client/streaming.mdx +14 -0
- package/docs/guides/dev-tui.md +10 -7
- package/docs/guides/dynamic-capabilities.md +49 -6
- package/docs/reference/project-layout.md +1 -1
- package/docs/reference/typescript-api.md +48 -48
- package/docs/subagents.mdx +32 -2
- package/package.json +2 -2
package/dist/src/public/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineDynamic}from"#public/definitions/
|
|
1
|
+
import{defineAgent,defineDynamic}from"#public/definitions/agent.js";import{defineRemoteAgent}from"#public/definitions/remote-agent.js";export{defineAgent,defineDynamic,defineRemoteAgent};
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import type { ResolvedDynamicToolResolver } from "#runtime/types.js";
|
|
2
|
-
import type { DynamicToolEvents } from "#shared/dynamic-tool-definition.js";
|
|
3
1
|
import type { ModelMessage } from "ai";
|
|
4
2
|
interface ConnectionSearchResultItem {
|
|
5
3
|
readonly connection: string;
|
|
@@ -17,19 +15,5 @@ interface ConnectionSearchResultItem {
|
|
|
17
15
|
* returns deduplicated tool metadata (latest result wins per qualifiedName).
|
|
18
16
|
*/
|
|
19
17
|
export declare function extractDiscoveredTools(messages: readonly ModelMessage[]): ConnectionSearchResultItem[];
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
* The resolver subscribes to `step.started` so it re-derives the tool
|
|
24
|
-
* set from conversation history on every step. After compaction, old
|
|
25
|
-
* `connection_search` results disappear from messages and discovered
|
|
26
|
-
* tools naturally drop from the toolset.
|
|
27
|
-
*/
|
|
28
|
-
export declare function createConnectionSearchEvents(): DynamicToolEvents;
|
|
29
|
-
/**
|
|
30
|
-
* Creates a `ResolvedDynamicToolResolver` for the framework connection
|
|
31
|
-
* search tool. Used by graph resolution to register alongside authored
|
|
32
|
-
* dynamic tool resolvers.
|
|
33
|
-
*/
|
|
34
|
-
export declare function createConnectionSearchResolver(): ResolvedDynamicToolResolver;
|
|
35
|
-
export {};
|
|
18
|
+
declare const connectionSearchDynamicDefinition: import("../../index.ts").DynamicSentinel<Record<string, object> | null>;
|
|
19
|
+
export default connectionSearchDynamicDefinition;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{z}from"#compiled/zod/index.js";import{toError}from"#shared/errors.js";import{loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{ConnectionAuthorizationFailedError,isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#public/connections/errors.js";import{getAuthorizationResult,getHookUrl,requestAuthorization}from"#harness/authorization.js";import{supportsInteractiveAuthorization}from"#runtime/connections/types.js";import{resolveAuthorizationCallbackUrl,stampChallengeDisplayName}from"#runtime/connections/scoped-authorization.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{principalKey,resolveConnectionPrincipal}from"#runtime/connections/principal.js";const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=z.strictObject({connection:z.string().describe(`Optional: limit search to a specific connection name.`).optional(),keywords:z.string().describe(`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`),limit:z.number().describe(`Max results to return. Default 10.`).optional()}),connectionSchema=z.looseObject({}),CONNECTION_SEARCH_RESULT_ITEM_SCHEMA=z.strictObject({connection:z.string(),description:z.string(),error:z.string().optional(),inputSchema:connectionSchema.optional(),needsAuthorization:z.boolean().optional(),outputSchema:connectionSchema.optional(),qualifiedName:z.string().optional(),tool:z.string().optional()}),CONNECTION_SEARCH_OUTPUT_SCHEMA=z.array(CONNECTION_SEARCH_RESULT_ITEM_SCHEMA),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(supportsInteractiveAuthorization(r))return r}async function completePendingAuthorizations(e){let t=loadContext(),n=new Set;for(let r of e.getConnections()){let i=getAuthorizationResult(r.connectionName);if(!i)continue;let a=await resolveInteractiveAuth(e,r.connectionName);if(!a)continue;let o=resolveConnectionPrincipal(r.connectionName,a),s=await a.completeAuthorization({callbackUrl:i.hookUrl,connection:{url:r.url??``},principal:o,resume:i.resume,callback:i.callback});writeCachedToken(t,r.connectionName,principalKey(o),s),n.add(r.connectionName)}return n}async function executeConnectionSearch(e){let t=loadContext(),i=t.get(ConnectionRegistryKey);if(i===void 0)return[];let o=await completePendingAuthorizations(i),
|
|
2
|
-
`));
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{z}from"#compiled/zod/index.js";import{toError}from"#shared/errors.js";import{loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{ConnectionAuthorizationFailedError,isConnectionAuthorizationFailedError,isConnectionAuthorizationRequiredError}from"#public/connections/errors.js";import{getAuthorizationResult,getHookUrl,requestAuthorization}from"#harness/authorization.js";import{supportsInteractiveAuthorization}from"#runtime/connections/types.js";import{resolveAuthorizationCallbackUrl,stampChallengeDisplayName}from"#runtime/connections/scoped-authorization.js";import{defineDynamic,defineTool}from"#public/definitions/tool.js";import{resolveConnectionAuthorization}from"#runtime/connections/resolve-authorization.js";import{writeCachedToken}from"#runtime/connections/authorization-tokens.js";import{principalKey,resolveConnectionPrincipal}from"#runtime/connections/principal.js";var __eveStepRegistrySym=Symbol.for(`@workflow/core//registeredSteps`);globalThis[__eveStepRegistrySym]||(globalThis[__eveStepRegistrySym]=new Map);var __eveStepRegistry=globalThis[__eveStepRegistrySym];const logger=createLogger(`framework.connection-search-dynamic`),CONNECTION_SEARCH_INPUT_SCHEMA=z.strictObject({connection:z.string().describe(`Optional: limit search to a specific connection name.`).optional(),keywords:z.string().describe(`Search keywords and expanded aliases. Distill intent into keywords; avoid stop words like 'a', 'the', 'in'.`),limit:z.number().describe(`Max results to return. Default 10.`).optional()}),connectionSchema=z.looseObject({}),CONNECTION_SEARCH_RESULT_ITEM_SCHEMA=z.strictObject({connection:z.string(),description:z.string(),error:z.string().optional(),inputSchema:connectionSchema.optional(),needsAuthorization:z.boolean().optional(),outputSchema:connectionSchema.optional(),qualifiedName:z.string().optional(),tool:z.string().optional()}),CONNECTION_SEARCH_OUTPUT_SCHEMA=z.array(CONNECTION_SEARCH_RESULT_ITEM_SCHEMA),ConnectionSearchResultsKey=new ContextKey(`eve.connectionSearchResults`);function qualifiedConnectionToolName(e,t){return`${e}__${t}`}function tokenize(e){return e.toLowerCase().split(/[\s_\-./]+/).filter(e=>e.length>1)}function scoreMatch(e,t){let n=tokenize(t.name),r=tokenize(t.description),i=0;for(let t of e){for(let e of n)(e.includes(t)||t.includes(e))&&(i+=3);for(let e of r)(e.includes(t)||t.includes(e))&&(i+=1)}return i}async function resolveInteractiveAuth(e,t){let n=e.getConnections().find(e=>e.connectionName===t);if(n===void 0)return;let r=await resolveConnectionAuthorization(n);if(supportsInteractiveAuthorization(r))return r}async function completePendingAuthorizations(e){let t=loadContext(),n=new Set;for(let r of e.getConnections()){let i=getAuthorizationResult(r.connectionName);if(!i)continue;let a=await resolveInteractiveAuth(e,r.connectionName);if(!a)continue;let o=resolveConnectionPrincipal(r.connectionName,a),s=await a.completeAuthorization({callbackUrl:i.hookUrl,connection:{url:r.url??``},principal:o,resume:i.resume,callback:i.callback});writeCachedToken(t,r.connectionName,principalKey(o),s),n.add(r.connectionName)}return n}async function executeConnectionSearch(e){let t=loadContext(),i=t.get(ConnectionRegistryKey);if(i===void 0)return[];let o=await completePendingAuthorizations(i),l=e.limit??10,d=tokenize(e.keywords),f=[],p=[],m=e.connection!==void 0&&e.connection!==``?i.getConnections().filter(t=>t.connectionName===e.connection):i.getConnections();if(e.connection&&m.length===0)throw Error(`Connection "${e.connection}" is not registered. Available connections: ${i.getConnectionNames().join(`, `)}.`);let h=[];for(let e of m){let t;try{t=await i.getClient(e.connectionName).getToolMetadata()}catch(t){if(isConnectionAuthorizationRequiredError(t)){if(o.has(e.connectionName)){logger.warn(`connection still unauthorized after authorization`,{connection:e.connectionName}),p.push({connection:e.connectionName,description:e.description,error:`Authorization for "${e.connectionName}" did not take effect; the token was rejected after sign-in.`});continue}let t=await resolveInteractiveAuth(i,e.connectionName);if(t){let r=getHookUrl(e.connectionName);if(r){let i=resolveConnectionPrincipal(e.connectionName,t),a=resolveAuthorizationCallbackUrl({authorization:t,callbackUrl:r});try{let{challenge:n,resume:r}=await t.startAuthorization({callbackUrl:a,connection:{url:e.url??``},principal:i});h.push({name:e.connectionName,challenge:stampChallengeDisplayName(n,t),hookUrl:a,resume:r})}catch(t){let r=toError(t);logger.warn(`startAuthorization failed`,{connection:e.connectionName,error:r}),p.push({connection:e.connectionName,description:e.description,error:`Failed to start authorization for "${e.connectionName}": ${r.message}`});continue}}}p.push({connection:e.connectionName,description:e.description,needsAuthorization:!0});continue}if(isConnectionAuthorizationFailedError(t)){logger.warn(`connection authorization failed`,{connection:e.connectionName,reason:t.reason,retryable:t.retryable,error:t}),p.push({connection:e.connectionName,description:e.description,error:`Authorization failed for ${e.connectionName}: ${t.message}`});continue}let r=toError(t);logger.warn(`failed to load connection tools`,{connection:e.connectionName,error:r}),p.push({connection:e.connectionName,description:e.description,error:`Failed to load tools for "${e.connectionName}": ${r.message}`});continue}for(let n of t){let t=scoreMatch(d,n);t>0&&f.push({item:{connection:e.connectionName,description:n.description,inputSchema:n.inputSchema,outputSchema:n.outputSchema,qualifiedName:qualifiedConnectionToolName(e.connectionName,n.name),tool:n.name},score:t})}}if(h.length>0)return requestAuthorization(h);let g=p.filter(e=>e.error!==void 0);if(m.length>0&&g.length===m.length)throw Error(g.map(e=>e.error).join(`
|
|
2
|
+
`));f.sort((e,t)=>t.score-e.score);let _=f.slice(0,l).map(e=>e.item);if(_.length>0){let e=[..._,...p],n=t.get(ConnectionSearchResultsKey)??[],r=new Map(n.map(e=>[e.qualifiedName,e]));for(let e of _)e.qualifiedName&&r.set(e.qualifiedName,e);return t.set(ConnectionSearchResultsKey,[...r.values()]),e}return m.map(e=>p.find(t=>t.connection===e.connectionName)||{connection:e.connectionName,description:e.description})}function extractDiscoveredTools(e){let t=new Map;for(let n of e){if(n.role!==`tool`)continue;let e=n.content;for(let n of e){if(n.type!==`tool-result`||n.toolName!==`connection_search`)continue;let e=n.output;if(e==null)continue;let r=typeof e==`object`&&`type`in e&&`value`in e?e.value:e;if(Array.isArray(r))for(let e of r)e.tool&&e.qualifiedName&&t.set(e.qualifiedName,e)}}return[...t.values()]}const connectionSearchDynamicDefinition=defineDynamic({events:{"step.started":async(e,t)=>{let n=loadContext().get(ConnectionRegistryKey);if(!n||n.getConnections().length===0)return null;let i=n.getConnections().map(e=>e.connectionName),o=extractDiscoveredTools(t.messages),s=loadContext().get(ConnectionSearchResultsKey)??[],c=new Map;for(let e of s)e.qualifiedName&&c.set(e.qualifiedName,e);for(let e of o)e.qualifiedName&&c.set(e.qualifiedName,e);let l=[...c.values()],u={};u.connection_search=defineTool({description:`Search for tools across your connections. Discovered tools become directly callable by their qualified name (e.g. \`linear__list_issues\`) in your next response. Available connections: ${i.join(`, `)}.`,inputSchema:CONNECTION_SEARCH_INPUT_SCHEMA,execute:async e=>await __eve_dynamic_exec_0({},e),__executeStepFn:__eve_dynamic_exec_0,__closureVars:{},outputSchema:CONNECTION_SEARCH_OUTPUT_SCHEMA});for(let e of l){let r=e.connection,i=e.tool,a=n.getConnectionApproval(r);u[qualifiedConnectionToolName(r,i)]=defineTool({description:e.description,inputSchema:e.inputSchema??{type:`object`},approval:a,outputSchema:e.outputSchema,execute:async(e,n)=>await __eve_dynamic_exec_1({ctx:t,connectionName:r,toolName:i},e,n),__executeStepFn:__eve_dynamic_exec_1,__closureVars:{ctx:t,connectionName:r,toolName:i}})}return u}}});async function __eve_dynamic_exec_0(e,t){return executeConnectionSearch(t)}async function __eve_dynamic_exec_1(e,t,n){let{ctx:i,connectionName:s,toolName:d}=e,f=loadContext().get(ConnectionRegistryKey),p=f.getConnections().find(e=>e.connectionName===s),m=await resolveInteractiveAuth(f,s),_=!1;if(m){let e=getAuthorizationResult(s);if(e){_=!0;let t=loadContext(),n=resolveConnectionPrincipal(s,m),i=await m.completeAuthorization({callbackUrl:e.hookUrl,connection:{url:p?.url??``},principal:n,resume:e.resume,callback:e.callback});writeCachedToken(t,s,principalKey(n),i)}}try{return await f.getClient(s).executeTool(d,t,{abortSignal:n.abortSignal})}catch(e){if(!isConnectionAuthorizationRequiredError(e)||!m)throw e;if(_)throw new ConnectionAuthorizationFailedError(s,{retryable:!1,reason:`token_rejected_after_authorization`,message:`Connection "${s}" rejected the token immediately after authorization.`});let t=getHookUrl(s);if(!t)throw e;let n=resolveConnectionPrincipal(s,m),r=resolveAuthorizationCallbackUrl({authorization:m,callbackUrl:t}),{challenge:i,resume:a}=await m.startAuthorization({callbackUrl:r,connection:{url:p?.url??``},principal:n});return requestAuthorization([{name:s,challenge:stampChallengeDisplayName(i,m),hookUrl:r,resume:a}])}}__eve_dynamic_exec_0.stepId=`eve:dynamic-tool//__eve_dynamic_exec_0`,__eveStepRegistry.set(`eve:dynamic-tool//__eve_dynamic_exec_0`,__eve_dynamic_exec_0),__eve_dynamic_exec_1.stepId=`eve:dynamic-tool//__eve_dynamic_exec_1`,__eveStepRegistry.set(`eve:dynamic-tool//__eve_dynamic_exec_1`,__eve_dynamic_exec_1);export{connectionSearchDynamicDefinition as default,extractDiscoveredTools};
|
|
@@ -3,7 +3,7 @@ export type { ReadFileStamp, ReadFileState } from "#runtime/framework-tools/file
|
|
|
3
3
|
export { ReadFileStateKey } from "#runtime/framework-tools/file-state.js";
|
|
4
4
|
export type { TodoItem, TodoState } from "#runtime/framework-tools/todo.js";
|
|
5
5
|
export { TodoStateKey } from "#runtime/framework-tools/todo.js";
|
|
6
|
-
import type { ResolvedSkillDefinition, ResolvedToolDefinition } from "#runtime/types.js";
|
|
6
|
+
import type { ResolvedDynamicToolResolver, ResolvedSkillDefinition, ResolvedToolDefinition } from "#runtime/types.js";
|
|
7
7
|
/**
|
|
8
8
|
* Returns framework-owned tool definitions registered in the tool registry
|
|
9
9
|
* alongside authored tools during graph resolution.
|
|
@@ -13,8 +13,13 @@ import type { ResolvedSkillDefinition, ResolvedToolDefinition } from "#runtime/t
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function getFrameworkToolDefinitions(config?: {
|
|
15
15
|
readonly authoredSkills?: readonly ResolvedSkillDefinition[];
|
|
16
|
-
readonly hasConnections?: boolean;
|
|
17
16
|
}): readonly ResolvedToolDefinition[];
|
|
17
|
+
/**
|
|
18
|
+
* Returns framework-owned dynamic tool resolvers.
|
|
19
|
+
* Framework definitions use the public `defineDynamic()` contract and enter
|
|
20
|
+
* the same loaded-definition resolver path as authored dynamic tools.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getFrameworkDynamicToolResolvers(): readonly ResolvedDynamicToolResolver[];
|
|
18
23
|
/**
|
|
19
24
|
* Returns every static framework-owned tool definition, including tools such
|
|
20
25
|
* as `agent` that the runtime does not register in the tool registry.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{ReadFileStateKey}from"#runtime/framework-tools/file-state.js";import{TODO_TOOL_DEFINITION,TodoStateKey}from"#runtime/framework-tools/todo.js";import{AGENT_TOOL_DEFINITION}from"#runtime/framework-tools/agent.js";import{ASK_QUESTION_TOOL_DEFINITION}from"#runtime/framework-tools/ask-question.js";import{WEB_SEARCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-search.js";import{BASH_TOOL_DEFINITION}from"#runtime/framework-tools/bash.js";import{GLOB_TOOL_DEFINITION}from"#runtime/framework-tools/glob.js";import{GREP_TOOL_DEFINITION}from"#runtime/framework-tools/grep.js";import{READ_FILE_TOOL_DEFINITION}from"#runtime/framework-tools/read-file.js";import{SKILL_TOOL_DEFINITION,createSkillToolDefinition}from"#runtime/framework-tools/skill.js";import{WEB_FETCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-fetch.js";import{WRITE_FILE_TOOL_DEFINITION}from"#runtime/framework-tools/write-file.js";const REGISTERED_FRAMEWORK_TOOLS=[ASK_QUESTION_TOOL_DEFINITION,BASH_TOOL_DEFINITION,GLOB_TOOL_DEFINITION,GREP_TOOL_DEFINITION,READ_FILE_TOOL_DEFINITION,WRITE_FILE_TOOL_DEFINITION,TODO_TOOL_DEFINITION,WEB_FETCH_TOOL_DEFINITION,WEB_SEARCH_TOOL_DEFINITION,SKILL_TOOL_DEFINITION],ALL_FRAMEWORK_TOOLS=[...REGISTERED_FRAMEWORK_TOOLS,AGENT_TOOL_DEFINITION];function getFrameworkToolDefinitions(e){let t=e?.authoredSkills;return t===void 0?REGISTERED_FRAMEWORK_TOOLS:REGISTERED_FRAMEWORK_TOOLS.map(e=>e.name===SKILL_TOOL_DEFINITION.name?createSkillToolDefinition(t):e)}function getAllFrameworkToolDefinitions(){return ALL_FRAMEWORK_TOOLS}function getAllFrameworkToolNames(){return new Set(ALL_FRAMEWORK_TOOLS.map(e=>e.name))}export{ConnectionRegistryKey,ReadFileStateKey,TodoStateKey,getAllFrameworkToolDefinitions,getAllFrameworkToolNames,getFrameworkToolDefinitions};
|
|
1
|
+
import{ConnectionRegistryKey}from"#context/providers/connection-key.js";import{ReadFileStateKey}from"#runtime/framework-tools/file-state.js";import{TODO_TOOL_DEFINITION,TodoStateKey}from"#runtime/framework-tools/todo.js";import{AGENT_TOOL_DEFINITION}from"#runtime/framework-tools/agent.js";import{ASK_QUESTION_TOOL_DEFINITION}from"#runtime/framework-tools/ask-question.js";import{WEB_SEARCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-search.js";import{BASH_TOOL_DEFINITION}from"#runtime/framework-tools/bash.js";import{GLOB_TOOL_DEFINITION}from"#runtime/framework-tools/glob.js";import{GREP_TOOL_DEFINITION}from"#runtime/framework-tools/grep.js";import{READ_FILE_TOOL_DEFINITION}from"#runtime/framework-tools/read-file.js";import{SKILL_TOOL_DEFINITION,createSkillToolDefinition}from"#runtime/framework-tools/skill.js";import{WEB_FETCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-fetch.js";import{WRITE_FILE_TOOL_DEFINITION}from"#runtime/framework-tools/write-file.js";import connectionSearchDynamicDefinition from"#runtime/framework-tools/connection-search-dynamic.js";import{resolveLoadedDynamicToolDefinition}from"#runtime/resolve-dynamic-tool.js";const REGISTERED_FRAMEWORK_DYNAMIC_TOOLS=[{definition:connectionSearchDynamicDefinition,logicalPath:`eve:framework/connection-search-dynamic`,slug:`connection`,sourceId:`eve:connection-search-dynamic`}],REGISTERED_FRAMEWORK_TOOLS=[ASK_QUESTION_TOOL_DEFINITION,BASH_TOOL_DEFINITION,GLOB_TOOL_DEFINITION,GREP_TOOL_DEFINITION,READ_FILE_TOOL_DEFINITION,WRITE_FILE_TOOL_DEFINITION,TODO_TOOL_DEFINITION,WEB_FETCH_TOOL_DEFINITION,WEB_SEARCH_TOOL_DEFINITION,SKILL_TOOL_DEFINITION],ALL_FRAMEWORK_TOOLS=[...REGISTERED_FRAMEWORK_TOOLS,AGENT_TOOL_DEFINITION];function getFrameworkToolDefinitions(e){let t=e?.authoredSkills;return t===void 0?REGISTERED_FRAMEWORK_TOOLS:REGISTERED_FRAMEWORK_TOOLS.map(e=>e.name===SKILL_TOOL_DEFINITION.name?createSkillToolDefinition(t):e)}function getFrameworkDynamicToolResolvers(){return REGISTERED_FRAMEWORK_DYNAMIC_TOOLS.map(e=>resolveLoadedDynamicToolDefinition(e.definition,{logicalPath:e.logicalPath,slug:e.slug,sourceId:e.sourceId,sourceKind:`module`}))}function getAllFrameworkToolDefinitions(){return ALL_FRAMEWORK_TOOLS}function getAllFrameworkToolNames(){return new Set(ALL_FRAMEWORK_TOOLS.map(e=>e.name))}export{ConnectionRegistryKey,ReadFileStateKey,TodoStateKey,getAllFrameworkToolDefinitions,getAllFrameworkToolNames,getFrameworkDynamicToolResolvers,getFrameworkToolDefinitions};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{expectObjectRecord}from"#internal/authored-module.js";import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{
|
|
1
|
+
import{expectObjectRecord}from"#internal/authored-module.js";import{ROOT_COMPILED_AGENT_NODE_ID}from"#compiler/manifest.js";import{createRuntimeSubagentRegistry}from"#runtime/subagents/registry.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{createRuntimeToolRegistry}from"#runtime/tools/registry.js";import{WORKFLOW_TOOL_NAME}from"#shared/workflow-sandbox.js";import{getAllFrameworkChannelNames,getFrameworkChannelDefinitions}from"#runtime/framework-channels/index.js";import{getAllFrameworkToolNames,getFrameworkDynamicToolResolvers,getFrameworkToolDefinitions}from"#runtime/framework-tools/index.js";import{resolveAgent}from"#runtime/resolve-agent.js";import{loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{createResolvedRuntimeTurnAgent}from"#runtime/agent/bootstrap.js";import{createRuntimeHookRegistry}from"#runtime/hooks/registry.js";import{resolveDynamicSubagentDefinition}from"#runtime/resolve-dynamic-subagent.js";import{createRuntimeSandboxRegistry}from"#runtime/sandbox/registry.js";var ResolveRuntimeAgentGraphError=class extends Error{logicalPath;nodeId;sourceId;constructor(e,t={}){super(e),this.name=`ResolveRuntimeAgentGraphError`,t.logicalPath!==void 0&&(this.logicalPath=t.logicalPath),t.nodeId!==void 0&&(this.nodeId=t.nodeId),t.sourceId!==void 0&&(this.sourceId=t.sourceId)}};async function resolveRuntimeAgentGraph(e){let n=new Map,r=createChildNodeIdsByParentNodeId(e.manifest),i=new Map(e.manifest.subagents.map(e=>[e.nodeId,e]));return{nodesByNodeId:n,root:await resolveRuntimeAgentNode({childNodeIdsByParentNodeId:r,manifest:e.manifest,moduleMap:e.moduleMap,nodeId:ROOT_COMPILED_AGENT_NODE_ID,nodesByNodeId:n,subagentNodesById:i})}}async function resolveRuntimeAgentNode(e){let t=toRuntimeNodeId(e.nodeId);if(e.nodesByNodeId.has(t))throw new ResolveRuntimeAgentGraphError(`Found multiple runtime agent nodes for node id "${t}".`,{nodeId:t,sourceId:e.sourceId});let i=await resolveAgent({manifest:e.manifest,moduleMap:e.moduleMap,nodeId:e.nodeId}),a=getFrameworkToolDefinitions({authoredSkills:i.skills}),o=new Set(a.map(e=>e.name)),s=getAllFrameworkToolNames(),c=new Set(i.tools.map(e=>e.name));for(let n of i.disabledFrameworkTools)if(!s.has(n))throw new ResolveRuntimeAgentGraphError(`agent/tools/${n}.ts exports disableTool() but "${n}" is not a framework tool. Rename the file to one of: ${[...s].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let l=new Set(i.disabledFrameworkTools),u=await createRuntimeToolRegistry({tools:[...a.filter(e=>!c.has(e.name)&&!l.has(e.name)),...i.tools]},{reservedToolNames:[WORKFLOW_TOOL_NAME,...o.has(LOAD_SKILL_TOOL_NAME)||c.has(LOAD_SKILL_TOOL_NAME)?[]:[LOAD_SKILL_TOOL_NAME]]}),d=new Set(i.channels.map(e=>e.name)),f=getAllFrameworkChannelNames();for(let n of i.disabledFrameworkChannels)if(!f.has(n))throw new ResolveRuntimeAgentGraphError(`agent/channels/${n}.ts exports disableRoute() but "${n}" is not a framework channel. Rename the file to one of: ${[...f].sort().join(`, `)}.`,{nodeId:t,sourceId:e.sourceId});let p=new Set(i.disabledFrameworkChannels),m=[...getFrameworkChannelDefinitions().filter(e=>!d.has(e.name)&&!p.has(e.name)),...i.channels],h=createRuntimeSandboxRegistry({authoredSandbox:i.sandbox,workspaceResourceRoot:i.workspaceResourceRoot}),g=createRuntimeSubagentRegistry({reservedToolNames:[LOAD_SKILL_TOOL_NAME,...u.preparedTools.map(e=>e.name)],subagents:await resolveRuntimeSubagents({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,manifest:e.manifest,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,parentNodeId:e.nodeId,subagentNodesById:e.subagentNodesById})}),_={...i,dynamicToolResolvers:[...i.dynamicToolResolvers,...getFrameworkDynamicToolResolvers()]},v={agent:_,channels:m,hookRegistry:createRuntimeHookRegistry(_.hooks),nodeId:t,sandboxRegistry:h,sourceId:e.sourceId,subagentRegistry:g,toolRegistry:u,turnAgent:createResolvedRuntimeTurnAgent({agent:_,nodeId:t,tools:[...u.preparedTools,...g.preparedTools]})};return e.nodesByNodeId.set(t,v),v}async function resolveRuntimeSubagents(e){let t=[],n=e.childNodeIdsByParentNodeId.get(e.parentNodeId)??[];for(let r of n){let n=e.subagentNodesById.get(r);if(n===void 0)throw new ResolveRuntimeAgentGraphError(`Missing compiled subagent node "${r}" while resolving runtime subagents.`,{nodeId:toRuntimeNodeId(e.parentNodeId),sourceId:r});t.push(await resolveRuntimeSubagent({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,moduleMap:e.moduleMap,nodesByNodeId:e.nodesByNodeId,sourceRef:n,subagentNodesById:e.subagentNodesById}))}for(let n of e.manifest.remoteAgents)t.push(await resolveRuntimeRemoteAgent({moduleMap:e.moduleMap,nodeScopeId:e.parentNodeId,sourceRef:n}));return t}async function resolveRuntimeSubagent(e){let t=e.sourceRef.agent.config.source;if(e.sourceRef.dynamic!==void 0&&t===void 0)throw new ResolveRuntimeAgentGraphError(`Dynamic subagent "${e.sourceRef.logicalPath}" is missing its agent config source.`,{nodeId:toRuntimeNodeId(e.sourceRef.nodeId),sourceId:e.sourceRef.sourceId});let n={...e.sourceRef.dynamic===void 0?{description:e.sourceRef.description}:{dynamic:await resolveDynamicSubagentDefinition({definition:{...t,...e.sourceRef.dynamic},moduleMap:e.moduleMap,nodeId:e.sourceRef.nodeId})},kind:`subagent`,logicalPath:e.sourceRef.logicalPath,name:e.sourceRef.name,nodeId:toRuntimeNodeId(e.sourceRef.nodeId),sourceId:e.sourceRef.sourceId,sourceKind:`module`};return await resolveRuntimeAgentNode({childNodeIdsByParentNodeId:e.childNodeIdsByParentNodeId,manifest:e.sourceRef.agent,moduleMap:e.moduleMap,nodeId:e.sourceRef.nodeId,nodesByNodeId:e.nodesByNodeId,sourceId:e.sourceRef.sourceId,subagentNodesById:e.subagentNodesById}),n}async function resolveRuntimeRemoteAgent(t){let n=expectObjectRecord(await loadResolvedModuleExport({definition:t.sourceRef,kindLabel:`remote agent`,moduleMap:t.moduleMap,nodeId:t.nodeScopeId}),`Expected remote agent source "${t.sourceRef.logicalPath}" to export an object.`),r={description:t.sourceRef.description,kind:`remote`,logicalPath:t.sourceRef.logicalPath,name:t.sourceRef.name,nodeId:toRuntimeNodeId(t.sourceRef.nodeId),outputSchema:t.sourceRef.outputSchema,path:t.sourceRef.path,sourceId:t.sourceRef.sourceId,sourceKind:`module`,url:await resolveRemoteAgentUrl({bakedUrl:t.sourceRef.url,logicalPath:t.sourceRef.logicalPath,resolvedUrl:n.url})};typeof n.auth==`function`&&(r.auth=n.auth),n.forwardPrincipal===!0&&(r.forwardPrincipal=!0);let i=resolveRemoteAgentHeaders(n.headers);return i!==void 0&&(r.headers=i),r}async function resolveRemoteAgentUrl(e){if(typeof e.resolvedUrl==`function`){let t=await e.resolvedUrl();if(typeof t!=`string`||t.length===0)throw Error(`Remote agent "${e.logicalPath}" url function must return a non-empty string.`);return t}let t=e.bakedUrl??(typeof e.resolvedUrl==`string`?e.resolvedUrl:``);if(t.length===0)throw Error(`Remote agent "${e.logicalPath}" is missing a url.`);return t}function resolveRemoteAgentHeaders(e){if(e===void 0)return;if(typeof e==`function`)return e;if(typeof e!=`object`||!e||Array.isArray(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function createChildNodeIdsByParentNodeId(e){let t=new Map;for(let n of e.subagentEdges){let e=t.get(n.parentNodeId);if(e===void 0){t.set(n.parentNodeId,[n.childNodeId]);continue}e.push(n.childNodeId)}return t}function toRuntimeNodeId(e){return e===ROOT_COMPILED_AGENT_NODE_ID?ROOT_RUNTIME_AGENT_NODE_ID:e}export{resolveRuntimeAgentGraph};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ResolveAgentError,createResolvedModuleSourceRef}from"#runtime/resolve-helpers.js";import{
|
|
1
|
+
import{ResolveAgentError,createResolvedModuleSourceRef}from"#runtime/resolve-helpers.js";import{resolveDynamicToolDefinition}from"#runtime/resolve-dynamic-tool.js";import{resolveChannelDefinition}from"#runtime/resolve-channel.js";import{resolveConnectionDefinition}from"#runtime/resolve-connection.js";import{resolveHookDefinition}from"#runtime/resolve-hook.js";import{resolveSandboxDefinition}from"#runtime/resolve-sandbox.js";import{resolveDynamicInstructionsDefinition}from"#runtime/resolve-dynamic-instructions.js";import{resolveDynamicSkillDefinition}from"#runtime/resolve-dynamic-skill.js";import{resolveToolDefinition}from"#runtime/resolve-tool.js";async function resolveAgent(e){let t=e.manifest.skills.map(e=>({...e,metadata:e.metadata===void 0?void 0:{...e.metadata}})),r=[],i=[];for(let t of e.manifest.channels){if(t.kind===`disabled`){i.push(t.name);continue}r.push(await resolveChannelDefinition(t,e.moduleMap,e.nodeId))}let a=await Promise.all(e.manifest.tools.map(t=>resolveToolDefinition(t,e.moduleMap,e.nodeId))),o=await Promise.all((e.manifest.dynamicInstructions??[]).map(t=>resolveDynamicInstructionsDefinition(t,e.moduleMap,e.nodeId))),s=await Promise.all((e.manifest.dynamicSkills??[]).map(t=>resolveDynamicSkillDefinition(t,e.moduleMap,e.nodeId))),c=await Promise.all(e.manifest.dynamicTools.map(t=>resolveDynamicToolDefinition(t,e.moduleMap,e.nodeId))),l=await Promise.all(e.manifest.hooks.map(t=>resolveHookDefinition(t,e.moduleMap,e.nodeId))),u=await Promise.all(e.manifest.connections.map(t=>resolveConnectionDefinition(t,e.moduleMap,e.nodeId))),d=e.manifest.sandbox===null?null:await resolveSandboxDefinition(e.manifest.sandbox,e.moduleMap,e.nodeId),f=createResolvedInstructionsDefinition(e.manifest.instructions),p=e.manifest.workspaceResourceRoot,m={channels:r,config:createResolvedAgentConfig(e.manifest),connections:u,disabledFrameworkChannels:i,disabledFrameworkTools:[...e.manifest.disabledFrameworkTools],workflowTool:e.manifest.workflowTool===void 0?void 0:{maxSubagents:e.manifest.workflowTool.maxSubagents},dynamicInstructionsResolvers:o,dynamicSkillResolvers:s,dynamicToolResolvers:c,hooks:l,metadata:{agentRoot:e.manifest.agentRoot,appRoot:e.manifest.appRoot,diagnosticsSummary:e.manifest.diagnosticsSummary},sandbox:d,workspaceResourceRoot:p,skills:t,tools:a,workspaceSpec:{rootEntries:[...p.rootEntries]}};return f===void 0?m:{...m,instructions:f}}function createResolvedInstructionsDefinition(e){if(e!==void 0)return{name:e.name,logicalPath:e.logicalPath,markdown:e.markdown,sourceId:e.sourceId,sourceKind:e.sourceKind}}function createResolvedAgentConfig(e){let n={model:e.config.model.source===void 0?{id:e.config.model.id,contextWindowTokens:e.config.model.contextWindowTokens,providerOptions:e.config.model.providerOptions}:{contextWindowTokens:e.config.model.contextWindowTokens,id:e.config.model.id,providerOptions:e.config.model.providerOptions,source:{exportName:e.config.model.source.exportName,sourceKind:`module`,logicalPath:e.config.model.source.logicalPath,sourceId:e.config.model.source.sourceId}},name:e.config.name};if(e.config.compaction!==void 0){let t={};e.config.compaction.model!==void 0&&(t.model=e.config.compaction.model.source===void 0?{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions}:{contextWindowTokens:e.config.compaction.model.contextWindowTokens,id:e.config.compaction.model.id,providerOptions:e.config.compaction.model.providerOptions,source:{exportName:e.config.compaction.model.source.exportName,sourceKind:`module`,logicalPath:e.config.compaction.model.source.logicalPath,sourceId:e.config.compaction.model.source.sourceId}}),e.config.compaction.thresholdPercent!==void 0&&(t.thresholdPercent=e.config.compaction.thresholdPercent),n.compaction=t}return e.config.dynamicModel!==void 0&&(n.dynamicModel={...createResolvedModuleSourceRef(e.config.dynamicModel),eventNames:[...e.config.dynamicModel.eventNames]}),e.config.experimental!==void 0&&(n.experimental={subagentPersistentSessions:e.config.experimental.subagentPersistentSessions,workflow:e.config.experimental.workflow===void 0?void 0:{world:e.config.experimental.workflow.world}}),e.config.outputSchema!==void 0&&(n.outputSchema=e.config.outputSchema),e.config.reasoning!==void 0&&(n.reasoning=e.config.reasoning),e.config.source!==void 0&&(n.source=createResolvedModuleSourceRef(e.config.source)),e.config.limits!==void 0&&(n.limits={maxInputTokensPerSession:e.config.limits.maxInputTokensPerSession,maxOutputTokensPerSession:e.config.limits.maxOutputTokensPerSession,sessionTimeoutMs:e.config.limits.sessionTimeoutMs}),n}export{ResolveAgentError,resolveAgent};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CompiledDynamicSubagentDefinition } from "#compiler/remote-agent-node.js";
|
|
2
|
+
import type { CompiledModuleMap } from "#compiler/module-map.js";
|
|
3
|
+
import type { ResolvedDynamicSubagentDefinition } from "#runtime/types.js";
|
|
4
|
+
import type { ModuleSourceRef } from "#shared/source-ref.js";
|
|
5
|
+
type DynamicSubagentSource = ModuleSourceRef & CompiledDynamicSubagentDefinition;
|
|
6
|
+
export declare function resolveDynamicSubagentDefinition(input: {
|
|
7
|
+
readonly definition: DynamicSubagentSource;
|
|
8
|
+
readonly moduleMap: CompiledModuleMap;
|
|
9
|
+
readonly nodeId: string;
|
|
10
|
+
}): Promise<ResolvedDynamicSubagentDefinition>;
|
|
11
|
+
export declare function normalizeResolvedDynamicSubagentDefinition(definition: DynamicSubagentSource, value: unknown): ResolvedDynamicSubagentDefinition;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{expectFunction,expectObjectRecord,expectOnlyKnownKeys}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";async function resolveDynamicSubagentDefinition(e){try{let t=await loadResolvedModuleExport({definition:e.definition,kindLabel:`dynamic subagent`,moduleMap:e.moduleMap,nodeId:e.nodeId});return normalizeResolvedDynamicSubagentDefinition(e.definition,t)}catch(t){throw t instanceof ResolveAgentError?t:new ResolveAgentError(`Failed to resolve dynamic subagent from "${e.definition.logicalPath}": ${toErrorMessage(t)}`,{logicalPath:e.definition.logicalPath,sourceId:e.definition.sourceId})}}function normalizeResolvedDynamicSubagentDefinition(n,r){let i=`Expected the dynamic subagent export "${n.exportName??`default`}" from "${n.logicalPath}" to provide defineDynamic({ events }).`,a=expectObjectRecord(r,i);if(expectOnlyKnownKeys(a,[`events`,`kind`],i),a.kind!==`eve:dynamic`)throw Error(i);let o=expectObjectRecord(a.events,i),s={};for(let t of n.eventNames)s[t]=expectFunction(o[t],i);return{eventNames:[...n.eventNames],events:s,exportName:n.exportName,logicalPath:n.logicalPath,sourceId:n.sourceId,sourceKind:`module`}}export{normalizeResolvedDynamicSubagentDefinition,resolveDynamicSubagentDefinition};
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import type { CompiledDynamicToolDefinition } from "#compiler/manifest.js";
|
|
2
2
|
import type { CompiledModuleMap } from "#compiler/module-map.js";
|
|
3
|
+
import type { ModuleSourceRef } from "#shared/source-ref.js";
|
|
3
4
|
import type { ResolvedDynamicToolResolver } from "#runtime/types.js";
|
|
5
|
+
type DynamicToolResolverSource = Readonly<ModuleSourceRef & {
|
|
6
|
+
readonly extensionNamespace?: string;
|
|
7
|
+
readonly slug: string;
|
|
8
|
+
}>;
|
|
4
9
|
/**
|
|
5
10
|
* Resolves one compiled dynamic tool entry into a runtime-owned resolver
|
|
6
11
|
* with live event handler functions reattached from the authored module.
|
|
@@ -10,3 +15,13 @@ import type { ResolvedDynamicToolResolver } from "#runtime/types.js";
|
|
|
10
15
|
* the lifecycle point indicated by each event name.
|
|
11
16
|
*/
|
|
12
17
|
export declare function resolveDynamicToolDefinition(definition: CompiledDynamicToolDefinition, moduleMap: CompiledModuleMap, nodeId: string | undefined): Promise<ResolvedDynamicToolResolver>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolves a loaded public `defineDynamic()` value into the runtime shape used
|
|
20
|
+
* by the dynamic-tool lifecycle.
|
|
21
|
+
*
|
|
22
|
+
* Authored definitions reach this boundary after module-map loading.
|
|
23
|
+
* Framework-owned definitions are already loaded with eve itself. Both use
|
|
24
|
+
* the same validation, source registration, and resolver construction here.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveLoadedDynamicToolDefinition(value: unknown, source: DynamicToolResolverSource, eventNames?: readonly string[]): ResolvedDynamicToolResolver;
|
|
27
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{registerDefinitionSource,stampDefinitionKey}from"#public/tool-result-narrowing.js";async function resolveDynamicToolDefinition(
|
|
1
|
+
import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{toErrorMessage}from"#shared/errors.js";import{isDynamicSentinel}from"#shared/dynamic-tool-definition.js";import{ResolveAgentError,loadResolvedModuleExport}from"#runtime/resolve-helpers.js";import{registerDefinitionSource,stampDefinitionKey}from"#public/tool-result-narrowing.js";async function resolveDynamicToolDefinition(e,t,r){try{return resolveLoadedDynamicToolDefinition(await loadResolvedModuleExport({definition:e,kindLabel:`dynamic-tool`,moduleMap:t,nodeId:r}),e,e.eventNames)}catch(t){throw t instanceof ResolveAgentError?t:new ResolveAgentError(`Failed to resolve dynamic tool from "${e.logicalPath}": ${toErrorMessage(t)}`,{logicalPath:e.logicalPath,sourceId:e.sourceId})}}function resolveLoadedDynamicToolDefinition(e,t,n){let r=expectDynamicToolValue(e,t);return createResolvedDynamicToolResolver(r,t,n??Object.keys(r.events))}function createResolvedDynamicToolResolver(t,n,r){let i={};for(let a of r)i[a]=expectFunction(t.events[a],describe(n,`to provide a handler for event "${a}"`));let a=`dynamic-tool-source:${n.sourceId}`;return stampDefinitionKey(t,a),registerDefinitionSource(a,{kind:`tool`,logicalPath:n.logicalPath,name:n.slug}),{eventNames:[...r],events:i,exportName:n.exportName,extensionNamespace:n.extensionNamespace,logicalPath:n.logicalPath,slug:n.slug,sourceId:n.sourceId,sourceKind:`module`}}function expectDynamicToolValue(e,n){let i=expectObjectRecord(e,describe(n,`to return an object`));if(!isDynamicSentinel(i))throw Error(describe(n,`to be created by defineDynamic()`));return expectObjectRecord(i.events,describe(n,`to provide an events object`)),i}function describe(e,t){return`Expected the dynamic tool export "${e.exportName??`default`}" from "${e.logicalPath}" ${t}.`}export{resolveDynamicToolDefinition,resolveLoadedDynamicToolDefinition};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type AgentLimitsDefinition, type AgentReasoningDefinition } from "#shared/agent-definition.js";
|
|
2
|
+
import { type JsonObject } from "#shared/json.js";
|
|
3
|
+
export interface DynamicSubagentAgentConfig {
|
|
4
|
+
readonly compaction?: {
|
|
5
|
+
readonly model?: DynamicSubagentModelReference;
|
|
6
|
+
readonly thresholdPercent?: number;
|
|
7
|
+
};
|
|
8
|
+
readonly description: string;
|
|
9
|
+
readonly limits?: AgentLimitsDefinition;
|
|
10
|
+
readonly model: DynamicSubagentModelReference;
|
|
11
|
+
readonly outputSchema?: JsonObject;
|
|
12
|
+
readonly reasoning?: AgentReasoningDefinition;
|
|
13
|
+
}
|
|
14
|
+
export interface DynamicSubagentModelReference {
|
|
15
|
+
readonly contextWindowTokens?: number;
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly providerOptions?: Record<string, JsonObject>;
|
|
18
|
+
}
|
|
19
|
+
export declare function normalizeDynamicSubagentAgentConfig(input: {
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly value: unknown;
|
|
22
|
+
}): DynamicSubagentAgentConfig;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{serializeOutputSchema}from"#shared/tool-schema.js";import{normalizeAgentDefinition}from"#internal/authored-definition/core.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{parseJsonObject}from"#shared/json.js";import{isDynamicModelDefinition}from"#shared/agent-definition.js";function normalizeDynamicSubagentAgentConfig(n){let r=`Dynamic subagent "${n.name}" must return defineAgent({ description, model, ... }) or null.`,i=normalizeAgentDefinition(n.value,r);if(!i.description)throw Error(`${r} The "description" field is required.`);if(i.build!==void 0)throw Error(`${r} The "build" field cannot be selected at runtime.`);if(i.experimental!==void 0)throw Error(`${r} The "experimental" field cannot be selected at runtime.`);if(isDynamicModelDefinition(i.model))throw Error(`${r} The returned "model" must be static.`);let a={description:i.description,model:normalizeModelReference({contextWindowTokens:i.modelContextWindowTokens,model:i.model,name:n.name,providerOptions:i.modelOptions?.providerOptions})};if(i.compaction!==void 0){let e={};i.compaction.model!==void 0&&(e.model=normalizeModelReference({contextWindowTokens:i.compaction.modelContextWindowTokens,model:i.compaction.model,name:n.name,providerOptions:i.modelOptions?.providerOptions})),i.compaction.thresholdPercent!==void 0&&(e.thresholdPercent=i.compaction.thresholdPercent),a.compaction=e}return i.limits!==void 0&&(a.limits=i.limits),i.outputSchema!==void 0&&(a.outputSchema=serializeOutputSchema(i.outputSchema)),i.reasoning!==void 0&&(a.reasoning=i.reasoning),a}function normalizeModelReference(e){if(typeof e.model!=`string`)throw Error(`Dynamic subagent "${e.name}" must return model IDs as strings so its agent config can cross durable workflow boundaries.`);let t={id:formatLanguageModelGatewayId(e.model)};return e.contextWindowTokens!==void 0&&(t.contextWindowTokens=e.contextWindowTokens),e.providerOptions!==void 0&&(t.providerOptions=Object.fromEntries(Object.entries(e.providerOptions).map(([e,t])=>[e,parseJsonObject(t)]))),t}export{normalizeDynamicSubagentAgentConfig};
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { z } from "#compiled/zod/index.js";
|
|
2
2
|
import type { PreparedRuntimeDelegationTool } from "#runtime/sessions/turn.js";
|
|
3
|
-
import type { ResolvedRuntimeDelegationNode } from "#runtime/types.js";
|
|
3
|
+
import type { ResolvedDynamicSubagentDefinition, ResolvedRuntimeDelegationNode } from "#runtime/types.js";
|
|
4
4
|
/**
|
|
5
5
|
* One runtime-owned subagent tracked by the prepared registry.
|
|
6
6
|
*/
|
|
7
7
|
interface RuntimeRegisteredSubagent {
|
|
8
8
|
readonly definition: ResolvedRuntimeDelegationNode;
|
|
9
|
-
readonly prepared
|
|
9
|
+
readonly prepared?: PreparedRuntimeDelegationTool;
|
|
10
|
+
}
|
|
11
|
+
export interface ResolvedDynamicSubagentResolver extends ResolvedDynamicSubagentDefinition {
|
|
12
|
+
readonly kind: "subagent";
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly nodeId: string;
|
|
10
15
|
}
|
|
11
16
|
/**
|
|
12
17
|
* Runtime-owned registry that exposes resolved subagents as model-visible tools.
|
|
13
18
|
*/
|
|
14
19
|
export interface RuntimeSubagentRegistry {
|
|
20
|
+
readonly dynamicNodeIds: ReadonlySet<string>;
|
|
21
|
+
readonly dynamicResolvers: readonly ResolvedDynamicSubagentResolver[];
|
|
15
22
|
readonly preparedTools: readonly PreparedRuntimeDelegationTool[];
|
|
16
23
|
readonly subagentsByName: ReadonlyMap<string, RuntimeRegisteredSubagent>;
|
|
17
24
|
readonly subagentsByNodeId: ReadonlyMap<string, RuntimeRegisteredSubagent>;
|
|
@@ -32,4 +39,5 @@ export declare function createRuntimeSubagentRegistry(input: {
|
|
|
32
39
|
readonly reservedToolNames?: readonly string[];
|
|
33
40
|
readonly subagents: readonly ResolvedRuntimeDelegationNode[];
|
|
34
41
|
}): RuntimeSubagentRegistry;
|
|
42
|
+
export declare function createPreparedRuntimeSubagentTool(definition: ResolvedRuntimeDelegationNode): PreparedRuntimeDelegationTool;
|
|
35
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";import{serializeInputSchema}from"#shared/tool-schema.js";import{RuntimeRegistry,RuntimeRegistryError}from"#internal/runtime-registry.js";const SUBAGENT_TOOL_INPUT_SCHEMA=z.strictObject({message:z.string().describe(`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`),outputSchema:z.looseObject({}).describe(`Only provide a non-empty JSON Schema when the caller explicitly requests structured output; otherwise omit this field. The subagent must match a provided schema, and that structured output becomes the tool result.`).optional()}),SUBAGENT_TOOL_INPUT_JSON_SCHEMA=serializeInputSchema(SUBAGENT_TOOL_INPUT_SCHEMA);function createRuntimeSubagentRegistry(e){let t=[],
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{serializeInputSchema}from"#shared/tool-schema.js";import{RuntimeRegistry,RuntimeRegistryError}from"#internal/runtime-registry.js";const SUBAGENT_TOOL_INPUT_SCHEMA=z.strictObject({message:z.string().describe(`The message to send to the subagent. Provide all context the subagent needs to complete the task; the subagent does not see the parent's history.`),outputSchema:z.looseObject({}).describe(`Only provide a non-empty JSON Schema when the caller explicitly requests structured output; otherwise omit this field. The subagent must match a provided schema, and that structured output becomes the tool result.`).optional()}),SUBAGENT_TOOL_INPUT_JSON_SCHEMA=serializeInputSchema(SUBAGENT_TOOL_INPUT_SCHEMA);function createRuntimeSubagentRegistry(e){let t=[],i=new Set,a=[],o=new RuntimeRegistry(`subagent`,e.reservedToolNames??[]),s=new Map;for(let n of e.subagents){let e={logicalPath:n.logicalPath,sourceId:n.sourceId};if(s.has(n.nodeId))throw new RuntimeRegistryError(`subagent`,`Found multiple runtime subagents mapped to node id "${n.nodeId}".`,{...e,entryName:n.name});let c,l=n.kind===`subagent`?n.dynamic:void 0;if(l===void 0){let r=createPreparedRuntimeSubagentTool(n);c={definition:n,prepared:r},o.register(n.name,c,{location:e,duplicateMessage:`Found multiple subagents named "${n.name}". Subagent names must be unique at runtime.`,reservedMessage:`Subagent "${n.name}" collides with another runtime-visible tool name.`}),t.push(r)}else i.add(n.nodeId),a.push({...l,kind:`subagent`,logicalPath:n.logicalPath,name:n.name,nodeId:n.nodeId,sourceId:n.sourceId,sourceKind:`module`}),c={definition:n};s.set(n.nodeId,c)}return{dynamicNodeIds:i,dynamicResolvers:a,preparedTools:t,subagentsByName:o.asMap(),subagentsByNodeId:s}}function createPreparedRuntimeSubagentTool(e){if(e.description===void 0)throw Error(`Static subagent "${e.name}" is missing a description.`);return{description:e.description,inputSchema:SUBAGENT_TOOL_INPUT_JSON_SCHEMA,kind:e.kind,logicalPath:e.logicalPath,name:e.name,nodeId:e.nodeId,outputSchema:e.kind===`remote`?e.outputSchema:void 0,sourceId:e.sourceId}}export{SUBAGENT_TOOL_INPUT_SCHEMA,createPreparedRuntimeSubagentTool,createRuntimeSubagentRegistry};
|
|
@@ -232,10 +232,15 @@ export interface ResolvedChannelDefinition extends ResolvedModuleSourceRef {
|
|
|
232
232
|
* subagent package.
|
|
233
233
|
*/
|
|
234
234
|
export type ResolvedRuntimeSubagentNode = Readonly<ModuleSourceRef & Node & {
|
|
235
|
-
description: string;
|
|
236
235
|
kind: "subagent";
|
|
237
236
|
name: string;
|
|
238
|
-
}
|
|
237
|
+
} & ({
|
|
238
|
+
description: string;
|
|
239
|
+
dynamic?: never;
|
|
240
|
+
} | {
|
|
241
|
+
description?: never;
|
|
242
|
+
dynamic: ResolvedDynamicSubagentDefinition;
|
|
243
|
+
})>;
|
|
239
244
|
/**
|
|
240
245
|
* Runtime-owned remote subagent entry resolved from one module-backed remote
|
|
241
246
|
* definition in the parent node's compiled manifest.
|
|
@@ -255,6 +260,10 @@ export type ResolvedRuntimeRemoteAgentNode = Readonly<ModuleSourceRef & Node & {
|
|
|
255
260
|
* Runtime-owned delegation entry exposed to the model as a subagent-shaped tool.
|
|
256
261
|
*/
|
|
257
262
|
export type ResolvedRuntimeDelegationNode = ResolvedRuntimeRemoteAgentNode | ResolvedRuntimeSubagentNode;
|
|
263
|
+
export interface ResolvedDynamicSubagentDefinition extends Readonly<ModuleSourceRef> {
|
|
264
|
+
readonly eventNames: readonly string[];
|
|
265
|
+
readonly events: Readonly<Record<string, (event: unknown, ctx: unknown) => unknown | Promise<unknown>>>;
|
|
266
|
+
}
|
|
258
267
|
/**
|
|
259
268
|
* Runtime-owned additive agent configuration resolved from `agent.ts`.
|
|
260
269
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{WizardCancelledError}from"#setup/step.js";import{withSpinner}from"#setup/with-spinner.js";const ADDRESS_PREFIX=`address:`,BACK=`action:back`,DONE=`action:done`,ALL=`category:all`,REGISTRY_CATEGORIES=[{value:`category:channel`,prefix:`channel/`,label:`
|
|
1
|
+
import{WizardCancelledError}from"#setup/step.js";import{withSpinner}from"#setup/with-spinner.js";const ADDRESS_PREFIX=`address:`,BACK=`action:back`,DONE=`action:done`,ALL=`category:all`,REGISTRY_CATEGORIES=[{value:`category:channel`,prefix:`channel/`,label:`Channels`,hint:`Where people talk to your agent — Web, Slack, Discord, Teams`,browseLabel:`Browse channels`},{value:`category:connection`,prefix:`connection/`,label:`MCP connections`,hint:`Connect services like Linear, Notion, GitHub, and Vercel`,browseLabel:`Browse MCP connections`},{value:`category:extension`,prefix:`extension/`,label:`Extensions`,hint:`Add browser automation, memory, and developer tools`,browseLabel:`Browse extensions`},{value:`category:instrumentation`,prefix:`instrumentation/`,label:`Observability`,hint:`Trace, evaluate, and monitor your agent`,browseLabel:`Browse observability integrations`}];function itemLabel(e){return e.title===void 0?(e.name.split(`/`).at(-1)??e.name).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `):e.title}function itemRows(e){return e.map((e,t)=>({value:`item:${t}`,label:itemLabel(e),hint:e.description??e.type}))}function categoryRows(){return[...REGISTRY_CATEGORIES.map(e=>({value:e.value,label:e.label,hint:e.hint})),{value:ALL,label:`Browse all`,hint:`Search every integration or enter an item address`},{value:DONE,label:`Return to chat`,trailingAction:!0}]}function categoryFor(e){return REGISTRY_CATEGORIES.find(t=>t.value===e)}function itemsForCategory(e,t){if(t===ALL)return e;let n=categoryFor(t);return n===void 0?e:e.filter(e=>e.address.startsWith(n.prefix)||e.name.startsWith(n.prefix))}function stringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}function itemSource(e){if(e.startsWith(`@`))return e.split(`/`)[0]??e;if(/^https?:\/\//u.test(e))try{return new URL(e).host}catch{return e}return`Vercel`}function manifestRecord(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:{}}function summarizeDetails(e,t=3){let n=e.slice(0,t),r=e.length-n.length;return r>0?`${n.join(`, `)} … (+${r} more)`:n.join(`, `)}function itemDetails(e,t){let n=[{label:`Source`,value:e.source}],r=[...stringArray(t.dependencies),...stringArray(t.devDependencies),...stringArray(t.registryDependencies)];r.length>0&&n.push({label:`Packages`,value:summarizeDetails(r)});let i=t.envVars;if(typeof i==`object`&&i&&!Array.isArray(i)){let e=Object.keys(i);e.length>0&&n.push({label:`Environment`,value:summarizeDetails(e)})}let a=(Array.isArray(t.files)?t.files:[]).flatMap(e=>{if(typeof e!=`object`||!e||Array.isArray(e))return[];let t=e.target;return typeof t==`string`?[t]:[]});return a.length>0&&n.push({label:`Files`,value:summarizeDetails(a)}),n}async function inspectItem(e,n,r,i,a,o){let s=a??manifestRecord(await withSpinner(e,`Loading registry item…`,()=>n.getRegistryItemManifest(r,i.address)));for(;;){let t={message:typeof s.title==`string`?s.title:i.name,metadata:itemDetails(i,s),options:[{value:`add`,label:`Add to project`},{value:`back`,label:`Back`}]},a=typeof s.description==`string`?s.description:i.description;if(a!==void 0&&(t.description=a),await e.select(t)===`back`)return{kind:`back`};let c=e.log.spinner?.(`Installing ${itemLabel(i)} and dependencies…`);try{c?.stop();let install=()=>n.installRegistryItem(r,i.address,{silent:!0,prompter:e,signal:o});return{kind:`added`,output:await(e.withExclusiveTerminal?.(install)??install())}}finally{c?.stop()}}}async function resolveAddressItem(e,n,r,i){let a=manifestRecord(await withSpinner(e,`Loading registry item…`,()=>n.getRegistryItemManifest(r,i))),o={address:i,name:typeof a.name==`string`?a.name:i,source:itemSource(i)};return typeof a.type==`string`&&(o.type=a.type),typeof a.description==`string`&&(o.description=a.description),{item:o,manifest:a}}async function runRegistryFlow(a){let o;(a.deps?.browseRegistryCatalog===void 0||a.deps.getRegistryItemManifest===void 0||a.deps.installRegistryItem===void 0)&&(o=await import(`#cli/commands/registry.js`));let s={browseRegistryCatalog:a.deps?.browseRegistryCatalog??o.browseRegistryCatalog,getRegistryItemManifest:a.deps?.getRegistryItemManifest??o.getRegistryItemManifest,installRegistryItem:a.deps?.installRegistryItem??o.installRegistryItem},c=[];try{for(;;){a.signal?.throwIfAborted();let e=await withSpinner(a.prompter,`Loading registry…`,()=>s.browseRegistryCatalog(a.appRoot));c=[...c,...e.errors.map(e=>({tone:`warning`,text:`${e.registry}: ${e.message}`}))];let o=await a.prompter.select({message:`Add an integration`,options:categoryRows(),hintLayout:`inline`,notices:c});if(c=[],o===DONE)return{kind:`done`,addedItems:[]};let l=itemsForCategory(e.items,o),u=itemRows(l);u.push({value:BACK,label:`Back`,trailingAction:!0});let d=await a.prompter.select({message:categoryFor(o)?.browseLabel??`Browse integrations`,options:u,search:!0,placeholder:`Search integrations or enter an item address`,searchAction:{label:e=>`Add “${e}”`,value:e=>`${ADDRESS_PREFIX}${e.trim()}`},hintLayout:`inline`});if(d===BACK)continue;let f=d.startsWith(ADDRESS_PREFIX)?await resolveAddressItem(a.prompter,s,a.appRoot,d.slice(8)):{item:l[Number(d.slice(5))]};if(f.item===void 0)throw Error(`The selected registry item is no longer available.`);let p=await inspectItem(a.prompter,s,a.appRoot,f.item,`manifest`in f?f.manifest:void 0,a.signal);if(p.kind===`added`)return p.output.length===0?{kind:`done`,addedItems:[f.item.address]}:{kind:`done`,addedItems:[f.item.address],output:p.output}}}catch(t){if(t instanceof WizardCancelledError)return{kind:`cancelled`};throw t}}export{runRegistryFlow};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.38`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.29.
|
|
1
|
+
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.38`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.29.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";
|
|
2
2
|
|
|
3
3
|
export default defineAgent({
|
|
4
4
|
model: "__EVE_INIT_MODEL__",
|
|
@@ -165,6 +165,13 @@ export interface AgentLimitsDefinition {
|
|
|
165
165
|
* These options are unstable and may change or be removed in any release.
|
|
166
166
|
*/
|
|
167
167
|
export interface AgentExperimentalDefinition {
|
|
168
|
+
/**
|
|
169
|
+
* Keeps this agent's delegated subagent sessions alive after they answer.
|
|
170
|
+
* The model can pass `agentId` to a subagent tool to continue a previous
|
|
171
|
+
* delegation, and the system prompt documents the `<agents>` listing.
|
|
172
|
+
* When unset, delegated children run as one-shot tasks.
|
|
173
|
+
*/
|
|
174
|
+
readonly subagentPersistentSessions?: boolean;
|
|
168
175
|
/**
|
|
169
176
|
* Durable Workflow runtime configuration. Root agents may use this to select
|
|
170
177
|
* the Workflow world backing sessions and runs.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "#compiled/zod/index.js";
|
|
2
|
+
import type { JsonValue } from "#shared/json.js";
|
|
3
|
+
import { type TokenUsage } from "#shared/token-usage.js";
|
|
4
|
+
/**
|
|
5
|
+
* What one delegated child turn produced, independent of whether the child
|
|
6
|
+
* session survived it.
|
|
7
|
+
*/
|
|
8
|
+
export type AgentTurnResult = {
|
|
9
|
+
readonly kind: "succeeded";
|
|
10
|
+
readonly output: JsonValue;
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: "failed";
|
|
13
|
+
readonly error: JsonValue;
|
|
14
|
+
} | {
|
|
15
|
+
readonly kind: "cancelled";
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* How one delegated child turn settled.
|
|
19
|
+
*
|
|
20
|
+
* `parked` means the child session survived the turn and can accept another
|
|
21
|
+
* delivery; `terminal` means the child session ended with this turn. The
|
|
22
|
+
* lifecycle is carried explicitly: a failed turn can leave the child parked,
|
|
23
|
+
* and a succeeded turn can be terminal (task mode). Consumers must never
|
|
24
|
+
* infer lifecycle from success or error codes.
|
|
25
|
+
*
|
|
26
|
+
* `usageDelta` is the provider-reported usage this turn added to the child's
|
|
27
|
+
* session subtree: the child captures its session totals at turn entry and
|
|
28
|
+
* reports final-minus-entry when the turn settles. The parent folds each
|
|
29
|
+
* delta exactly once, so repeated turns of a persistent child never re-report
|
|
30
|
+
* earlier turns.
|
|
31
|
+
*/
|
|
32
|
+
export type AgentTurnOutcome = {
|
|
33
|
+
readonly kind: "parked";
|
|
34
|
+
readonly result: AgentTurnResult;
|
|
35
|
+
readonly usageDelta: TokenUsage;
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: "terminal";
|
|
38
|
+
readonly result: AgentTurnResult;
|
|
39
|
+
readonly usageDelta: TokenUsage;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Zod schema for {@link AgentTurnOutcome}.
|
|
43
|
+
*
|
|
44
|
+
* Validates outcomes crossing the process boundary (remote session
|
|
45
|
+
* callbacks). Local notification paths construct the type directly.
|
|
46
|
+
*/
|
|
47
|
+
export declare const agentTurnOutcomeSchema: z.ZodType<AgentTurnOutcome>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{tokenUsageSchema}from"#shared/token-usage.js";const jsonValueSchema=z.lazy(()=>z.union([z.null(),z.boolean(),z.number(),z.string(),z.array(jsonValueSchema),z.record(z.string(),jsonValueSchema)])),agentTurnResultSchema=z.discriminatedUnion(`kind`,[z.strictObject({kind:z.literal(`succeeded`),output:jsonValueSchema}),z.strictObject({error:jsonValueSchema,kind:z.literal(`failed`)}),z.strictObject({kind:z.literal(`cancelled`)})]),agentTurnOutcomeSchema=z.discriminatedUnion(`kind`,[z.strictObject({kind:z.literal(`parked`),result:agentTurnResultSchema,usageDelta:tokenUsageSchema}),z.strictObject({kind:z.literal(`terminal`),result:agentTurnResultSchema,usageDelta:tokenUsageSchema})]);export{agentTurnOutcomeSchema};
|
|
@@ -116,7 +116,7 @@ export declare const DYNAMIC_SENTINEL_KIND: "eve:dynamic";
|
|
|
116
116
|
/**
|
|
117
117
|
* Return value of `defineDynamic`: the runtime shape of a dynamic export,
|
|
118
118
|
* stamped with a sentinel kind the compiler/normalizer detects. `TFallback`
|
|
119
|
-
* is
|
|
119
|
+
* is used by dynamic agent models.
|
|
120
120
|
*/
|
|
121
121
|
export type DynamicSentinel<TResult = unknown, TFallback = never> = {
|
|
122
122
|
readonly kind: typeof DYNAMIC_SENTINEL_KIND;
|
|
@@ -124,10 +124,6 @@ export type DynamicSentinel<TResult = unknown, TFallback = never> = {
|
|
|
124
124
|
} & ([TFallback] extends [never] ? object : {
|
|
125
125
|
readonly fallback: TFallback;
|
|
126
126
|
});
|
|
127
|
-
/**
|
|
128
|
-
* Throws when a dynamic sentinel outside the agent `model` slot carries a
|
|
129
|
-
* `fallback` — anywhere else it would be silently dead configuration.
|
|
130
|
-
*/
|
|
131
127
|
export declare function rejectDynamicSentinelFallback(sentinel: DynamicSentinel, message: string): void;
|
|
132
128
|
export declare function isDynamicSentinel(value: unknown): value is DynamicSentinel;
|
|
133
129
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function rejectDynamicSentinelFallback(e,t){if(`fallback`in e)throw Error(`${t} "fallback" is only supported on a dynamic agent model
|
|
1
|
+
const ALLOWED_DYNAMIC_TOOL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),ALLOWED_DYNAMIC_INSTRUCTION_EVENTS=new Set([`session.started`,`turn.started`]),ALLOWED_DYNAMIC_SKILL_EVENTS=new Set([`session.started`,`turn.started`]),DYNAMIC_SENTINEL_KIND=`eve:dynamic`;function rejectDynamicSentinelFallback(e,t){if(`fallback`in e)throw Error(`${t} "fallback" is only supported on a dynamic agent model. For dynamic tools, skills, instructions, and subagents, return null when the capability should be omitted.`)}function isDynamicSentinel(e){return typeof e==`object`&&!!e&&e.kind===`eve:dynamic`}const TOOL_BRAND=Symbol.for(`eve:tool-brand`);function isBrandedToolEntry(e){return typeof e==`object`&&!!e&&e[TOOL_BRAND]===!0}const INSTRUCTIONS_BRAND=Symbol.for(`eve:instructions-brand`);function isBrandedInstructionsEntry(e){return typeof e==`object`&&!!e&&e[INSTRUCTIONS_BRAND]===!0}const SKILL_BRAND=Symbol.for(`eve:skill-brand`);function isBrandedSkillEntry(e){return typeof e==`object`&&!!e&&e[SKILL_BRAND]===!0}export{ALLOWED_DYNAMIC_INSTRUCTION_EVENTS,ALLOWED_DYNAMIC_SKILL_EVENTS,ALLOWED_DYNAMIC_TOOL_EVENTS,DYNAMIC_SENTINEL_KIND,INSTRUCTIONS_BRAND,SKILL_BRAND,TOOL_BRAND,isBrandedInstructionsEntry,isBrandedSkillEntry,isBrandedToolEntry,isDynamicSentinel,rejectDynamicSentinelFallback};
|
package/dist/src/svelte/index.js
CHANGED
package/dist/src/vue/index.js
CHANGED
package/docs/channels/custom.mdx
CHANGED
|
@@ -48,6 +48,8 @@ Declare routes with the `POST()` and `GET()` helpers. Each route handler receive
|
|
|
48
48
|
|
|
49
49
|
- `send(message, { auth, continuationToken, state?, title? })` starts or resumes a session. `title` overrides the new workflow session's display title without changing the model message. Returns a `Session`.
|
|
50
50
|
- `cancel({ continuationToken, turnId? })` requests cancellation of the active turn on the session that owns the token. See [Cancel a turn](#cancel-a-turn).
|
|
51
|
+
- `clear({ continuationToken })` removes the model-message history while preserving the session and its durable resources. See [Clear session context](#clear-session-context).
|
|
52
|
+
- `compact({ continuationToken })` queues context compaction for the session that owns the token without sending model input. See [Compact a session](#compact-a-session).
|
|
51
53
|
- `reset({ continuationToken, reason? })` retires the session that owns the token so the next `send()` starts a fresh session. See [Reset a session](#reset-a-session).
|
|
52
54
|
- `getSession(sessionId)` looks up an existing session. The returned `Session` exposes `getEventStream({ startIndex? })` for streaming, `getStreamTailIndex()` for resolving the durable tail when a route wants to serve bounded reads, and `cancel({ turnId? })` for session-id-addressed cancellation.
|
|
53
55
|
- `receive(channel, ...)` hands inbound work to a different channel for cross-channel hand-off.
|
|
@@ -86,6 +88,44 @@ Semantics:
|
|
|
86
88
|
|
|
87
89
|
When you already hold a `Session` — returned by `send()` or `getSession(sessionId)` — call `session.cancel({ turnId? })` to request the same cancellation addressed by session id.
|
|
88
90
|
|
|
91
|
+
## Clear session context
|
|
92
|
+
|
|
93
|
+
Call `clear` with the channel-local continuation token to remove a session's durable model-message history without replacing the session:
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { defineChannel, POST } from "eve/channels";
|
|
97
|
+
|
|
98
|
+
export default defineChannel({
|
|
99
|
+
routes: [
|
|
100
|
+
POST("/threads/:threadId/clear", async (_req, { clear, params }) => {
|
|
101
|
+
const result = await clear({ continuationToken: params.threadId });
|
|
102
|
+
return Response.json(result);
|
|
103
|
+
}),
|
|
104
|
+
],
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`"accepted"` means the clear was queued. The stream emits `context.cleared` followed by `session.waiting`, after which the next ordinary message resumes the same session with no prior model messages. The system prompt, configured tools and skills, durable state, limits, continuation-token ownership, and session-scoped sandbox remain. `"no_active_session"` means the token has no current owner.
|
|
109
|
+
|
|
110
|
+
## Compact a session
|
|
111
|
+
|
|
112
|
+
Call `compact` with the channel-local continuation token to summarize durable conversation history without delivering a command to the model:
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
import { defineChannel, POST } from "eve/channels";
|
|
116
|
+
|
|
117
|
+
export default defineChannel({
|
|
118
|
+
routes: [
|
|
119
|
+
POST("/threads/:threadId/compact", async (_req, { compact, params }) => {
|
|
120
|
+
const result = await compact({ continuationToken: params.threadId });
|
|
121
|
+
return Response.json(result);
|
|
122
|
+
}),
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`"accepted"` means the durable session queued the operation. A successful compaction emits `compaction.requested` followed by `compaction.completed`, then the operation returns through `session.waiting`. If summarization fails, the stream returns through `session.waiting` without `compaction.completed` and preserves the previous history. If a turn is active, eve runs the compaction after that turn settles; it does not cancel the turn. `"no_active_session"` means the token has no current owner. Both outcomes are successful, and compaction never starts a session or appends a synthetic user message.
|
|
128
|
+
|
|
89
129
|
## Reset a session
|
|
90
130
|
|
|
91
131
|
Identity-addressed channels can consume commands such as `/new` in their route, without sending the command to the model. Call `reset` with the same channel-local continuation token used by `send()`:
|
|
@@ -160,7 +200,7 @@ export default defineChannel({
|
|
|
160
200
|
});
|
|
161
201
|
```
|
|
162
202
|
|
|
163
|
-
`WS()` handlers receive the same helpers as HTTP route handlers: `send`, `cancel`, `reset`, `getSession`, `receive`, `params`, `waitUntil`, and `requestIp`. The returned hooks are eve-owned structural types compatible with Nitro/H3 websocket routing, including `upgrade`, `open`, `message`, `close`, and `error`.
|
|
203
|
+
`WS()` handlers receive the same helpers as HTTP route handlers: `send`, `cancel`, `clear`, `compact`, `reset`, `getSession`, `receive`, `params`, `waitUntil`, and `requestIp`. The returned hooks are eve-owned structural types compatible with Nitro/H3 websocket routing, including `upgrade`, `open`, `message`, `close`, and `error`.
|
|
164
204
|
|
|
165
205
|
### Node upgrade server escape hatch
|
|
166
206
|
|