eve 0.51.1 → 0.52.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 +23 -0
- package/dist/src/cli/dev/boot-progress.d.ts +3 -0
- package/dist/src/cli/dev/boot-progress.js +1 -0
- package/dist/src/cli/run.d.ts +4 -0
- package/dist/src/cli/run.js +3 -3
- package/dist/src/cli/telemetry/command.d.ts +9 -0
- package/dist/src/cli/telemetry/command.js +1 -0
- package/dist/src/cli/telemetry/flush.d.ts +2 -0
- package/dist/src/cli/telemetry/flush.js +1 -0
- package/dist/src/cli/telemetry/identity.d.ts +13 -0
- package/dist/src/cli/telemetry/identity.js +1 -0
- package/dist/src/cli/telemetry/index.d.ts +25 -0
- package/dist/src/cli/telemetry/index.js +3 -0
- package/dist/src/cli/telemetry/preference.d.ts +9 -0
- package/dist/src/cli/telemetry/preference.js +1 -0
- package/dist/src/client/types.d.ts +3 -2
- package/dist/src/compiled/.vendor-stamp.json +2 -2
- package/dist/src/compiled/@eve/catalog/index.js +1 -1
- package/dist/src/compiled/@modelcontextprotocol/server/index.d.ts +1 -0
- package/dist/src/compiler/extension-compatibility.d.ts +22 -4
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-channel.js +1 -1
- package/dist/src/compiler/normalize-schedule.js +1 -1
- package/dist/src/compiler/normalize-tool.js +1 -1
- package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
- package/dist/src/execution/activity-collector.js +1 -1
- package/dist/src/execution/continuation-conflict-step.js +1 -1
- package/dist/src/execution/coordination-dispatch-shared.d.ts +2 -2
- package/dist/src/execution/coordination-dispatch-step.js +1 -1
- package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +1 -1
- package/dist/src/execution/inline-turn.d.ts +2 -2
- package/dist/src/execution/inline-turn.js +1 -1
- package/dist/src/execution/tasks/child/steps.d.ts +11 -1
- package/dist/src/execution/tasks/child/steps.js +1 -1
- package/dist/src/execution/tasks/child/workflow.js +1 -1
- package/dist/src/execution/tasks/parent/tool-execution.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/tools/subagent/invoke-agent.d.ts +1 -7
- package/dist/src/execution/tools/subagent/invoke-agent.js +1 -1
- package/dist/src/execution/tools/workflow/ask.d.ts +1 -2
- package/dist/src/execution/tools/workflow/ask.js +1 -1
- package/dist/src/execution/tools/workflow/body.d.ts +6 -1
- package/dist/src/execution/tools/workflow/body.js +1 -1
- package/dist/src/execution/tools/workflow/cancel.js +1 -1
- package/dist/src/execution/tools/workflow/messages.d.ts +9 -8
- package/dist/src/execution/tools/workflow/messages.js +1 -1
- package/dist/src/execution/tools/workflow/owner-inbox.d.ts +2 -2
- package/dist/src/execution/tools/workflow/owner-inbox.js +1 -1
- package/dist/src/execution/tools/workflow/owner.d.ts +5 -11
- package/dist/src/execution/tools/workflow/owner.js +1 -1
- package/dist/src/execution/tools/workflow/run-control.d.ts +0 -4
- package/dist/src/execution/tools/workflow/run-control.js +1 -1
- package/dist/src/execution/tools/workflow/start.d.ts +5 -14
- package/dist/src/execution/tools/workflow/start.js +1 -1
- package/dist/src/execution/tools/workflow/workflow.d.ts +1 -1
- package/dist/src/execution/tools/workflow/workflow.js +1 -1
- package/dist/src/execution/turn-dispatch.js +1 -1
- package/dist/src/execution/turn-workflow-tool-run.d.ts +2 -8
- package/dist/src/execution/turn-workflow-tool-run.js +1 -1
- package/dist/src/execution/turn-workflow.d.ts +1 -0
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/wire/session-inbox-resume.js +1 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/emission-state.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/turn-client-context.d.ts +9 -0
- package/dist/src/harness/turn-client-context.js +1 -0
- package/dist/src/harness/workflow-tool-runs.d.ts +0 -1
- package/dist/src/harness/workflow-tool-runs.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/authored-definition/schema-backed.js +1 -1
- package/dist/src/internal/invocation/workflow-execution.js +1 -1
- package/dist/src/internal/mcp/streamable-http-server.d.ts +29 -1
- package/dist/src/internal/mcp/streamable-http-server.js +1 -1
- package/dist/src/internal/nitro/host/build-application.js +1 -1
- package/dist/src/internal/workflow/runtime.d.ts +6 -0
- package/dist/src/internal/workflow/runtime.js +1 -1
- package/dist/src/internal/workflow-bundle/authored-workflow-directives.d.ts +1 -3
- package/dist/src/internal/workflow-bundle/authored-workflow-directives.js +1 -1
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.d.ts +1 -2
- package/dist/src/internal/workflow-bundle/authored-workflow-modules.js +1 -1
- package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-builders.d.ts +0 -2
- package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-transformer.js +1 -1
- package/dist/src/protocol/message.d.ts +3 -2
- package/dist/src/public/channels/mcp.js +1 -1
- package/dist/src/public/models/openai/chatgpt/model.js +2 -2
- package/dist/src/public/models/openai/chatgpt/transport.js +1 -1
- package/dist/src/public/tools/index.d.ts +3 -1
- package/dist/src/public/tools/index.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/shared/workflow-tool-context.d.ts +2 -0
- package/dist/src/shared/workflow-tool-context.js +1 -0
- package/dist/src/tasks/types.d.ts +17 -1
- package/dist/src/tasks/types.js +1 -1
- package/dist/src/tools/behavior.d.ts +5 -0
- package/dist/src/tools/definition.d.ts +16 -12
- package/dist/src/tools/definition.js +1 -1
- package/dist/src/tools/dynamic.d.ts +2 -2
- package/dist/src/tools/provided/sleep.d.ts +2 -2
- package/dist/src/tools/provided/sleep.js +1 -1
- package/dist/src/tools/task.d.ts +28 -80
- package/dist/src/tools/task.js +1 -1
- package/dist/src/tools/workflow-definition.d.ts +60 -0
- package/dist/src/tools/workflow-definition.js +1 -0
- package/docs/channels/mcp.mdx +25 -3
- package/docs/concepts/execution-model-and-durability.mdx +13 -2
- package/docs/guides/client/messages.mdx +1 -1
- package/docs/guides/deployment/vercel.mdx +2 -0
- package/docs/guides/frontend/overview.mdx +1 -1
- package/docs/memory/overview.mdx +40 -11
- package/docs/reference/cli.md +31 -33
- package/docs/reference/meta.json +1 -4
- package/docs/reference/telemetry.md +56 -0
- package/docs/reference/typescript-api.md +38 -35
- package/docs/tools/overview.mdx +59 -18
- package/docs/tools/workflows.mdx +146 -70
- package/package.json +1 -7
- package/dist/src/public/workflow/index.d.ts +0 -5
- package/dist/src/public/workflow/index.js +0 -1
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import { type Hook } from "#compiled/@workflow/core/index.js";
|
|
2
|
-
import { type WorkflowToolRunControlMessage } from "#execution/tools/workflow/messages.js";
|
|
3
1
|
/**
|
|
4
2
|
* The run's control inbox. An unawaited hook read is not scheduled under
|
|
5
3
|
* replay, so `cancelled` must be raced for a cancel to be observed at all.
|
|
6
4
|
*/
|
|
7
5
|
export interface WorkflowToolRunControlInbox {
|
|
8
|
-
readonly hook: Hook<WorkflowToolRunControlMessage>;
|
|
9
6
|
readonly signal: AbortSignal;
|
|
10
7
|
/** Rejects with {@link WorkflowToolRunCancelledError} when a cancel message arrives; never resolves. */
|
|
11
8
|
readonly cancelled: Promise<never>;
|
|
12
9
|
reason(): string | undefined;
|
|
13
10
|
}
|
|
14
|
-
/** Opens without claiming, so a losing duplicate start never trips the signal. */
|
|
15
11
|
export declare function openWorkflowToolRunControlInbox(hookToken: string): WorkflowToolRunControlInbox;
|
|
16
12
|
export declare class WorkflowToolRunCancelledError extends Error {
|
|
17
13
|
constructor(reason: string);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHook}from"#compiled/@workflow/core/index.js";import{isWorkflowToolRunControlMessage}from"#execution/tools/workflow/messages.js";function openWorkflowToolRunControlInbox(t){let n=createHook({token:t})
|
|
1
|
+
import{createHook}from"#compiled/@workflow/core/index.js";import{isWorkflowToolRunControlMessage}from"#execution/tools/workflow/messages.js";function openWorkflowToolRunControlInbox(t){let n=createHook({token:t})[Symbol.asyncIterator](),r=new AbortController,i,a=consumeCancel(n,e=>{i=e,r.abort(new WorkflowToolRunCancelledError(e))});return a.catch(()=>{}),{cancelled:a,reason:()=>i,signal:r.signal}}async function consumeCancel(e,n){for(;;){let r=await e.next();if(r.done===!0)return await new Promise(()=>{});if(isWorkflowToolRunControlMessage(r.value))throw n(r.value.reason),new WorkflowToolRunCancelledError(r.value.reason)}}var WorkflowToolRunCancelledError=class extends Error{constructor(e){super(e),this.name=`WorkflowToolRunCancelledError`}};export{WorkflowToolRunCancelledError,openWorkflowToolRunControlInbox};
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import type { SessionAuth, SessionParent } from "#context/session-context.js";
|
|
2
2
|
import type { RuntimeSession } from "#subagents/handle-dispatch.js";
|
|
3
3
|
import type { RuntimeToolResultActionResult, RuntimeWorkflowTaskRequest } from "#shared/action-types.js";
|
|
4
|
-
import type { WorkflowToolRunInput } from "#execution/tools/workflow/types.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
readonly parentTurnId: string;
|
|
9
|
-
}): string;
|
|
10
|
-
/** Resolves once the workflow tool run owns its hook. Call from a `"use step"` body. */
|
|
11
|
-
export declare function startWorkflowToolRun(input: Omit<WorkflowToolRunInput, "hookToken"> & {
|
|
12
|
-
readonly hookToken?: string;
|
|
13
|
-
}): Promise<{
|
|
14
|
-
readonly hookToken: string;
|
|
15
|
-
readonly runId: string;
|
|
16
|
-
}>;
|
|
4
|
+
import type { WorkflowToolRunAddress, WorkflowToolRunInput } from "#execution/tools/workflow/types.js";
|
|
5
|
+
import type { WorkflowToolRunOwner } from "#execution/tools/workflow/messages.js";
|
|
6
|
+
/** Starts a new run for each dispatch attempt. Call from a `"use step"` body. */
|
|
7
|
+
export declare function startWorkflowToolRun(input: Omit<WorkflowToolRunInput, "hookToken">): Promise<WorkflowToolRunAddress>;
|
|
17
8
|
/** Starts one durable workflow task and records it on the owning session. */
|
|
18
9
|
export declare function startWorkflowTask(input: {
|
|
19
10
|
readonly auth: SessionAuth["current"];
|
|
@@ -23,7 +14,7 @@ export declare function startWorkflowTask(input: {
|
|
|
23
14
|
readonly turnId: string;
|
|
24
15
|
};
|
|
25
16
|
readonly initiatorAuth: SessionAuth["initiator"];
|
|
26
|
-
readonly
|
|
17
|
+
readonly owner: WorkflowToolRunOwner;
|
|
27
18
|
readonly parentSession: SessionParent | undefined;
|
|
28
19
|
readonly session: RuntimeSession;
|
|
29
20
|
readonly task: RuntimeWorkflowTaskRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{toError}from"#shared/errors.js";import{startWorkflowOnCurrentDeployment,
|
|
1
|
+
import{createLogger,logError}from"#internal/logging.js";import{toError}from"#shared/errors.js";import{startWorkflowOnCurrentDeployment,workflowToolRunWorkflowReference}from"#execution/workflow-runtime.js";import{recordWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{createRuntimeToolResultFromValue}from"#harness/action-result-helpers.js";const log=createLogger(`execution.workflow-tool-run`);async function startWorkflowToolRun(e){let t=crypto.randomUUID();return{hookToken:t,runId:(await startWorkflowOnCurrentDeployment(workflowToolRunWorkflowReference,[{...e,hookToken:t}])).runId}}async function startWorkflowTask(e){let{task:n,batchEvent:r,session:i}=e;try{let t=await startWorkflowToolRun({callId:n.callId,executeInput:n.executeInput,input:n.input,owner:e.owner,resultKind:n.resultKind,session:{auth:{current:e.auth,initiator:e.initiatorAuth},id:i.sessionId,parent:e.parentSession,turn:{id:r.turnId,sequence:r.sequence}},stepIndex:r.stepIndex,toolName:n.toolName,workflowId:n.workflowId});return{session:recordWorkflowToolRun(i,{callId:n.callId,hookToken:t.hookToken,resultKind:n.resultKind??`tool`,runId:t.runId,toolName:n.toolName})}}catch(e){return logError(log,`workflow tool run failed to start`,e,{callId:n.callId,toolName:n.toolName}),{result:createRuntimeToolResultFromValue({callId:n.callId,isError:!0,output:toError(e),toolName:n.toolName}),session:i}}}export{startWorkflowTask,startWorkflowToolRun};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { WorkflowToolRunInput } from "#execution/tools/workflow/types.js";
|
|
2
|
-
/** Runs one authored workflow tool call and reports to its declared owner
|
|
2
|
+
/** Runs one authored workflow tool call and reports to its declared owner hook. */
|
|
3
3
|
export declare function workflowToolRunWorkflow(input: WorkflowToolRunInput): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sleep}from"#compiled/@workflow/core/index.js";import{
|
|
1
|
+
import{sleep}from"#compiled/@workflow/core/index.js";import{createWorkflowBodyRef,executeWorkflowBody}from"#execution/tools/workflow/body.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{openWorkflowToolRunControlInbox}from"#execution/tools/workflow/run-control.js";async function workflowToolRunWorkflow(n){"use workflow";let r=openWorkflowToolRunControlInbox(n.hookToken),i={...n,execution:n.execution??`blocking`},a=createWorkflowBodyRef(i),o=executeWorkflowBody(i,r.signal).then(({outcome:e})=>{if(e.status===`completed`)return e.output;throw e.status===`failed`?e.error:r.signal.reason??Error(e.reason??`Workflow tool run cancelled.`)}),s=o.catch(()=>{}),c;try{c={output:await Promise.race([o,r.cancelled]),status:`completed`}}catch(t){r.signal.aborted?(await Promise.race([s,sleep(`30s`)]),c={reason:r.reason(),status:`cancelled`}):c={error:normalizeSerializableError(t),status:`failed`}}let l={from:a,result:c};await resumeHookStep(n.owner.inbox,{kind:`outcome`,...l},{ifPresent:c.status===`cancelled`})}workflowToolRunWorkflow.workflowId=`workflow//eve//workflowToolRunWorkflow`;export{workflowToolRunWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{activeTurnId}from"#harness/active-turn-id.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{dispatchTurnStep}from"#execution/dispatch-turn-step.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";import{runInlineTurn}from"#execution/inline-turn.js";async function dispatchAndAwaitTurn(e){let
|
|
1
|
+
import{activeTurnId}from"#harness/active-turn-id.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{SessionStateCursor}from"#execution/session-state-cursor.js";import{dispatchTurnStep}from"#execution/dispatch-turn-step.js";import{TurnControlReceiver}from"#execution/turn-control-receiver.js";import{runInlineTurn}from"#execution/inline-turn.js";import{runTurnOwnedWorkflow}from"#execution/turn-workflow.js";async function dispatchAndAwaitTurn(e){let t=e.stateCursor??new SessionStateCursor({serializedContext:e.serializedContext,sessionState:e.sessionState}),r=await runInlineTurn({...e,stateCursor:t});return r.kind===`result`?{action:r.action,async dispose(){}}:await runAndAwaitTurn({...e,inline:r.kind===`continue`,initialCancellation:r.initialCancellation,stateCursor:t,initialStep:r.initialStep})}async function runAndAwaitTurn(n){let a=new TurnControlReceiver({bufferedDeliveries:n.bufferedDeliveries,bufferedSessionControls:n.bufferedSessionControls,cancelledTaskIds:n.cancelledTaskIds,commandInbox:n.commandInbox,expectedTurnId:activeTurnId(n.sessionState.emissionState),seenTaskDeliveries:n.seenTaskDeliveries??new Set,stateCursor:n.stateCursor,token:n.controlToken});try{let e={capabilities:n.capabilities,completionToken:a.token,delivery:n.delivery,initialCancellation:n.initialCancellation,initialStep:n.initialStep,mode:n.mode,parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState},i;if(n.inline){let n=Promise.withResolvers();[i]=await Promise.all([n.promise.then(()=>a.waitForAction()),runTurnOwnedWorkflow(createTurnWorkflowInput(e),n.resolve)])}else await dispatchTurnStep(e),i=await a.waitForAction();return{action:i,dispose:()=>a.dispose()}}catch(e){throw await a.dispose(),e}}export{dispatchAndAwaitTurn};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { WorkflowToolRunMessage } from "#execution/tools/workflow/messages.js";
|
|
2
2
|
import type { TurnExecutionCursor } from "#execution/turn-execution-cursor.js";
|
|
3
3
|
import type { RuntimeActionResult } from "#shared/action-types.js";
|
|
4
4
|
interface HandlerInput<T> {
|
|
@@ -6,11 +6,5 @@ interface HandlerInput<T> {
|
|
|
6
6
|
readonly cursor: TurnExecutionCursor;
|
|
7
7
|
readonly message: T;
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
* Settles a workflow tool run outcome against the turn's recorded runs and
|
|
11
|
-
* returns the runtime action result the turn should accept, or `undefined`
|
|
12
|
-
* when the outcome does not bind to a run this turn owns.
|
|
13
|
-
*/
|
|
14
|
-
export declare function handleWorkflowToolRunOutcome(input: HandlerInput<WorkflowToolRunOutcomeMessage>): Promise<RuntimeActionResult | undefined>;
|
|
15
|
-
export declare function handleWorkflowToolRunRequest(input: HandlerInput<WorkflowToolRunRequestMessage>): Promise<void>;
|
|
9
|
+
export declare function handleWorkflowToolRunMessage(input: HandlerInput<WorkflowToolRunMessage>): Promise<RuntimeActionResult | undefined>;
|
|
16
10
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{findWorkflowToolRun,isInboxSubagentResultFromRecordedWorkflowToolRun,isInboxToolResultFromRecordedWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{cancelAgentInvocationOwnerStep}from"#execution/tools/subagent/task-cancel.js";import{runProxySubagentEventStep}from"#subagents/event-proxy-step.js";import{applyTaskAgentRequest}from"#execution/tools/subagent/task-agent-requests.js";import{workflowToolRunOutcomeToSubagentResult,workflowToolRunOutcomeToToolResult,workflowToolRunRequestToInputRequestPayload}from"#execution/tools/workflow/owner-inbox.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{releaseAgentInvocationOwnerStep}from"#execution/tools/subagent/invoke-step.js";async function handleWorkflowToolRunOutcome(i){let{cursor:a,message:o}=i,s=findWorkflowToolRun(a.sessionState.snapshot?.session.state,o.from.callId);if(s?.runId!==o.from.runId)return;let c=s.resultKind===`subagent`?await settleSubagentOutcome(i):workflowToolRunOutcomeToToolResult(o);await cancelAgentInvocationOwnerStep({ownerId:o.from.runId,serializedContext:a.serializedContext,sessionState:a.sessionState});let l=await releaseAgentInvocationOwnerStep({cancelled:o.result.status===`cancelled`,ownerId:o.from.runId,sessionState:a.sessionState});await a.adopt({serializedContext:a.serializedContext,sessionState:l.sessionState});let u=a.sessionState.snapshot?.session.state;return(c.kind===`subagent-result`?c.callId===o.from.callId&&isInboxSubagentResultFromRecordedWorkflowToolRun(u,c):isInboxToolResultFromRecordedWorkflowToolRun(u,c))?c:void 0}async function settleSubagentOutcome(e){let{cursor:t,message:n}=e,r=workflowToolRunOutcomeToSubagentResult(n);return r.origin===`child`&&await t.adopt(await applyTaskAgentRequest({accumulateUsage:!1,ownerId:n.from.runId,replyTo:n.from.runId,request:{kind:`agent-settled`,result:r}},requestContext(e))),r}async function handleWorkflowToolRunRequest(t){let{cursor:n,message:r}=t;if(r.request.kind===`agent-invoke`||r.request.kind===`agent-settled`){if(findWorkflowToolRun(n.sessionState.snapshot?.session.state,r.from.callId)?.runId!==r.from.runId){r.request.kind===`agent-invoke`&&await resumeHookStep(r.replyTo,{kind:`runtime-action-result`,results:[{callId:r.request.invocationId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`AGENT_INVOCATION_NOT_ADMITTED`,message:`The workflow tool run no longer owns this agent invocation.`},subagentName:r.request.input.target}]});return}await n.adopt(await applyTaskAgentRequest({accumulateUsage:r.from.resultKind!==`subagent`,ownerId:r.from.runId,replyTo:r.replyTo,request:r.request},requestContext(t)));return}if(r.request.kind===`authorization-request`){await n.adopt(await runProxySubagentEventStep({hookPayload:r.request.event,parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}));return}await n.adopt(await runProxySubagentEventStep({...r.requestCoordinates===void 0?{answerHook:{runId:r.from.runId}}:{},hookPayload:workflowToolRunRequestToInputRequestPayload(r),parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}))}function requestContext(e){return{callbackBaseUrl:resolveWorkflowCallbackBaseUrl(e.callbackMetadataUrl),parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}}export{
|
|
1
|
+
import{findWorkflowToolRun,isInboxSubagentResultFromRecordedWorkflowToolRun,isInboxToolResultFromRecordedWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{cancelAgentInvocationOwnerStep}from"#execution/tools/subagent/task-cancel.js";import{runProxySubagentEventStep}from"#subagents/event-proxy-step.js";import{applyTaskAgentRequest}from"#execution/tools/subagent/task-agent-requests.js";import{workflowToolRunOutcomeToSubagentResult,workflowToolRunOutcomeToToolResult,workflowToolRunRequestToInputRequestPayload}from"#execution/tools/workflow/owner-inbox.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{resumeHookStep}from"#execution/tools/workflow/resume-hook-step.js";import{releaseAgentInvocationOwnerStep}from"#execution/tools/subagent/invoke-step.js";import{emitWorkflowToolRunReportStep}from"#execution/tools/workflow/emit-workflow-tool-run-report-step.js";async function handleWorkflowToolRunMessage(e){let{message:t}=e;switch(t.kind){case`outcome`:return await handleWorkflowToolRunOutcome({...e,message:t});case`request`:await handleWorkflowToolRunRequest({...e,message:t});return;case`report`:await emitWorkflowToolRunReportStep({from:t.from,parentWritable:e.cursor.parentWritable,update:t.update});return}}async function handleWorkflowToolRunOutcome(i){let{cursor:a,message:o}=i,s=findWorkflowToolRun(a.sessionState.snapshot?.session.state,o.from.callId);if(s?.runId!==o.from.runId)return;let c=s.resultKind===`subagent`?await settleSubagentOutcome(i):workflowToolRunOutcomeToToolResult(o);await cancelAgentInvocationOwnerStep({ownerId:o.from.runId,serializedContext:a.serializedContext,sessionState:a.sessionState});let l=await releaseAgentInvocationOwnerStep({cancelled:o.result.status===`cancelled`,ownerId:o.from.runId,sessionState:a.sessionState});await a.adopt({serializedContext:a.serializedContext,sessionState:l.sessionState});let u=a.sessionState.snapshot?.session.state;return(c.kind===`subagent-result`?c.callId===o.from.callId&&isInboxSubagentResultFromRecordedWorkflowToolRun(u,c):isInboxToolResultFromRecordedWorkflowToolRun(u,c))?c:void 0}async function settleSubagentOutcome(e){let{cursor:t,message:n}=e,r=workflowToolRunOutcomeToSubagentResult(n);return r.origin===`child`&&await t.adopt(await applyTaskAgentRequest({accumulateUsage:!1,ownerId:n.from.runId,replyTo:n.from.runId,request:{kind:`agent-settled`,result:r}},requestContext(e))),r}async function handleWorkflowToolRunRequest(t){let{cursor:n,message:r}=t;if(r.request.kind===`agent-invoke`||r.request.kind===`agent-settled`){if(findWorkflowToolRun(n.sessionState.snapshot?.session.state,r.from.callId)?.runId!==r.from.runId){r.request.kind===`agent-invoke`&&await resumeHookStep(r.replyTo,{kind:`runtime-action-result`,results:[{callId:r.request.invocationId,isError:!0,kind:`subagent-result`,origin:`dispatch`,output:{code:`AGENT_INVOCATION_NOT_ADMITTED`,message:`The workflow tool run no longer owns this agent invocation.`},subagentName:r.request.input.target}]});return}await n.adopt(await applyTaskAgentRequest({accumulateUsage:r.from.resultKind!==`subagent`,ownerId:r.from.runId,replyTo:r.replyTo,request:r.request},requestContext(t)));return}if(r.request.kind===`authorization-request`){await n.adopt(await runProxySubagentEventStep({hookPayload:r.request.event,parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}));return}await n.adopt(await runProxySubagentEventStep({...r.requestCoordinates===void 0?{answerHook:{runId:r.from.runId}}:{},hookPayload:workflowToolRunRequestToInputRequestPayload(r),parentWritable:n.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}))}function requestContext(e){return{callbackBaseUrl:resolveWorkflowCallbackBaseUrl(e.callbackMetadataUrl),parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}}export{handleWorkflowToolRunMessage};
|
|
@@ -10,3 +10,4 @@ export type { TurnWorkflowInput };
|
|
|
10
10
|
* guard-mismatched cancel is a benign no-op.
|
|
11
11
|
*/
|
|
12
12
|
export declare function turnWorkflow(rawInput: unknown): Promise<void>;
|
|
13
|
+
export declare function runTurnOwnedWorkflow(input: TurnWorkflowInput, onReady?: () => void): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isInboxSubagentResultFromRecordedWorkflowToolRun,isInboxToolResultFromRecordedWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{activeTurnId}from"#harness/active-turn-id.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{turnStep}from"#execution/workflow-steps.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#subagents/event-proxy-step.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerChannels}from"#execution/tools/workflow/owner.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{findRunningAgentHandle,isInboxSubagentResultFromRunningHandle}from"#subagents/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchCoordinationStep}from"#execution/coordination-dispatch-step.js";import{emitWorkflowToolRunReportStep}from"#execution/tools/workflow/emit-workflow-tool-run-report-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{resolveRuntimeActionResultsForCallIds}from"#runtime/actions/results.js";import{handleWorkflowToolRunOutcome,handleWorkflowToolRunRequest}from"#execution/turn-workflow-tool-run.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(a){let o=createHook({token:`${a.completionToken}:inbox`}),c=createChannelReader(`inbox`,o),l=a.initialStep,u=new TurnExecutionCursor({controlToken:a.completionToken,parentWritable:a.stepInput.parentWritable,serializedContext:l?.beforeStep.serializedContext??a.stepInput.serializedContext,sessionState:l?.beforeStep.sessionState??a.stepInput.sessionState}),d=0,nextDeliveryRequestId=()=>`${o.token}:delivery:${String(d++)}`,f=[],p=a.stepInput.input,m=!1,h,g;try{try{await claimHookOwnership(o),m=!0}catch(e){if(isHookConflictError(e))return;throw e}h=openWorkflowToolRunOwnerChannels(o.token);let e=[...h.readers,c];for(a.driverCapabilities?.cancelledTurnSettle===!0&&(g=await createTurnCancellationControl({controlToken:a.completionToken,expectedTurnId:activeTurnId(u.sessionState.emissionState),initialPayload:a.initialCancellation}));;){let n=l?.beforeStep??{serializedContext:u.serializedContext,sessionState:u.sessionState},r=l?.result??await turnStep(u.createStepInput(p,g?.signal));l=void 0;let i=r.action===`dispatch-workflow-tasks`?r.pendingTaskCallIds:r.action===`park`?r.pendingCoordinationCallIds:void 0,s=(r.backgroundTasks?.length??0)>0;if(s){if(r.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await u.adopt({serializedContext:n.serializedContext,sessionState:r.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:r.backgroundTasks??[]})}if(r.action===`cancelled`){await u.adopt({serializedContext:r.serializedContext,sessionState:r.backgroundTaskState??r.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:g,cursor:u});return}if(g?.signal.aborted===!0&&(i===void 0||s)){await u.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(n.serializedContext,r.serializedContext),sessionState:u.sessionState}),await finishCancelledTurn({bufferedDeliveries:f,cancellation:g,cursor:u});return}if(r.action===`done`){await g?.dispose(),await u.finish(r,{kind:`done`,output:r.output??``,isError:r.isError,usage:r.usage,usageDelta:r.usageDelta},f);return}if(i!==void 0&&(r.action===`park`||r.action===`dispatch-workflow-tasks`)){await u.adopt(r);let n=await dispatchCoordinationStep({action:r.action,callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),parentContinuationToken:o.token,parentWritable:u.parentWritable,serializedContext:u.serializedContext,sessionState:u.sessionState}),a=n.results.length===0?void 0:Date.now();await u.adopt(n),await acknowledgeDelegatedTasksStep({tasks:n.pendingTasks});let s=await waitForRuntimeActionResults({bufferedDeliveries:f,cancellation:g,cursor:u,inboxToken:o.token,initialAcceptedAtMs:a,initialResults:n.results,nextDeliveryRequestId,readers:e,pendingCallIds:i});if(s===`cancelled`){p=void 0;continue}if(s===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:f,cancellation:g,cursor:u});return}p={kind:`runtime-action-result`,...s};continue}if(r.action===`park`){if(!(r.hasPendingAuthorization||r.hasPendingInputBatch&&a.capabilities?.requestInput===!0||a.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await g?.dispose(),await u.finish(r,{authorizationAttemptIds:r.authorizationAttemptIds,authorizationNames:r.authorizationNames,kind:`park`,settled:r.settled},f);return}await u.adopt(r),p=void 0}}catch(e){throw await u.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{g!==void 0&&await g.dispose(),h!==void 0&&await h.dispose(),m&&await disposeHook(o)}}async function finishCancelledTurn(e){(e.cancellation?.signal.aborted===!0?await e.cancellation.payload:void 0)?.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForRuntimeActionResults(e){let n,r=[...e.initialResults],i=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)i.set(t.callId,e.initialAcceptedAtMs);for(;;){let s=resolveRuntimeActionResultsForCallIds({pendingCallIds:e.pendingCallIds,results:r});if(s!==void 0)return n!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),{acceptedAtMsByCallId:Object.fromEntries(s.map(e=>[e.callId,i.get(e.callId)])),results:s};e.cursor.sessionState.hasProxyInputRequests&&n===void 0&&(n=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:n}));let c=await raceChannelReads(e.readers,e.cancellation?.requested);if(c===`cancel`)return n!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),`cancelled`;if(c.next.done)throw Error(`Turn inbox closed before runtime actions completed.`);if(c.channel===`outcome`){let n=await handleWorkflowToolRunOutcome({callbackMetadataUrl:getWorkflowMetadata().url,cursor:e.cursor,message:c.next.value});n!==void 0&&(r.push(n),i.set(n.callId,Date.now()));continue}if(c.channel===`request`){await handleWorkflowToolRunRequest({callbackMetadataUrl:getWorkflowMetadata().url,cursor:e.cursor,message:c.next.value});continue}if(c.channel===`report`){await emitWorkflowToolRunReportStep({from:c.next.value.from,parentWritable:e.cursor.parentWritable,update:c.next.value.update});continue}let l=c.next.value;if(l.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,n=l.results.filter(e=>e.kind===`tool-result`?isInboxToolResultFromRecordedWorkflowToolRun(t,e):e.origin===`child`&&isInboxSubagentResultFromRunningHandle(t,e)||isInboxSubagentResultFromRecordedWorkflowToolRun(t,e));if(n.length>0){let e=Date.now();r.push(...n);for(let t of n)i.set(t.callId,e)}continue}if(l.kind===`subagent-input-request`||l.kind===`subagent-authorization-event`){let t=findRunningAgentHandle(e.cursor.sessionState.snapshot?.session.state,{callId:l.callId});if(t?.identity.name!==l.subagentName||t.address.sessionId!==l.childSessionId)continue;let n=await runProxySubagentEventStep({hookPayload:l,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(n);continue}if(l.kind===`driver-delivery`&&l.requestId===n){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:l.requestId}),n=void 0;let t=await routeDeliverToChildren({delivery:l.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:t.serializedContext??e.cursor.serializedContext,sessionState:t.sessionState??e.cursor.sessionState}),t.kind===`cancel-turn`)return t.kind;t.remainder!==void 0&&e.bufferedDeliveries.push(t.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let n=await turnStep(t);if(n.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:n.output??``,isError:n.isError,serializedContext:n.serializedContext,sessionState:n.sessionState,usage:n.usage,usageDelta:n.usageDelta},kind:`turn-result`}});return}if(n.action===`dispatch-workflow-tasks`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-tasks`,pendingCallIds:n.pendingTaskCallIds,serializedContext:n.serializedContext,sessionState:n.sessionState},kind:`turn-result`}});return}if(n.action===`park`){let t=n.pendingCoordinationCallIds;if(!(t!==void 0||n.hasPendingAuthorization||n.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let r=t===void 0?{kind:`park`,serializedContext:n.serializedContext,sessionState:n.sessionState,authorizationAttemptIds:n.authorizationAttemptIds,authorizationNames:n.authorizationNames,settled:n.settled}:{kind:`dispatch-coordination`,pendingCallIds:t,serializedContext:n.serializedContext,sessionState:n.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:r,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}turnWorkflow.workflowId=`workflow//eve//turnWorkflow`;export{turnWorkflow};
|
|
1
|
+
import{createHook,getWorkflowMetadata}from"#compiled/@workflow/core/index.js";import{claimHookOwnership,disposeHook,isHookConflictError}from"#execution/hook-ownership.js";import{isInboxSubagentResultFromRecordedWorkflowToolRun,isInboxToolResultFromRecordedWorkflowToolRun}from"#harness/workflow-tool-runs.js";import{activeTurnId}from"#harness/active-turn-id.js";import{migrateTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{turnStep}from"#execution/workflow-steps.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{runProxySubagentEventStep}from"#subagents/event-proxy-step.js";import{createChannelReader,raceChannelReads}from"#execution/tools/workflow/owner-channels.js";import{openWorkflowToolRunOwnerInbox}from"#execution/tools/workflow/owner.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{acknowledgeDelegatedTasksStep}from"#execution/tasks/parent/delegate.js";import{normalizeSerializableError}from"#execution/workflow-errors.js";import{sendTurnControlStep}from"#execution/turn-control-protocol.js";import{findRunningAgentHandle,isInboxSubagentResultFromRunningHandle}from"#subagents/handles/query.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{cancelDescendantTurnsStep}from"#execution/cancel-descendant-turns-step.js";import{dispatchCoordinationStep}from"#execution/coordination-dispatch-step.js";import{createTurnCancellationControl}from"#execution/turn-cancellation-control.js";import{TurnExecutionCursor}from"#execution/turn-execution-cursor.js";import{resolveRuntimeActionResultsForCallIds}from"#runtime/actions/results.js";import{handleWorkflowToolRunMessage}from"#execution/turn-workflow-tool-run.js";const TASK_MODE_WAIT_ERROR_MESSAGE="Task mode cannot wait for follow-up input (`next: null`).";async function turnWorkflow(e){"use workflow";let t=migrateTurnWorkflowInput(e);return t.driverCapabilities?.turnInbox===!0?runTurnOwnedWorkflow(t):runLegacyTurnWorkflow(t)}async function runTurnOwnedWorkflow(a,o){let c=createHook({token:`${a.completionToken}:inbox`}),l=createChannelReader(`inbox`,c),u=a.initialStep,d=new TurnExecutionCursor({controlToken:a.completionToken,parentWritable:a.stepInput.parentWritable,serializedContext:u?.beforeStep.serializedContext??a.stepInput.serializedContext,sessionState:u?.beforeStep.sessionState??a.stepInput.sessionState}),f=0,nextDeliveryRequestId=()=>`${c.token}:delivery:${String(f++)}`,p=[],m=a.stepInput.input,h=!1,g;try{try{await claimHookOwnership(c),h=!0}catch(e){if(isHookConflictError(e))return;throw e}let e=openWorkflowToolRunOwnerInbox(),r=[e.reader,l];for(a.driverCapabilities?.cancelledTurnSettle===!0&&(g=await createTurnCancellationControl({controlToken:a.completionToken,expectedTurnId:activeTurnId(d.sessionState.emissionState),initialPayload:a.initialCancellation})),o?.();;){let n=u?.beforeStep??{serializedContext:d.serializedContext,sessionState:d.sessionState},i=u?.result??await turnStep(d.createStepInput(m,g?.signal));u=void 0;let o=i.action===`dispatch-workflow-tasks`?i.pendingTaskCallIds:i.action===`park`?i.pendingCoordinationCallIds:void 0,s=(i.backgroundTasks?.length??0)>0;if(s){if(i.backgroundTaskState===void 0)throw Error(`Background tasks were returned without their committed session state.`);await d.adopt({serializedContext:n.serializedContext,sessionState:i.backgroundTaskState}),await acknowledgeDelegatedTasksStep({tasks:i.backgroundTasks??[]})}if(i.action===`cancelled`){await d.adopt({serializedContext:i.serializedContext,sessionState:i.backgroundTaskState??i.sessionState}),await finishCancelledTurn({bufferedDeliveries:p,cancellation:g,cursor:d});return}if(g?.signal.aborted===!0&&(o===void 0||s)){await d.adopt({serializedContext:preserveSerializedSessionDynamicModelSelection(n.serializedContext,i.serializedContext),sessionState:d.sessionState}),await finishCancelledTurn({bufferedDeliveries:p,cancellation:g,cursor:d});return}if(i.action===`done`){await g?.dispose(),await d.finish(i,{kind:`done`,output:i.output??``,isError:i.isError,usage:i.usage,usageDelta:i.usageDelta},p);return}if(o!==void 0&&(i.action===`park`||i.action===`dispatch-workflow-tasks`)){await d.adopt(i);let n=await dispatchCoordinationStep({action:i.action,callbackBaseUrl:resolveWorkflowCallbackBaseUrl(getWorkflowMetadata().url),workflowToolRunOwner:e.owner,parentWritable:d.parentWritable,serializedContext:d.serializedContext,sessionState:d.sessionState}),a=n.results.length===0?void 0:Date.now();await d.adopt(n),await acknowledgeDelegatedTasksStep({tasks:n.pendingTasks});let s=await waitForRuntimeActionResults({bufferedDeliveries:p,cancellation:g,cursor:d,inboxToken:c.token,initialAcceptedAtMs:a,initialResults:n.results,nextDeliveryRequestId,readers:r,pendingCallIds:o});if(s===`cancelled`){m=void 0;continue}if(s===`cancel-turn`){await finishCancelledTurn({bufferedDeliveries:p,cancellation:g,cursor:d});return}m={kind:`runtime-action-result`,...s};continue}if(i.action===`park`){if(!(i.hasPendingAuthorization||i.hasPendingInputBatch&&a.capabilities?.requestInput===!0||a.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);await g?.dispose(),await d.finish(i,{authorizationAttemptIds:i.authorizationAttemptIds,authorizationNames:i.authorizationNames,kind:`park`,settled:i.settled},p);return}await d.adopt(i),m=void 0}}catch(e){throw await d.send({error:normalizeSerializableError(e),kind:`turn-error`}),e}finally{g!==void 0&&await g.dispose(),h&&await disposeHook(c)}}async function finishCancelledTurn(e){(e.cancellation?.signal.aborted===!0?await e.cancellation.payload:void 0)?.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await cancelDescendantTurnsStep({serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState}),await e.cancellation?.dispose(),await e.cursor.finish({sessionState:e.cursor.sessionState},{cancelled:!0,kind:`park`},e.bufferedDeliveries)}async function waitForRuntimeActionResults(e){let n,r=[...e.initialResults],i=new Map;if(e.initialAcceptedAtMs!==void 0)for(let t of e.initialResults)i.set(t.callId,e.initialAcceptedAtMs);for(;;){let s=resolveRuntimeActionResultsForCallIds({pendingCallIds:e.pendingCallIds,results:r});if(s!==void 0)return n!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),{acceptedAtMsByCallId:Object.fromEntries(s.map(e=>[e.callId,i.get(e.callId)])),results:s};e.cursor.sessionState.hasProxyInputRequests&&n===void 0&&(n=e.nextDeliveryRequestId(),await e.cursor.send({continuationToken:e.cursor.sessionState.continuationToken,inboxToken:e.inboxToken,kind:`turn-delivery-request`,requestId:n}));let c=await raceChannelReads(e.readers,e.cancellation?.requested);if(c===`cancel`)return n!==void 0&&await e.cursor.send({kind:`turn-delivery-cancelled`,requestId:n}),`cancelled`;if(c.next.done)throw Error(`Turn inbox closed before runtime actions completed.`);if(c.channel===`workflow`){let n=await handleWorkflowToolRunMessage({callbackMetadataUrl:getWorkflowMetadata().url,cursor:e.cursor,message:c.next.value});n!==void 0&&(r.push(n),i.set(n.callId,Date.now()));continue}let l=c.next.value;if(l.kind===`runtime-action-result`){let t=e.cursor.sessionState.snapshot?.session.state,n=l.results.filter(e=>e.kind===`tool-result`?isInboxToolResultFromRecordedWorkflowToolRun(t,e):e.origin===`child`&&isInboxSubagentResultFromRunningHandle(t,e)||isInboxSubagentResultFromRecordedWorkflowToolRun(t,e));if(n.length>0){let e=Date.now();r.push(...n);for(let t of n)i.set(t.callId,e)}continue}if(l.kind===`subagent-input-request`||l.kind===`subagent-authorization-event`){let t=findRunningAgentHandle(e.cursor.sessionState.snapshot?.session.state,{callId:l.callId});if(t?.identity.name!==l.subagentName||t.address.sessionId!==l.childSessionId)continue;let n=await runProxySubagentEventStep({hookPayload:l,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});await e.cursor.adopt(n);continue}if(l.kind===`driver-delivery`&&l.requestId===n){await e.cursor.send({kind:`turn-delivery-accepted`,requestId:l.requestId}),n=void 0;let t=await routeDeliverToChildren({delivery:l.delivery,parentWritable:e.cursor.parentWritable,serializedContext:e.cursor.serializedContext,sessionState:e.cursor.sessionState});if(await e.cursor.adopt({serializedContext:t.serializedContext??e.cursor.serializedContext,sessionState:t.sessionState??e.cursor.sessionState}),t.kind===`cancel-turn`)return t.kind;t.remainder!==void 0&&e.bufferedDeliveries.push(t.remainder)}}}async function runLegacyTurnWorkflow(e){let t=e.stepInput;try{for(;;){let n=await turnStep(t);if(n.action===`done`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`done`,output:n.output??``,isError:n.isError,serializedContext:n.serializedContext,sessionState:n.sessionState,usage:n.usage,usageDelta:n.usageDelta},kind:`turn-result`}});return}if(n.action===`dispatch-workflow-tasks`){await sendTurnControlStep({controlToken:e.completionToken,payload:{action:{kind:`dispatch-workflow-tasks`,pendingCallIds:n.pendingTaskCallIds,serializedContext:n.serializedContext,sessionState:n.sessionState},kind:`turn-result`}});return}if(n.action===`park`){let t=n.pendingCoordinationCallIds;if(!(t!==void 0||n.hasPendingAuthorization||n.hasPendingInputBatch&&e.capabilities?.requestInput===!0||e.mode===`conversation`))throw Error(TASK_MODE_WAIT_ERROR_MESSAGE);let r=t===void 0?{kind:`park`,serializedContext:n.serializedContext,sessionState:n.sessionState,authorizationAttemptIds:n.authorizationAttemptIds,authorizationNames:n.authorizationNames,settled:n.settled}:{kind:`dispatch-coordination`,pendingCallIds:t,serializedContext:n.serializedContext,sessionState:n.sessionState};await sendTurnControlStep({controlToken:e.completionToken,payload:{action:r,kind:`turn-result`}});return}t={input:void 0,parentWritable:t.parentWritable,serializedContext:n.serializedContext,sessionState:n.sessionState}}}catch(t){throw await sendTurnControlStep({controlToken:e.completionToken,payload:{error:normalizeSerializableError(t),kind:`turn-error`}}),t}}turnWorkflow.workflowId=`workflow//eve//turnWorkflow`;export{runTurnOwnedWorkflow,turnWorkflow};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isSessionCommandHookToken,sessionCommandHookToken}from"#execution/session-command-token.js";import{isObject}from"#shared/guards.js";import{getHookByToken,resumeHook}from"#internal/workflow/runtime.js";import{HookNotFoundError}from"#compiled/@workflow/errors/index.js";import{SESSION_INBOX_WIRE_VERSION_METADATA_KEY,SessionInboxWireError,isSessionInboxWireVersion}from"#execution/wire/session-inbox-contract.js";import{sessionInboxWire}from"#execution/wire/session-inbox-encoder.js";async function resumeSessionInbox(e,t){if(isStableInboxFastPathCompatible(e,t))return await resumeHook(e,sessionInboxWire.encode(t,{variant:`send`,version:0}));let n=await getHookByToken(e),i=await resolveSessionInboxWireTarget(n);return await resumeHook(n,sessionInboxWire.encode(t,i))}function isStableInboxFastPathCompatible(t,n){return!isSessionCommandHookToken(t)||n.kind===`cancel`&&n.tasks===!0?!1:!(`caller`in n&&n.caller?.activityObserver!==void 0)}async function resolveSessionInboxWireTarget(e){let r=isObject(e.metadata)?e.metadata:void 0;if(r!==void 0&&SESSION_INBOX_WIRE_VERSION_METADATA_KEY in r){let e=r[SESSION_INBOX_WIRE_VERSION_METADATA_KEY];if(isSessionInboxWireVersion(e))return{version:e};throw new SessionInboxWireError(`Session inbox target declares unsupported wire version ${JSON.stringify(e)}.`)}let a=sessionCommandHookToken(e.runId);if(e.token===a)return{variant:`send`,version:0};try{let t=await
|
|
1
|
+
import{isSessionCommandHookToken,sessionCommandHookToken}from"#execution/session-command-token.js";import{isObject}from"#shared/guards.js";import{getHookByToken,getRawHookByToken,resumeHook}from"#internal/workflow/runtime.js";import{HookNotFoundError}from"#compiled/@workflow/errors/index.js";import{SESSION_INBOX_WIRE_VERSION_METADATA_KEY,SessionInboxWireError,isSessionInboxWireVersion}from"#execution/wire/session-inbox-contract.js";import{sessionInboxWire}from"#execution/wire/session-inbox-encoder.js";async function resumeSessionInbox(e,t){if(isStableInboxFastPathCompatible(e,t))return await resumeHook(e,sessionInboxWire.encode(t,{variant:`send`,version:0}));let n=await getHookByToken(e),i=await resolveSessionInboxWireTarget(n);return await resumeHook(n,sessionInboxWire.encode(t,i))}function isStableInboxFastPathCompatible(t,n){return!isSessionCommandHookToken(t)||n.kind===`cancel`&&n.tasks===!0?!1:!(`caller`in n&&n.caller?.activityObserver!==void 0)}async function resolveSessionInboxWireTarget(e){let r=isObject(e.metadata)?e.metadata:void 0;if(r!==void 0&&SESSION_INBOX_WIRE_VERSION_METADATA_KEY in r){let e=r[SESSION_INBOX_WIRE_VERSION_METADATA_KEY];if(isSessionInboxWireVersion(e))return{version:e};throw new SessionInboxWireError(`Session inbox target declares unsupported wire version ${JSON.stringify(e)}.`)}let a=sessionCommandHookToken(e.runId);if(e.token===a)return{variant:`send`,version:0};try{let t=await getRawHookByToken(a);if(t.runId!==e.runId)throw new SessionInboxWireError(`Stable session inbox ${JSON.stringify(a)} belongs to run ${JSON.stringify(t.runId)}, expected ${JSON.stringify(e.runId)}.`);return{variant:`send`,version:0}}catch(e){if(HookNotFoundError.is(e))return{variant:`deliver`,version:0};throw e}}export{resolveSessionInboxWireTarget,resumeSessionInbox};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomBytes}from"node:crypto";import{createEveActivityRoutePath}from"#protocol/routes.js";import{createLogger,logError}from"#internal/logging.js";import{getChannelActivityPresentation}from"#channel/activity-renderer.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{ActivityObserverKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{normalizePersistedMessageStreamEvent}from"#protocol/message-version.js";import{cancelRun,
|
|
1
|
+
import{randomBytes}from"node:crypto";import{createEveActivityRoutePath}from"#protocol/routes.js";import{createLogger,logError}from"#internal/logging.js";import{getChannelActivityPresentation}from"#channel/activity-renderer.js";import{sessionCommandHookToken}from"#execution/session-command-token.js";import{ActivityObserverKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{walkCauseChain}from"#shared/errors.js";import{normalizePersistedMessageStreamEvent}from"#protocol/message-version.js";import{cancelRun,getRawHookByToken,getRun,getWorld,start}from"#internal/workflow/runtime.js";import{serializeContext}from"#context/serialize.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{EntityConflictError,HookNotFoundError,RunExpiredError,WorkflowRunNotFoundError}from"#compiled/@workflow/errors/index.js";import{resumeSessionInbox}from"#execution/wire/session-inbox-resume.js";import{getCompiledRuntimeAgentBundle}from"#runtime/sessions/compiled-agent-cache.js";import{buildSessionAttributes,buildSubagentRootAttributes,readParentLineage}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{ROOT_RUNTIME_AGENT_NODE_ID}from"#runtime/graph.js";import{initializeSessionInstrumentation}from"#instrumentation/runtime.js";import{createWorkflowCallbackUrl,resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{buildRunContext}from"#execution/runtime-context.js";import{parseNdjsonStream}from"#execution/ndjson-stream.js";import{buildInvocationAttributes}from"#internal/invocation/metadata.js";import{isAgentTraceContext}from"#tracing/agent-trace-context.js";import{ACTIVITY_COLLECTOR_WORKFLOW_NAME,SESSION_TIMEOUT_WORKFLOW_NAME,TASK_RUN_WORKFLOW_NAME,TURN_WORKFLOW_NAME,WORKFLOW_ENTRY_NAME,WORKFLOW_TOOL_RUN_WORKFLOW_NAME}from"#execution/stable-workflow-names.js";const EVE_PACKAGE_INFO=resolveInstalledPackageInfo(),COMMAND_HOOK_READY_TIMEOUT_MS=3e4,STABLE_ID_BASE=EVE_PACKAGE_INFO.name,log=createLogger(`execution.workflow-runtime`),workflowEntryReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_ENTRY_NAME}`},turnWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TURN_WORKFLOW_NAME}`},sessionTimeoutWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${SESSION_TIMEOUT_WORKFLOW_NAME}`},taskRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${TASK_RUN_WORKFLOW_NAME}`},activityCollectorWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${ACTIVITY_COLLECTOR_WORKFLOW_NAME}`},workflowToolRunWorkflowReference={workflowId:`workflow//${STABLE_ID_BASE}//${WORKFLOW_TOOL_RUN_WORKFLOW_NAME}`};function createWorkflowRuntime(n){return{async createSession(a){let o=await getCompiledRuntimeAgentBundle({compiledArtifactsSource:n.compiledArtifactsSource,nodeId:n.nodeId}),s=buildRunContext({bundle:o,dynamicSubagentAgentConfig:n.dynamicSubagentAgentConfig,run:a}),c=resolveEffectiveAgentRuntime(o,s);initializeSessionInstrumentation({agentName:c.turnAgent.id,ctx:s,parentTraceContext:a.parentTraceContext});let l=c.limits?.sessionTimeoutMs,u,d=a.activityObserver;if(a.parent===void 0&&d===void 0&&(getChannelActivityPresentation(a.adapter)?.renderers.length??0)>0){let n=serializeContext(s),r=randomBytes(32).toString(`base64url`),i={expiresAt:new Date(Date.now()+(typeof l==`number`?l:864e5)).toISOString(),serializedContext:n,token:r};try{u=(await startWorkflowOnCurrentDeployment(activityCollectorWorkflowReference,[i])).runId,d={sink:{url:createWorkflowCallbackUrl(resolveWorkflowCallbackBaseUrl(process.env.VERCEL_URL?`https://${process.env.VERCEL_URL}`:`http://localhost:3000`),createEveActivityRoutePath(r)),version:1}},s.set(ActivityObserverKey,d)}catch{await cancelActivityCollector(u),u=void 0,log.warn(`failed to start activity collector`)}}let f=serializeContext(s),p=readParentLineage(f),m={input:a.input,limits:a.limits,serializedContext:f},h=a.taskId??a.callback?.taskId;h!==void 0&&(m.taskId=h),u!==void 0&&(m.activityCollectorRunId=u),a.continuationConflictCommand!==void 0&&(m.continuationConflictCommand=a.continuationConflictCommand),l!==void 0&&(m.sessionTimeoutMs=l);let g={...p.sessionId===void 0?buildSessionAttributes({inputMessage:a.title??a.input.message,serializedContext:f}):buildSubagentRootAttributes({identity:{nodeId:o.nodeId??ROOT_RUNTIME_AGENT_NODE_ID},parentCallId:p.callId,parentSessionId:p.sessionId,parentTurnId:p.turnId,rootSessionId:p.rootSessionId??p.sessionId,serializedContext:f}),...a.externalInvocation===void 0?{}:buildInvocationAttributes(a.externalInvocation)},_;try{_=await startWorkflowOnCurrentDeployment(workflowEntryReference,[m],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(g)})}catch(e){throw await cancelActivityCollector(u),logError(log,`failed to start workflow run`,e,{continuationToken:a.continuationToken}),e}let v,getEvents=()=>(v??=parseNdjsonStream(()=>getRun(_.runId).getReadable(),normalizePersistedEvent),v);return{get events(){return getEvents()},sessionId:_.runId}},async dispatchContinuation(e){return await dispatchWorkflowCommand(e.continuationToken,e.command)},async dispatchSession(e){return await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),e.command)},async getEventStream(e,t){return parseNdjsonStream(()=>getRun(e).getReadable({startIndex:t?.startIndex}),normalizePersistedEvent)},async getStreamTailIndex(e){let t=getRun(e).getReadable();try{return await t.getTailIndex()}finally{await t.cancel().catch(()=>{})}},async resolveContinuation(e){try{return{sessionId:(await getRawHookByToken(e)).runId}}catch(t){if(HookNotFoundError.is(t))return;throw logError(log,`failed to resolve session by continuation token`,t,{continuationToken:e}),t}}}}function normalizePersistedEvent(e){return normalizePersistedMessageStreamEvent(e)}async function cancelActivityCollector(e){if(e!==void 0)try{await cancelRun(await getWorld(),e,{cancelReason:`Root session creation did not complete`})}catch{log.warn(`failed to cancel unowned activity collector`)}}async function dispatchWorkflowCommand(e,t){let n;try{n=normalizeWorkflowHook(await resumeSessionInbox(e,t))}catch(n){if(isInactiveCommandTarget(n))return inactiveCommandResult(t);throw logError(log,`failed to dispatch session command`,n,{command:t.kind,token:e}),n}return t.kind===`reset`&&await waitForCommandHookRelease(sessionCommandHookToken(n.runId),n.runId),activeCommandResult(t,n.runId)}function activeCommandResult(e,t){return e.kind===`reset`?{previousSessionId:t,status:`reset`}:(e.kind,{sessionId:t,status:`accepted`})}function inactiveCommandResult(e){return e.kind===`send`?{status:`session_not_active`}:e.kind===`cancel`?{status:`no_active_turn`}:{status:`no_active_session`}}async function requestWorkflowTurnCancellation(e){let t={kind:`cancel`};return e.taskId!==void 0&&(t.taskId=e.taskId),e.tasks!==void 0&&(t.tasks=e.tasks),e.turnId!==void 0&&(t.turnId=e.turnId),await dispatchWorkflowCommand(sessionCommandHookToken(e.sessionId),t)}function isInactiveCommandTarget(e){if(HookNotFoundError.is(e))return!0;for(let t of walkCauseChain(e))if(WorkflowRunNotFoundError.is(t)||RunExpiredError.is(t)||EntityConflictError.is(t))return!0;return!1}async function waitForCommandHookOwner(e){let t=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;)try{return normalizeWorkflowHook(await getRawHookByToken(e))}catch(e){if(!HookNotFoundError.is(e)||Date.now()>=t)throw e;await new Promise(e=>setTimeout(e,20))}}async function waitForCommandHookRelease(e,t){let n=Date.now()+COMMAND_HOOK_READY_TIMEOUT_MS;for(;;){try{if(normalizeWorkflowHook(await getRawHookByToken(e)).runId!==t)return}catch(e){if(HookNotFoundError.is(e))return;throw e}if(Date.now()>=n)throw Error(`Timed out waiting for session "${t}" to release its command inbox.`);await new Promise(e=>setTimeout(e,20))}}async function startWorkflowOnCurrentDeployment(e,t,n){return await startWorkflowOnDeployment(e,t,process.env.VERCEL_DEPLOYMENT_ID?.trim()||void 0,n)}async function startWorkflowOnAcceptedDeployment(e,t,n,r){return n===void 0?await startWorkflowOnCurrentDeployment(e,t,r):await startWorkflowOnDeployment(e,t,n,r)}async function startWorkflowOnDeployment(e,t,n,r){return await withWorkflowStartContext(async()=>n===void 0?r===void 0?await start(e,t):await start(e,t,r):await start(e,t,{...r,deploymentId:n}))}async function withWorkflowStartContext(e){let t=context.active(),n=isAgentTraceContext(t)?trace.deleteSpan(t):t;return await context.with(n,e)}function normalizeWorkflowHook(e){if(typeof e!=`object`||!e||!(`runId`in e))throw Error(`Workflow hook did not include a run id.`);let t=e.runId;if(typeof t!=`string`||t.length===0)throw Error(`Workflow hook did not include a run id.`);return{runId:t}}export{activityCollectorWorkflowReference,createWorkflowRuntime,requestWorkflowTurnCancellation,sessionTimeoutWorkflowReference,startWorkflowOnAcceptedDeployment,startWorkflowOnCurrentDeployment,taskRunWorkflowReference,turnWorkflowReference,waitForCommandHookOwner,workflowEntryReference,workflowToolRunWorkflowReference};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{activeTurnId}from"#harness/active-turn-id.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskCallIds,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{TASK_UPDATE_SESSION_INSTRUCTION}from"#tools/framework/task-update.js";import{deferMismatchedInlineTurnStep}from"#execution/accepted-delivery-deployment.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(a){"use step";let o=deferMismatchedInlineTurnStep(a);if(o!==void 0)return o;let s=a,c=await readDurableSession(s.sessionState),l=await deserializeContext(s.serializedContext);a.input?.kind===`deliver`&&(l.set(TurnTaskDeliveryKey,`none`),l.delete(TurnTaskStateKey));let u=l.require(ChannelKey),d=l.require(BundleKey),f=resolveEffectiveAgentRuntime(d,l),p=c.taskId!==void 0&&f.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.target.kind===`task-update`);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&l.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let m=getPendingAuthorization(c.state),h;if(m&&s.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(m,s.input.payloads);if(s={...s,input:{...s.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);l.set(PendingAuthorizationResultKey,n),c={...c,state:clearPendingAuthorization(c.state,n.map(e=>e.attemptId??e.name))},h=e,t.length===0&&(s={...s,input:void 0})}}s.input?.kind===`deliver`&&s.input.auth!==void 0&&l.set(AuthKey,s.input.auth??null);let g=hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:c,turnAgent:f.turnAgent}),_=createExecutionHistoryView(g),v=bindSessionInstrumentation({agentName:f.turnAgent.id,ctx:l,rootSessionId:g.rootSessionId??g.sessionId,sessionId:g.sessionId}),y=getHarnessEmissionState(g.state);a.input?.kind===`deliver`&&await contextStorage.run(l,()=>v?.instrumentChannelDelivery({agentName:d.turnAgent.id,ctx:l,delivery:a.input,rootSessionId:g.rootSessionId??g.sessionId,sequence:y.sequence,sessionId:g.sessionId,turnId:activeTurnId(y)}));let failChannelDeliveries=async e=>{await contextStorage.run(l,()=>v?.instrumentChannelDelivery({ctx:l,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await v?.flush()},b=buildAdapterContext(u,l),x;if(s.input?.kind===`deliver`){let e=[];try{for(let n of s.input.payloads){let r=u.deliver?await u.deliver(n,b):defaultDeliverResult(n);r!=null&&e.push(r)}}catch(e){throw await failChannelDeliveries(e),e}x=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else s.input?.kind===`runtime-action-result`&&(s.input.acceptedAtMsByCallId!==void 0&&l.set(RuntimeActionSettlementTimesKey,s.input.acceptedAtMsByCallId),x={runtimeActionResults:s.input.results});if(x!==void 0&&a.input?.kind===`deliver`&&a.input.taskDeliveryId!==void 0){let e=resolveTaskDeliveryContext({state:c.state,taskDeliveryId:a.input.taskDeliveryId});e!==void 0&&(l.set(TurnTaskDeliveryKey,e.phase),x={...x,context:[...x.context??[],e.context]})}if(l.get(TurnTaskDeliveryKey)===`none`){let e=resolveInitiatingTaskContext({state:c.state,turnId:activeTurnId(y)});e!==void 0&&(l.set(TurnTaskDeliveryKey,e.phase),l.set(TurnTaskStateKey,e.context))}if(s.input?.kind===`deliver`&&setChannelContext(l,{...u,state:{...b.state}}),s.input?.kind===`deliver`&&x===void 0){await contextStorage.run(l,()=>v?.instrumentChannelDelivery({ctx:l,includeTurn:!1,outcome:`completed`})),await v?.flush();let e=reconcileSessionContinuationToken(l,g),t=serializeContext(l),r=e===g?s.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r}}let S=d.hookRegistry,C=bindDynamicConnections(l,d.resolvedAgent),w=d.resolvedAgent.dynamicInstructionsResolvers??[],T=d.resolvedAgent.dynamicSkillResolvers??[],E=d.subagentRegistry.dynamicResolvers??[],D=d.resolvedAgent.dynamicToolResolvers??[],O={...d.graph.root,turnAgent:f.turnAgent},k=buildRuntimeIdentity(O);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(d.compiledArtifactsSource);if(!y.sessionStarted)l.set(SessionDynamicSubagentRuntimeRevisionKey,t),l.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:k});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:l,resolvers:E,event:e,messages:_.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:l,resolvers:D,event:e,messages:_.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:l,event:createTurnStartedEvent({sequence:y.sequence,turnId:activeTurnId(y)}),messages:_.initial.messages,resolvers:D})}}catch(e){throw await failChannelDeliveries(e),e}let A=s.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(u,t,b);setChannelContext(l,{...u,state:{...b.state}});let r=stampMessageStreamEvent(n);return await A.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await forwardTaskEventToSessionCallback(l,e)?stampMessageStreamEvent(e):await emit(e),r=await dispatchMemoryLifecycleEvent({abortSignal:s.abortSignal,appRoot:O.agent?.metadata?.appRoot??``,ctx:l,event:e,memories:O.agent?.memories??[],messages:t,nodeId:d.nodeId??`__root__`});observeSessionActivity({ctx:l,event:n,sessionId:g.sessionId}),await dispatchStreamEventHooks({ctx:l,registry:S,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:l,dynamicModel:f.turnAgent.dynamicModel,event:n,messages:r,scope:{moduleMap:d.moduleMap,nodeId:d.nodeId}}),await C.dispatch(n),await dispatchDynamicSubagentEvent({ctx:l,resolvers:E,event:n,messages:r}),await dispatchDynamicToolEvent({ctx:l,resolvers:D,event:n,messages:r}),await dispatchDynamicSkillEvent({ctx:l,resolvers:T,event:n,messages:r}),await dispatchDynamicInstructionEvent({ctx:l,resolvers:w,event:n,messages:r})},j=l.require(ModeKey),M;try{throwIfTurnAborted(s.abortSignal),M=await runBackgroundStep(l,g,async e=>{l.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:f.turnAgent.outputSchema,input:x,mode:j,session:e});if(await C.rehydrate(y,k,isHarnessBetweenTurns(t)),h){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(l,_.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:v});try{e=await emitTurnPreamble(handleEvent,{},e,k,r)}finally{n=drainDynamicInstructionUserMessages(l),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of h){let r=m?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let n=l.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:f.thresholdPercent},session:e,systemPromptAdditions:p?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:f.turnAgent}),i=r;return createExecutionNodeStep({abortSignal:s.abortSignal,capabilities:n,clearOnly:s.input?.kind===`clear`,compactOnly:s.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:_.projector,historyView:_.prepare(i),instrumentation:v,mode:j,modelResolutionScope:{moduleMap:d.moduleMap,nodeId:d.nodeId},node:O,workflowMaxSubagents:r.workflowMaxSubagents})(i,t)})(t,x)})}catch(e){if(!isTurnCancellation(e))throw await failChannelDeliveries(e),e;A.releaseLock();let t=serializeContext(l),n=readRetainedBackgroundToolResult(l),r=await preserveCancelledTurnMessage(n?.backgroundTaskSession??g,x);return{action:`cancelled`,...n===void 0?{}:{backgroundTaskState:createDurableSessionState({session:r}),backgroundTasks:n.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(s.serializedContext,t),t),t),sessionState:createDurableSessionState({session:r})}}let N=reconcileSessionContinuationToken(l,M.session),P=serializeContext(l);M={...M,session:N};let F=createDurableSessionState({session:M.session}),I=M.backgroundTasks===void 0||M.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:M.backgroundTaskSession}),backgroundTasks:M.backgroundTasks};if(M.next!==null&&typeof M.next==`object`&&`done`in M.next){if(j===`task`&&hasPendingInputBatch(M.session.state))throw A.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await A.close();let e=getTurnUsageState(M.session.state)?.session;return{action:`done`,...I,output:M.next.output,isError:M.next.isError,serializedContext:P,sessionState:F,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(M.session).delta}}if(M.next===null){A.releaseLock();let e=getPendingWorkflowInterrupt(M.session.state);if(e!==void 0&&isWorkflowTaskInterrupt(e.interrupt))return{action:`dispatch-workflow-tasks`,...I,pendingTaskCallIds:getWorkflowTaskCallIds(e.interrupt),serializedContext:P,sessionState:F};let t=derivePendingState(M.session);if(M.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(M.session);return{action:`park`,...I,...t,serializedContext:P,sessionState:createDurableSessionState({session:n}),settled:{output:M.settledTurn.output,isError:M.settledTurn.isError,usage:e}}}return{action:`park`,...I,...t,serializedContext:P,sessionState:F}}return A.releaseLock(),{action:`continue`,...I,serializedContext:P,sessionState:F}}export{turnStep};
|
|
1
|
+
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{activeTurnId}from"#harness/active-turn-id.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskCallIds,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{TASK_UPDATE_SESSION_INSTRUCTION}from"#tools/framework/task-update.js";import{deferMismatchedInlineTurnStep}from"#execution/accepted-delivery-deployment.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(a){"use step";let o=deferMismatchedInlineTurnStep(a);if(o!==void 0)return o;let s=a,c=await readDurableSession(s.sessionState),l=await deserializeContext(s.serializedContext);a.input?.kind===`deliver`&&(l.set(TurnTaskDeliveryKey,`none`),l.delete(TurnTaskStateKey));let u=l.require(ChannelKey),d=l.require(BundleKey),f=resolveEffectiveAgentRuntime(d,l),p=c.taskId!==void 0&&f.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.target.kind===`task-update`);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&l.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let m=getPendingAuthorization(c.state),h;if(m&&s.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(m,s.input.payloads);if(s={...s,input:{...s.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);l.set(PendingAuthorizationResultKey,n),c={...c,state:clearPendingAuthorization(c.state,n.map(e=>e.attemptId??e.name))},h=e,t.length===0&&(s={...s,input:void 0})}}s.input?.kind===`deliver`&&s.input.auth!==void 0&&l.set(AuthKey,s.input.auth??null);let g=hydrateDurableSession({compactionOverrides:{thresholdPercent:f.thresholdPercent},durable:c,turnAgent:f.turnAgent}),_=createExecutionHistoryView(g),v=bindSessionInstrumentation({agentName:f.turnAgent.id,ctx:l,rootSessionId:g.rootSessionId??g.sessionId,sessionId:g.sessionId}),y=getHarnessEmissionState(g.state);a.input?.kind===`deliver`&&await contextStorage.run(l,()=>v?.instrumentChannelDelivery({agentName:d.turnAgent.id,ctx:l,delivery:a.input,rootSessionId:g.rootSessionId??g.sessionId,sequence:y.sequence,sessionId:g.sessionId,turnId:activeTurnId(y)}));let failChannelDeliveries=async e=>{await contextStorage.run(l,()=>v?.instrumentChannelDelivery({ctx:l,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await v?.flush()},b=buildAdapterContext(u,l),x;if(s.input?.kind===`deliver`){let e=[];try{for(let n of s.input.payloads){let r=u.deliver?await u.deliver(n,b):defaultDeliverResult(n);r!=null&&e.push(r)}}catch(e){throw await failChannelDeliveries(e),e}x=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else s.input?.kind===`runtime-action-result`&&(s.input.acceptedAtMsByCallId!==void 0&&l.set(RuntimeActionSettlementTimesKey,s.input.acceptedAtMsByCallId),x={runtimeActionResults:s.input.results});if(x!==void 0&&a.input?.kind===`deliver`&&a.input.taskDeliveryId!==void 0){let e=resolveTaskDeliveryContext({state:c.state,taskDeliveryId:a.input.taskDeliveryId});e!==void 0&&(l.set(TurnTaskDeliveryKey,e.phase),x={...x,context:[...x.context??[],e.context]})}if(l.get(TurnTaskDeliveryKey)===`none`){let e=resolveInitiatingTaskContext({state:c.state,turnId:activeTurnId(y)});e!==void 0&&(l.set(TurnTaskDeliveryKey,e.phase),l.set(TurnTaskStateKey,e.context))}if(s.input?.kind===`deliver`&&setChannelContext(l,{...u,state:{...b.state}}),s.input?.kind===`deliver`&&x===void 0){await contextStorage.run(l,()=>v?.instrumentChannelDelivery({ctx:l,includeTurn:!1,outcome:`completed`})),await v?.flush();let e=reconcileSessionContinuationToken(l,g),t=serializeContext(l),r=e===g?s.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r}}let S=d.hookRegistry,C=bindDynamicConnections(l,d.resolvedAgent),w=d.resolvedAgent.dynamicInstructionsResolvers??[],T=d.resolvedAgent.dynamicSkillResolvers??[],E=d.subagentRegistry.dynamicResolvers??[],D=d.resolvedAgent.dynamicToolResolvers??[],O={...d.graph.root,turnAgent:f.turnAgent},k=buildRuntimeIdentity(O);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(d.compiledArtifactsSource);if(!y.sessionStarted)l.set(SessionDynamicSubagentRuntimeRevisionKey,t),l.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:k});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:l,resolvers:E,event:e,messages:_.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:l,resolvers:D,event:e,messages:_.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:l,event:createTurnStartedEvent({sequence:y.sequence,turnId:activeTurnId(y)}),messages:_.initial.messages,resolvers:D})}}catch(e){throw await failChannelDeliveries(e),e}let A=s.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(u,t,b);setChannelContext(l,{...u,state:{...b.state}});let r=stampMessageStreamEvent(n);return await A.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await forwardTaskEventToSessionCallback(l,e)?stampMessageStreamEvent(e):await emit(e),r=await dispatchMemoryLifecycleEvent({abortSignal:s.abortSignal,appRoot:O.agent?.metadata?.appRoot??``,ctx:l,event:e,memories:O.agent?.memories??[],messages:t,nodeId:d.nodeId??`__root__`});observeSessionActivity({ctx:l,event:n,sessionId:g.sessionId}),await dispatchStreamEventHooks({ctx:l,registry:S,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:l,dynamicModel:f.turnAgent.dynamicModel,event:n,messages:r,scope:{moduleMap:d.moduleMap,nodeId:d.nodeId}}),await C.dispatch(n),await dispatchDynamicSubagentEvent({ctx:l,resolvers:E,event:n,messages:r}),await dispatchDynamicToolEvent({ctx:l,resolvers:D,event:n,messages:r}),await dispatchDynamicSkillEvent({ctx:l,resolvers:T,event:n,messages:r}),await dispatchDynamicInstructionEvent({ctx:l,resolvers:w,event:n,messages:r})},j=l.require(ModeKey),M;try{throwIfTurnAborted(s.abortSignal),M=await runBackgroundStep(l,g,async e=>{l.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:f.turnAgent.outputSchema,input:x,mode:j,session:e});if(await C.rehydrate(y,k,isHarnessBetweenTurns(t)),h){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(l,_.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:v});try{e=await emitTurnPreamble(handleEvent,{},e,k,r)}finally{n=drainDynamicInstructionUserMessages(l),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of h){let r=m?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let n=l.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:f.thresholdPercent},session:e,systemPromptAdditions:p?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:f.turnAgent}),i=r;return createExecutionNodeStep({abortSignal:s.abortSignal,capabilities:n,clearOnly:s.input?.kind===`clear`,compactOnly:s.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:_.projector,historyView:_.prepare(i),instrumentation:v,mode:j,modelResolutionScope:{moduleMap:d.moduleMap,nodeId:d.nodeId},node:O,workflowMaxSubagents:r.workflowMaxSubagents})(i,t)})(t,x)})}catch(e){if(!isTurnCancellation(e))throw await failChannelDeliveries(e),e;A.releaseLock();let t=serializeContext(l),r=readRetainedBackgroundToolResult(l),i=await contextStorage.run(l,()=>preserveCancelledTurnMessage(r?.backgroundTaskSession??g,x));return{action:`cancelled`,...r===void 0?{}:{backgroundTaskState:createDurableSessionState({session:i}),backgroundTasks:r.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection(s.serializedContext,t),t),t),sessionState:createDurableSessionState({session:i})}}let N=reconcileSessionContinuationToken(l,M.session),P=serializeContext(l);M={...M,session:N};let F=createDurableSessionState({session:M.session}),I=M.backgroundTasks===void 0||M.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:M.backgroundTaskSession}),backgroundTasks:M.backgroundTasks};if(M.next!==null&&typeof M.next==`object`&&`done`in M.next){if(j===`task`&&hasPendingInputBatch(M.session.state))throw A.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await A.close();let e=getTurnUsageState(M.session.state)?.session;return{action:`done`,...I,output:M.next.output,isError:M.next.isError,serializedContext:P,sessionState:F,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(M.session).delta}}if(M.next===null){A.releaseLock();let e=getPendingWorkflowInterrupt(M.session.state);if(e!==void 0&&isWorkflowTaskInterrupt(e.interrupt))return{action:`dispatch-workflow-tasks`,...I,pendingTaskCallIds:getWorkflowTaskCallIds(e.interrupt),serializedContext:P,sessionState:F};let t=derivePendingState(M.session);if(M.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(M.session);return{action:`park`,...I,...t,serializedContext:P,sessionState:createDurableSessionState({session:n}),settled:{output:M.settledTurn.output,isError:M.settledTurn.isError,usage:e}}}return{action:`park`,...I,...t,serializedContext:P,sessionState:F}}return A.releaseLock(),{action:`continue`,...I,serializedContext:P,sessionState:F}}export{turnStep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const HARNESS_EMISSION_STATE_KEY=`eve.harness.emission`,DEFAULT_EMISSION_STATE={sessionStarted:!1,sequence:0,stepIndex:0,turnId:``};function getHarnessEmissionState(
|
|
1
|
+
import{clearTurnClientContextState}from"#harness/turn-client-context.js";const HARNESS_EMISSION_STATE_KEY=`eve.harness.emission`,DEFAULT_EMISSION_STATE={sessionStarted:!1,sequence:0,stepIndex:0,turnId:``};function getHarnessEmissionState(e){return e?.[HARNESS_EMISSION_STATE_KEY]??DEFAULT_EMISSION_STATE}function isHarnessBetweenTurns(e){return getHarnessEmissionState(e.state).turnId===``}function setHarnessEmissionState(t,n){let r=n.turnId===``?clearTurnClientContextState(t):t;return{...r,state:{...r.state,[HARNESS_EMISSION_STATE_KEY]:n}}}export{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{readClientContext}from"#internal/client-context.js";import{createErrorId,createLogger,formatError,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,ParentSessionKey,ScheduleIdKey,SessionCallbackKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageCompletedEvent,createResultCompletedEvent,createSessionWaitingEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{buildDynamicTools,buildResponseAuthorizationTools}from"#context/build-dynamic-tools.js";import{drainMemoryCommit,prepareMemoryCompaction,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,clearMemorySessionState,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{projectParkedAgentHandles,resolveAgentsAnnouncement}from"#subagents/handles/prompt.js";import{renderPendingApprovalsInstruction,renderPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{normalizeModelMessages,normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createCoordinationRequestFromToolCall,resolvePendingCoordination,setPendingCoordinationBatch}from"#harness/coordination.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskInterrupts,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{ASK_QUESTION_TOOL_NAME}from"#harness/request-input-tool.js";import{getSupersededAuthorizationChallenges,setPendingAuthorization}from"#harness/authorization.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{BackgroundToolExecutorKey,createBackgroundToolCallBatch}from"#harness/background-tools.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{buildDynamicInstructionMessages,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{getApprovalAuditState,markApprovalCandidateHistoryEventEmitted,markApprovalCandidatePendingEventEmitted,markApprovalSettlementEventEmitted}from"#harness/approval-candidates.js";import{getPendingInputBatches,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{createCurrentMessages}from"#harness/current-messages.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{requireSessionModelReference}from"#harness/types.js";import{mergeProviderSafetyIdentifier}from"#harness/provider-safety.js";import{emitWorkflowActionResults,emitWorkflowActionsRequested}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionUsageLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools,shouldPrepareApprovalReplayTools}from"#harness/approval-delivery-coordinator.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{resolveDeliveryPolicy}from"#tasks/delivery-policy.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#harness/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
|
|
1
|
+
import{readClientContext}from"#internal/client-context.js";import{createErrorId,createLogger,formatError,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,ParentSessionKey,ScheduleIdKey,SessionCallbackKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageCompletedEvent,createResultCompletedEvent,createSessionWaitingEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{buildDynamicTools,buildResponseAuthorizationTools}from"#context/build-dynamic-tools.js";import{drainMemoryCommit,prepareMemoryCompaction,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,clearMemorySessionState,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{projectParkedAgentHandles,resolveAgentsAnnouncement}from"#subagents/handles/prompt.js";import{renderPendingApprovalsInstruction,renderPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{normalizeModelMessages,normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createCoordinationRequestFromToolCall,resolvePendingCoordination,setPendingCoordinationBatch}from"#harness/coordination.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskInterrupts,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{ASK_QUESTION_TOOL_NAME}from"#harness/request-input-tool.js";import{getSupersededAuthorizationChallenges,setPendingAuthorization}from"#harness/authorization.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{BackgroundToolExecutorKey,createBackgroundToolCallBatch}from"#harness/background-tools.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{buildDynamicInstructionMessages,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{getApprovalAuditState,markApprovalCandidateHistoryEventEmitted,markApprovalCandidatePendingEventEmitted,markApprovalSettlementEventEmitted}from"#harness/approval-candidates.js";import{getPendingInputBatches,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{clearTurnClientContextState,getTurnClientContextState,setTurnClientContextState}from"#harness/turn-client-context.js";import{EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{createCurrentMessages}from"#harness/current-messages.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{requireSessionModelReference}from"#harness/types.js";import{mergeProviderSafetyIdentifier}from"#harness/provider-safety.js";import{emitWorkflowActionResults,emitWorkflowActionsRequested}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionUsageLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools,shouldPrepareApprovalReplayTools}from"#harness/approval-delivery-coordinator.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{resolveDeliveryPolicy}from"#tasks/delivery-policy.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#harness/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
|
|
2
2
|
|
|
3
|
-
`)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(n){let r=n.handleEvent,f=resolveApprovalKeyFromTools(n.tools);async function runStep(e,t){return n.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(t),session:e},e=>executeStepBody(e.session,t,e))??executeStepBody(e,t)}async function executeStepBody(_,v,y){let b=_,S=createHistoryViewPreparer({previous:n.historyView,projector:n.historyProjector});S(b.history,b.state);let projectHistory=(e,t)=>S(e,t).messages,w=getHarnessEmissionState(b.state),T=contextStorage.getStore(),E=T?.get(ParentSessionKey),D=T?.get(SessionCallbackKey),ue=E!==void 0||D!==void 0,de,O=y?.createHandleEvent({getAttemptScope:()=>de,handleEvent:r,turnId:activeTurnId(w)})??r,failModelSelection=async(e,r)=>{if(throwIfTurnAborted(n.abortSignal),y?.recordError(e),!O)throw e;let i=createErrorId(),a=toErrorMessage(e);return log.error(`model selection failed terminally`,{error:e,errorId:i,sessionId:b.sessionId,turnId:r.turnId}),await emitFailedStep(O,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:i},message:a,sessionId:b.sessionId}),{next:n.mode===`task`||ue?{done:!0,isError:!0,output:a}:{done:!0,output:``},session:b}},preparePreambleTrace=async()=>await y?.preparePreamble({sequence:w.sequence,sessionStarted:w.sessionStarted,traceContext:y?.traceContext,turnId:`turn_${w.sequence}`});if(n.clearOnly===!0)return b={...b,compaction:{recentWindowSize:b.compaction.recentWindowSize,threshold:b.compaction.threshold,thresholdPercent:b.compaction.thresholdPercent},history:[],state:clearMemorySessionState(b.state)},await O?.(createContextClearedEvent({sequence:w.sequence,sessionId:b.sessionId,turnId:activeTurnId(w)})),await O?.(createSessionWaitingEvent()),{next:null,session:b};if(n.compactOnly===!0){if(b.history.length>0)try{let e=contextStorage.getStore(),t=await resolveActiveRuntimeModel({config:n,ctx:e,session:b});b=t.session;let r=await maybeCompact({abortSignal:n.abortSignal,auth:e?.get(AuthKey)??null,emit:O,emissionState:{...w,turnId:activeTurnId(w)},force:!0,historyProjector:n.historyProjector,messages:[...b.history],model:t.model,onCompaction:n.onCompaction,resolveModel:n.resolveModel,runtimeIdentity:n.runtimeIdentity,session:b,telemetry:y?.telemetry()});b={...r.session,compaction:{recentWindowSize:r.session.compaction.recentWindowSize,threshold:r.session.compaction.threshold,thresholdPercent:r.session.compaction.thresholdPercent},history:r.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:b.sessionId})}return await O?.(createSessionWaitingEvent()),{next:null,session:b}}let k=consumeDeferredStepInput({input:v,preferCurrentInput:n.mode!==`conversation`&&v!==void 0&&hasPendingApprovalBatch(b),session:b});b=k.session;let A=await resolvePendingCoordination({emit:O,session:b,stepInput:k.input,tools:n.tools});if(A.outcome===`unresolved`)return{next:null,session:A.session};b=A.session;let fe=getPendingInputRequestIds(b.state),j=convertStaleResponsesToUserMessage({history:A.messages,pendingRequestIds:fe,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:fe,stepInput:k.input}),tools:n.tools}),M=j.stepInput,pe=j.kind===`converted`?{...M,message:j.displayMessage}:M,N=contextStorage.getStore();N!==void 0&&n.resolveStepDynamicTools!==void 0&&shouldPrepareApprovalReplayTools({session:b,stepInput:M})&&await n.resolveStepDynamicTools({ctx:N,event:createStepStartedEvent({modelId:b.agent.modelReference?.id??`dynamic`,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId}),messages:projectHistory(A.messages,b.state)});let me=shouldPrepareApprovalPolicyTools({session:b,stepInput:M})?buildResponseAuthorizationTools({authoredTools:n.tools,context:N}):n.tools,P=await coordinateApprovalDelivery({session:b,stepInput:M,tools:me});if(b=P.session,O){for(let e of P.feedback)await O(createMessageCompletedEvent({message:e,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId}));let e=getApprovalAuditState(b.state);for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await O(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:b.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await O(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:b.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await O(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:b.state})}}if(P.kind===`park`)return{next:null,session:b};if(P.kind===`continue-coordination`)return{next:runStep,session:P.stepInput===void 0?b:queueDeferredStepInput(b,P.stepInput)};if(P.challenges.length>0){if(O)for(let e of P.challenges)await O(createAuthorizationRequiredEvent({authorization:e.challenge,candidateId:e.candidateId,description:e.challenge.instructions??`Authorization required for ${e.name}`,name:e.name,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId,webhookUrl:e.hookUrl}));let e=P.stepInput===void 0?b:queueDeferredStepInput(b,P.stepInput);return{next:null,session:{...e,state:setPendingAuthorization(e.state,{challenges:P.challenges})}}}let F=resolvePendingInput({deferMessagesWhileApprovalsPending:n.mode!==`conversation`,history:A.messages,resolveApprovalKey:f,session:b,stepInput:P.stepInput});if(F.outcome===`unresolved`){let e=A.outcome===`resolved`?{...F.session,history:[...A.messages]}:F.session;if(O&&n.mode===`conversation`&&F.deferredMessage===!0&&hasStepInput(v)){T!==void 0&&prepareDynamicInstructionPreamble(T,projectHistory(e.history,e.state));let t=[];try{let e=await preparePreambleTrace();w=await emitTurnPreamble(O,pe??{},w,n.runtimeIdentity,e)}catch(n){if(t=T===void 0?[]:drainDynamicInstructionUserMessages(T),e={...e,history:[...e.history,...t]},b=e,!isDynamicModelSelectionError(n))throw n;return failModelSelection(n,{sessionStarted:!0,sequence:w.sequence,stepIndex:0,turnId:`turn_${w.sequence}`})}return t=T===void 0?[]:drainDynamicInstructionUserMessages(T),e={...e,history:[...e.history,...t]},w=await emitTurnEpilogue(O,w,n.mode),{next:null,session:setHarnessEmissionState(e,w)}}return A.outcome===`resolved`?(O&&n.mode===`conversation`&&(w=await emitTurnEpilogue(O,w,n.mode),e=setHarnessEmissionState(e,w)),{next:null,session:e}):{next:null,session:F.session}}if(F.resolvedInputs!==void 0)for(let e of F.resolvedInputs)await y?.publishInputResolutions({batch:e,sessionId:b.sessionId}),O&&await O(createInputResolvedEvent({resolutions:e.inputs.map(e=>{let t={kind:e.request.kind,outcome:e.outcome,requestId:e.request.requestId};return e.response===void 0?t:{...t,response:e.response}}),sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(O&&F.rejectedActions)for(let e of F.rejectedActions)for(let t of e.results)await O(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));let he=readClientContext(M),I=he===void 0||F.deferredContext===!0?[]:he.map(e=>({content:e,role:`user`})),L=[];if(M?.context!==void 0&&F.deferredContext!==!0)for(let e of M.context)L.push({content:e,role:`user`});let ge=normalizeUserContent(M?.message),_e=ge!==void 0&&!F.deferredMessage&&!F.consumedMessage?await stageAttachmentsToSandbox(ge):void 0;_e!==void 0&&L.push({content:_e,role:`user`});let R=[],z;if(O&&hasStepInput(v)){T!==void 0&&(prepareDynamicInstructionPreamble(T,projectHistory(F.session.history,F.session.state)),prepareMemoryPreamble(T,{history:F.messages,input:[...I,...L],state:F.session.state}));try{let e=await preparePreambleTrace();w=await emitTurnPreamble(O,pe??{},w,n.runtimeIdentity,e)}catch(e){if(R=T===void 0?[]:drainDynamicInstructionUserMessages(T),z=T===void 0?void 0:drainMemoryCommit(T),b={...F.session,history:[...z?.history??F.session.history,...R],state:z?.state??F.session.state},!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:w.sequence,stepIndex:0,turnId:`turn_${w.sequence}`})}R=T===void 0?[]:drainDynamicInstructionUserMessages(T),z=T===void 0?void 0:drainMemoryCommit(T),y?.setTurnId(w.turnId)}let ve=z?.history??F.session.history,ye=F.session.history.length;b=setHarnessEmissionState({...F.session,history:[...ve,...R],state:z?.state??F.session.state},w);let B=[...z?.history??F.messages.slice(0,ye),...R,...z===void 0?F.messages.slice(ye):[]],V=await applySessionLimitContinuation({config:n,emit:O,emissionState:w,limitContinuation:F.limitContinuation,session:b});if(V.result!==null)return V.result;b=V.session;let be=getAgentHandleStore(b.state);if(!hasUnansweredToolCall(B)){let e=await T?.get(BackgroundToolExecutorKey)?.readAgentViews?.(),t=resolveAgentsAnnouncement({agentViews:e===void 0||e.length===0?void 0:[...projectParkedAgentHandles(be??{handles:[]}).map(e=>({availability:`available`,id:e.identity.id,name:e.identity.name,statusLine:e.phase===`parked`?e.lastStatus:void 0})),...e],messages:projectHistory(B,b.state),store:be});t!==void 0&&B.push({content:t,role:`user`})}B=[...B,...L];let createModelMessages=e=>{if(I.length===0)return[...e];let t=Math.max(0,e.length-L.length);return[...e.slice(0,t),...I,...e.slice(t)]},H=projectHistory(createModelMessages(B),b.state),U=T,W;try{U!==void 0&&n.dispatchDynamicModelEvent!==void 0&&await n.dispatchDynamicModelEvent({ctx:U,event:{data:{sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId},type:`step.started`},messages:H}),W=await resolveActiveRuntimeModel({config:n,ctx:U,session:b})}catch(e){return failModelSelection(e,w)}b=W.session;let G=W.model,xe=detectPromptCachePath(G),K=xe.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,Se=buildGatewayAttributionHeaders(G,n.runtimeIdentity),q=await maybeCompact({abortSignal:n.abortSignal,auth:U?.get(AuthKey)??null,emit:O,emissionState:w,historyProjector:n.historyProjector,messages:[...B],model:G,onCompaction:n.onCompaction,promptMessages:createModelMessages(B),resolveModel:n.resolveModel,runtimeIdentity:n.runtimeIdentity,session:b,telemetry:y?.telemetry()});b=q.session,q.compacted&&(B=q.messages),H=normalizeModelMessages(projectHistory(createModelMessages(B),b.state)),O&&await emitStepStarted(O,w,requireSessionModelReference(b).id,H);let Ce=getApprovedTools(b,f),we=w.sequence===0,J=resolveDeliveryPolicy({hasScheduleProvenance:we&&U?.get(ScheduleIdKey)!==void 0,hasOutputSchema:b.outputSchema!==void 0,isChild:U?.get(ParentSessionKey)!==void 0,isFirstTurn:we,taskDeliveryPhase:U?.get(TurnTaskDeliveryKey)}),Y=createCurrentMessages(H,{currentTurnMessages:L});if(U!==void 0){Y.addSystem(buildDynamicInstructionMessages(U));let e=U.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&Y.add(w.sequence,e);let t=U.get(TurnTaskStateKey);t!==void 0&&Y.add(w.sequence,t)}J.instruction!==void 0&&Y.add(w.sequence,J.instruction);let Te=renderPendingApprovalsInstruction(getPendingInputBatches(b.state).flatMap(e=>e.requests));Te!==void 0&&Y.add(w.sequence,Te,{cacheFriendly:!1});let X=await hydrateSandboxAttachments(Y.nonSystemMessages),prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=Y.systemMessages.length>0||t.length>0?[...t,...n,...Y.systemMessages]:void 0,i=r!==void 0&&K?applySystemCacheBreakpoint(r,K):r,a=i===void 0?b.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:y?.resolveRuntimeContext({eveVersion,emissionState:w,environment,modelInput:{instructions:a,messages:X},session:b})}},Ee=n.tools,runSingleModelCall=async e=>{let{instructions:t,telemetryRuntimeContext:r={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(r[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...X,{role:`user`,content:e.trailingUserNote}]:[...X],s=buildHarnessToolsWithDynamicSubagents(n.tools,U),c=createBackgroundToolCallBatch(),l=getAdvertisedTools({session:b,tools:s});Ee=l;let u=await buildToolSetWithProviderTools({approvedTools:Ce,backgroundBatch:c,capabilities:n.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(b),tools:l});if(U!==void 0){let t=getAdvertisedTools({session:b,tools:buildDynamicTools(U)}),r=buildToolSetFromDefinitions({approvedTools:Ce,backgroundBatch:c,capabilities:n.capabilities,disabledProviderTools:e.disabledProviderTools,tools:t});for(let[e,t]of Object.entries(r)){let n=l.get(e);if(n?.runtimeAction!==void 0||n?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);u[e]=t}}b.outputSchema!==void 0&&(u[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let d=n.workflow===!0?{maxSubagents:n.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:u,session:b,tools:l,workflow:d});b=f.session;let p=f.modelTools,m=K?applyLastToolCacheBreakpoint(p,K):p,h=activeTurnId(w),g=y?.prepareAttempt({attemptIndex:e.attemptIndex,runtimeContext:r,stepIndex:w.stepIndex,turnId:h});de=g?.scope;let _=buildStepHooks({auth:U?.get(AuthKey)??null,cachePath:xe,emit:O,emissionState:w,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:K,session:b}),ee=new ToolLoopAgent({headers:Se,instructions:t,model:G,onLanguageModelCallEnd(e){for(let t of e.content)t.type!==`tool-call`||t.providerExecuted===!0||isInvalidToolCall(t)||c.register({callId:t.toolCallId,input:t.input,toolName:t.toolName})},onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:_.onStepFinish,prepareStep:_.prepareStep,reasoning:b.agent.reasoning,runtimeContext:r,stopWhen:isStepCount(1),telemetry:g?.telemetry,toolApproval:buildToolApproval(p),tools:m}),executeModelCall=async()=>{if(O){let e=[...n.tools].filter(([e,t])=>t.runtimeAction!==void 0&&l.get(e)===void 0).map(([e])=>e),t=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await ee.stream({abortSignal:n.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:s,inlineAuthorizationResults:c,trailingInlineToolResultParts:u}=await emitStreamContent(O,w,r.fullStream,{excludedActionToolNames:t,tools:l});throwIfTurnAborted(n.abortSignal);let[d,f]=await Promise.all([_.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&c.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(O,w,d,{emittedActionCallIds:i,excludedActionCallIds:s,excludedActionToolNames:t,handledInlineToolResultCallIds:o,tools:l});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of c)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:s,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await ee.generate({abortSignal:n.abortSignal,messages:a});throwIfTurnAborted(n.abortSignal);let t=await _.stepResult;if(isEmptyModelResponse(t)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:t})};try{let e=await executeModelCall();return await g?.complete(),e}catch(e){return await g?.fail(e),rethrowNoOutputAsEmptyResponse(e)}},De=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:De++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:b.sessionId,turnId:w.turnId},n.abortSignal),Oe=prepareModelCallInput(),ke=await continuePendingWorkflowInterrupt({childResults:M?.runtimeActionResults,config:n,emit:O,emissionState:w,runStep,session:b,tools:buildHarnessToolsWithDynamicSubagents(n.tools,U)});if(ke!==null)return ke;let Ae=await enforceSessionUsageLimit({config:n,emit:O,emissionState:w,messages:H,session:b});if(Ae!==null)return Ae;let Z;try{Z=await runOneModelCall({preparedInput:Oe,suppressStepStartedEmission:!0})}catch(e){throwIfTurnAborted(n.abortSignal);let r=await runModelCallRecoveryPipeline({error:e,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:w.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:J.allowsEmptyDelivery,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:w.turnId})]});if(throwIfTurnAborted(n.abortSignal),r.outcome===`recovered`)Z=r.result;else{let e=r.error;if(y?.recordError(e),!O)throw e;let i=extractWorkflowStreamWriteErrorDetails(e);if(i!==null){let n=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...i,errorId:n,error:e,sessionId:b.sessionId,turnId:w.turnId}),w=await emitRecoverableFailedTurn(O,w,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:b.continuationToken,details:{...i,errorId:n},message:toErrorMessage(e)}),{next:null,session:setHarnessEmissionState(b,w)}}let a=classifyModelCallError(e),o=createErrorId(),s=summarizeKnownError(e),c=s===null?extractUpstreamRejectionMessage(e):null,l=s?.message??c?.message??toErrorMessage(e),u=s?.hint===void 0?l:`${l} ${s.hint}`,d=extractModelCallErrorDetails(e),f=buildModelCallFailureDetails({catalogSummary:s,error:e,errorId:o,modelCallDetails:d,upstreamRejection:c}),m=buildModelCallFailureLogFields({error:e,errorId:o,modelCallDetails:d,recognized:s!==null||c!==null,sessionId:b.sessionId,turnId:w.turnId});if(a===`terminal`)return s===null?log.error(c?.message??`model call failed terminally`,m):log.error(`${s.name}: ${s.message}`,{errorId:o,hint:s.hint,sessionId:b.sessionId,turnId:w.turnId}),await emitFailedStep(O,w,{code:`MODEL_CALL_FAILED`,details:f,message:l,sessionId:b.sessionId}),{next:n.mode===`task`||ue?{done:!0,isError:!0,output:u}:{done:!0,output:``},session:b};if(n.mode===`task`){if(a===`recoverable`&&!(e instanceof EmptyModelResponseError))throw log.warn(c?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,m),e;return log.error(c?.message??`model call failed; failing the task run`,m),await emitFailedStep(O,w,{code:`MODEL_CALL_FAILED`,details:f,message:l,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:u},session:b}}log.error(c?.message??`model call failed — parking session for retry by the user`,m),w=await emitRecoverableFailedTurn(O,w,{code:`MODEL_CALL_FAILED`,continuationToken:b.continuationToken,details:f,message:l});let h={isError:!0,output:u};return b={...b,outputSchema:void 0},{next:null,session:setHarnessEmissionState(b,w),settledTurn:h}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:w.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});b=setTurnUsageState(b,Q);let $;try{$=formatLanguageModelGatewayId(G)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":n.tools.size}),handleStepResult({config:n,emit:O,emissionState:w,durableModelPromptMessageCount:I.length===0?H.length:void 0,promptMessages:B,result:Z,runStep,session:b,coordinationTools:Ee})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:n,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(n,i),...a}:{errorId:i,message:toErrorMessage(n),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}function hasUnansweredToolCall(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r.content))for(let e of r.content)typeof e!=`object`||!e||(e.type===`tool-call`&&t.add(e.toolCallId),e.type===`tool-result`&&n.add(e.toolCallId));for(let e of t)if(!n.has(e))return!0;return!1}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:o}=e,{emissionState:s,session:c}=e,l=resolveAssistantStepText(i.response.messages,i.text),u=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(l),d=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),f=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...d.map(e=>e.toolCallId)]),p=u?[]:appendMissingToolResultMessages({append:d.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),m=u?null:l,h=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&h.add(e.toolCallId);let g=normalizeProviderToolHistory({messages:p,providerExecutedOutcomeIds:h}),v=g.messages,y={...c,compaction:createNextCompactionConfig(c.compaction,e.durableModelPromptMessageCount,i)},te=t.workflow===!0?readWorkflowContinuationSecurity(y):void 0;if(te!==void 0){let t=await getWorkflowSandboxInterrupt(i,te);if(t!==void 0){if(!isWorkflowTaskInterrupt(t))throw Error(`Unsupported Workflow interrupt kind "${t.payload.kind}".`);return await parkOnWorkflowInterrupt({baseSession:y,emit:n,emissionState:s,interrupt:t,promptMessages:r,responseMessages:v,tools:e.coordinationTools,usedCalls:0})}}let x=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:f}),ne=new Set(x.map(e=>e.action.callId)),S=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...f,...ne]),tools:e.coordinationTools}),C=[...x,...S],re=renderPendingApprovalsSnippet(x),ie=v.findIndex(e=>e.role!==`tool`),w=ie===-1?v:v.slice(0,ie),ae=v.slice(w.length),oe=[...r,...w,...re===void 0?[]:[{content:re,role:`user`}]],se=getAdvertisedTools({session:y,tools:e.coordinationTools}),T=(i.toolCalls??[]).filter(e=>!f.has(e.toolCallId)).filter(t=>isDeferredHarnessTool(e.coordinationTools.get(t.toolName))).filter(e=>isDeferredHarnessTool(se.get(e.toolName))?!0:(log.warn(`deferred tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:y.sessionId,toolName:e.toolName}),!1)).map(e=>createCoordinationRequestFromToolCall({toolCall:e,tools:se}));if(T.length>0){let e=T.flatMap(e=>e.kind===`runtime-action`?[e.request]:[]),t=T.flatMap(e=>e.kind===`task`?[e.request]:[]);if(C.length===0)return{next:null,session:setHarnessEmissionState(setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},responseMessages:v,session:{...y,history:[...r]}}),advanceStep(s))};let i=setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},responseMessages:ae,session:{...y,history:oe}});return i=appendPendingInputBatch({event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},requests:C,responseMessages:[],session:i}),n&&await n(createInputRequestedEvent({requests:C,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),{next:null,session:setHarnessEmissionState(i,advanceStep(s))}}if(C.length>0){let e=buildResponseAuthorizationTools({authoredTools:t.tools,context:contextStorage.getStore()}),r=appendPendingInputBatch({event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},requests:C,responseAuthRequiredRequestIds:x.filter(t=>{let n=e.get(t.action.toolName)?.approval;return n!==void 0&&typeof n!=`function`&&n.response!==void 0}).map(e=>e.requestId),responseMessages:ae,session:{...y,history:oe}});return n&&(await n(createInputRequestedEvent({requests:C,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),t.mode===`conversation`&&(s=await emitTurnEpilogue(n,s,t.mode),r=setHarnessEmissionState(r,s))),{next:hasDeferredStepInput(r)?o:null,session:r}}let ce=resolveInlineAuthorizationInterrupt({messages:[...r,...v],toolResults:i.toolResults});if(ce){let{challenges:e,history:r}=ce;if(n){for(let t of getSupersededAuthorizationChallenges(y.state,e))await n(createAuthorizationCompletedEvent({attemptId:t.attemptId,authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({attemptId:t.attemptId,authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));t.mode===`conversation`&&(s=await emitTurnEpilogue(n,s,t.mode))}return{next:null,session:setHarnessEmissionState({...y,history:r,state:setPendingAuthorization(y.state,{challenges:e})},s)}}let E=v,le=[...r,...E],D={...y,history:le};return!(D.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(E.at(-1)?.role===`tool`||g.outcomeEndsResponse||hasDeferredStepInput(D))?(n&&(s=advanceStep(s),D=setHarnessEmissionState(D,s)),{next:o,session:D}):t.mode===`task`?finishTaskTurn({emissionState:s,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:m}):finishConversationTurn({emissionState:s,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:m})}function isDeferredHarnessTool(e){return e?.runtimeAction!==void 0||e?.workflowId!==void 0&&e.execution!==`background`}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(s={...s,outputSchema:void 0},t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){s={...s,outputSchema:void 0},t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowTaskInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let r=e.childResults??[],a=getWorkflowTaskInterrupts(n);e.emit!==void 0&&r.length>0&&await emitWorkflowActionResults({emit:e.emit,emissionState:e.emissionState,interrupts:a,results:r});let o=getWorkflowContinuationSecurity(e.session),s;try{let t=buildWorkflowHostTools({tools:e.tools}),i=n,a=0;for(;;){s=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:o,interrupt:i,resolution:r[a]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(s,o);if(n.status!==`interrupted`||!isWorkflowTaskInterrupt(n.interrupt)||a+1>=r.length)break;let c=getWorkflowTaskInterrupts(n.interrupt)[0];if(c===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);a++,i=c}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),s={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let c=await unwrapWorkflowSandboxResult(s,o),l=c.status===`interrupted`?c.interrupt:c.output,u=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,l),d=clearPendingWorkflowInterrupt({...e.session,history:u});if(c.status===`interrupted`){if(!isWorkflowTaskInterrupt(c.interrupt))throw Error(`Unsupported Workflow interrupt kind "${c.interrupt.payload.kind}".`);let n=e.session.history.length,r=u.slice(0,n),i=u.slice(n);return d={...d,history:r},await parkOnWorkflowInterrupt({baseSession:d,emit:e.emit,emissionState:e.emissionState,interrupt:c.interrupt,promptMessages:r,responseMessages:i,tools:e.tools,usedCalls:t.usedCalls})}return{next:e.runStep,session:d}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}async function parkOnWorkflowInterrupt(e){let t=getWorkflowTaskInterrupts(e.interrupt),n=t[0];if(n===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);e.emit!==void 0&&await emitWorkflowActionsRequested({emit:e.emit,emissionState:e.emissionState,interrupts:t,tools:e.tools});let r={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:n,responseMessages:e.responseMessages,session:r,usedCalls:e.usedCalls}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session,o=e.promptMessages??r,s=e.historyProjector?.({messages:o,state:i.state})??o,c=e.force===!0||shouldCompact(s,i.compaction),l=shouldCanonicalizeMemory(r);if(!c&&!l)return{compacted:!1,messages:r,session:i};let u=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel}),d=mergeProviderSafetyIdentifier(i.agent.compactionModelReference??requireSessionModelReference(i),u.providerOptions,e.auth);if(t){let e=contextStorage.getStore();e!==void 0&&prepareMemoryCompaction(e,{history:r,state:i.state}),await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(u.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(s,i.compaction)}),s)}let f=canonicalizeMemoryRecords(r),p=e.historyProjector?.({messages:f.ordinary,state:i.state})??f.ordinary,m=c?await compactMessages([...p],u.model,i.compaction,d,e.telemetry,buildGatewayAttributionHeaders(u.model,e.runtimeIdentity),e.abortSignal,e.force===!0):[...p];if(r=[...f.memory,...m],e.onCompaction)for(let t of e.onCompaction())r.push(t);if(t){let o=contextStorage.getStore();if(o!==void 0&&prepareMemoryCompaction(o,{history:r,state:i.state}),await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(u.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),o!==void 0){let e=drainMemoryCommit(o);e!==void 0&&(r=[...e.history],i={...i,state:e.state})}}return{compacted:!0,messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}export{appendMissingToolResultMessages,createToolLoopHarness};
|
|
3
|
+
`)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(n){let r=n.handleEvent,f=resolveApprovalKeyFromTools(n.tools);async function runStep(e,t){return n.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(t),session:e},e=>executeStepBody(e.session,t,e))??executeStepBody(e,t)}async function executeStepBody(_,v,y){let b=_,S=createHistoryViewPreparer({previous:n.historyView,projector:n.historyProjector});S(b.history,b.state);let projectHistory=(e,t)=>S(e,t).messages,w=getHarnessEmissionState(b.state),T=contextStorage.getStore(),E=T?.get(ParentSessionKey),D=T?.get(SessionCallbackKey),ue=E!==void 0||D!==void 0,de,O=y?.createHandleEvent({getAttemptScope:()=>de,handleEvent:r,turnId:activeTurnId(w)})??r,failModelSelection=async(e,r)=>{if(throwIfTurnAborted(n.abortSignal),y?.recordError(e),!O)throw e;let i=createErrorId(),a=toErrorMessage(e);return log.error(`model selection failed terminally`,{error:e,errorId:i,sessionId:b.sessionId,turnId:r.turnId}),await emitFailedStep(O,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:i},message:a,sessionId:b.sessionId}),{next:n.mode===`task`||ue?{done:!0,isError:!0,output:a}:{done:!0,output:``},session:b}},preparePreambleTrace=async()=>await y?.preparePreamble({sequence:w.sequence,sessionStarted:w.sessionStarted,traceContext:y?.traceContext,turnId:`turn_${w.sequence}`});if(n.clearOnly===!0)return b={...b,compaction:{recentWindowSize:b.compaction.recentWindowSize,threshold:b.compaction.threshold,thresholdPercent:b.compaction.thresholdPercent},history:[],state:clearMemorySessionState(b.state)},await O?.(createContextClearedEvent({sequence:w.sequence,sessionId:b.sessionId,turnId:activeTurnId(w)})),await O?.(createSessionWaitingEvent()),{next:null,session:b};if(n.compactOnly===!0){if(b.history.length>0)try{let e=contextStorage.getStore(),t=await resolveActiveRuntimeModel({config:n,ctx:e,session:b});b=t.session;let r=await maybeCompact({abortSignal:n.abortSignal,auth:e?.get(AuthKey)??null,emit:O,emissionState:{...w,turnId:activeTurnId(w)},force:!0,historyProjector:n.historyProjector,messages:[...b.history],model:t.model,onCompaction:n.onCompaction,resolveModel:n.resolveModel,runtimeIdentity:n.runtimeIdentity,session:b,telemetry:y?.telemetry()});b={...r.session,compaction:{recentWindowSize:r.session.compaction.recentWindowSize,threshold:r.session.compaction.threshold,thresholdPercent:r.session.compaction.thresholdPercent},history:r.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:b.sessionId})}return await O?.(createSessionWaitingEvent()),{next:null,session:b}}let k=consumeDeferredStepInput({input:v,preferCurrentInput:n.mode!==`conversation`&&v!==void 0&&hasPendingApprovalBatch(b),session:b});b=k.session;let A=await resolvePendingCoordination({emit:O,session:b,stepInput:k.input,tools:n.tools});if(A.outcome===`unresolved`)return{next:null,session:A.session};b=A.session;let fe=getPendingInputRequestIds(b.state),j=convertStaleResponsesToUserMessage({history:A.messages,pendingRequestIds:fe,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:fe,stepInput:k.input}),tools:n.tools}),M=j.stepInput,pe=j.kind===`converted`?{...M,message:j.displayMessage}:M,N=contextStorage.getStore();N!==void 0&&n.resolveStepDynamicTools!==void 0&&shouldPrepareApprovalReplayTools({session:b,stepInput:M})&&await n.resolveStepDynamicTools({ctx:N,event:createStepStartedEvent({modelId:b.agent.modelReference?.id??`dynamic`,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId}),messages:projectHistory(A.messages,b.state)});let me=shouldPrepareApprovalPolicyTools({session:b,stepInput:M})?buildResponseAuthorizationTools({authoredTools:n.tools,context:N}):n.tools,P=await coordinateApprovalDelivery({session:b,stepInput:M,tools:me});if(b=P.session,O){for(let e of P.feedback)await O(createMessageCompletedEvent({message:e,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId}));let e=getApprovalAuditState(b.state);for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await O(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:b.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await O(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:b.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await O(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId})),b={...b,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:b.state})}}if(P.kind===`park`)return{next:null,session:b};if(P.kind===`continue-coordination`)return{next:runStep,session:P.stepInput===void 0?b:queueDeferredStepInput(b,P.stepInput)};if(P.challenges.length>0){if(O)for(let e of P.challenges)await O(createAuthorizationRequiredEvent({authorization:e.challenge,candidateId:e.candidateId,description:e.challenge.instructions??`Authorization required for ${e.name}`,name:e.name,sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId,webhookUrl:e.hookUrl}));let e=P.stepInput===void 0?b:queueDeferredStepInput(b,P.stepInput);return{next:null,session:{...e,state:setPendingAuthorization(e.state,{challenges:P.challenges})}}}let F=resolvePendingInput({deferMessagesWhileApprovalsPending:n.mode!==`conversation`,history:A.messages,resolveApprovalKey:f,session:b,stepInput:P.stepInput});if(F.outcome===`unresolved`){let e=A.outcome===`resolved`?{...F.session,history:[...A.messages]}:F.session;if(O&&n.mode===`conversation`&&F.deferredMessage===!0&&hasStepInput(v)){T!==void 0&&prepareDynamicInstructionPreamble(T,projectHistory(e.history,e.state));let t=[];try{let e=await preparePreambleTrace();w=await emitTurnPreamble(O,pe??{},w,n.runtimeIdentity,e)}catch(n){if(t=T===void 0?[]:drainDynamicInstructionUserMessages(T),e={...e,history:[...e.history,...t]},b=e,!isDynamicModelSelectionError(n))throw n;return failModelSelection(n,{sessionStarted:!0,sequence:w.sequence,stepIndex:0,turnId:`turn_${w.sequence}`})}return t=T===void 0?[]:drainDynamicInstructionUserMessages(T),e={...e,history:[...e.history,...t]},w=await emitTurnEpilogue(O,w,n.mode),{next:null,session:setHarnessEmissionState(e,w)}}return A.outcome===`resolved`?(O&&n.mode===`conversation`&&(w=await emitTurnEpilogue(O,w,n.mode),e=setHarnessEmissionState(e,w)),{next:null,session:e}):{next:null,session:F.session}}if(F.resolvedInputs!==void 0)for(let e of F.resolvedInputs)await y?.publishInputResolutions({batch:e,sessionId:b.sessionId}),O&&await O(createInputResolvedEvent({resolutions:e.inputs.map(e=>{let t={kind:e.request.kind,outcome:e.outcome,requestId:e.request.requestId};return e.response===void 0?t:{...t,response:e.response}}),sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(O&&F.rejectedActions)for(let e of F.rejectedActions)for(let t of e.results)await O(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));let he=activeTurnId(w),ge=getTurnClientContextState(F.session.state,he),I=F.deferredContext===!0?void 0:readClientContext(M),_e=(I??ge?.messages)?.map(e=>({content:e,role:`user`}))??[],L=[];if(M?.context!==void 0&&F.deferredContext!==!0)for(let e of M.context)L.push({content:e,role:`user`});let ve=normalizeUserContent(M?.message),ye=ve!==void 0&&!F.deferredMessage&&!F.consumedMessage?await stageAttachmentsToSandbox(ve):void 0;ye!==void 0&&L.push({content:ye,role:`user`});let R=[],z;if(O&&hasStepInput(v)){T!==void 0&&(prepareDynamicInstructionPreamble(T,projectHistory(F.session.history,F.session.state)),prepareMemoryPreamble(T,{history:F.messages,input:[..._e,...L],state:F.session.state}));try{let e=await preparePreambleTrace();w=await emitTurnPreamble(O,pe??{},w,n.runtimeIdentity,e)}catch(e){if(R=T===void 0?[]:drainDynamicInstructionUserMessages(T),z=T===void 0?void 0:drainMemoryCommit(T),b={...F.session,history:[...z?.history??F.session.history,...R],state:z?.state??F.session.state},!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:w.sequence,stepIndex:0,turnId:`turn_${w.sequence}`})}R=T===void 0?[]:drainDynamicInstructionUserMessages(T),z=T===void 0?void 0:drainMemoryCommit(T),y?.setTurnId(w.turnId)}let be=z?.history??F.session.history,xe=F.session.history.length;b=setHarnessEmissionState({...F.session,history:[...be,...R],state:z?.state??F.session.state},w);let B=[...z?.history??F.messages.slice(0,xe),...R,...z===void 0?F.messages.slice(xe):[]],V=await applySessionLimitContinuation({config:n,emit:O,emissionState:w,limitContinuation:F.limitContinuation,session:b});if(V.result!==null)return V.result;b=V.session;let Se=getAgentHandleStore(b.state);if(!hasUnansweredToolCall(B)){let e=await T?.get(BackgroundToolExecutorKey)?.readAgentViews?.(),t=resolveAgentsAnnouncement({agentViews:e===void 0||e.length===0?void 0:[...projectParkedAgentHandles(Se??{handles:[]}).map(e=>({availability:`available`,id:e.identity.id,name:e.identity.name,statusLine:e.phase===`parked`?e.lastStatus:void 0})),...e],messages:projectHistory(B,b.state),store:Se});t!==void 0&&B.push({content:t,role:`user`})}let H=ge;I!==void 0&&(H={insertionIndex:ge?.insertionIndex??B.length,messages:[...I],turnId:he}),H!==void 0&&(b=setTurnClientContextState(b,H)),B=[...B,...L];let createModelMessages=e=>{if(H===void 0||H.messages.length===0)return[...e];let t=Math.min(Math.max(0,H.insertionIndex),e.length);return[...e.slice(0,t),...H.messages.map(e=>({content:e,role:`user`})),...e.slice(t)]},U=projectHistory(createModelMessages(B),b.state),W=T,G;try{W!==void 0&&n.dispatchDynamicModelEvent!==void 0&&await n.dispatchDynamicModelEvent({ctx:W,event:{data:{sequence:w.sequence,stepIndex:w.stepIndex,turnId:w.turnId},type:`step.started`},messages:U}),G=await resolveActiveRuntimeModel({config:n,ctx:W,session:b})}catch(e){return failModelSelection(e,w)}b=G.session;let K=G.model,Ce=detectPromptCachePath(K),q=Ce.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,we=buildGatewayAttributionHeaders(K,n.runtimeIdentity),Te=H===void 0?void 0:Math.max(0,B.length-H.insertionIndex),J=await maybeCompact({abortSignal:n.abortSignal,auth:W?.get(AuthKey)??null,emit:O,emissionState:w,historyProjector:n.historyProjector,messages:[...B],model:K,onCompaction:n.onCompaction,promptMessages:createModelMessages(B),resolveModel:n.resolveModel,runtimeIdentity:n.runtimeIdentity,session:b,telemetry:y?.telemetry()});b=J.session,J.compacted&&(B=J.messages,H!==void 0&&Te!==void 0&&(H={...H,insertionIndex:Math.max(0,B.length-Te)},b=setTurnClientContextState(b,H))),U=normalizeModelMessages(projectHistory(createModelMessages(B),b.state)),O&&await emitStepStarted(O,w,requireSessionModelReference(b).id,U);let Ee=getApprovedTools(b,f),De=w.sequence===0,Y=resolveDeliveryPolicy({hasScheduleProvenance:De&&W?.get(ScheduleIdKey)!==void 0,hasOutputSchema:b.outputSchema!==void 0,isChild:W?.get(ParentSessionKey)!==void 0,isFirstTurn:De,taskDeliveryPhase:W?.get(TurnTaskDeliveryKey)}),X=createCurrentMessages(U,{currentTurnMessages:L});if(W!==void 0){X.addSystem(buildDynamicInstructionMessages(W));let e=W.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&X.add(w.sequence,e);let t=W.get(TurnTaskStateKey);t!==void 0&&X.add(w.sequence,t)}Y.instruction!==void 0&&X.add(w.sequence,Y.instruction);let Oe=renderPendingApprovalsInstruction(getPendingInputBatches(b.state).flatMap(e=>e.requests));Oe!==void 0&&X.add(w.sequence,Oe,{cacheFriendly:!1});let Z=await hydrateSandboxAttachments(X.nonSystemMessages),prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=b.agent.system?[{role:`system`,content:b.agent.system}]:[],r=X.systemMessages.length>0||t.length>0?[...t,...n,...X.systemMessages]:void 0,i=r!==void 0&&q?applySystemCacheBreakpoint(r,q):r,a=i===void 0?b.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:y?.resolveRuntimeContext({eveVersion,emissionState:w,environment,modelInput:{instructions:a,messages:Z},session:b})}},ke=n.tools,runSingleModelCall=async e=>{let{instructions:t,telemetryRuntimeContext:r={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(r[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...Z,{role:`user`,content:e.trailingUserNote}]:[...Z],s=buildHarnessToolsWithDynamicSubagents(n.tools,W),c=createBackgroundToolCallBatch(),l=getAdvertisedTools({session:b,tools:s});ke=l;let u=await buildToolSetWithProviderTools({approvedTools:Ee,backgroundBatch:c,capabilities:n.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(b),tools:l});if(W!==void 0){let t=getAdvertisedTools({session:b,tools:buildDynamicTools(W)}),r=buildToolSetFromDefinitions({approvedTools:Ee,backgroundBatch:c,capabilities:n.capabilities,disabledProviderTools:e.disabledProviderTools,tools:t});for(let[e,t]of Object.entries(r)){let n=l.get(e);if(n?.runtimeAction!==void 0||n?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);u[e]=t}}b.outputSchema!==void 0&&(u[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(b.outputSchema));let d=n.workflow===!0?{maxSubagents:n.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:u,session:b,tools:l,workflow:d});b=f.session;let p=f.modelTools,m=q?applyLastToolCacheBreakpoint(p,q):p,h=activeTurnId(w),g=y?.prepareAttempt({attemptIndex:e.attemptIndex,runtimeContext:r,stepIndex:w.stepIndex,turnId:h});de=g?.scope;let _=buildStepHooks({auth:W?.get(AuthKey)??null,cachePath:Ce,emit:O,emissionState:w,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:q,session:b}),ee=new ToolLoopAgent({headers:we,instructions:t,model:K,onLanguageModelCallEnd(e){for(let t of e.content)t.type!==`tool-call`||t.providerExecuted===!0||isInvalidToolCall(t)||c.register({callId:t.toolCallId,input:t.input,toolName:t.toolName})},onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:_.onStepFinish,prepareStep:_.prepareStep,reasoning:b.agent.reasoning,runtimeContext:r,stopWhen:isStepCount(1),telemetry:g?.telemetry,toolApproval:buildToolApproval(p),tools:m}),executeModelCall=async()=>{if(O){let e=[...n.tools].filter(([e,t])=>t.runtimeAction!==void 0&&l.get(e)===void 0).map(([e])=>e),t=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await ee.stream({abortSignal:n.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:s,inlineAuthorizationResults:c,trailingInlineToolResultParts:u}=await emitStreamContent(O,w,r.fullStream,{excludedActionToolNames:t,tools:l});throwIfTurnAborted(n.abortSignal);let[d,f]=await Promise.all([_.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&c.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(O,w,d,{emittedActionCallIds:i,excludedActionCallIds:s,excludedActionToolNames:t,handledInlineToolResultCallIds:o,tools:l});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of c)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:s,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await ee.generate({abortSignal:n.abortSignal,messages:a});throwIfTurnAborted(n.abortSignal);let t=await _.stepResult;if(isEmptyModelResponse(t)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:t})};try{let e=await executeModelCall();return await g?.complete(),e}catch(e){return await g?.fail(e),rethrowNoOutputAsEmptyResponse(e)}},Ae=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:Ae++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:b.sessionId,turnId:w.turnId},n.abortSignal),je=prepareModelCallInput(),Me=await continuePendingWorkflowInterrupt({childResults:M?.runtimeActionResults,config:n,emit:O,emissionState:w,runStep,session:b,tools:buildHarnessToolsWithDynamicSubagents(n.tools,W)});if(Me!==null)return Me;let Ne=await enforceSessionUsageLimit({config:n,emit:O,emissionState:w,messages:U,session:b});if(Ne!==null)return Ne;let Q;try{Q=await runOneModelCall({preparedInput:je,suppressStepStartedEmission:!0})}catch(e){throwIfTurnAborted(n.abortSignal);let r=await runModelCallRecoveryPipeline({error:e,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:b.sessionId,turnId:w.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:Y.allowsEmptyDelivery,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:b.sessionId,turnId:w.turnId})]});if(throwIfTurnAborted(n.abortSignal),r.outcome===`recovered`)Q=r.result;else{let e=r.error;if(y?.recordError(e),!O)throw e;let i=extractWorkflowStreamWriteErrorDetails(e);if(i!==null){let n=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...i,errorId:n,error:e,sessionId:b.sessionId,turnId:w.turnId}),w=await emitRecoverableFailedTurn(O,w,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:b.continuationToken,details:{...i,errorId:n},message:toErrorMessage(e)}),{next:null,session:setHarnessEmissionState(b,w)}}let a=classifyModelCallError(e),o=createErrorId(),s=summarizeKnownError(e),c=s===null?extractUpstreamRejectionMessage(e):null,l=s?.message??c?.message??toErrorMessage(e),u=s?.hint===void 0?l:`${l} ${s.hint}`,d=extractModelCallErrorDetails(e),f=buildModelCallFailureDetails({catalogSummary:s,error:e,errorId:o,modelCallDetails:d,upstreamRejection:c}),m=buildModelCallFailureLogFields({error:e,errorId:o,modelCallDetails:d,recognized:s!==null||c!==null,sessionId:b.sessionId,turnId:w.turnId});if(a===`terminal`)return s===null?log.error(c?.message??`model call failed terminally`,m):log.error(`${s.name}: ${s.message}`,{errorId:o,hint:s.hint,sessionId:b.sessionId,turnId:w.turnId}),await emitFailedStep(O,w,{code:`MODEL_CALL_FAILED`,details:f,message:l,sessionId:b.sessionId}),{next:n.mode===`task`||ue?{done:!0,isError:!0,output:u}:{done:!0,output:``},session:b};if(n.mode===`task`){if(a===`recoverable`&&!(e instanceof EmptyModelResponseError))throw log.warn(c?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,m),e;return log.error(c?.message??`model call failed; failing the task run`,m),await emitFailedStep(O,w,{code:`MODEL_CALL_FAILED`,details:f,message:l,sessionId:b.sessionId}),{next:{done:!0,isError:!0,output:u},session:b}}log.error(c?.message??`model call failed — parking session for retry by the user`,m),w=await emitRecoverableFailedTurn(O,w,{code:`MODEL_CALL_FAILED`,continuationToken:b.continuationToken,details:f,message:l});let h={isError:!0,output:u};return b={...b,outputSchema:void 0},{next:null,session:setHarnessEmissionState(b,w),settledTurn:h}}}let $=accumulateTurnUsage({previous:getTurnUsageState(b.state),turnId:w.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Q.providerMetadata),usage:Q.usage})});b=setTurnUsageState(b,$);let Pe;try{Pe=formatLanguageModelGatewayId(K)}catch{Pe=void 0}return await setEveAttributes({"$eve.model":Pe,"$eve.input_tokens":$.inputTokens,"$eve.output_tokens":$.outputTokens,"$eve.cache_read_tokens":$.cacheReadTokens,"$eve.cache_write_tokens":$.cacheWriteTokens,"$eve.cost_usd":$.sawCost?$.costUsd:void 0,"$eve.tool_count":n.tools.size}),handleStepResult({config:n,emit:O,emissionState:w,durableModelPromptMessageCount:H===void 0||H.messages.length===0?U.length:void 0,promptMessages:B,result:Q,runStep,session:b,coordinationTools:ke})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:n,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(n,i),...a}:{errorId:i,message:toErrorMessage(n),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}function hasUnansweredToolCall(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r.content))for(let e of r.content)typeof e!=`object`||!e||(e.type===`tool-call`&&t.add(e.toolCallId),e.type===`tool-result`&&n.add(e.toolCallId));for(let e of t)if(!n.has(e))return!0;return!1}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:o}=e,{emissionState:s,session:c}=e,l=resolveAssistantStepText(i.response.messages,i.text),u=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(l),d=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),f=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...d.map(e=>e.toolCallId)]),p=u?[]:appendMissingToolResultMessages({append:d.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),m=u?null:l,h=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&h.add(e.toolCallId);let g=normalizeProviderToolHistory({messages:p,providerExecutedOutcomeIds:h}),v=g.messages,y={...c,compaction:createNextCompactionConfig(c.compaction,e.durableModelPromptMessageCount,i)},te=t.workflow===!0?readWorkflowContinuationSecurity(y):void 0;if(te!==void 0){let t=await getWorkflowSandboxInterrupt(i,te);if(t!==void 0){if(!isWorkflowTaskInterrupt(t))throw Error(`Unsupported Workflow interrupt kind "${t.payload.kind}".`);return await parkOnWorkflowInterrupt({baseSession:y,emit:n,emissionState:s,interrupt:t,promptMessages:r,responseMessages:v,tools:e.coordinationTools,usedCalls:0})}}let x=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:f}),ne=new Set(x.map(e=>e.action.callId)),S=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...f,...ne]),tools:e.coordinationTools}),C=[...x,...S],re=renderPendingApprovalsSnippet(x),ie=v.findIndex(e=>e.role!==`tool`),w=ie===-1?v:v.slice(0,ie),ae=v.slice(w.length),oe=[...r,...w,...re===void 0?[]:[{content:re,role:`user`}]],se=getAdvertisedTools({session:y,tools:e.coordinationTools}),T=(i.toolCalls??[]).filter(e=>!f.has(e.toolCallId)).filter(t=>isDeferredHarnessTool(e.coordinationTools.get(t.toolName))).filter(e=>isDeferredHarnessTool(se.get(e.toolName))?!0:(log.warn(`deferred tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:y.sessionId,toolName:e.toolName}),!1)).map(e=>createCoordinationRequestFromToolCall({toolCall:e,tools:se}));if(T.length>0){let e=T.flatMap(e=>e.kind===`runtime-action`?[e.request]:[]),t=T.flatMap(e=>e.kind===`task`?[e.request]:[]);if(C.length===0)return{next:null,session:setHarnessEmissionState(setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},responseMessages:v,session:{...y,history:[...r]}}),advanceStep(s))};let i=setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},responseMessages:ae,session:{...y,history:oe}});return i=appendPendingInputBatch({event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},requests:C,responseMessages:[],session:i}),n&&await n(createInputRequestedEvent({requests:C,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),{next:null,session:setHarnessEmissionState(i,advanceStep(s))}}if(C.length>0){let e=buildResponseAuthorizationTools({authoredTools:t.tools,context:contextStorage.getStore()}),r=appendPendingInputBatch({event:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},requests:C,responseAuthRequiredRequestIds:x.filter(t=>{let n=e.get(t.action.toolName)?.approval;return n!==void 0&&typeof n!=`function`&&n.response!==void 0}).map(e=>e.requestId),responseMessages:ae,session:{...y,history:oe}});return n&&(await n(createInputRequestedEvent({requests:C,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),t.mode===`conversation`&&(s=await emitTurnEpilogue(n,s,t.mode),r=setHarnessEmissionState(r,s))),{next:hasDeferredStepInput(r)?o:null,session:r}}let ce=resolveInlineAuthorizationInterrupt({messages:[...r,...v],toolResults:i.toolResults});if(ce){let{challenges:e,history:r}=ce;if(n){for(let t of getSupersededAuthorizationChallenges(y.state,e))await n(createAuthorizationCompletedEvent({attemptId:t.attemptId,authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({attemptId:t.attemptId,authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));t.mode===`conversation`&&(s=await emitTurnEpilogue(n,s,t.mode))}return{next:null,session:setHarnessEmissionState({...y,history:r,state:setPendingAuthorization(y.state,{challenges:e})},s)}}let E=v,le=[...r,...E],D={...y,history:le};return!(D.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(E.at(-1)?.role===`tool`||g.outcomeEndsResponse||hasDeferredStepInput(D))?(n&&(s=advanceStep(s),D=setHarnessEmissionState(D,s)),{next:o,session:D}):t.mode===`task`?finishTaskTurn({emissionState:s,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:m}):finishConversationTurn({emissionState:s,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:m})}function isDeferredHarnessTool(e){return e?.runtimeAction!==void 0||e?.workflowId!==void 0&&e.execution!==`background`}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(s={...s,outputSchema:void 0},t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){s={...s,outputSchema:void 0},t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowTaskInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let r=e.childResults??[],a=getWorkflowTaskInterrupts(n);e.emit!==void 0&&r.length>0&&await emitWorkflowActionResults({emit:e.emit,emissionState:e.emissionState,interrupts:a,results:r});let o=getWorkflowContinuationSecurity(e.session),s;try{let t=buildWorkflowHostTools({tools:e.tools}),i=n,a=0;for(;;){s=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:o,interrupt:i,resolution:r[a]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(s,o);if(n.status!==`interrupted`||!isWorkflowTaskInterrupt(n.interrupt)||a+1>=r.length)break;let c=getWorkflowTaskInterrupts(n.interrupt)[0];if(c===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);a++,i=c}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),s={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let c=await unwrapWorkflowSandboxResult(s,o),l=c.status===`interrupted`?c.interrupt:c.output,u=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,l),d=clearPendingWorkflowInterrupt({...e.session,history:u});if(c.status===`interrupted`){if(!isWorkflowTaskInterrupt(c.interrupt))throw Error(`Unsupported Workflow interrupt kind "${c.interrupt.payload.kind}".`);let n=e.session.history.length,r=u.slice(0,n),i=u.slice(n);return d={...d,history:r},await parkOnWorkflowInterrupt({baseSession:d,emit:e.emit,emissionState:e.emissionState,interrupt:c.interrupt,promptMessages:r,responseMessages:i,tools:e.tools,usedCalls:t.usedCalls})}return{next:e.runStep,session:d}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}async function parkOnWorkflowInterrupt(e){let t=getWorkflowTaskInterrupts(e.interrupt),n=t[0];if(n===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);e.emit!==void 0&&await emitWorkflowActionsRequested({emit:e.emit,emissionState:e.emissionState,interrupts:t,tools:e.tools});let r={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:n,responseMessages:e.responseMessages,session:r,usedCalls:e.usedCalls}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session,o=e.promptMessages??r,s=e.historyProjector?.({messages:o,state:i.state})??o,c=e.force===!0||shouldCompact(s,i.compaction),l=shouldCanonicalizeMemory(r);if(!c&&!l)return{compacted:!1,messages:r,session:i};let u=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel}),d=mergeProviderSafetyIdentifier(i.agent.compactionModelReference??requireSessionModelReference(i),u.providerOptions,e.auth);if(t){let e=contextStorage.getStore();e!==void 0&&prepareMemoryCompaction(e,{history:r,state:i.state}),await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(u.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(s,i.compaction)}),s)}let f=canonicalizeMemoryRecords(r),p=e.historyProjector?.({messages:f.ordinary,state:i.state})??f.ordinary,m=c?await compactMessages([...p],u.model,i.compaction,d,e.telemetry,buildGatewayAttributionHeaders(u.model,e.runtimeIdentity),e.abortSignal,e.force===!0):[...p];if(r=[...f.memory,...m],e.onCompaction)for(let t of e.onCompaction())r.push(t);if(t){let o=contextStorage.getStore();if(o!==void 0&&prepareMemoryCompaction(o,{history:r,state:i.state}),await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(u.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),o!==void 0){let e=drainMemoryCommit(o);e!==void 0&&(r=[...e.history],i={...i,state:e.state})}}return{compacted:!0,messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}export{appendMissingToolResultMessages,createToolLoopHarness};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HarnessSession, SessionStateMap } from "#harness/types.js";
|
|
2
|
+
export interface TurnClientContextState {
|
|
3
|
+
readonly insertionIndex: number;
|
|
4
|
+
readonly messages: readonly string[];
|
|
5
|
+
readonly turnId: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getTurnClientContextState(state: SessionStateMap | undefined, turnId: string): TurnClientContextState | undefined;
|
|
8
|
+
export declare function setTurnClientContextState(session: HarnessSession, clientContext: TurnClientContextState): HarnessSession;
|
|
9
|
+
export declare function clearTurnClientContextState(session: HarnessSession): HarnessSession;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const TURN_CLIENT_CONTEXT_STATE_KEY=`eve.harness.turnClientContext`;function getTurnClientContextState(e,t){let n=e?.[TURN_CLIENT_CONTEXT_STATE_KEY];return n?.turnId===t?n:void 0}function setTurnClientContextState(e,t){return{...e,state:{...e.state,[TURN_CLIENT_CONTEXT_STATE_KEY]:t}}}function clearTurnClientContextState(e){if(e.state?.[TURN_CLIENT_CONTEXT_STATE_KEY]===void 0)return e;let{[TURN_CLIENT_CONTEXT_STATE_KEY]:t,...n}=e.state;return{...e,state:n}}export{clearTurnClientContextState,getTurnClientContextState,setTurnClientContextState};
|