eve 0.42.0 → 0.43.0
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 +20 -0
- package/dist/src/channel/forwarded-principal.d.ts +4 -4
- package/dist/src/compiler/extension-compatibility.d.ts +7 -5
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.d.ts +3 -0
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/context/build-dynamic-tools.d.ts +5 -5
- package/dist/src/context/build-dynamic-tools.js +1 -1
- package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.d.ts +8 -27
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/context/keys.d.ts +10 -14
- package/dist/src/context/keys.js +1 -1
- package/dist/src/context/provider.d.ts +5 -1
- package/dist/src/context/run-step.d.ts +3 -2
- package/dist/src/context/run-step.js +1 -1
- package/dist/src/execution/agent-handle-dispatch.d.ts +3 -0
- package/dist/src/execution/agent-handle-dispatch.js +1 -1
- package/dist/src/execution/delegation-tool.d.ts +9 -1
- package/dist/src/execution/delegation-tool.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-shared.d.ts +14 -1
- package/dist/src/execution/dispatch-runtime-actions-shared.js +1 -1
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/history-view.d.ts +9 -0
- package/dist/src/execution/history-view.js +1 -0
- package/dist/src/execution/next-driver-action.d.ts +33 -1
- package/dist/src/execution/node-step.d.ts +5 -2
- package/dist/src/execution/node-step.js +1 -1
- package/dist/src/execution/remote-agent-dispatch.d.ts +2 -0
- package/dist/src/execution/remote-agent-dispatch.js +1 -1
- package/dist/src/execution/session-callback-step.d.ts +2 -2
- package/dist/src/execution/session-callback-step.js +1 -1
- package/dist/src/execution/tasks/child/steps.js +1 -1
- package/dist/src/execution/tasks/child/update.d.ts +2 -2
- package/dist/src/execution/tasks/child/update.js +1 -1
- package/dist/src/execution/tasks/child/workflow.js +1 -1
- package/dist/src/execution/tasks/parent/agent-views.d.ts +2 -1
- package/dist/src/execution/tasks/parent/agent-views.js +1 -1
- package/dist/src/execution/tasks/parent/continuation-dispatch.d.ts +6 -0
- package/dist/src/execution/tasks/parent/continuation-dispatch.js +1 -1
- package/dist/src/execution/tasks/parent/control-shared.d.ts +1 -1
- package/dist/src/execution/tasks/parent/control-shared.js +1 -1
- package/dist/src/execution/tasks/parent/delegate.d.ts +20 -6
- package/dist/src/execution/tasks/parent/delegate.js +1 -1
- package/dist/src/execution/tasks/parent/dispatch-task-step.js +1 -1
- package/dist/src/execution/tasks/parent/dispatch.d.ts +13 -1
- package/dist/src/execution/tasks/parent/dispatch.js +1 -1
- package/dist/src/execution/tasks/parent/hitl-proxy-steps.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.d.ts +46 -0
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -0
- package/dist/src/execution/tool-auth.d.ts +12 -3
- package/dist/src/execution/tool-auth.js +1 -1
- package/dist/src/execution/turn-cancellation-control.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/wire/session-inbox-wire.v1.js +1 -1
- package/dist/src/execution/workflow-steps.d.ts +1 -54
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/advertised-tools.js +1 -1
- package/dist/src/harness/background-tools.d.ts +37 -0
- package/dist/src/harness/background-tools.js +1 -0
- package/dist/src/harness/execute-tool.d.ts +10 -1
- package/dist/src/harness/handles/transitions.d.ts +36 -0
- package/dist/src/harness/handles/transitions.js +1 -1
- package/dist/src/harness/messages.d.ts +2 -0
- package/dist/src/harness/messages.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/tools.d.ts +5 -1
- package/dist/src/harness/tools.js +1 -1
- package/dist/src/harness/types.d.ts +13 -0
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/authored-module-loader.js +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-capability-transform-plugin.js +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +13 -0
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.d.ts +7 -31
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +4 -4
- package/dist/src/packages/eve-catalog/src/index.js +1 -1
- package/dist/src/public/channels/eve.d.ts +7 -7
- package/dist/src/public/channels/eve.js +1 -1
- package/dist/src/public/definitions/remote-agent.d.ts +7 -5
- package/dist/src/public/definitions/tool.d.ts +23 -0
- package/dist/src/public/definitions/tool.js +1 -1
- package/dist/src/public/tools/approval/approval-helpers.js +1 -1
- package/dist/src/public/tools/index.d.ts +1 -1
- package/dist/src/runtime/framework-tools/connection-search-dynamic.js +2 -2
- package/dist/src/runtime/framework-tools/subagent/local.d.ts +41 -0
- package/dist/src/runtime/framework-tools/subagent/local.js +1 -0
- package/dist/src/runtime/framework-tools/subagent/remote.d.ts +23 -0
- package/dist/src/runtime/framework-tools/subagent/remote.js +1 -0
- package/dist/src/runtime/framework-tools/tasks.d.ts +11 -2
- package/dist/src/runtime/framework-tools/tasks.js +1 -1
- package/dist/src/runtime/resolve-tool.js +1 -1
- package/dist/src/runtime/session-callback-route.js +1 -1
- package/dist/src/setup/integrations/linq/management.d.ts +5 -0
- package/dist/src/setup/integrations/linq/management.js +1 -0
- package/dist/src/setup/integrations/linq/setup.d.ts +5 -1
- package/dist/src/setup/integrations/linq/setup.js +3 -3
- package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +4 -10
- package/dist/src/setup/scaffold/create/web-template.d.ts +0 -1
- package/dist/src/setup/scaffold/create/web-template.js +1 -1
- package/dist/src/setup/scaffold/update/channels.d.ts +1 -1
- package/dist/src/setup/scaffold/update/channels.js +2 -2
- package/dist/src/setup/scaffold/update/package-json.d.ts +0 -2
- package/dist/src/setup/scaffold/update/package-json.js +1 -1
- package/dist/src/setup/scaffold/workspace-root.d.ts +0 -1
- package/dist/src/setup/scaffold/workspace-root.js +1 -1
- package/dist/src/shared/durable-dynamic-tool-callbacks.d.ts +34 -0
- package/dist/src/shared/durable-dynamic-tool-callbacks.js +1 -0
- package/dist/src/shared/dynamic-tool-definition.d.ts +2 -4
- package/dist/src/shared/empty-delivery.js +1 -1
- package/dist/src/shared/history-view.d.ts +22 -0
- package/dist/src/shared/history-view.js +1 -0
- package/dist/src/shared/json.d.ts +2 -0
- package/dist/src/shared/json.js +1 -1
- package/dist/src/shared/tool-definition.d.ts +4 -1
- package/dist/src/shared/tool-task.d.ts +107 -0
- package/dist/src/shared/tool-task.js +1 -0
- package/dist/src/tasks/delivery-context.d.ts +12 -0
- package/dist/src/tasks/delivery-context.js +17 -0
- package/dist/src/tasks/json.d.ts +25 -10
- package/dist/src/tasks/json.js +1 -1
- package/dist/src/tasks/session-index.d.ts +5 -3
- package/dist/src/tasks/session-index.js +1 -1
- package/dist/src/tasks/transitions.d.ts +40 -5
- package/dist/src/tasks/transitions.js +1 -1
- package/dist/src/tasks/types.d.ts +46 -4
- package/dist/src/tasks/types.js +1 -1
- package/docs/channels/linq.mdx +1 -1
- package/docs/getting-started.mdx +36 -36
- package/docs/guides/auth-and-route-protection.md +6 -2
- package/docs/guides/dynamic-capabilities.md +12 -10
- package/docs/guides/remote-agents.md +10 -2
- package/docs/tools/overview.mdx +19 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{createEveCallbackRoutePath}from"#protocol/routes.js";import{continueRemoteAgentSession,isAmbiguousRemoteAgentContinueError,isRetryableRemoteAgentContinueError,resolveRemoteAgentForAction}from"#execution/remote-agent-dispatch.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE}from"#harness/agent-handle-errors.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{prepareAgentContinuation,rejectAgentEffect,removeTaskAgentAddress}from"#harness/handles/transitions.js";import{normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{err,ok}from"#shared/result.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";const log=createLogger(`execution.agent-handle-dispatch`);function isAgentHandleAction(e){return e.kind===`subagent-call`||e.kind===`remote-agent-call`}async function dispatchToAgentHandle(e){let{action:n,agentId:r,bundle:i}=e,a=n.kind===`remote-agent-call`?n.remoteAgentName:n.subagentName,o={callId:n.callId,id:deriveAgentOperationId({callId:n.callId,parentSessionId:e.currentSession.sessionId,parentTurnId:e.parentTurnId}),kind:`continue`,parentTurnId:e.parentTurnId,previousStatus:``},s=prepareAgentContinuation(e.currentSession,{agentId:r,invokedName:a,operation:o});switch(s.kind){case`unknown`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:`Agent with id "${r}" is no longer reachable.`}),session:e.currentSession};case`mismatch`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_MISMATCH,message:`Agent "${r}" from the <agents> list does not belong to "${a}".`}),session:e.currentSession};case`busy`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_BUSY,message:`Agent "${r}" is still working on its previous request. Wait for its result before continuing it.`}),session:e.currentSession};case`ready`:break}let{handle:f}=s,p=await deliverToAgentAddress({action:n,address:f.address,bundle:i,identity:f.identity,parentToken:e.parentToken});if(!p.ok){let{cause:e,permanent:i}=p.error;return logError(log,`agent delivery failed`,e,{agentId:r,callId:n.callId,nodeId:f.identity.nodeId,permanent:i,subagentName:f.identity.name}),{deliveryAmbiguous:p.error.deliveryAmbiguous,kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:i?`Agent "${f.identity.name}" with id "${r}" is no longer reachable.`:`Agent "${f.identity.name}" with id "${r}" is temporarily unreachable. Try again.`}),session:rejectAgentEffect(s.session,{disposition:i?`dead`:`retryable`,operationId:o.id})}}return{address:f.address,callId:n.callId,kind:`called`,name:n.name,session:s.session,toolName:f.identity.name}}async function dispatchToTaskAgentAddress(e){let{action:n,agentId:r}=e,i=n.kind===`remote-agent-call`?n.remoteAgentName:n.subagentName,a=(getAgentHandleStore(e.currentSession.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===r);if(a===void 0)return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:`Agent with id "${r}" is no longer reachable.`}),session:e.currentSession};if(a.identity.name!==i)return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_MISMATCH,message:`Agent "${r}" from the <agents> list does not belong to "${i}".`}),session:e.currentSession};let o=await deliverToAgentAddress({action:n,address:a.address,bundle:e.bundle,identity:a.identity,parentToken:e.parentToken});if(!o.ok){let{cause:i,permanent:s}=o.error;return logError(log,`task agent delivery failed`,i,{agentId:r,callId:n.callId,nodeId:a.identity.nodeId,permanent:s,subagentName:a.identity.name}),{deliveryAmbiguous:o.error.deliveryAmbiguous,kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:s?`Agent "${a.identity.name}" with id "${r}" is no longer reachable.`:`Agent "${a.identity.name}" with id "${r}" is temporarily unreachable. Try again.`}),session:s?removeTaskAgentAddress(e.currentSession,r):e.currentSession}}return{address:a.address,callId:n.callId,kind:`called`,name:n.name,session:e.currentSession,toolName:a.identity.name}}async function deliverToAgentAddress(e){let{action:t,address:c,bundle:l,identity:u}=e;if(c.kind===`agent/remote`){let n;try{n=resolveRemoteAgentForAction({nodeId:u.nodeId,remoteAgentName:u.name,registry:l.subagentRegistry.subagentsByNodeId})}catch(e){return err({cause:e,deliveryAmbiguous:!1,permanent:!0})}try{await continueRemoteAgentSession({callback:{callId:t.callId,subagentName:u.name,taskId:readTaskIdFromInboxToken(e.parentToken),token:e.parentToken,url:createWorkflowCallbackUrl(c.callbackBaseUrl,createEveCallbackRoutePath(e.parentToken))},message:readSubagentMessage(t),outputSchema:normalizeRequestedOutputSchema(t.input.outputSchema),remote:{...n,url:c.url},sessionId:c.sessionId})}catch(e){return err({cause:e,deliveryAmbiguous:isAmbiguousRemoteAgentContinueError(e),permanent:!isRetryableRemoteAgentContinueError(e)})}return ok(void 0)}let d=createWorkflowRuntime({compiledArtifactsSource:l.compiledArtifactsSource,nodeId:u.nodeId});try{if((await d.dispatchSession({command:{caller:{callId:t.callId,replyTo:{kind:`hook`,token:e.parentToken},subagentName:u.name,taskId:readTaskIdFromInboxToken(e.parentToken)},kind:`send`,payload:{message:readSubagentMessage(t),outputSchema:normalizeRequestedOutputSchema(t.input.outputSchema)}},sessionId:c.sessionId})).status===`session_not_active`)return err({cause:Error(`Agent session "${c.sessionId}" is no longer active.`),deliveryAmbiguous:!1,permanent:!0})}catch(e){let t=isRuntimeNoActiveSessionError(e);return err({cause:e,deliveryAmbiguous:!t,permanent:t})}return ok(void 0)}function createAgentErrorResult(e){return{callId:e.action.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:e.code,message:e.message},subagentName:e.action.kind===`remote-agent-call`?e.action.remoteAgentName:e.action.subagentName}}function readSubagentMessage(e){return typeof e.input.message==`string`?e.input.message:``}export{createAgentErrorResult,dispatchToAgentHandle,dispatchToTaskAgentAddress,isAgentHandleAction};
|
|
1
|
+
import{createLogger,logError}from"#internal/logging.js";import{isRuntimeNoActiveSessionError}from"#execution/runtime-errors.js";import{createEveCallbackRoutePath}from"#protocol/routes.js";import{continueRemoteAgentSession,isAmbiguousRemoteAgentContinueError,isRetryableRemoteAgentContinueError,resolveRemoteAgentForAction}from"#execution/remote-agent-dispatch.js";import{AGENT_BUSY,AGENT_MISMATCH,AGENT_UNREACHABLE}from"#harness/agent-handle-errors.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{prepareAgentContinuation,rejectAgentEffect,removeTaskAgentAddress}from"#harness/handles/transitions.js";import{normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{err,ok}from"#shared/result.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";const log=createLogger(`execution.agent-handle-dispatch`);function isAgentHandleAction(e){return e.kind===`subagent-call`||e.kind===`remote-agent-call`}async function dispatchToAgentHandle(e){let{action:n,agentId:r,bundle:i}=e,a=n.kind===`remote-agent-call`?n.remoteAgentName:n.subagentName,o={callId:n.callId,id:deriveAgentOperationId({callId:n.callId,parentSessionId:e.currentSession.sessionId,parentTurnId:e.parentTurnId}),kind:`continue`,parentTurnId:e.parentTurnId,previousStatus:``},s=prepareAgentContinuation(e.currentSession,{agentId:r,invokedName:a,operation:o});switch(s.kind){case`unknown`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:`Agent with id "${r}" is no longer reachable.`}),session:e.currentSession};case`mismatch`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_MISMATCH,message:`Agent "${r}" from the <agents> list does not belong to "${a}".`}),session:e.currentSession};case`busy`:return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_BUSY,message:`Agent "${r}" is still working on its previous request. Wait for its result before continuing it.`}),session:e.currentSession};case`ready`:break}let{handle:f}=s,p=await deliverToAgentAddress({action:n,address:f.address,auth:e.auth,bundle:i,identity:f.identity,parentToken:e.parentToken});if(!p.ok){let{cause:e,permanent:i}=p.error;return logError(log,`agent delivery failed`,e,{agentId:r,callId:n.callId,nodeId:f.identity.nodeId,permanent:i,subagentName:f.identity.name}),{deliveryAmbiguous:p.error.deliveryAmbiguous,kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:i?`Agent "${f.identity.name}" with id "${r}" is no longer reachable.`:`Agent "${f.identity.name}" with id "${r}" is temporarily unreachable. Try again.`}),session:rejectAgentEffect(s.session,{disposition:i?`dead`:`retryable`,operationId:o.id})}}return{address:f.address,callId:n.callId,kind:`called`,name:n.name,session:s.session,toolName:f.identity.name}}async function dispatchToTaskAgentAddress(e){let{action:n,agentId:r}=e,i=n.kind===`remote-agent-call`?n.remoteAgentName:n.subagentName,a=(getAgentHandleStore(e.currentSession.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===r);if(a===void 0)return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:`Agent with id "${r}" is no longer reachable.`}),session:e.currentSession};if(a.identity.name!==i)return{kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_MISMATCH,message:`Agent "${r}" from the <agents> list does not belong to "${i}".`}),session:e.currentSession};let o=await deliverToAgentAddress({action:n,address:a.address,auth:e.auth,bundle:e.bundle,identity:a.identity,parentToken:e.parentToken});if(!o.ok){let{cause:i,permanent:s}=o.error;return logError(log,`task agent delivery failed`,i,{agentId:r,callId:n.callId,nodeId:a.identity.nodeId,permanent:s,subagentName:a.identity.name}),{deliveryAmbiguous:o.error.deliveryAmbiguous,kind:`error`,result:createAgentErrorResult({action:n,code:AGENT_UNREACHABLE,message:s?`Agent "${a.identity.name}" with id "${r}" is no longer reachable.`:`Agent "${a.identity.name}" with id "${r}" is temporarily unreachable. Try again.`}),session:s?removeTaskAgentAddress(e.currentSession,r):e.currentSession}}return{address:a.address,callId:n.callId,kind:`called`,name:n.name,session:e.currentSession,toolName:a.identity.name}}async function deliverToAgentAddress(e){let{action:t,address:c,bundle:l,identity:u}=e;if(c.kind===`agent/remote`){let n;try{n=resolveRemoteAgentForAction({nodeId:u.nodeId,remoteAgentName:u.name,registry:l.subagentRegistry.subagentsByNodeId})}catch(e){return err({cause:e,deliveryAmbiguous:!1,permanent:!0})}try{await continueRemoteAgentSession({auth:e.auth,callback:{callId:t.callId,subagentName:u.name,taskId:readTaskIdFromInboxToken(e.parentToken),token:e.parentToken,url:createWorkflowCallbackUrl(c.callbackBaseUrl,createEveCallbackRoutePath(e.parentToken))},message:readSubagentMessage(t),outputSchema:normalizeRequestedOutputSchema(t.input.outputSchema),remote:{...n,url:c.url},sessionId:c.sessionId})}catch(e){return err({cause:e,deliveryAmbiguous:isAmbiguousRemoteAgentContinueError(e),permanent:!isRetryableRemoteAgentContinueError(e)})}return ok(void 0)}let d=createWorkflowRuntime({compiledArtifactsSource:l.compiledArtifactsSource,nodeId:u.nodeId});try{if((await d.dispatchSession({command:{auth:e.auth,caller:{callId:t.callId,replyTo:{kind:`hook`,token:e.parentToken},subagentName:u.name,taskId:readTaskIdFromInboxToken(e.parentToken)},kind:`send`,payload:{message:readSubagentMessage(t),outputSchema:normalizeRequestedOutputSchema(t.input.outputSchema)}},sessionId:c.sessionId})).status===`session_not_active`)return err({cause:Error(`Agent session "${c.sessionId}" is no longer active.`),deliveryAmbiguous:!1,permanent:!0})}catch(e){let t=isRuntimeNoActiveSessionError(e);return err({cause:e,deliveryAmbiguous:!t,permanent:t})}return ok(void 0)}function createAgentErrorResult(e){return{callId:e.action.callId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:e.code,message:e.message},subagentName:e.action.kind===`remote-agent-call`?e.action.remoteAgentName:e.action.subagentName}}function readSubagentMessage(e){return typeof e.input.message==`string`?e.input.message:``}export{createAgentErrorResult,dispatchToAgentHandle,dispatchToTaskAgentAddress,isAgentHandleAction};
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import type { HarnessToolDefinition } from "#harness/execute-tool.js";
|
|
2
2
|
import type { PreparedRuntimeDelegationTool } from "#runtime/sessions/turn.js";
|
|
3
|
-
|
|
3
|
+
import { type ToolSchemaSource } from "#shared/tool-schema.js";
|
|
4
|
+
type HarnessDelegationTool = Pick<PreparedRuntimeDelegationTool, "description" | "kind" | "name" | "nodeId"> & {
|
|
5
|
+
readonly inputSchema?: ToolSchemaSource | null;
|
|
6
|
+
readonly outputSchema?: ToolSchemaSource | null;
|
|
7
|
+
readonly rootOnly?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function createHarnessDelegationToolDefinition(tool: HarnessDelegationTool): HarnessToolDefinition;
|
|
10
|
+
export declare function createBackgroundSubagentHarnessDefinition(tool: HarnessDelegationTool): HarnessToolDefinition;
|
|
11
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#shared/tool-schema.js";function createHarnessDelegationToolDefinition(e){let t=e.kind===`remote`?{kind:`remote-agent-call`,nodeId:e.nodeId,remoteAgentName:e.name,subagentName:e.name}:{kind:`subagent-call`,nodeId:e.nodeId,subagentName:e.name};return{description:e.description??``,inputSchema:toInputSchema(e.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:e.name,outputSchema:toOutputSchema(e.outputSchema),runtimeAction:t}}export{createHarnessDelegationToolDefinition};
|
|
1
|
+
import{UNSPECIFIED_INPUT_SCHEMA,toInputSchema,toOutputSchema}from"#shared/tool-schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{defineSubagent,registerLocalSubagentExecutor}from"#runtime/framework-tools/subagent/local.js";import{defineRemoteSubagent}from"#runtime/framework-tools/subagent/remote.js";function createHarnessDelegationToolDefinition(e){let t=e.kind===`remote`?{kind:`remote-agent-call`,nodeId:e.nodeId,remoteAgentName:e.name,subagentName:e.name}:{kind:`subagent-call`,nodeId:e.nodeId,subagentName:e.name};return{description:e.description??``,inputSchema:toInputSchema(e.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:e.name,outputSchema:toOutputSchema(e.outputSchema)??void 0,rootOnly:e.rootOnly,runtimeAction:t,workflowCallable:!0}}function createBackgroundSubagentHarnessDefinition(n){let r=n.kind===`remote`?defineRemoteSubagent({description:n.description??``,name:n.name,nodeId:n.nodeId}):defineSubagent({description:n.description??``,name:n.name,nodeId:n.nodeId}),i=createToolExecuteWithAuth({execute:r.execute,execution:r.execution,scope:n.name});return n.kind!==`remote`&®isterLocalSubagentExecutor(i),{description:r.description,execute:i,execution:r.execution,inputSchema:toInputSchema(r.inputSchema)??UNSPECIFIED_INPUT_SCHEMA,name:n.name,outputSchema:toOutputSchema(r.outputSchema)??void 0,rootOnly:n.rootOnly,workflowCallable:!0}}export{createBackgroundSubagentHarnessDefinition,createHarnessDelegationToolDefinition};
|
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
* replay-safe `subagent.called` emission tail live here.
|
|
8
8
|
*/
|
|
9
9
|
import { type ChannelAdapter, type ChannelAdapterContext } from "#channel/adapter.js";
|
|
10
|
+
import { type AlsContext } from "#context/container.js";
|
|
10
11
|
import { type CompiledBundle } from "#runtime/sessions/runtime-context-keys.js";
|
|
11
12
|
import { type DispatchOutcome, type RuntimeAgentHandleAction, type RuntimeSession } from "#execution/agent-handle-dispatch.js";
|
|
12
13
|
import { getPendingRuntimeActionBatch } from "#harness/runtime-actions.js";
|
|
13
|
-
import type { RuntimeActionResult, RuntimeRemoteAgentCallActionRequest, RuntimeSubagentCallActionRequest, RuntimeSubagentDispatchFailure, RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
|
|
14
|
+
import type { RuntimeActionRequest, RuntimeActionResult, RuntimeRemoteAgentCallActionRequest, RuntimeSubagentCallActionRequest, RuntimeSubagentDispatchFailure, RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
|
|
14
15
|
import { type DurableSessionState } from "#execution/durable-session-store.js";
|
|
15
16
|
import { buildSubagentRunInput, type SubagentInputSource } from "#execution/subagent-tool.js";
|
|
16
17
|
import { getDynamicSubagentSelection } from "#context/dynamic-subagent-lifecycle.js";
|
|
@@ -109,6 +110,18 @@ export declare function prepareRuntimeActionDispatch(input: {
|
|
|
109
110
|
*/
|
|
110
111
|
readonly taskControls: boolean;
|
|
111
112
|
}): Promise<PreparedRuntimeActionDispatch | undefined>;
|
|
113
|
+
export declare function prepareAgentActionDispatch(input: {
|
|
114
|
+
readonly action: RuntimeActionRequest;
|
|
115
|
+
readonly ctx: AlsContext;
|
|
116
|
+
readonly event: {
|
|
117
|
+
readonly sequence: number;
|
|
118
|
+
readonly stepIndex: number;
|
|
119
|
+
readonly turnId: string;
|
|
120
|
+
};
|
|
121
|
+
readonly localFanoutSize: number;
|
|
122
|
+
readonly serializedContext: Record<string, unknown>;
|
|
123
|
+
readonly sessionState: DurableSessionState;
|
|
124
|
+
}): Promise<PreparedRuntimeActionDispatch>;
|
|
112
125
|
/**
|
|
113
126
|
* Emits the parent `subagent.called` control-plane event for one adopted
|
|
114
127
|
* child. Emission is observability, not control flow: a failure is logged
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{callAdapterEventHandler}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ChannelInstrumentationKey,InitiatorAuthKey,SandboxKey}from"#context/keys.js";import{createSubagentCalledEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{isAgentHandleAction}from"#execution/agent-handle-dispatch.js";import{readActionTraceContext,readSessionTraceContext}from"#tracing/agent-trace-context-store.js";import{assertUniqueRuntimeActionCallIds,getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{createRecursiveAgentRootOnlyResult,createUnavailableDynamicSubagentResult,getSubagentName}from"#execution/dispatch-action-failures.js";import{startLocalSubagent}from"#execution/subagent-start-local.js";import{startRemoteSubagent}from"#execution/subagent-start-remote.js";import"#execution/subagent-tool.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{isTaskControlAction}from"#execution/tasks/parent/dispatch.js";const log=createLogger(`execution.dispatch-runtime-actions`);async function prepareRuntimeActionDispatch(e){let t=await readDurableSession(e.sessionState),n=getPendingRuntimeActionBatch(t.state);
|
|
1
|
+
import{createLogger,logError}from"#internal/logging.js";import{callAdapterEventHandler}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ChannelInstrumentationKey,InitiatorAuthKey,SandboxKey}from"#context/keys.js";import{createSubagentCalledEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{ContextContainer}from"#context/container.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{getAgentHandleStore}from"#harness/handles/store.js";import{workflowEntryReference}from"#execution/workflow-runtime.js";import{deserializeContext}from"#context/serialize.js";import{readDurableSession}from"#execution/durable-session-store.js";import{getDynamicSubagentSelection}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{withContextScope}from"#context/run-step.js";import{isAgentHandleAction}from"#execution/agent-handle-dispatch.js";import{readActionTraceContext,readSessionTraceContext}from"#tracing/agent-trace-context-store.js";import{assertUniqueRuntimeActionCallIds,getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{createRecursiveAgentRootOnlyResult,createUnavailableDynamicSubagentResult,getSubagentName}from"#execution/dispatch-action-failures.js";import{startLocalSubagent}from"#execution/subagent-start-local.js";import{startRemoteSubagent}from"#execution/subagent-start-remote.js";import"#execution/subagent-tool.js";import{resolveSubagentDepth}from"#harness/subagent-depth.js";import{isTaskControlAction}from"#execution/tasks/parent/dispatch.js";const log=createLogger(`execution.dispatch-runtime-actions`);async function prepareRuntimeActionDispatch(e){let t=await readDurableSession(e.sessionState),n=getPendingRuntimeActionBatch(t.state);return n===void 0||n.actions.length===0?void 0:await prepareActionDispatch({batch:n,ctx:await deserializeContext(e.serializedContext),durableSession:t,serializedContext:e.serializedContext,taskControls:e.taskControls})}async function prepareAgentActionDispatch(e){let t=await readDurableSession(e.sessionState);return await prepareActionDispatch({batch:{actions:[e.action],event:e.event,responseMessages:[]},ctx:copyDurableContext(e.ctx),durableSession:t,fanoutSize:e.localFanoutSize,serializedContext:e.serializedContext,taskControls:!1})}function copyDurableContext(e){let t=new ContextContainer;for(let[n,r]of e.entries())t.set(n,r);return t}async function prepareActionDispatch(e){let{batch:t,durableSession:n}=e;assertUniqueRuntimeActionCallIds(t.actions);let s=e.ctx,c=s.require(BundleKey),l=resolveEffectiveAgentRuntime(c,s),u=hydrateDurableSession({compactionOverrides:{thresholdPercent:l.thresholdPercent},durable:n,turnAgent:l.turnAgent}),d=s.require(ChannelKey);getAgentHandleStore(n.state);let f=planDispatch({actions:t.actions,bundle:c,ctx:s,session:u,taskControls:e.taskControls}),p=resolveActiveSandboxSessionId(d.state,u.sessionId);if(planSharesSandbox({bundle:c,plan:f}))try{u=(await withContextScope(s,u,async e=>(await s.require(SandboxKey).get(),{result:void 0,session:e}))).session}finally{s.clearVirtualContext()}return{adapter:d,adapterCtx:buildAdapterContext(d,s),auth:s.get(AuthKey)??null,batch:t,bundle:c,capabilities:s.get(CapabilitiesKey),channelMetadata:s.get(ChannelInstrumentationKey),fanoutSize:e.fanoutSize??f.filter(e=>e.kind===`start`&&e.target.kind===`local`).length,initiatorAuth:s.get(InitiatorAuthKey)??null,parentTraceContext:readSessionTraceContext(e.serializedContext,u.sessionId),plan:f,sandboxSessionId:p,serializedContext:e.serializedContext,session:u}}function planSharesSandbox(e){let t=e.bundle.graph;return e.plan.some(n=>{if(n.kind!==`start`||n.target.kind!==`local`)return!1;let r=n.target.action;return r.subagentName===`agent`&&!e.bundle.subagentRegistry.subagentsByNodeId.has(r.nodeId)||t?.nodesByNodeId.get(r.nodeId)?.sandboxRegistry.sandbox.definition.inheritsParent===!0})}function resolveActiveSandboxSessionId(e,t){if(typeof e!=`object`||!e)return t;let n=e.sandboxSessionId;return typeof n==`string`&&n.length>0?n:t}async function emitSubagentCalled(e){let{entry:r,outcome:i}=e;try{let t=r.kind===`resume`?r.action:r.target.action,a=r.kind===`resume`?r.dynamicRemoteAgent:r.target.kind===`remote`?r.target.dynamicRemoteAgent:void 0,o=await callAdapterEventHandler(e.adapter,createSubagentCalledEvent({callId:i.callId,childSessionId:i.address.sessionId,name:i.name,remote:i.address.kind===`agent/remote`?{resolverId:a===void 0?t.nodeId:a.credentialsStepId,url:i.address.url}:void 0,sequence:e.batchEvent.sequence,sessionId:e.sessionId,toolName:i.toolName,turnId:e.batchEvent.turnId,workflowId:workflowEntryReference.workflowId}),e.adapterCtx);await e.writer.write(encodeMessageStreamEvent(stampMessageStreamEvent(o)))}catch(e){logError(log,`subagent.called emission failed`,e,{callId:i.callId,childSessionId:i.address.sessionId,toolName:i.toolName})}}function planDispatch(e){let t=getAgentHandleStore(e.session.state)?.handles??[];return e.actions.map(n=>{if(e.taskControls&&isTaskControlAction(n))return{action:n,kind:`task-control`};let r=n.input.agentId,i=typeof r==`string`&&r.trim()!==``?r:void 0;if(i!==void 0&&isAgentHandleAction(n)){if(t.some(e=>e.identity.id===i)){let t=e.bundle.subagentRegistry.dynamicNodeIds?.has(n.nodeId)===!0?getDynamicSubagentSelection(e.ctx,n.nodeId):void 0;return{action:n,agentId:i,dynamicRemoteAgent:n.kind===`remote-agent-call`&&t?.kind===`remote`?t.remoteAgent:void 0,kind:`resume`}}log.warn(`unknown agentId on subagent call; starting a new agent`,{agentId:i,callId:n.callId})}return classifyFreshStart({action:n,bundle:e.bundle,ctx:e.ctx,session:e.session})})}function classifyFreshStart(e){let{action:t}=e,n=e.bundle.subagentRegistry.subagentsByNodeId,r=resolveSubagentDepth(e.session),i=e.session.rootSessionId!==void 0||r.currentDepth>0,a=(t.kind===`subagent-call`||t.kind===`remote-agent-call`)&&e.bundle.subagentRegistry.dynamicNodeIds?.has(t.nodeId)===!0,o=a?getDynamicSubagentSelection(e.ctx,t.nodeId):void 0;if(a&&(o===void 0||t.kind===`subagent-call`&&o.kind!==`subagent`||t.kind===`remote-agent-call`&&o.kind!==`remote`)){let e=getSubagentName(t);return log.warn(`dynamic subagent call blocked after availability changed`,{callId:t.callId,nodeId:t.nodeId,subagentName:e}),{kind:`reject`,result:createUnavailableDynamicSubagentResult(t)}}if(isRecursiveAgentAction(t,n)&&i)return log.warn(`recursive agent call blocked outside the root session`,{callId:t.callId,currentDepth:r.currentDepth,nodeId:t.nodeId,subagentName:t.subagentName}),{kind:`reject`,result:createRecursiveAgentRootOnlyResult(t)};switch(t.kind){case`subagent-call`:{let e=o?.kind===`subagent`?o.agentConfig:void 0,r=n.get(t.nodeId),i=e?.description??(r?.definition.kind===`subagent`?r.definition.description:void 0);return{kind:`start`,target:{action:t,dynamicSubagentAgentConfig:e,kind:`local`,source:i===void 0?{type:`runtime`}:{description:i,type:`local`}}}}case`remote-agent-call`:return{kind:`start`,target:{action:t,dynamicRemoteAgent:o?.kind===`remote`?o.remoteAgent:void 0,kind:`remote`}};default:throw Error(`Unsupported runtime action kind "${t.kind}" in workflow runtime.`)}}async function startSubagent(e){let t=readActionTraceContext(e.serializedContext,e.session.sessionId,e.batchEvent.turnId,e.target.action.callId)??e.parentTraceContext;switch(e.target.kind){case`local`:return startLocalSubagent({action:e.target.action,auth:e.auth,batchEvent:e.batchEvent,bundle:e.bundle,capabilities:e.capabilities,channelMetadata:e.channelMetadata,currentSession:e.currentSession,dynamicSubagentAgentConfig:e.target.dynamicSubagentAgentConfig,fanoutSize:e.fanoutSize,initiatorAuth:e.initiatorAuth,parentContinuationToken:e.parentContinuationToken,parentTraceContext:t,persistentSessions:e.persistentSessions,sandboxSessionId:e.sandboxSessionId,session:e.session,source:e.target.source,taskOwned:e.taskOwned});case`remote`:return startRemoteSubagent({action:e.target.action,auth:e.auth,batchEvent:e.batchEvent,bundle:e.bundle,callbackBaseUrl:e.callbackBaseUrl,currentSession:e.currentSession,dynamicRemoteAgent:e.target.dynamicRemoteAgent,initiatorAuth:e.initiatorAuth,parentContinuationToken:e.parentContinuationToken,parentTraceContext:t,persistentSessions:e.persistentSessions,session:e.session,taskOwned:e.taskOwned});default:return e.target}}function isRecursiveAgentAction(e,t){return e.kind===`subagent-call`&&e.subagentName===`agent`&&!t.has(e.nodeId)}export{emitSubagentCalled,prepareAgentActionDispatch,prepareRuntimeActionDispatch,startSubagent};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToAgentHandle}from"#execution/agent-handle-dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";async function dispatchRuntimeActionsStep(n){"use step";let r=await prepareRuntimeActionDispatch({serializedContext:n.serializedContext,sessionState:n.sessionState,taskControls:!1});if(r===void 0)return{results:[],sessionState:n.sessionState,pendingTasks:[]};let{batch:i,bundle:a,session:o}=r,s=a.resolvedAgent.config?.experimental?.subagentPersistentSessions===!0,c=n.parentWritable.getWriter(),l=o,u=[];try{for(let e of r.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`task-control`)throw Error(`Task-control actions require the task dispatch step.`);let t;switch(e.kind){case`resume`:t=await dispatchToAgentHandle({action:e.action,agentId:e.agentId,bundle:createAgentContinuationBundle({action:e.action,bundle:a,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:n.parentContinuationToken??o.continuationToken,parentTurnId:i.event.turnId});break;case`start`:t=await startSubagent({auth:r.auth,batchEvent:i.event,bundle:a,callbackBaseUrl:n.callbackBaseUrl,capabilities:r.capabilities,channelMetadata:r.channelMetadata,currentSession:l,fanoutSize:r.fanoutSize,initiatorAuth:r.initiatorAuth,parentContinuationToken:n.parentContinuationToken,parentTraceContext:r.parentTraceContext,persistentSessions:s,sandboxSessionId:r.sandboxSessionId,serializedContext:r.serializedContext,session:o,taskOwned:!1,target:e.target});break}if(l=t.session,t.kind===`error`){u.push(t.result);continue}await emitSubagentCalled({adapter:r.adapter,adapterCtx:r.adapterCtx,batchEvent:i.event,entry:e,outcome:t,sessionId:o.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===o?n.sessionState:createDurableSessionState({session:l}),pendingTasks:[]}}export{dispatchRuntimeActionsStep};
|
|
1
|
+
import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToAgentHandle}from"#execution/agent-handle-dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";async function dispatchRuntimeActionsStep(n){"use step";let r=await prepareRuntimeActionDispatch({serializedContext:n.serializedContext,sessionState:n.sessionState,taskControls:!1});if(r===void 0)return{results:[],sessionState:n.sessionState,pendingTasks:[]};let{batch:i,bundle:a,session:o}=r,s=a.resolvedAgent.config?.experimental?.subagentPersistentSessions===!0,c=n.parentWritable.getWriter(),l=o,u=[];try{for(let e of r.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`task-control`)throw Error(`Task-control actions require the task dispatch step.`);let t;switch(e.kind){case`resume`:t=await dispatchToAgentHandle({action:e.action,agentId:e.agentId,auth:r.auth,bundle:createAgentContinuationBundle({action:e.action,bundle:a,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:n.parentContinuationToken??o.continuationToken,parentTurnId:i.event.turnId});break;case`start`:t=await startSubagent({auth:r.auth,batchEvent:i.event,bundle:a,callbackBaseUrl:n.callbackBaseUrl,capabilities:r.capabilities,channelMetadata:r.channelMetadata,currentSession:l,fanoutSize:r.fanoutSize,initiatorAuth:r.initiatorAuth,parentContinuationToken:n.parentContinuationToken,parentTraceContext:r.parentTraceContext,persistentSessions:s,sandboxSessionId:r.sandboxSessionId,serializedContext:r.serializedContext,session:o,taskOwned:!1,target:e.target});break}if(l=t.session,t.kind===`error`){u.push(t.result);continue}await emitSubagentCalled({adapter:r.adapter,adapterCtx:r.adapterCtx,batchEvent:i.event,entry:e,outcome:t,sessionId:o.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===o?n.sessionState:createDurableSessionState({session:l}),pendingTasks:[]}}export{dispatchRuntimeActionsStep};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HarnessSession } from "#harness/types.js";
|
|
2
|
+
import { identityHistoryViewProjector, type PreparedHistoryView } from "#shared/history-view.js";
|
|
3
|
+
export interface ExecutionHistoryView {
|
|
4
|
+
readonly initial: PreparedHistoryView;
|
|
5
|
+
readonly messages: (session: HarnessSession) => PreparedHistoryView["messages"];
|
|
6
|
+
readonly prepare: (session: HarnessSession) => PreparedHistoryView;
|
|
7
|
+
readonly projector: typeof identityHistoryViewProjector;
|
|
8
|
+
}
|
|
9
|
+
export declare function createExecutionHistoryView(session: HarnessSession): ExecutionHistoryView;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createHistoryViewPreparer,identityHistoryViewProjector}from"#shared/history-view.js";function createExecutionHistoryView(t){let n=identityHistoryViewProjector,r=createHistoryViewPreparer({projector:n}),prepare=e=>r(e.history,e.state);return{initial:prepare(t),messages:e=>prepare(e).messages,prepare,projector:n}}export{createExecutionHistoryView};
|
|
@@ -12,8 +12,39 @@
|
|
|
12
12
|
* strips unknown fields.
|
|
13
13
|
*/
|
|
14
14
|
import type { DurableSessionState } from "#execution/durable-session-store.js";
|
|
15
|
-
import type { SettledTurn } from "#harness/types.js";
|
|
15
|
+
import type { SettledTurn, StepResult } from "#harness/types.js";
|
|
16
16
|
import type { TokenUsage } from "#shared/token-usage.js";
|
|
17
|
+
interface DurableStepResultFields {
|
|
18
|
+
readonly backgroundTaskState?: DurableSessionState;
|
|
19
|
+
readonly backgroundTasks?: StepResult["backgroundTasks"];
|
|
20
|
+
readonly serializedContext: Record<string, unknown>;
|
|
21
|
+
readonly sessionState: DurableSessionState;
|
|
22
|
+
}
|
|
23
|
+
/** Result returned by the latest turn step to its durable driver workflow. */
|
|
24
|
+
export type DurableStepResult = ({
|
|
25
|
+
readonly action: "continue" | "done";
|
|
26
|
+
readonly output?: unknown;
|
|
27
|
+
readonly isError?: boolean;
|
|
28
|
+
readonly sleepDurationMs?: number;
|
|
29
|
+
readonly usage?: TokenUsage;
|
|
30
|
+
readonly usageDelta?: TokenUsage;
|
|
31
|
+
} | {
|
|
32
|
+
readonly action: "cancelled";
|
|
33
|
+
} | {
|
|
34
|
+
readonly action: "park";
|
|
35
|
+
readonly authorizationAttemptIds?: readonly string[];
|
|
36
|
+
readonly authorizationNames?: readonly string[];
|
|
37
|
+
readonly hasPendingAuthorization: boolean;
|
|
38
|
+
readonly hasPendingInputBatch: boolean;
|
|
39
|
+
readonly pendingRuntimeActionKeys?: readonly string[];
|
|
40
|
+
readonly tasksEnabled?: boolean;
|
|
41
|
+
readonly sleepDurationMs?: number;
|
|
42
|
+
readonly settled?: SettledTurn;
|
|
43
|
+
} | {
|
|
44
|
+
readonly action: "dispatch-workflow-runtime-actions";
|
|
45
|
+
readonly pendingRuntimeActionKeys: readonly string[];
|
|
46
|
+
readonly sleepDurationMs?: number;
|
|
47
|
+
}) & DurableStepResultFields;
|
|
17
48
|
/** Discriminated union the driver workflow body dispatches on. */
|
|
18
49
|
export type NextDriverAction = {
|
|
19
50
|
readonly kind: "done";
|
|
@@ -58,3 +89,4 @@ export type NextDriverAction = {
|
|
|
58
89
|
readonly sessionState: DurableSessionState;
|
|
59
90
|
readonly serializedContext: Record<string, unknown>;
|
|
60
91
|
};
|
|
92
|
+
export {};
|
|
@@ -5,6 +5,7 @@ import type { RunMode } from "#shared/run-mode.js";
|
|
|
5
5
|
import { type RuntimeModelResolutionScope } from "#runtime/agent/resolve-model.js";
|
|
6
6
|
import type { RuntimeCompiledArtifactsSource } from "#runtime/compiled-artifacts-source.js";
|
|
7
7
|
import type { ResolvedRuntimeAgentNode } from "#runtime/graph.js";
|
|
8
|
+
import type { HistoryViewProjector, PreparedHistoryView } from "#shared/history-view.js";
|
|
8
9
|
/**
|
|
9
10
|
* Factory that creates a {@link Runtime} for the given compiled
|
|
10
11
|
* artifacts source and optional node id. Matches the signature of
|
|
@@ -38,6 +39,8 @@ export interface CreateExecutionNodeStepInput {
|
|
|
38
39
|
*/
|
|
39
40
|
readonly createRuntime: CreateRuntime;
|
|
40
41
|
readonly handleEvent?: HandleEventFn;
|
|
42
|
+
readonly historyProjector?: HistoryViewProjector;
|
|
43
|
+
readonly historyView?: PreparedHistoryView;
|
|
41
44
|
readonly mode: RunMode;
|
|
42
45
|
readonly modelResolutionScope: RuntimeModelResolutionScope;
|
|
43
46
|
readonly node: ResolvedRuntimeAgentNode;
|
|
@@ -61,8 +64,8 @@ export declare function buildRuntimeIdentity(node: ResolvedRuntimeAgentNode): Ru
|
|
|
61
64
|
* Resolves unified {@link HarnessToolDefinition}s from the node's registries.
|
|
62
65
|
*
|
|
63
66
|
* For authored tools: copies all lifecycle fields from the resolved definition.
|
|
64
|
-
* For subagent tools:
|
|
65
|
-
*
|
|
67
|
+
* For subagent tools: selects the existing runtime-action definition or the
|
|
68
|
+
* background `defineTool` definition from the node's `experimental.tasks` setting.
|
|
66
69
|
* Tools without `execute` (provider-managed) get entries with schema but no execute.
|
|
67
70
|
*/
|
|
68
71
|
export declare function createNodeHarnessTools(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA}from"#shared/tool-schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{createHarnessDelegationToolDefinition}from"#execution/delegation-tool.js";import{PERSISTENT_SUBAGENT_TOOL_INPUT_SCHEMA,SUBAGENT_TOOL_INPUT_SCHEMA}from"#runtime/subagents/registry.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{createTaskToolHarnessDefinitions,isTaskToolAvailable}from"#runtime/framework-tools/tasks.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,isImplicitAgentToolAvailable}from"#runtime/framework-tools/agent.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node}),i=getInstrumentationRuntime(),a=createToolLoopHarness({abortSignal:e.abortSignal,capabilities:e.capabilities,clearOnly:e.clearOnly,compactOnly:e.compactOnly,workflow:e.node.agent.workflowTool!==void 0,workflowMaxSubagents:e.workflowMaxSubagents,webSearchProvider:e.node.agent.webSearchProvider,handleEvent:e.handleEvent,instrumentation:i,mode:e.mode,onCompaction:preserveFrameworkStateOnCompaction,persistentSubagentSessions:e.node.agent.config?.experimental?.tasks===!0||e.node.agent.config?.experimental?.subagentPersistentSessions===!0,dispatchDynamicModelEvent:n,resolveModel:t,runtimeIdentity:buildRuntimeIdentity(e.node),tools:r});return i===void 0?a:async(e,t)=>{try{return await a(e,t)}finally{await i.forceFlush()}}}function buildRuntimeIdentity(e){let n=resolveInstalledPackageInfo(),r={agentId:e.turnAgent.id,agentName:e.agent.config?.name,eveVersion:n.version},i=process.env.VERCEL_GIT_COMMIT_SHA?.trim(),a=process.env.VERCEL_GIT_COMMIT_REF?.trim(),o=process.env.VERCEL_DEPLOYMENT_CREATED_AT?.trim();return i||a||o?{...r,build:{deployedAt:o||void 0,gitBranch:a||void 0,gitSha:i||void 0}}:r}function createRuntimeModelResolver(e){return t=>resolveRuntimeModelReference(t,e)}function createRuntimeDynamicModelEventDispatcher(e,t){return n=>dispatchDynamicModelEvent({ctx:n.ctx,dynamicModel:t,event:n.event,messages:n.messages,scope:e})}function createNodeHarnessTools(e){let t=new Map;for(let
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{UNSPECIFIED_INPUT_SCHEMA}from"#shared/tool-schema.js";import{createToolExecuteWithAuth}from"#execution/tool-auth.js";import{resolveRuntimeModelReference}from"#runtime/agent/resolve-model.js";import{createBackgroundSubagentHarnessDefinition,createHarnessDelegationToolDefinition}from"#execution/delegation-tool.js";import{PERSISTENT_SUBAGENT_TOOL_INPUT_SCHEMA,SUBAGENT_TOOL_INPUT_SCHEMA}from"#runtime/subagents/registry.js";import{LOAD_SKILL_TOOL_NAME}from"#runtime/skills/fragment-context.js";import{createTaskToolHarnessDefinitions,isTaskToolAvailable}from"#runtime/framework-tools/tasks.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{createToolLoopHarness}from"#harness/tool-loop.js";import{getInstrumentationRuntime}from"#harness/instrumentation/runtime.js";import{AGENT_TOOL_DESCRIPTION,AGENT_TOOL_NAME,isImplicitAgentToolAvailable}from"#runtime/framework-tools/agent.js";import{findRegisteredRuntimeTool}from"#runtime/tools/registry.js";import{preserveFrameworkStateOnCompaction}from"#execution/compaction.js";const log=createLogger(`execution.node-step`);function createExecutionNodeStep(e){let t=createRuntimeModelResolver(e.modelResolutionScope),n=e.node.turnAgent.dynamicModel===void 0?void 0:createRuntimeDynamicModelEventDispatcher(e.modelResolutionScope,e.node.turnAgent.dynamicModel),r=createNodeHarnessTools({node:e.node}),i=getInstrumentationRuntime(),a=createToolLoopHarness({abortSignal:e.abortSignal,capabilities:e.capabilities,clearOnly:e.clearOnly,compactOnly:e.compactOnly,workflow:e.node.agent.workflowTool!==void 0,workflowMaxSubagents:e.workflowMaxSubagents,webSearchProvider:e.node.agent.webSearchProvider,handleEvent:e.handleEvent,historyProjector:e.historyProjector,historyView:e.historyView,instrumentation:i,mode:e.mode,onCompaction:preserveFrameworkStateOnCompaction,persistentSubagentSessions:e.node.agent.config?.experimental?.tasks===!0||e.node.agent.config?.experimental?.subagentPersistentSessions===!0,dispatchDynamicModelEvent:n,resolveModel:t,runtimeIdentity:buildRuntimeIdentity(e.node),tools:r});return i===void 0?a:async(e,t)=>{try{return await a(e,t)}finally{await i.forceFlush()}}}function buildRuntimeIdentity(e){let n=resolveInstalledPackageInfo(),r={agentId:e.turnAgent.id,agentName:e.agent.config?.name,eveVersion:n.version},i=process.env.VERCEL_GIT_COMMIT_SHA?.trim(),a=process.env.VERCEL_GIT_COMMIT_REF?.trim(),o=process.env.VERCEL_DEPLOYMENT_CREATED_AT?.trim();return i||a||o?{...r,build:{deployedAt:o||void 0,gitBranch:a||void 0,gitSha:i||void 0}}:r}function createRuntimeModelResolver(e){return t=>resolveRuntimeModelReference(t,e)}function createRuntimeDynamicModelEventDispatcher(e,t){return n=>dispatchDynamicModelEvent({ctx:n.ctx,dynamicModel:t,event:n.event,messages:n.messages,scope:e})}function createNodeHarnessTools(e){let t=new Map,n=e.node.agent.config?.experimental?.tasks===!0;for(let r of e.node.turnAgent.tools){let i=resolveHarnessToolDefinition({node:e.node,tasksEnabled:n,tool:r});i!==null&&t.set(r.name,i)}if(isImplicitAgentToolAvailable({disabledFrameworkTools:e.node.agent.disabledFrameworkTools,hasAuthoredAgentTool:t.has(AGENT_TOOL_NAME),nodeId:e.node.nodeId})){let r={description:AGENT_TOOL_DESCRIPTION,inputSchema:n||e.node.agent.config?.experimental?.subagentPersistentSessions===!0?PERSISTENT_SUBAGENT_TOOL_INPUT_SCHEMA:SUBAGENT_TOOL_INPUT_SCHEMA,kind:`subagent`,name:AGENT_TOOL_NAME,nodeId:e.node.nodeId,rootOnly:!0};t.set(AGENT_TOOL_NAME,n?createBackgroundSubagentHarnessDefinition(r):createHarnessDelegationToolDefinition(r))}for(let r of createTaskToolHarnessDefinitions())isTaskToolAvailable({disabledFrameworkTools:e.node.agent.disabledFrameworkTools,hasAuthoredTool:t.has(r.name),tasksEnabled:n,toolName:r.name})&&t.set(r.name,r);return t}function resolveHarnessToolDefinition(e){if(e.tool.kind===`subagent`||e.tool.kind===`remote`)return e.tasksEnabled?createBackgroundSubagentHarnessDefinition(e.tool):createHarnessDelegationToolDefinition(e.tool);let t=findRegisteredRuntimeTool(e.node.toolRegistry,e.tool.name);if(t===null)return log.warn(`declared tool is not registered — omitting from toolset`,{toolName:e.tool.name,nodeId:e.node.nodeId}),null;let r=t.definition,i=r.sourceId.startsWith(`eve:`),s=r.execute;return{approvalKey:r.approvalKey,description:r.description,execution:r.execution,execute:resolveAuthoredExecute({isFrameworkTool:i,rawExecute:s,scope:r.name}),frameworkAction:i&&r.name===LOAD_SKILL_TOOL_NAME?`load-skill`:void 0,inputSchema:r.inputSchema??UNSPECIFIED_INPUT_SCHEMA,name:r.name,approval:r.approval,outputSchema:r.outputSchema,toModelOutput:r.toModelOutput}}function resolveAuthoredExecute(e){let{isFrameworkTool:t,rawExecute:n,scope:i}=e;return n===void 0?void 0:t?n:createToolExecuteWithAuth({execute:n,scope:i})}export{buildRuntimeIdentity,createExecutionNodeStep,createNodeHarnessTools};
|
|
@@ -35,6 +35,8 @@ export declare function startRemoteAgentSession(input: {
|
|
|
35
35
|
}): Promise<RemoteAgentSessionCoordinates>;
|
|
36
36
|
/** Continues one remote-agent session by its immutable session ID. */
|
|
37
37
|
export declare function continueRemoteAgentSession(input: {
|
|
38
|
+
/** The dispatching turn's session principal, forwarded when `remote.forwardPrincipal` is set. */
|
|
39
|
+
readonly auth: SessionAuthContext | null;
|
|
38
40
|
readonly callback: {
|
|
39
41
|
readonly callId: string;
|
|
40
42
|
readonly subagentName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z}from"#compiled/zod/index.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";import{AgentHandleError}from"#protocol/agent-handle-error.js";import{createRemoteAgentRouteUrl}from"#execution/remote-agent-route-url.js";import{formatTraceparent}from"#protocol/traceparent.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),sessionId:z.string().min(1),status:z.literal(`accepted`)});var RemoteAgentCancelRequestError=class extends Error{retryable;constructor(e,t){super(e),this.name=`RemoteAgentCancelRequestError`,this.retryable=t.retryable}};async function startRemoteAgentSession(e){let t=e.callbackToken??e.session.continuationToken;if(!t)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let n=buildForwardedPrincipalField(e),i={capabilities:{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,taskId:readTaskIdFromInboxToken(t),token:t,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(t))},message:formatRemoteAgentCallInputMessage({action:e.action,persistentSession:e.persistentSessions,remote:e.remote}),mode:e.persistentSessions===!0?`conversation`:`task`,outputSchema:normalizeRequestedOutputSchema(e.action.input.outputSchema)??e.remote.outputSchema};n!==void 0&&(i.forwardedPrincipal=n),e.operationId!==void 0&&(i.operationId=e.operationId);let a=await resolveRemoteAgentRequestHeaders(e.remote),o=formatTraceparent(e.parentTraceContext);if(o!==void 0){for(let e of Object.keys(a))e.toLowerCase()===`traceparent`&&delete a[e];a.traceparent=o}let s=await fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(i),headers:{"content-type":`application/json`,...a},method:`POST`});if(!s.ok)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${s.status}.`);let c;try{c=await s.json()}catch{throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON.`)}let l=CreateSessionResponseSchema.safeParse(c);if(!l.success)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid.`);return{sessionId:l.data.sessionId}}async function continueRemoteAgentSession(e){let t=
|
|
1
|
+
import{z}from"#compiled/zod/index.js";import{expectFunction,expectObjectRecord}from"#internal/authored-module.js";import{createEveCallbackRoutePath,createEveSessionCancelRoutePath,createEveSessionRoutePath}from"#protocol/routes.js";import{CancelTurnResponseSchema}from"#protocol/cancel-turn.js";import{formatSubagentInput,normalizeRequestedOutputSchema}from"#execution/subagent-invocation.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";import{AgentHandleError}from"#protocol/agent-handle-error.js";import{createRemoteAgentRouteUrl}from"#execution/remote-agent-route-url.js";import{formatTraceparent}from"#protocol/traceparent.js";const CreateSessionResponseSchema=z.object({ok:z.literal(!0),sessionId:z.string().min(1),status:z.literal(`accepted`)});var RemoteAgentCancelRequestError=class extends Error{retryable;constructor(e,t){super(e),this.name=`RemoteAgentCancelRequestError`,this.retryable=t.retryable}};async function startRemoteAgentSession(e){let t=e.callbackToken??e.session.continuationToken;if(!t)throw Error(`Cannot dispatch remote agent without a parent continuation token.`);if(!e.callbackBaseUrl)throw Error(`Cannot dispatch remote agent without a callback base URL.`);let n=buildForwardedPrincipalField(e),i={capabilities:{},callback:{callId:e.action.callId,subagentName:e.action.remoteAgentName,taskId:readTaskIdFromInboxToken(t),token:t,url:createWorkflowCallbackUrl(e.callbackBaseUrl,createEveCallbackRoutePath(t))},message:formatRemoteAgentCallInputMessage({action:e.action,persistentSession:e.persistentSessions,remote:e.remote}),mode:e.persistentSessions===!0?`conversation`:`task`,outputSchema:normalizeRequestedOutputSchema(e.action.input.outputSchema)??e.remote.outputSchema};n!==void 0&&(i.forwardedPrincipal=n),e.operationId!==void 0&&(i.operationId=e.operationId);let a=await resolveRemoteAgentRequestHeaders(e.remote),o=formatTraceparent(e.parentTraceContext);if(o!==void 0){for(let e of Object.keys(a))e.toLowerCase()===`traceparent`&&delete a[e];a.traceparent=o}let s=await fetch(createRemoteAgentSessionUrl(e.remote),{body:JSON.stringify(i),headers:{"content-type":`application/json`,...a},method:`POST`});if(!s.ok)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session request failed with HTTP ${s.status}.`);let c;try{c=await s.json()}catch{throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was not valid JSON.`)}let l=CreateSessionResponseSchema.safeParse(c);if(!l.success)throw Error(`Remote agent "${e.action.remoteAgentName}" create-session response was invalid.`);return{sessionId:l.data.sessionId}}async function continueRemoteAgentSession(e){let t=buildForwardedPrincipalField(e),n={callback:e.callback,message:e.message,outputSchema:e.outputSchema};t!==void 0&&(n.forwardedPrincipal=t);let r=await fetch(createRemoteAgentContinueUrl(e.remote,e.sessionId),{body:JSON.stringify(n),headers:{"content-type":`application/json`,...await resolveRemoteAgentRequestHeaders(e.remote)},method:`POST`});if(!r.ok){let n=await readRemoteAgentErrorCode(r),i=r.status===404||n===AgentHandleError.SessionNotResumable.code,a=r.status===400&&t!==void 0?` The receiver may support forwarded principals only on session creation; upgrade it before retrying.`:``;throw new RemoteAgentContinueRequestError(`Remote agent "${e.remote.name}" continue-session request failed${i?` permanently`:``} with HTTP ${r.status}.${a}`,{deliveryAmbiguous:isAmbiguousRemoteContinueStatus(r.status),retryable:!i})}}var RemoteAgentContinueRequestError=class extends Error{deliveryAmbiguous;retryable;constructor(e,t){super(e),this.name=`RemoteAgentContinueRequestError`,this.deliveryAmbiguous=t.deliveryAmbiguous,this.retryable=t.retryable}};function isRetryableRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.retryable}function isAmbiguousRemoteAgentContinueError(e){return!(e instanceof RemoteAgentContinueRequestError)||e.deliveryAmbiguous}function isAmbiguousRemoteContinueStatus(e){return e===408||e===425||e>=500}async function readRemoteAgentErrorCode(e){let t;try{t=await e.json()}catch{return}if(typeof t!=`object`||!t)return;let n=Reflect.get(t,`code`);return typeof n==`string`?n:void 0}function buildForwardedPrincipalField(e){if(e.remote.forwardPrincipal!==!0||e.auth===null||e.auth===void 0)return;let t={current:e.auth};return e.initiatorAuth!==null&&e.initiatorAuth!==void 0&&(t.initiator=e.initiatorAuth),t}async function cancelRemoteAgentTurn(e){let t=await resolveRemoteAgentRequestHeaders(e.remote),n=await fetch(createRemoteAgentCancelTurnUrl(e.remote,e.sessionId),{body:e.turnId===void 0&&e.taskId===void 0?void 0:JSON.stringify({taskId:e.taskId,turnId:e.turnId}),headers:t,method:`POST`});if(!n.ok)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn request failed with HTTP ${n.status}.`,{retryable:isRetryableRemoteCancelStatus(n.status)});let r;try{r=await n.json()}catch{throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was not valid JSON.`,{retryable:!1})}let i=CancelTurnResponseSchema.safeParse(r);if(!i.success||i.data.status===`accepted`&&i.data.sessionId!==e.sessionId)throw new RemoteAgentCancelRequestError(`Remote agent "${e.remote.name}" cancel-turn response was invalid.`,{retryable:!1});return i.data.status===`accepted`?{sessionId:i.data.sessionId,status:`accepted`}:{status:`no_active_turn`}}function isRetryableRemoteAgentCancelError(e){return!(e instanceof RemoteAgentCancelRequestError)||e.retryable}function resolveRemoteAgentForAction(e){let t=e.registry.get(e.nodeId)?.definition;if(e.dynamicRemoteAgent!==void 0){if(t===void 0)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);let n=resolveDynamicRemoteAgentCredentials(e.dynamicRemoteAgent),r=e.dynamicRemoteAgent,i={description:r.description,kind:`remote`,logicalPath:t.logicalPath,name:e.remoteAgentName,nodeId:e.nodeId,outputSchema:r.outputSchema,path:r.path,sourceId:t.sourceId,sourceKind:`module`,url:r.url};return r.forwardPrincipal!==void 0&&(i.forwardPrincipal=r.forwardPrincipal),n.auth!==void 0&&(i.auth=n.auth),n.headers!==void 0&&(i.headers=n.headers),i}if(t?.kind!==`remote`)throw Error(`Missing remote agent "${e.remoteAgentName}" in runtime registry.`);return t}async function resolveRemoteAgentStreamHeaders(e){if(e.resolverId===void 0)return{};let t=new Set([e.bundle.graph.root,...e.bundle.graph.nodesByNodeId.values()]);for(let n of t){let t=n.subagentRegistry.subagentsByNodeId.get(e.resolverId)?.definition;if(t!==void 0){if(t.kind!==`remote`||t.name!==e.name||t.url!==e.url)throw Error(`Remote child stream resolver does not match the authored remote agent.`);return await resolveRemoteAgentRequestHeaders(t)}}return await resolveRemoteAgentRequestHeaders(resolveDynamicRemoteAgentCredentials({credentialsStepId:e.resolverId,description:``,path:``,url:e.url}))}function resolveDynamicRemoteAgentCredentials(e){if(e.credentialsStepId===void 0)return{};let r=getStepRegistry().get(e.credentialsStepId);if(r===void 0)throw Error(`Dynamic remote subagent credentials function "${e.credentialsStepId}" is not registered.`);let i=expectObjectRecord(r(),`Dynamic remote subagent credentials are invalid.`),a={};return i.auth!==void 0&&(a.auth=expectFunction(i.auth,`Dynamic remote subagent auth is invalid.`)),i.headers!==void 0&&(a.headers=resolveDynamicRemoteAgentHeaders(i.headers)),a}function resolveDynamicRemoteAgentHeaders(e){if(typeof e==`function`)return e;let t=expectObjectRecord(e,`Dynamic remote subagent headers are invalid.`);for(let e of Object.values(t))if(typeof e!=`string`)throw Error(`Dynamic remote subagent headers are invalid.`);return t}function getStepRegistry(){let e=Symbol.for(`@workflow/core//registeredSteps`),t=globalThis,n=t[e];return n===void 0&&(n=new Map,t[e]=n),n}function createRemoteAgentSessionUrl(e){return createRemoteAgentRouteUrl(e.url,e.path)}function createRemoteAgentCancelTurnUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionCancelRoutePath(t))}function createRemoteAgentContinueUrl(e,t){return createRemoteAgentRouteUrl(e.url,createEveSessionRoutePath(t))}function isRetryableRemoteCancelStatus(e){return e===408||e===425||e===429||e>=500}async function resolveRemoteAgentRequestHeaders(e){let t={};return e.headers!==void 0&&Object.assign(t,typeof e.headers==`function`?await e.headers():e.headers),e.auth!==void 0&&Object.assign(t,(await e.auth()).headers),t}function formatRemoteAgentCallInputMessage(e){let t=typeof e.action.input.message==`string`?e.action.input.message:``;return formatSubagentInput({description:e.remote.description,message:t,name:e.action.remoteAgentName,persistentSession:e.persistentSession,type:`remote`}).message}export{RemoteAgentContinueRequestError,cancelRemoteAgentTurn,continueRemoteAgentSession,isAmbiguousRemoteAgentContinueError,isRetryableRemoteAgentCancelError,isRetryableRemoteAgentContinueError,resolveRemoteAgentForAction,resolveRemoteAgentStreamHeaders,startRemoteAgentSession};
|
|
@@ -14,8 +14,8 @@ export declare function fireTaskEventCallbackStep(input: {
|
|
|
14
14
|
export declare function fireTaskUpdateCallbackStep(input: {
|
|
15
15
|
readonly callback: unknown;
|
|
16
16
|
readonly callId: string;
|
|
17
|
-
readonly
|
|
18
|
-
readonly
|
|
17
|
+
readonly updateIndex: number;
|
|
18
|
+
readonly updateEpoch: string;
|
|
19
19
|
readonly message: string;
|
|
20
20
|
}): Promise<string | undefined>;
|
|
21
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{SESSION_FAILED}from"#harness/agent-handle-errors.js";import{parseSessionCallback}from"#channel/session-callback.js";import{postSessionCallbackRequest}from"#execution/session-callback-request.js";const log=createLogger(`execution.session-callback`);async function fireTaskEventCallbackStep(e){"use step";let t=parseSerializedSessionCallback(e.callback);if(t.taskId===void 0)return;let n=e.event.type===`input.requested`,r=n?`task.input-requested`:`task.authorization`,i=await postSessionCallbackRequest({body:{callId:t.callId,childContinuationToken:e.childContinuationToken,childSessionId:e.childSessionId,event:n?e.event.data:e.event,kind:r,subagentName:t.subagentName,taskId:t.taskId},url:t.url});if(!i.ok)throw Error(`Task event callback failed with HTTP ${i.status}.`)}async function fireTaskUpdateCallbackStep(e){"use step";let t=parseSerializedSessionCallback(e.callback);if(t.taskId===void 0)return;let n=await postSessionCallbackRequest({body:{callId:e.callId,
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{SESSION_FAILED}from"#harness/agent-handle-errors.js";import{parseSessionCallback}from"#channel/session-callback.js";import{postSessionCallbackRequest}from"#execution/session-callback-request.js";const log=createLogger(`execution.session-callback`);async function fireTaskEventCallbackStep(e){"use step";let t=parseSerializedSessionCallback(e.callback);if(t.taskId===void 0)return;let n=e.event.type===`input.requested`,r=n?`task.input-requested`:`task.authorization`,i=await postSessionCallbackRequest({body:{callId:t.callId,childContinuationToken:e.childContinuationToken,childSessionId:e.childSessionId,event:n?e.event.data:e.event,kind:r,subagentName:t.subagentName,taskId:t.taskId},url:t.url});if(!i.ok)throw Error(`Task event callback failed with HTTP ${i.status}.`)}async function fireTaskUpdateCallbackStep(e){"use step";let t=parseSerializedSessionCallback(e.callback);if(t.taskId===void 0)return;let n=await postSessionCallbackRequest({body:{callId:e.callId,updateIndex:e.updateIndex,updateEpoch:e.updateEpoch,kind:`task.update`,message:e.message,taskId:t.taskId},url:t.url});if(!n.ok)throw Error(`Task update callback failed with HTTP ${n.status}.`);return t.taskId}async function fireSessionCallbackStep(e){"use step";let i=e.serializedContext[`eve.sessionId`]??``,o=e.serializedContext[SessionCallbackKey.name];if(o!==void 0)try{let t=parseSerializedSessionCallback(o),a=await postSessionCallbackRequest({body:e.status===`completed`?buildCompletedCallbackBody({callback:t,output:e.output,sessionId:i,usage:e.usage}):{callId:t.callId,error:{code:SESSION_FAILED,message:toErrorMessage(e.error)},kind:`session.failed`,sessionId:i,subagentName:t.subagentName,usage:e.usage},url:t.url});if(!a.ok)throw Error(`Session callback failed with HTTP ${a.status}.`)}catch(e){throw log.error(`failed to post session callback`,{error:e,sessionId:i}),e}}function buildCompletedCallbackBody(e){let t={callId:e.callback.callId,kind:`session.completed`,output:e.output??``,sessionId:e.sessionId,subagentName:e.callback.subagentName};return e.usage===void 0?t:{...t,usage:e.usage}}function parseSerializedSessionCallback(e){let t=parseSessionCallback(e);if(!t.ok)throw Error(`Serialized session callback is invalid.`,{cause:t.cause});return t.callback}export{fireSessionCallbackStep,fireTaskEventCallbackStep,fireTaskUpdateCallbackStep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger}from"#internal/logging.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let t=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await t.write(e.view)}finally{t.releaseLock()}}async function wakeTaskAuthorizationParentStep(e){"use step";let n={callId:e.request.callId,childSessionId:e.request.childSessionId,event:e.request.event,kind:`subagent-authorization-event`,subagentName:e.request.subagentName},r=e.request.event.data,i={task:{authorizationEvents:[{hookPayload:n,taskId:e.taskId}]}};e.request.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${e.request.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(e.request.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskParentStep(e){"use step";let n={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(n.task={views:[e.view]});let r={kind:`send`,payload:n,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let n={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.
|
|
1
|
+
import{createLogger}from"#internal/logging.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{getWritable}from"#compiled/@workflow/core/index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{TASK_VIEW_STREAM_NAMESPACE,isTerminalTaskStatus,taskAuthorizationRequestId}from"#tasks/types.js";const log=createLogger(`execution.tasks.run`);async function appendTaskViewStep(e){"use step";let t=getWritable({namespace:TASK_VIEW_STREAM_NAMESPACE}).getWriter();try{await t.write(e.view)}finally{t.releaseLock()}}async function wakeTaskAuthorizationParentStep(e){"use step";let n={callId:e.request.callId,childSessionId:e.request.childSessionId,event:e.request.event,kind:`subagent-authorization-event`,subagentName:e.request.subagentName},r=e.request.event.data,i={task:{authorizationEvents:[{hookPayload:n,taskId:e.taskId}]}};e.request.event.type===`authorization.required`&&(i.message=`Background task ${e.taskId} needs authorization.`);let a={kind:`send`,payload:i,taskDeliveryId:`${e.taskId}:authorization:${e.request.event.type}:${r.turnId}:${r.stepIndex}:${r.sequence}:${taskAuthorizationRequestId(e.request.event)}`};try{await resumeSessionInbox(e.token,a)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskParentStep(e){"use step";let n={message:formatTaskNotification(e.view)};isTerminalTaskStatus(e.view.status)&&(n.task={views:[e.view]});let r={kind:`send`,payload:n,taskDeliveryId:`${e.view.taskId}:ready:${e.view.status}`};try{await resumeSessionInbox(e.token,r)}catch(t){if(isTaskWorkflowTargetGone(t)){log.warn(`task wake target is gone; the parent session already ended`,{status:e.view.status,taskId:e.view.taskId});return}throw t}}async function wakeTaskUpdateParentStep(e){"use step";let n={kind:`send`,payload:{message:`Background task ${e.view.taskId} (${e.view.metadata.name}) update: ${e.update.message}`},taskDeliveryId:`${e.view.taskId}:update:${e.update.updateEpoch}:${e.update.updateIndex}:${e.update.callId}`};try{await resumeSessionInbox(e.token,n)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function wakeTaskInputRequestParentStep(e){"use step";let n={kind:`send`,payload:{task:{inputRequests:[{hookPayload:e.request,taskId:e.taskId}]}},taskDeliveryId:`${e.taskId}:input:${e.request.event.turnId}:${e.request.event.stepIndex}:${e.request.event.sequence}`};try{await resumeSessionInbox(e.token,n)}catch(e){if(isTaskWorkflowTargetGone(e))return;throw e}}async function deliverTaskInputResponsesStep(e){"use step";let n=new Set(e.requestIds),r={auth:e.answer.auth,kind:`send`,payload:{inputResponses:e.answer.inputResponses.filter(e=>n.has(e.requestId))},taskDeliveryId:`${e.answer.taskId}:${[...e.requestIds].sort().join(`,`)}`};try{if(e.answer.childResponseUrl!==void 0){let t=await fetch(e.answer.childResponseUrl,{body:JSON.stringify({inputResponses:r.payload.inputResponses}),headers:{"content-type":`application/json`},method:`POST`,redirect:`error`});if(t.status===404)return`unreachable`;if(!t.ok)throw Error(`Remote task input delivery failed with HTTP ${t.status}.`)}else await resumeSessionInbox(e.answer.childContinuationToken,r);return`delivered`}catch(t){if(isTaskWorkflowTargetGone(t))return log.warn(`task input answer target is gone; the child turn already ended`,{taskId:e.answer.taskId}),`unreachable`;throw t}}function formatTaskNotification(e){let t=`Background task ${e.taskId} (${e.metadata.name})`;return e.status===`input_required`?`${t} needs input.`:e.status===`completed`?`${t} is completed.\n\nResult:\n${formatTaskOutput(e.lastOutput.data)}`:e.status===`failed`?`${t} failed.\n\nError:\n${formatTaskOutput(e.lastOutput.data)}`:`${t} is cancelled.`}function formatTaskOutput(e){return typeof e==`string`?e:JSON.stringify(e)??`null`}export{appendTaskViewStep,deliverTaskInputResponsesStep,formatTaskNotification,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep};
|
|
@@ -4,7 +4,7 @@ import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#runtime
|
|
|
4
4
|
export declare function executeTaskUpdate(input: {
|
|
5
5
|
readonly action: RuntimeToolCallActionRequest;
|
|
6
6
|
readonly adapter: ChannelAdapter | undefined;
|
|
7
|
-
readonly
|
|
8
|
-
readonly
|
|
7
|
+
readonly updateIndex: number;
|
|
8
|
+
readonly updateEpoch: string;
|
|
9
9
|
readonly serializedContext: Record<string, unknown> | undefined;
|
|
10
10
|
}): Promise<RuntimeActionResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SessionCallbackKey}from"#context/keys.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#execution/subagent-adapter-state.js";import{resumeHook}from"#internal/workflow/runtime.js";import{fireTaskUpdateCallbackStep}from"#execution/session-callback-step.js";import{createTaskControlError}from"#execution/tasks/parent/control-shared.js";async function executeTaskUpdate(n){let r=readUpdateMessage(n.action.input);if(r===void 0)return createTaskControlError(n.action,"Provide a non-empty `message`.");let i=n.serializedContext?.[SessionCallbackKey.name];if(i!==void 0){let e=await fireTaskUpdateCallbackStep({callback:i,callId:n.action.callId,
|
|
1
|
+
import{SessionCallbackKey}from"#context/keys.js";import{readTaskIdFromInboxToken}from"#tasks/task-id.js";import{SUBAGENT_ADAPTER_KIND,isSubagentAdapterState}from"#execution/subagent-adapter-state.js";import{resumeHook}from"#internal/workflow/runtime.js";import{fireTaskUpdateCallbackStep}from"#execution/session-callback-step.js";import{createTaskControlError}from"#execution/tasks/parent/control-shared.js";async function executeTaskUpdate(n){let r=readUpdateMessage(n.action.input);if(r===void 0)return createTaskControlError(n.action,"Provide a non-empty `message`.");let i=n.serializedContext?.[SessionCallbackKey.name];if(i!==void 0){let e=await fireTaskUpdateCallbackStep({callback:i,callId:n.action.callId,updateIndex:n.updateIndex,updateEpoch:n.updateEpoch,message:r});return e===void 0?createTaskControlError(n.action,`This session is not owned by a parent task.`):createTaskUpdateResult(n.action,e)}let a=n.adapter;if(a?.kind!==SUBAGENT_ADAPTER_KIND||!isSubagentAdapterState(a.state))return createTaskControlError(n.action,`This session is not owned by a parent task.`);let o=a.state.parentContinuationToken,s=readTaskIdFromInboxToken(o);return s===void 0?createTaskControlError(n.action,`This session is not owned by a parent task.`):(await resumeHook(o,{callId:n.action.callId,updateIndex:n.updateIndex,updateEpoch:n.updateEpoch,kind:`task-update`,message:r}),createTaskUpdateResult(n.action,s))}function readUpdateMessage(e){return typeof e.message==`string`&&e.message.trim()!==``?e.message:void 0}function createTaskUpdateResult(e,t){return{callId:e.callId,kind:`tool-result`,output:{status:`sent`,taskId:t},toolName:e.toolName}}export{executeTaskUpdate};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId,readTaskUsage}from"#tasks/types.js";import{appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep}from"#execution/tasks/child/steps.js";import{applyTaskTransition}from"#tasks/transitions.js";import{translateTaskInboundPayload}from"#tasks/wire.js";function isTaskRunFinished(e,t){return!isTerminalTaskStatus(e.status)||!t?!1:e.status!==`cancelled`||e.executor?.lifecycle===`terminal`}async function taskRunWorkflow(i){"use workflow";let a=createHook({token:i.taskInboxToken}),o=a[Symbol.asyncIterator](),s=!1;try{try{await claimHookOwnership(a),s=!0}catch(e){if(isHookConflictError(e))return;throw e}let e=i.initialView,n,c=[],l=[],u=!1;for(await appendTaskViewStep({view:e});!isTaskRunFinished(e,u);){let t=await o.next();if(t.done===!0)return;let r=t.value.kind===`subagent-authorization-event`?{...t.value,kind:`authorization-event`}:t.value;if(r.kind===`authorization-event`&&(r.event.type===`approval.candidate`||r.event.type===`approval.settled`))continue;let a=r.kind===`task-command`&&r.command.kind===`ready`,s=r.kind===`task-command`&&r.command.kind===`reject-dispatch`;if((a||s)&&(u=!0),r.kind===`subagent-input-request`&&(n=r),r.kind===`authorization-event`&&c.push(r),r.kind===`task-update`){u&&!isTerminalTaskStatus(e.status)?await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:r,view:e}):l.push(r);continue}let d=e.status===`cancelled`&&r.kind===`runtime-action-result`,f=r.kind===`input-response`,p;if(d)p={kind:`settle-executor`,usage:readTaskUsage(r.results[0]?.outcome?.usageDelta)};else if(f){if(e.status!==`input_required`)continue;p=await resolveAnsweredCommand(e,r)}else p=translateTaskInboundPayload(r);if(p===void 0)continue;if(a&&isTerminalTaskStatus(e.status)){for(let t of l)await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:t,view:e});l=[],await wakeTaskParentStep({token:i.parentContinuationToken,view:e});continue}let m=applyTaskTransition(e,p);if(m.
|
|
1
|
+
import{createHook}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isReadyTaskStatus,isTerminalTaskStatus,readTaskInputRequestId,readTaskUsage}from"#tasks/types.js";import{appendTaskViewStep,deliverTaskInputResponsesStep,wakeTaskAuthorizationParentStep,wakeTaskInputRequestParentStep,wakeTaskParentStep,wakeTaskUpdateParentStep}from"#execution/tasks/child/steps.js";import{applyTaskTransition}from"#tasks/transitions.js";import{translateTaskInboundPayload}from"#tasks/wire.js";function isTaskRunFinished(e,t){return!isTerminalTaskStatus(e.status)||!t?!1:e.status!==`cancelled`||e.executor?.lifecycle===`terminal`}async function taskRunWorkflow(i){"use workflow";let a=createHook({token:i.taskInboxToken}),o=a[Symbol.asyncIterator](),s=!1;try{try{await claimHookOwnership(a),s=!0}catch(e){if(isHookConflictError(e))return;throw e}let e=i.initialView,n,c=[],l=[],u=!1;for(await appendTaskViewStep({view:e});!isTaskRunFinished(e,u);){let t=await o.next();if(t.done===!0)return;let r=t.value.kind===`subagent-authorization-event`?{...t.value,kind:`authorization-event`}:t.value;if(r.kind===`authorization-event`&&(r.event.type===`approval.candidate`||r.event.type===`approval.settled`))continue;let a=r.kind===`task-command`&&r.command.kind===`ready`,s=r.kind===`task-command`&&r.command.kind===`reject-dispatch`;if((a||s)&&(u=!0),r.kind===`subagent-input-request`&&(n=r),r.kind===`authorization-event`&&c.push(r),r.kind===`task-update`){u&&!isTerminalTaskStatus(e.status)?await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:r,view:e}):l.push(r);continue}let d=e.status===`cancelled`&&r.kind===`runtime-action-result`,f=r.kind===`input-response`,p;if(d)p={kind:`settle-executor`,usage:readTaskUsage(r.results[0]?.outcome?.usageDelta)};else if(f){if(e.status!==`input_required`)continue;p=await resolveAnsweredCommand(e,r)}else p=translateTaskInboundPayload(r);if(p===void 0)continue;if(a&&isTerminalTaskStatus(e.status)){for(let t of l)await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:t,view:e});l=[],await wakeTaskParentStep({token:i.parentContinuationToken,view:e});continue}let m=applyTaskTransition(e,p);if(m.action!==`accepted`)continue;let h=!isTerminalTaskStatus(e.status)&&isTerminalTaskStatus(m.view.status),g=!isReadyTaskStatus(e.status)&&isReadyTaskStatus(m.view.status);e=m.view,await appendTaskViewStep({view:e});let _=u&&!h?c:[];for(let t of _)await wakeTaskAuthorizationParentStep({request:t,taskId:e.taskId,token:i.parentContinuationToken});if(u&&l.length>0&&!isTerminalTaskStatus(e.status)){for(let t of l)await wakeTaskUpdateParentStep({token:i.parentContinuationToken,update:t,view:e});l=[]}(h||_.length>0)&&(c=[]),n!==void 0&&u&&e.status===`input_required`?(await wakeTaskInputRequestParentStep({request:n,taskId:e.taskId,token:i.parentContinuationToken}),n=void 0):!s&&_.length===0&&u&&(h||g&&n===void 0)&&await wakeTaskParentStep({token:i.parentContinuationToken,view:e}),e.status!==`input_required`&&(n=void 0)}}finally{s&&await disposeHook(a)}}async function resolveAnsweredCommand(e,t){if(t.taskId!==e.taskId)return;let n=new Set(e.inputRequests.flatMap(e=>{let t=readTaskInputRequestId(e);return t===void 0?[]:[t]})),r=t.inputResponses.map(e=>e.requestId).filter(e=>n.has(e));return r.length===0?void 0:await deliverTaskInputResponsesStep({answer:t,requestIds:r})===`delivered`?{kind:`answered`,requestIds:r}:void 0}export{taskRunWorkflow};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import type { ModelMessage } from "ai";
|
|
1
2
|
import type { HarnessSession } from "#harness/types.js";
|
|
2
3
|
import { type AgentView } from "#harness/handles/prompt.js";
|
|
3
4
|
/** Derives model-visible task-agent availability from authoritative task views. */
|
|
4
5
|
export declare function readTaskAgentViews(session: HarnessSession): Promise<readonly AgentView[]>;
|
|
5
6
|
/** Appends the changed task-agent projection before the next model call. */
|
|
6
|
-
export declare function appendTaskAgentAnnouncement(session: HarnessSession): Promise<HarnessSession>;
|
|
7
|
+
export declare function appendTaskAgentAnnouncement(session: HarnessSession, messages?: readonly ModelMessage[]): Promise<HarnessSession>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveAgentsAnnouncement}from"#harness/handles/prompt.js";import{formatAgentStatus,getAgentHandleStore}from"#harness/handles/store.js";import{getSessionTaskIndex}from"#tasks/session-index.js";import{readTaskViews}from"#execution/tasks/parent/control-shared.js";async function readTaskAgentViews(e){let
|
|
1
|
+
import{resolveAgentsAnnouncement}from"#harness/handles/prompt.js";import{formatAgentStatus,getAgentHandleStore}from"#harness/handles/store.js";import{getSessionTaskIndex}from"#tasks/session-index.js";import{readSubagentTaskMetadata}from"#tasks/types.js";import{readTaskViews}from"#execution/tasks/parent/control-shared.js";async function readTaskAgentViews(e){let o=(getAgentHandleStore(e.state)?.handles??[]).filter(e=>e.phase===`addressed`);if(o.length===0)return[];let s=await readTaskViews(getSessionTaskIndex(e.state)),c=new Map;for(let e of s){let t=readSubagentTaskMetadata(e);if(t===void 0)continue;let n=c.get(t.agentId)??[];c.set(t.agentId,[...n,e])}return o.map(e=>{let n=c.get(e.identity.id)??[],r=n.filter(e=>e.status===`working`||e.status===`input_required`);if(r.length>1)throw Error(`Agent "${e.identity.id}" has more than one nonterminal task.`);let i=r[0];if(i!==void 0){let t=i.status===`input_required`?`input_required`:`working`;return{availability:`busy`,id:e.identity.id,name:e.identity.name,taskId:i.taskId,taskStatus:t}}let a=n.at(-1);return{availability:`available`,id:e.identity.id,name:e.identity.name,statusLine:a?.lastOutput===void 0?void 0:formatAgentStatus(a.lastOutput.data)}})}async function appendTaskAgentAnnouncement(t,r=t.history){let i=resolveAgentsAnnouncement({agentViews:await readTaskAgentViews(t),messages:r,store:getAgentHandleStore(t.state)});return i===void 0?t:{...t,history:[...t.history,{content:i,role:`user`}]}}export{appendTaskAgentAnnouncement,readTaskAgentViews};
|
|
@@ -18,6 +18,12 @@ export declare function checkTaskContinuationAvailability(input: {
|
|
|
18
18
|
readonly parentTurnId: string;
|
|
19
19
|
readonly session: RuntimeSession;
|
|
20
20
|
}): Promise<RuntimeSubagentDispatchFailure | undefined>;
|
|
21
|
+
export declare function createTaskContinuationBusyResult(input: {
|
|
22
|
+
readonly action: RuntimeAgentHandleAction;
|
|
23
|
+
readonly agentId: string;
|
|
24
|
+
readonly status: string;
|
|
25
|
+
readonly taskId: string;
|
|
26
|
+
}): RuntimeSubagentDispatchFailure;
|
|
21
27
|
/**
|
|
22
28
|
* Persists the task's ownership and routing entry in the parent session's
|
|
23
29
|
* `eve.tasks` index and creates its parked tool-call receipt before dispatch.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{AGENT_BUSY}from"#harness/agent-handle-errors.js";import{createAgentErrorResult}from"#execution/agent-handle-dispatch.js";import{findActiveTaskForAgent,findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{failDelegatedDispatch,rejectDelegatedDispatch,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{describeTaskAgent}from"#execution/tasks/parent/agent-identity.js";function describeTaskDispatch(e){let t=describeTaskAgent(e),n=e.agentId===void 0?void 0:findTaskAgentAddress(e.session,e.agentId);return n===void 0?t:{...t,mode:n.address.kind===`agent/remote`?`remote`:`local`}}async function checkTaskContinuationAvailability(
|
|
1
|
+
import{AGENT_BUSY}from"#harness/agent-handle-errors.js";import{createAgentErrorResult}from"#execution/agent-handle-dispatch.js";import{findActiveTaskForAgent,findTaskAgentAddress}from"#execution/tasks/parent/control-shared.js";import{failDelegatedDispatch,rejectDelegatedDispatch,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{describeTaskAgent}from"#execution/tasks/parent/agent-identity.js";function describeTaskDispatch(e){let t=describeTaskAgent(e),n=e.agentId===void 0?void 0:findTaskAgentAddress(e.session,e.agentId);return n===void 0?t:{...t,mode:n.address.kind===`agent/remote`?`remote`:`local`}}async function checkTaskContinuationAvailability(e){let t=await findActiveTaskForAgent(e.session,e.agentId,e.parentTurnId,e.parentStepIndex);return t===void 0?void 0:createTaskContinuationBusyResult({action:e.action,agentId:e.agentId,status:t.view.status,taskId:t.view.taskId})}function createTaskContinuationBusyResult(n){return createAgentErrorResult({action:n.action,code:AGENT_BUSY,message:`Agent "${n.agentId}" is busy with task "${n.taskId}" (${n.status}).`})}async function persistContinuationTaskInParentSession(e){let t=findTaskAgentAddress(e.session,e.agentId);if(t!==void 0)return settleDelegatedDispatch({callId:e.action.callId,session:e.session,subagentName:t.identity.name,task:e.delegated})}async function settleTaskDispatchError(e){return e.persisted!==void 0&&e.outcome.deliveryAmbiguous===!0||await(e.persisted===void 0?rejectDelegatedDispatch:failDelegatedDispatch)({error:e.outcome.result.output,task:e.delegated}),e.persisted===void 0?e.outcome.result:{...e.outcome.result,output:attachTaskId(e.outcome.result.output,e.delegated.taskId)}}function attachTaskId(e,t){return typeof e==`object`&&e&&!Array.isArray(e)?{...e,taskId:t}:{error:e,taskId:t}}export{checkTaskContinuationAvailability,createTaskContinuationBusyResult,describeTaskDispatch,persistContinuationTaskInParentSession,settleTaskDispatchError};
|
|
@@ -2,7 +2,7 @@ import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
|
|
|
2
2
|
import { type AgentHandle } from "#harness/handles/store.js";
|
|
3
3
|
import type { RuntimeActionResult, RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
|
|
4
4
|
import { type SessionTaskIndexEntry } from "#tasks/session-index.js";
|
|
5
|
-
import type
|
|
5
|
+
import { type TaskView } from "#tasks/types.js";
|
|
6
6
|
/**
|
|
7
7
|
* Result and lookup helpers shared by the task-control executors
|
|
8
8
|
* (`task_cancel` in the dispatch module,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getAgentHandleStore}from"#harness/handles/store.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{findSessionTaskEntry,getSessionTaskIndex}from"#tasks/session-index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{taskViewsToJson}from"#tasks/json.js";function lookupTaskEntries(e,t){let r=[],i=[];for(let a of t){let t=findSessionTaskEntry(e.state,a);t===void 0?i.push(a):r.push(t)}return i.length>0?{kind:`unknown`,unknown:i}:{entries:r,kind:`found`}}async function readTaskViews(e){return Promise.all(e.map(readTaskView))}async function readTaskView(e){try{return await readLatestTaskView({taskRunId:e.taskRunId})??createPendingTaskView(e)}catch(t){if(isTaskWorkflowTargetGone(t)&&e.terminalView!==void 0)return e.terminalView;throw t}}function createPendingTaskView(e){
|
|
1
|
+
import{getAgentHandleStore}from"#harness/handles/store.js";import{readLatestTaskView}from"#execution/tasks/parent/run-parent.js";import{findSessionTaskEntry,getSessionTaskIndex}from"#tasks/session-index.js";import{isTaskWorkflowTargetGone}from"#execution/tasks/workflow-target.js";import{readSubagentTaskMetadata}from"#tasks/types.js";import{taskViewsToJson}from"#tasks/json.js";function lookupTaskEntries(e,t){let r=[],i=[];for(let a of t){let t=findSessionTaskEntry(e.state,a);t===void 0?i.push(a):r.push(t)}return i.length>0?{kind:`unknown`,unknown:i}:{entries:r,kind:`found`}}async function readTaskViews(e){return Promise.all(e.map(readTaskView))}async function readTaskView(e){try{return await readLatestTaskView({taskRunId:e.taskRunId})??createPendingTaskView(e)}catch(t){if(isTaskWorkflowTargetGone(t)&&e.terminalView!==void 0)return e.terminalView;throw t}}function createPendingTaskView(e){let t={metadata:e.metadata,status:`working`,taskId:e.taskId};return e.executor===void 0?t:{...t,executor:{binding:e.executor}}}function findTaskAgentAddress(t,n){return(getAgentHandleStore(t.state)?.handles??[]).find(e=>e.phase===`addressed`&&e.identity.id===n)}async function findActiveTaskForAgent(e,t,n,i){let o=getSessionTaskIndex(e.state).filter(e=>readSubagentTaskMetadata(e)?.agentId===t),s=await readTaskViews(o);return o.flatMap((e,t)=>{let r=s[t];return r!==void 0&&(e.createdByTurnId===n&&e.createdByStepIndex===i||r.status===`working`||r.status===`input_required`)?[{entry:e,view:r}]:[]})[0]}function createTaskViewsResult(e,t){return{callId:e.callId,kind:`tool-result`,output:taskViewsToJson(t),toolName:e.toolName}}function createTaskControlError(e,t){return{callId:e.callId,isError:!0,kind:`tool-result`,output:{message:t},toolName:e.toolName}}function createUnknownTasksError(e,t){return createTaskControlError(e,`Unknown task ids: ${t.join(`, `)}. Tasks belong to the session that created them.`)}export{createTaskControlError,createTaskViewsResult,createUnknownTasksError,findActiveTaskForAgent,findTaskAgentAddress,lookupTaskEntries,readTaskView,readTaskViews};
|
|
@@ -8,17 +8,22 @@
|
|
|
8
8
|
import type { RuntimeSession } from "#execution/agent-handle-dispatch.js";
|
|
9
9
|
import type { RuntimeSubagentChildResult } from "#runtime/actions/types.js";
|
|
10
10
|
import type { JsonValue } from "#shared/json.js";
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
import type { TaskExecutorBinding } from "#shared/tool-task.js";
|
|
12
|
+
import { type DurableTaskMetadata } from "#tasks/types.js";
|
|
13
|
+
/** A prepared background task: identity plus its started durable run. */
|
|
14
|
+
export interface BackgroundTask {
|
|
14
15
|
readonly taskInboxToken: string;
|
|
15
16
|
readonly createdByStepIndex?: number;
|
|
16
17
|
readonly createdByTurnId: string;
|
|
17
|
-
readonly
|
|
18
|
-
readonly
|
|
18
|
+
readonly executor?: TaskExecutorBinding;
|
|
19
|
+
readonly metadata: DurableTaskMetadata;
|
|
19
20
|
readonly taskId: string;
|
|
20
21
|
readonly taskRunId: string;
|
|
21
22
|
}
|
|
23
|
+
/** A subagent task also carries its deterministic agent-handle operation. */
|
|
24
|
+
export interface DelegatedTask extends BackgroundTask {
|
|
25
|
+
readonly operationId: string;
|
|
26
|
+
}
|
|
22
27
|
/**
|
|
23
28
|
* Creates the durable task record for one delegated subagent call,
|
|
24
29
|
* before the child dispatch side effect. The task must exist first so
|
|
@@ -35,6 +40,15 @@ export declare function beginDelegatedTask(input: {
|
|
|
35
40
|
readonly parentTurnId: string;
|
|
36
41
|
readonly session: RuntimeSession;
|
|
37
42
|
}): Promise<DelegatedTask>;
|
|
43
|
+
/** Creates a replay-stable task run before a background tool starts external work. */
|
|
44
|
+
export declare function beginBackgroundTask(input: {
|
|
45
|
+
readonly callId: string;
|
|
46
|
+
readonly metadata: DurableTaskMetadata;
|
|
47
|
+
readonly parentSessionId: string;
|
|
48
|
+
readonly parentStepIndex?: number;
|
|
49
|
+
readonly parentTurnId: string;
|
|
50
|
+
readonly session: RuntimeSession;
|
|
51
|
+
}): Promise<BackgroundTask>;
|
|
38
52
|
/**
|
|
39
53
|
* Settles a delegated dispatch that acknowledged a child: persists the task
|
|
40
54
|
* in the session index and returns the receipt that resolves the originating
|
|
@@ -66,5 +80,5 @@ export declare function failDelegatedDispatch(input: {
|
|
|
66
80
|
/** Silently terminates a task whose child dispatch failed before parent indexing. */
|
|
67
81
|
export declare function rejectDelegatedDispatch(input: {
|
|
68
82
|
readonly error: JsonValue;
|
|
69
|
-
readonly task:
|
|
83
|
+
readonly task: BackgroundTask;
|
|
70
84
|
}): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sessionCommandHookToken}from"#execution/session-command-token.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";import{deriveTaskId,deriveTaskInboxToken}from"#tasks/task-id.js";import{readLatestTaskView,sendTaskCommand,sendTaskCommandToOwner,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{isTerminalTaskStatus}from"#tasks/types.js";async function beginDelegatedTask(
|
|
1
|
+
import{sessionCommandHookToken}from"#execution/session-command-token.js";import{deriveAgentOperationId}from"#harness/handles/operation-id.js";import{deriveTaskId,deriveTaskInboxToken}from"#tasks/task-id.js";import{readLatestTaskView,sendTaskCommand,sendTaskCommandToOwner,startTaskRun,waitForTaskCommandOwner}from"#execution/tasks/parent/run-parent.js";import{recordSessionTask}from"#tasks/session-index.js";import{createSubagentTaskMetadata,isTerminalTaskStatus,readSubagentTaskMetadata}from"#tasks/types.js";async function beginDelegatedTask(e){return{...await beginBackgroundTask({callId:e.callId,metadata:createSubagentTaskMetadata({agentId:e.agentId,mode:e.mode,name:e.name}),parentSessionId:e.parentSessionId,parentStepIndex:e.parentStepIndex,parentTurnId:e.parentTurnId,session:e.session}),operationId:deriveAgentOperationId({callId:e.callId,parentSessionId:e.parentSessionId,parentTurnId:e.parentTurnId})}}async function beginBackgroundTask(t){let r=deriveTaskId({callId:t.callId,parentSessionId:t.parentSessionId,parentTurnId:t.parentTurnId}),i=deriveTaskInboxToken({parentContinuationToken:t.session.continuationToken,taskId:r});await startTaskRun({taskInboxToken:i,initialView:{metadata:t.metadata,status:`working`,taskId:r},parentContinuationToken:sessionCommandHookToken(t.session.sessionId)});let a=await waitForTaskCommandOwner({taskInboxToken:i});return{taskInboxToken:i,createdByStepIndex:t.parentStepIndex??0,createdByTurnId:t.parentTurnId,metadata:t.metadata,taskId:r,taskRunId:a.runId}}async function settleDelegatedDispatch(e){let t=readSubagentTaskMetadata(e.task);if(t===void 0)throw Error(`Task "${e.task.taskId}" is not a subagent task.`);let n={agentId:t.agentId,status:`working`,taskId:e.task.taskId};return{receipt:{backgroundTask:{status:n.status,taskId:n.taskId},callId:e.callId,kind:`subagent-result`,origin:`child`,outcome:{kind:`parked`,result:{kind:`succeeded`,output:`Delegated as background task ${e.task.taskId} (working).`},usageDelta:{cacheReadTokens:0,cacheWriteTokens:0,inputTokens:0,outputTokens:0}},output:n,subagentName:e.subagentName},session:recordSessionTask(e.session,{taskInboxToken:e.task.taskInboxToken,createdByStepIndex:e.task.createdByStepIndex,createdByTurnId:e.task.createdByTurnId,metadata:e.task.metadata,operationId:e.task.operationId,taskId:e.task.taskId,taskRunId:e.task.taskRunId})}}async function acknowledgeDelegatedTasksStep(e){"use step";for(let t of e.tasks){if(await sendTaskCommandToOwner({command:{kind:`ready`},taskInboxToken:t.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})!==void 0)continue;let e=await readLatestTaskView({taskRunId:t.taskRunId});if(!(e!==void 0&&isTerminalTaskStatus(e.status)))throw Error(`Task run "${t.taskId}" did not accept its readiness command.`)}}async function failDelegatedDispatch(e){await sendTaskCommand({command:{data:e.error,kind:`fail`},taskInboxToken:e.task.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})}async function rejectDelegatedDispatch(e){await sendTaskCommand({command:{data:e.error,kind:`reject-dispatch`},taskInboxToken:e.task.taskInboxToken,retryUnreachable:{attempts:20,delayMs:250}})}export{acknowledgeDelegatedTasksStep,beginBackgroundTask,beginDelegatedTask,failDelegatedDispatch,rejectDelegatedDispatch,settleDelegatedDispatch};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{beginDelegatedTask,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{checkTaskContinuationAvailability,describeTaskDispatch,persistContinuationTaskInParentSession,settleTaskDispatchError}from"#execution/tasks/parent/continuation-dispatch.js";async function dispatchTaskStep(r){"use step";let i=await prepareRuntimeActionDispatch({serializedContext:r.serializedContext,sessionState:r.sessionState,taskControls:!0});if(i===void 0)return{results:[],sessionState:r.sessionState,pendingTasks:[]};let{batch:a,bundle:o,session:s}=i,c=r.parentWritable.getWriter(),l=s,u=[],d=[];try{for(let e of i.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`task-control`){let t=await executeTaskControlAction({action:e.action,adapter:i.adapter,bundle:o,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,serializedContext:i.serializedContext,session:l});l=t.session,t.pendingTask!==void 0&&d.push(t.pendingTask),u.push(t.result);continue}if(e.kind===`resume`){let t=await checkTaskContinuationAvailability({action:e.action,agentId:e.agentId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l});if(t!==void 0){u.push(t);continue}}let n=await beginDelegatedTask({...describeTaskDispatch({action:e.kind===`resume`?e.action:e.target.action,agentId:e.kind===`resume`?e.agentId:void 0,parentSessionId:s.sessionId,parentTurnId:a.event.turnId,session:l}),parentSessionId:s.sessionId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l}),f;e.kind===`resume`&&(f=await persistContinuationTaskInParentSession({action:e.action,agentId:e.agentId,delegated:n,session:l}),l=f?.session??l);let p;switch(e.kind){case`resume`:p=await dispatchToTaskAgentAddress({action:e.action,agentId:e.agentId,bundle:createAgentContinuationBundle({action:e.action,bundle:o,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:n.taskInboxToken});break;case`start`:p=await startSubagent({auth:i.auth,batchEvent:a.event,bundle:o,callbackBaseUrl:r.callbackBaseUrl,capabilities:i.capabilities,channelMetadata:i.channelMetadata,currentSession:l,fanoutSize:i.fanoutSize,initiatorAuth:i.initiatorAuth,parentContinuationToken:n.taskInboxToken,parentTraceContext:i.parentTraceContext,persistentSessions:!0,sandboxSessionId:i.sandboxSessionId,serializedContext:i.serializedContext,session:s,taskOwned:!0,target:e.target});break}if(l=p.session,p.kind===`error`){u.push(await settleTaskDispatchError({delegated:n,outcome:p,persisted:f})),f!==void 0&&d.push(n);continue}if(f!==void 0)u.push(f.receipt);else{let e=await settleDelegatedDispatch({callId:p.callId,session:l,subagentName:p.toolName,task:n});l=e.session,u.push(e.receipt)}d.push(n),await emitSubagentCalled({adapter:i.adapter,adapterCtx:i.adapterCtx,batchEvent:a.event,entry:e,outcome:p,sessionId:s.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===s?r.sessionState:createDurableSessionState({session:l}),pendingTasks:d}}export{dispatchTaskStep};
|
|
1
|
+
import{createDurableSessionState}from"#execution/durable-session-store.js";import{dispatchToTaskAgentAddress}from"#execution/agent-handle-dispatch.js";import{executeTaskControlAction}from"#execution/tasks/parent/dispatch.js";import{createAgentContinuationBundle}from"#execution/agent-continuation-bundle.js";import{emitSubagentCalled,prepareRuntimeActionDispatch,startSubagent}from"#execution/dispatch-runtime-actions-shared.js";import{beginDelegatedTask,settleDelegatedDispatch}from"#execution/tasks/parent/delegate.js";import{checkTaskContinuationAvailability,describeTaskDispatch,persistContinuationTaskInParentSession,settleTaskDispatchError}from"#execution/tasks/parent/continuation-dispatch.js";async function dispatchTaskStep(r){"use step";let i=await prepareRuntimeActionDispatch({serializedContext:r.serializedContext,sessionState:r.sessionState,taskControls:!0});if(i===void 0)return{results:[],sessionState:r.sessionState,pendingTasks:[]};let{batch:a,bundle:o,session:s}=i,c=r.parentWritable.getWriter(),l=s,u=[],d=[];try{for(let e of i.plan){if(e.kind===`reject`){u.push(e.result);continue}if(e.kind===`task-control`){let t=await executeTaskControlAction({action:e.action,adapter:i.adapter,bundle:o,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,serializedContext:i.serializedContext,session:l});l=t.session,t.pendingTask!==void 0&&d.push(t.pendingTask),u.push(t.result);continue}if(e.kind===`resume`){let t=await checkTaskContinuationAvailability({action:e.action,agentId:e.agentId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l});if(t!==void 0){u.push(t);continue}}let n=await beginDelegatedTask({...describeTaskDispatch({action:e.kind===`resume`?e.action:e.target.action,agentId:e.kind===`resume`?e.agentId:void 0,parentSessionId:s.sessionId,parentTurnId:a.event.turnId,session:l}),parentSessionId:s.sessionId,parentStepIndex:a.event.stepIndex,parentTurnId:a.event.turnId,session:l}),f;e.kind===`resume`&&(f=await persistContinuationTaskInParentSession({action:e.action,agentId:e.agentId,delegated:n,session:l}),l=f?.session??l);let p;switch(e.kind){case`resume`:p=await dispatchToTaskAgentAddress({action:e.action,agentId:e.agentId,auth:i.auth,bundle:createAgentContinuationBundle({action:e.action,bundle:o,dynamicRemoteAgent:e.dynamicRemoteAgent}),currentSession:l,parentToken:n.taskInboxToken});break;case`start`:p=await startSubagent({auth:i.auth,batchEvent:a.event,bundle:o,callbackBaseUrl:r.callbackBaseUrl,capabilities:i.capabilities,channelMetadata:i.channelMetadata,currentSession:l,fanoutSize:i.fanoutSize,initiatorAuth:i.initiatorAuth,parentContinuationToken:n.taskInboxToken,parentTraceContext:i.parentTraceContext,persistentSessions:!0,sandboxSessionId:i.sandboxSessionId,serializedContext:i.serializedContext,session:s,taskOwned:!0,target:e.target});break}if(l=p.session,p.kind===`error`){u.push(await settleTaskDispatchError({delegated:n,outcome:p,persisted:f})),f!==void 0&&d.push(n);continue}if(f!==void 0)u.push(f.receipt);else{let e=await settleDelegatedDispatch({callId:p.callId,session:l,subagentName:p.toolName,task:n});l=e.session,u.push(e.receipt)}d.push(n),await emitSubagentCalled({adapter:i.adapter,adapterCtx:i.adapterCtx,batchEvent:a.event,entry:e,outcome:p,sessionId:s.sessionId,writer:c})}}finally{c.releaseLock()}return{results:u,sessionState:l===s?r.sessionState:createDurableSessionState({session:l}),pendingTasks:d}}export{dispatchTaskStep};
|