eve 0.33.0 → 0.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/src/execution/dispatch-runtime-actions-step.d.ts +3 -9
- package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
- package/dist/src/execution/durable-session-store.d.ts +5 -0
- package/dist/src/execution/durable-session-store.js +1 -1
- package/dist/src/execution/parked-delivery-wait.d.ts +8 -0
- package/dist/src/execution/parked-delivery-wait.js +1 -1
- package/dist/src/execution/route-child-delivery.js +1 -1
- package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
- package/dist/src/execution/subagent-hitl-proxy.d.ts +1 -0
- package/dist/src/execution/subagent-hitl-proxy.js +1 -1
- package/dist/src/execution/turn-workflow.js +1 -1
- package/dist/src/execution/workflow-entry.js +1 -1
- package/dist/src/execution/workflow-steps.d.ts +4 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/hitl/approval-input-requests.d.ts +13 -0
- package/dist/src/harness/hitl/approval-input-requests.js +1 -0
- package/dist/src/harness/hitl/pending-input-resolution.d.ts +51 -0
- package/dist/src/harness/hitl/pending-input-resolution.js +1 -0
- package/dist/src/harness/hitl/question-input-requests.d.ts +15 -0
- package/dist/src/harness/hitl/question-input-requests.js +1 -0
- package/dist/src/harness/hitl/session-limit-input-requests.d.ts +10 -0
- package/dist/src/harness/hitl/session-limit-input-requests.js +1 -0
- package/dist/src/harness/input-requests.d.ts +17 -105
- package/dist/src/harness/input-requests.js +1 -1
- package/dist/src/harness/pending-input-batches.d.ts +77 -0
- package/dist/src/harness/pending-input-batches.js +1 -0
- package/dist/src/harness/proxy-input-requests.d.ts +13 -3
- package/dist/src/harness/proxy-input-requests.js +1 -1
- package/dist/src/harness/session-limit-enforcement.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/create/web-template.d.ts +9 -0
- package/dist/src/setup/scaffold/create/web-template.js +291 -1
- package/dist/src/setup/scaffold/index.d.ts +1 -1
- package/dist/src/setup/scaffold/update/channels.d.ts +4 -13
- package/dist/src/setup/scaffold/update/channels.js +2 -2
- package/dist/src/setup/scaffold/update/web-options.d.ts +15 -0
- package/dist/src/setup/scaffold/update/web-options.js +1 -0
- package/dist/src/setup/vercel-project.js +0 -0
- package/docs/concepts/sessions-runs-and-streaming.md +4 -4
- package/docs/guides/frontend/overview.mdx +31 -10
- package/docs/guides/frontend/use-eve-agent-svelte.mdx +37 -15
- package/docs/guides/frontend/use-eve-agent-vue.mdx +38 -15
- package/docs/tools/human-in-the-loop.md +2 -2
- package/package.json +1 -1
|
@@ -1,120 +1,33 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
|
-
import type { RuntimeToolCallActionRequest
|
|
2
|
+
import type { RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
|
|
3
3
|
import type { InputRequest } from "#runtime/input/types.js";
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Denied tool-call approvals from one resolved batch, ready for the caller to
|
|
16
|
-
* emit as `rejected` `action.result` events against the originating turn.
|
|
17
|
-
*/
|
|
18
|
-
export interface RejectedActionBatch {
|
|
19
|
-
readonly event: PendingInputBatchEvent;
|
|
20
|
-
readonly results: readonly RuntimeToolResultActionResult[];
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Returns true when the step input carries user-facing turn input.
|
|
24
|
-
*/
|
|
4
|
+
import { getApprovedTools } from "#harness/hitl/approval-input-requests.js";
|
|
5
|
+
import type { RejectedActionBatch } from "#harness/hitl/approval-input-requests.js";
|
|
6
|
+
import type { ResolvePendingInputResult } from "#harness/hitl/pending-input-resolution.js";
|
|
7
|
+
import { clearPendingSessionLimitPrompt } from "#harness/hitl/session-limit-input-requests.js";
|
|
8
|
+
import type { HarnessSession, StepInput } from "#harness/types.js";
|
|
9
|
+
export { getApprovedTools, clearPendingSessionLimitPrompt };
|
|
10
|
+
export type { RejectedActionBatch };
|
|
11
|
+
export { appendPendingInputBatch, consumeDeferredStepInput, getPendingInputRequestIds, hasDeferredStepInput, hasPendingInputBatch, } from "#harness/pending-input-batches.js";
|
|
12
|
+
/** Returns true when the step input carries user-facing turn input. */
|
|
25
13
|
export declare function hasStepInput(input?: StepInput): boolean;
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
* from session state.
|
|
29
|
-
*
|
|
30
|
-
* Used when the harness has to process a pending tool-approval response first
|
|
31
|
-
* and defer the user's new message to the next internal model step.
|
|
32
|
-
*/
|
|
33
|
-
export declare function consumeDeferredStepInput(input: {
|
|
34
|
-
readonly input?: StepInput;
|
|
35
|
-
readonly session: HarnessSession;
|
|
36
|
-
}): {
|
|
37
|
-
readonly input?: StepInput;
|
|
38
|
-
readonly session: HarnessSession;
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Returns true when the session carries queued follow-up input for the next
|
|
42
|
-
* internal harness step.
|
|
43
|
-
*/
|
|
44
|
-
export declare function hasDeferredStepInput(session: HarnessSession): boolean;
|
|
14
|
+
/** Returns true when any pending batch still contains a tool approval. */
|
|
15
|
+
export declare function hasPendingApprovalBatch(session: HarnessSession): boolean;
|
|
45
16
|
/**
|
|
46
17
|
* Resolves pending input at the start of a harness step.
|
|
47
18
|
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* request; {@link consumeDeferredStepInput} replays it on the subsequent
|
|
52
|
-
* step. Tool approval responses additionally resolve in isolation because
|
|
53
|
-
* AI SDK cannot process an approval response and a new user message in the
|
|
54
|
-
* same request.
|
|
19
|
+
* Ordered batches remain independently answerable. Session-limit prompts own
|
|
20
|
+
* resolution while open; approval batches preserve AI SDK's tail-message
|
|
21
|
+
* requirement; question-only batches retain dismiss-and-continue behavior.
|
|
55
22
|
*/
|
|
56
23
|
export declare function resolvePendingInput(input: {
|
|
24
|
+
readonly deferMessagesWhileApprovalsPending?: boolean;
|
|
57
25
|
readonly history?: readonly ModelMessage[];
|
|
58
26
|
readonly resolveApprovalKey?: (request: InputRequest) => string | undefined;
|
|
59
27
|
readonly session: HarnessSession;
|
|
60
28
|
readonly stepInput?: StepInput;
|
|
61
29
|
}): ResolvePendingInputResult;
|
|
62
|
-
/**
|
|
63
|
-
* Drops a pending session-limit continuation prompt from a parked session.
|
|
64
|
-
*
|
|
65
|
-
* A cancelled turn settles with the step's input snapshot, which can
|
|
66
|
-
* resurrect a continuation prompt the user already answered — the decline
|
|
67
|
-
* that cancelled the turn consumed the answer inside the discarded turn
|
|
68
|
-
* state. Left in place, the stale prompt would queue every follow-up
|
|
69
|
-
* message behind an answer that will never come. Harness-authored prompts
|
|
70
|
-
* are deterministically re-raised by the pre-model gate, so dropping is
|
|
71
|
-
* always safe; model-anchored batches (tool approvals, questions) are kept
|
|
72
|
-
* because their tool calls still require resolution.
|
|
73
|
-
*/
|
|
74
|
-
export declare function clearPendingSessionLimitPrompt(session: HarnessSession): HarnessSession;
|
|
75
|
-
type ResolvePendingInputResult = {
|
|
76
|
-
readonly consumedMessage?: boolean;
|
|
77
|
-
readonly deferredContext?: boolean;
|
|
78
|
-
readonly deferredMessage?: boolean;
|
|
79
|
-
/**
|
|
80
|
-
* Present when the resolved batch answered a session-limit continuation
|
|
81
|
-
* prompt. The tool loop grants a fresh token budget window or terminates
|
|
82
|
-
* the session based on `granted`.
|
|
83
|
-
*/
|
|
84
|
-
readonly limitContinuation?: {
|
|
85
|
-
readonly granted: boolean;
|
|
86
|
-
};
|
|
87
|
-
readonly outcome: "resolved" | "continue" | "unresolved";
|
|
88
|
-
readonly messages: ModelMessage[];
|
|
89
|
-
readonly rejectedActions?: RejectedActionBatch;
|
|
90
|
-
readonly session: HarnessSession;
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Returns true when the session is parked on a pending HITL batch
|
|
94
|
-
* (tool approvals or `ask_question` prompts).
|
|
95
|
-
*/
|
|
96
|
-
export declare function hasPendingInputBatch(state: SessionStateMap | undefined): boolean;
|
|
97
|
-
/**
|
|
98
|
-
* Returns the request IDs in the currently pending HITL batch.
|
|
99
|
-
*/
|
|
100
|
-
export declare function getPendingInputRequestIds(state: SessionStateMap | undefined): ReadonlySet<string>;
|
|
101
|
-
/**
|
|
102
|
-
* Stores one pending HITL batch on the session until the user responds.
|
|
103
|
-
*/
|
|
104
|
-
export declare function setPendingInputBatch(input: {
|
|
105
|
-
readonly event?: PendingInputBatchEvent;
|
|
106
|
-
readonly requests: readonly InputRequest[];
|
|
107
|
-
readonly responseMessages: readonly ModelMessage[];
|
|
108
|
-
readonly session: HarnessSession;
|
|
109
|
-
}): HarnessSession;
|
|
110
|
-
/**
|
|
111
|
-
* Returns the set of tool names that have been approved at least once
|
|
112
|
-
* during this session.
|
|
113
|
-
*/
|
|
114
|
-
export declare function getApprovedTools(session: HarnessSession): ReadonlySet<string>;
|
|
115
|
-
/**
|
|
116
|
-
* Creates a runtime tool-call action shape from an AI SDK tool call.
|
|
117
|
-
*/
|
|
30
|
+
/** Creates a runtime tool-call action shape from an AI SDK tool call. */
|
|
118
31
|
export declare function createRuntimeToolCallActionFromToolCall(input: {
|
|
119
32
|
readonly toolCall: {
|
|
120
33
|
readonly input: unknown;
|
|
@@ -122,4 +35,3 @@ export declare function createRuntimeToolCallActionFromToolCall(input: {
|
|
|
122
35
|
readonly toolName: string;
|
|
123
36
|
};
|
|
124
37
|
}): RuntimeToolCallActionRequest;
|
|
125
|
-
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveTextToResponses}from"#channel/resolve-text.js";import{
|
|
1
|
+
import{resolveTextToResponses}from"#channel/resolve-text.js";import{resolveToolCallInputObject}from"#harness/runtime-actions.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{compactStepInput}from"#harness/hitl/pending-input-resolution.js";import{resolveQuestionOnlyInputBatches}from"#harness/hitl/question-input-requests.js";import{getApprovedTools,hasAnsweredApprovalBatch,resolveApprovalInputBatches}from"#harness/hitl/approval-input-requests.js";import{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput}from"#harness/hitl/session-limit-input-requests.js";function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function hasPendingApprovalBatch(e){return getPendingInputBatches(e.state).some(e=>e.requests.some(e=>isApprovalRequest(e)))}function resolvePendingInput(e){let t=[...e.history??e.session.history],n=getPendingInputBatches(e.session.state);if(n.length===0)return{outcome:`continue`,messages:t,session:e.session};let r=routePendingInput(n),i=hasTailApprovalResponse(t),a=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,o=a===void 0?e.stepInput:resolveTextMessageInput(a,e.stepInput),s=canonicalizeInputResponses(o?.inputResponses??[]);if(r.kind===`approval`&&e.deferMessagesWhileApprovalsPending===!0&&o?.message!==void 0&&!hasAnsweredApprovalBatch(r.approvalBatches,s))return{deferredMessage:!0,outcome:`unresolved`,messages:t,session:queueDeferredStepInput(e.session,compactStepInput(o))};if(s.length===0&&o?.message===void 0){let n=compactStepInput(o);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let c={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:o,responses:s,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...c,pendingBatch:r.batch});case`approval`:return resolveApprovalInputBatches({...c,approvalBatches:r.approvalBatches,questionBatches:r.questionBatches,resolveApprovalKey:e.resolveApprovalKey});case`question`:return resolveQuestionOnlyInputBatches(c)}}function routePendingInput(e){let t=e.map(e=>({batch:e,domain:classifyPendingInputBatch(e)})),n=t.find(({domain:e})=>e===`session-limit`)?.batch;if(n!==void 0)return{batch:n,kind:`session-limit`};let r=t.filter(({domain:e})=>e===`approval`).map(({batch:e})=>e);if(r.length>0){let t=new Set(r);return{approvalBatches:r,kind:`approval`,questionBatches:e.filter(e=>!t.has(e))}}return{kind:`question`}}function classifyPendingInputBatch(e){for(let t of e.requests)switch(t.kind){case`question`:case`session-limit`:case`tool-approval`:break;default:{let e=t.kind;throw TypeError(`Unhandled pending input request kind: ${String(e)}`)}}return isSessionLimitInputBatch(e)?`session-limit`:e.requests.some(e=>isApprovalRequest(e))?`approval`:`question`}function canonicalizeInputResponses(e){let t=new Map;for(let n of e)t.set(n.requestId,n);return[...t.values()]}function hasTailApprovalResponse(e){let t=e.at(-1);return t?.role===`tool`&&t.content.some(e=>e.type===`tool-approval-response`)}function resolveTextMessageInput(t,n){if(typeof n?.message!=`string`)return n;let r=new Set(t.requests.map(e=>e.requestId));if(n.inputResponses?.some(e=>r.has(e.requestId)))return n;let i=resolveTextToResponses(n.message,t.requests);return i.length===0?n:compactStepInput({...n,inputResponses:[...n.inputResponses??[],...i],messageConsumed:!0,message:void 0})}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}export{appendPendingInputBatch,clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasPendingInputBatch,hasStepInput,resolvePendingInput};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ModelMessage } from "ai";
|
|
2
|
+
import type { InputRequest } from "#runtime/input/types.js";
|
|
3
|
+
import type { HarnessSession, SessionStateMap, StepInput } from "#harness/types.js";
|
|
4
|
+
/**
|
|
5
|
+
* Stream-emit coordinates carried so a parked batch's resolution can attribute
|
|
6
|
+
* its events to the turn and step that requested the input.
|
|
7
|
+
*/
|
|
8
|
+
export interface PendingInputBatchEvent {
|
|
9
|
+
readonly sequence: number;
|
|
10
|
+
readonly stepIndex: number;
|
|
11
|
+
readonly turnId: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Serializable pending input batch stored on the session state: one parked
|
|
15
|
+
* assistant turn's requests plus its withheld model output.
|
|
16
|
+
*/
|
|
17
|
+
export interface PendingInputBatch {
|
|
18
|
+
readonly event?: PendingInputBatchEvent;
|
|
19
|
+
readonly requests: readonly InputRequest[];
|
|
20
|
+
readonly responseMessages: readonly ModelMessage[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns true when the session holds at least one pending HITL batch
|
|
24
|
+
* (tool approvals or `ask_question` prompts).
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasPendingInputBatch(state: SessionStateMap | undefined): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Returns the request IDs across every pending HITL batch.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getPendingInputRequestIds(state: SessionStateMap | undefined): ReadonlySet<string>;
|
|
31
|
+
/**
|
|
32
|
+
* Reads the ordered pending batches. Sessions parked before the collection
|
|
33
|
+
* shape carry the legacy singleton key; it reads as a one-element list and
|
|
34
|
+
* is rewritten to the list shape on the next batch write.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getPendingInputBatches(state: SessionStateMap | undefined): readonly PendingInputBatch[];
|
|
37
|
+
/**
|
|
38
|
+
* Removes the given batches (matched by identity from a prior
|
|
39
|
+
* {@link getPendingInputBatches} read) and keeps every other batch open.
|
|
40
|
+
*
|
|
41
|
+
* Removal is the only exported way to shrink the collection: a wholesale
|
|
42
|
+
* setter would reintroduce the overwrite hazard the collection exists to
|
|
43
|
+
* prevent — a writer clobbering batches it never resolved.
|
|
44
|
+
*/
|
|
45
|
+
export declare function removePendingInputBatches(session: HarnessSession, batches: readonly PendingInputBatch[]): HarnessSession;
|
|
46
|
+
/**
|
|
47
|
+
* Appends one pending HITL batch for a parked assistant turn. Earlier
|
|
48
|
+
* batches stay open and independently answerable.
|
|
49
|
+
*/
|
|
50
|
+
export declare function appendPendingInputBatch(input: {
|
|
51
|
+
readonly event?: PendingInputBatchEvent;
|
|
52
|
+
readonly requests: readonly InputRequest[];
|
|
53
|
+
readonly responseMessages: readonly ModelMessage[];
|
|
54
|
+
readonly session: HarnessSession;
|
|
55
|
+
}): HarnessSession;
|
|
56
|
+
/**
|
|
57
|
+
* Merges any queued follow-up input into the current step input and clears it
|
|
58
|
+
* from session state. When `preferCurrentInput` is set, fresh input is returned
|
|
59
|
+
* alone and the queued input remains deferred.
|
|
60
|
+
*
|
|
61
|
+
* Used when the harness has to process a pending tool-approval response first
|
|
62
|
+
* and defer the user's new message to the next internal model step.
|
|
63
|
+
*/
|
|
64
|
+
export declare function consumeDeferredStepInput(input: {
|
|
65
|
+
readonly input?: StepInput;
|
|
66
|
+
readonly preferCurrentInput?: boolean;
|
|
67
|
+
readonly session: HarnessSession;
|
|
68
|
+
}): {
|
|
69
|
+
readonly input?: StepInput;
|
|
70
|
+
readonly session: HarnessSession;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Returns true when the session carries queued follow-up input for the next
|
|
74
|
+
* internal harness step.
|
|
75
|
+
*/
|
|
76
|
+
export declare function hasDeferredStepInput(session: HarnessSession): boolean;
|
|
77
|
+
export declare function queueDeferredStepInput(session: HarnessSession, input: StepInput): HarnessSession;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(!(!Array.isArray(t.requests)||!Array.isArray(t.responseMessages)))return t}function getPendingInputBatches(e){let r=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(r)){let e=r.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let i=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),a=i===void 0?[]:[i];return assertUniqueRequestIds(a),a}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,r){assertUniqueRequestIds(r);let i={...e.state};return delete i[LEGACY_PENDING_INPUT_BATCH_KEY],r.length===0?delete i[PENDING_INPUT_BATCHES_KEY]:i[PENDING_INPUT_BATCHES_KEY]=r.map(e=>({event:e.event,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(i).length>0?i:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,requests:e.requests,responseMessages:e.responseMessages}])}function consumeDeferredStepInput(t){let n=getDeferredStepInput(t.session);if(n===void 0)return t;if(t.preferCurrentInput===!0&&t.input!==void 0)return{input:t.input,session:t.session};let r=clearDeferredStepInput(t.session);return t.input===void 0?{input:n,session:r}:{input:coalesceTurnInputs(n,t.input),session:r}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(t,n){let i=getDeferredStepInput(t),a=i===void 0?n:coalesceTurnInputs(i,n),o={...t.state};return o[DEFERRED_STEP_INPUT_KEY]=a,{...t,state:o}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
|
|
@@ -3,9 +3,15 @@ import type { HarnessSession, SessionStateMap } from "#harness/types.js";
|
|
|
3
3
|
import type { InputRequestKind } from "#runtime/input/types.js";
|
|
4
4
|
/** Routing and control metadata for one descendant-owned input request. */
|
|
5
5
|
export interface ProxyInputRequest {
|
|
6
|
+
/** Batch semantics are optional so sessions written before this field remain routable. */
|
|
7
|
+
readonly batch?: ProxyInputRequestBatch;
|
|
6
8
|
readonly childContinuationToken: string;
|
|
7
9
|
readonly kind: InputRequestKind;
|
|
8
10
|
}
|
|
11
|
+
export interface ProxyInputRequestBatch {
|
|
12
|
+
readonly approvalRequestIds: readonly string[];
|
|
13
|
+
readonly requestIds: readonly string[];
|
|
14
|
+
}
|
|
9
15
|
/**
|
|
10
16
|
* Returns the proxy-routing map as a fresh `Map`. Never returns a live
|
|
11
17
|
* reference so accidental mutation cannot corrupt session state.
|
|
@@ -17,9 +23,9 @@ export declare function getProxyInputRequests(state: SessionStateMap | undefined
|
|
|
17
23
|
*/
|
|
18
24
|
export declare function hasProxyInputRequests(state: SessionStateMap | undefined): boolean;
|
|
19
25
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
26
|
+
* Merges the provided routes into the parent session by request ID. Existing
|
|
27
|
+
* routes with different IDs stay independently answerable; re-recording the
|
|
28
|
+
* same request ID replaces only that route, making durable retries idempotent.
|
|
23
29
|
*/
|
|
24
30
|
export declare function upsertProxyInputRequests(input: {
|
|
25
31
|
readonly entries: readonly (readonly [requestId: string, route: ProxyInputRequest])[];
|
|
@@ -31,6 +37,10 @@ export declare function upsertProxyInputRequests(input: {
|
|
|
31
37
|
* child subagent finishes so stale clicks no longer route to it.
|
|
32
38
|
*/
|
|
33
39
|
export declare function clearProxyInputRequestsForChild(session: HarnessSession, childContinuationToken: string): HarnessSession;
|
|
40
|
+
/** Removes only the request IDs whose responses were successfully forwarded. */
|
|
41
|
+
export declare function retireProxyInputRequests<T extends {
|
|
42
|
+
readonly state?: SessionStateMap;
|
|
43
|
+
}>(session: T, requestIds: readonly string[]): T;
|
|
34
44
|
/**
|
|
35
45
|
* Removes every proxy entry. Called when a cancelled turn orphans its
|
|
36
46
|
* descendants so stale HITL responses no longer route to them.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={
|
|
1
|
+
const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={...readMap(e.session.state)};for(let[n,r]of e.entries)t[n]=r;return writeMap(e.session,t)}function clearProxyInputRequestsForChild(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(a.childContinuationToken===t){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e){let t={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)};return e.event.requests.map(n=>[n.requestId,{batch:t,childContinuationToken:e.childContinuationToken,kind:n.kind}])}function readMap(t){let n=t?.[PROXY_INPUT_REQUESTS_KEY];if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){let n=parseProxyInputRequest(t,e);n!==void 0&&(r[e]=n)}return r}function writeMap(t,n){let r={...t.state};return Object.keys(n).length===0?(delete r[PROXY_INPUT_REQUESTS_KEY],{...t,state:Object.keys(r).length>0?r:void 0}):(r[PROXY_INPUT_REQUESTS_KEY]=n,{...t,state:r})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n={childContinuationToken:e.childContinuationToken,kind:e.kind},r=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0;return r===void 0||!r.requestIds.includes(t)?n:{...n,batch:r}}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequests};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{
|
|
1
|
+
import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{appendPendingInputBatch}from"#harness/input-requests.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";import{SessionLimitDeclinedError}from"#harness/turn-cancellation.js";import{bumpSessionRuntimeTokenLimits,getSessionTokenLimitViolation,getSessionTokenUsage}from"#harness/turn-tag-state.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:bumpSessionRuntimeTokenLimits(e.session)};if(!(e.config.mode===`conversation`||e.session.continuationToken!==``)){let t=getSessionTokenLimitViolation(e.session);return{result:t===null?{next:{done:!0,output:``},session:e.session}:await failSessionTokenLimit({...e,violation:t}),session:e.session}}throw new SessionLimitDeclinedError}async function enforceSessionTokenLimit(e){let t=getSessionTokenLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return t.limit>0&&n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionTokenLimit({...e,emit:n,violation:t}):failSessionTokenLimit({...e,violation:t})}async function parkOnSessionTokenLimit(t){let a=createSessionLimitContinuationRequest({sessionId:t.session.sessionId,violation:t.violation}),o=t.emissionState,s=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:[a],responseMessages:[],session:{...t.session,history:[...t.messages]}});return await t.emit(createInputRequestedEvent({requests:[a],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.config.mode===`conversation`&&(o=await emitTurnEpilogue(t.emit,o,t.config.mode)),{next:null,session:setHarnessEmissionState(s,o)}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let n=getSessionTokenUsage(e.session),r=formatSessionTokenLimitMessage(e.violation.kind),i={inputTokens:n.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:n.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:i,message:r,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`||void 0,output:e.config.mode===`task`?r:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionTokenLimit};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey,ParentTraceContextKey,SessionCallbackKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createResultCompletedEvent,createSessionWaitingEvent}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{contextStorage}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{getAgentHandleStore}from"#harness/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{
|
|
1
|
+
import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey,ParentTraceContextKey,SessionCallbackKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createResultCompletedEvent,createSessionWaitingEvent}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{contextStorage}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{getAgentHandleStore}from"#harness/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{getSupersededAuthorizationChallenges,isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.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{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.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{buildDynamicTools}from"#context/build-dynamic-tools.js";import{resolveAgentsAnnouncement}from"#harness/handles/prompt.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{resolveParentLineage}from"#harness/parent-lineage.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.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"#runtime/framework-tools/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 enrichTelemetry(e,t,n,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}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)))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({isRemote:!0,traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}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(t){let n=t.handleEvent,u=getInstrumentationConfig();u!==void 0&&ensureOtelIntegration();let p=u===void 0?void 0:trace.getTracer(`eve`),m=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(p&&hasStepInput(t)){let t=u?.functionId??m,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=p.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(p,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(p,h,g){let v=p;g&&(v=setTurnTraceState(v,g.spanContext()));let y=getHarnessEmissionState(v.state),S=contextStorage.getStore(),E=S?.get(ParentSessionKey),j=E!==void 0||S?.get(SessionCallbackKey)!==void 0,M=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,parentLineage:resolveParentLineage(E,S?.get(ChannelKey)),parentTraceContext:S?.get(ParentTraceContextKey),rootSessionId:E?.rootSessionId,sessionId:v.sessionId,turnId:activeTurnId(y)}),failModelSelection=async(n,r)=>{if(throwIfTurnAborted(t.abortSignal),g&&recordErrorOnSpan(g,n),!M)throw n;let a=createErrorId(),o=toErrorMessage(n);return log.error(`model selection failed terminally`,{error:n,errorId:a,sessionId:v.sessionId,turnId:r.turnId}),await emitFailedStep(M,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:a},message:o,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:v}};if(t.clearOnly===!0)return v={...v,compaction:{recentWindowSize:v.compaction.recentWindowSize,threshold:v.compaction.threshold,thresholdPercent:v.compaction.thresholdPercent},history:[]},await M?.(createContextClearedEvent({sequence:y.sequence,sessionId:v.sessionId,turnId:activeTurnId(y)})),await M?.(createSessionWaitingEvent()),{next:null,session:v};if(t.compactOnly===!0){if(v.history.length>0)try{let e=await resolveActiveRuntimeModel({config:t,ctx:contextStorage.getStore(),session:v});v=e.session;let n=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:{...y,turnId:activeTurnId(y)},force:!0,messages:[...v.history],model:e.model,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0});v={...n.session,compaction:{recentWindowSize:n.session.compaction.recentWindowSize,threshold:n.session.compaction.threshold,thresholdPercent:n.session.compaction.thresholdPercent},history:n.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:v.sessionId})}return await M?.(createSessionWaitingEvent()),{next:null,session:v}}let N=consumeDeferredStepInput({input:h,session:v});v=N.session;let P=await resolvePendingRuntimeActions({emit:M,session:v,stepInput:N.input});if(P.outcome===`unresolved`)return{next:null,session:P.session};v=P.session;let ne=getPendingInputRequestIds(v.state),F=convertStaleResponsesToUserMessage({history:P.messages,pendingRequestIds:ne,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:ne,stepInput:N.input})}),I=F.stepInput,L=F.kind===`converted`?{...I,message:F.displayMessage}:I,R=resolvePendingInput({history:P.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:v,stepInput:I});if(R.outcome===`unresolved`){if(M&&R.deferredMessage===!0&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}return y=await emitTurnEpilogue(M,y,t.mode),{next:null,session:setHarnessEmissionState(R.session,y)}}return{next:null,session:R.session}}if(M&&R.rejectedActions)for(let e of R.rejectedActions.results)await M(createActionResultEvent({rejected:!0,result:e,sequence:R.rejectedActions.event.sequence,stepIndex:R.rejectedActions.event.stepIndex,turnId:R.rejectedActions.event.turnId}));if(M&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}v=setHarnessEmissionState(v,y),g&&g.setAttribute(`eve.turn.id`,y.turnId)}v=R.session;let z=R.messages,B=await applySessionLimitContinuation({config:t,emit:M,emissionState:y,limitContinuation:R.limitContinuation,session:v});if(B.result!==null)return B.result;if(v=B.session,t.persistentSubagentSessions===!0){let e=resolveAgentsAnnouncement({messages:z,store:getAgentHandleStore(v.state)});e!==void 0&&z.push({content:e,role:`user`})}if(I?.context!==void 0&&R.deferredContext!==!0)for(let e of I.context)z.push({content:e,role:`user`});let re=normalizeUserContent(I?.message);if(re!==void 0&&!R.deferredMessage&&!R.consumedMessage){let e=await stageAttachmentsToSandbox(re);z.push({content:e,role:`user`})}let V=S,H;try{V!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:V,event:{data:{sequence:y.sequence,stepIndex:y.stepIndex,turnId:y.turnId},type:`step.started`},messages:z}),H=await resolveActiveRuntimeModel({config:t,ctx:V,session:v})}catch(e){return failModelSelection(e,y)}v=H.session;let U=H.model;M&&await emitStepStarted(M,y,requireSessionModelReference(v).id,z);let W=detectPromptCachePath(U),G=W.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,ie=buildGatewayAttributionHeaders(U,t.runtimeIdentity);({messages:z,session:v}=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:y,messages:z,model:U,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0}));let K=getApprovedTools(v),q=v.outputSchema===void 0&&V!==void 0&&isScheduleAppAuth(V.get(AuthKey))&&V.get(ParentSessionKey)===void 0,ae=await hydrateSandboxAttachments(z),J=[],Y=[];for(let e of ae)e.role===`system`?J.push(e):Y.push(e);if(V!==void 0){J.push(...buildDynamicInstructionMessages(V));let e=V.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&J.push({role:`system`,content:e})}q&&J.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let X=Y,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=v.agent.system?[{role:`system`,content:v.agent.system}]:[],r=J.length>0||t.length>0?[...t,...n,...J]:void 0,i=r!==void 0&&G?applySystemCacheBreakpoint(r,G):r,a=i===void 0?v.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:u,emissionState:y,environment,modelInput:{instructions:a,messages:X},session:v})}},oe=t.tools,runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...X,{role:`user`,content:e.trailingUserNote}]:X,o=buildHarnessToolsWithDynamicSubagents(t.tools,V),s=getAdvertisedTools({session:v,tools:o});oe=s;let c=await buildToolSetWithProviderTools({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(v),tools:s,webSearchProvider:t.webSearchProvider});if(V!==void 0){let n=getAdvertisedTools({session:v,tools:buildDynamicTools(V)}),r=buildToolSetFromDefinitions({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){if(s.get(e)?.runtimeAction!==void 0)throw Error(`Dynamic tool "${e}" collides with a runtime-visible subagent.`);c[e]=t}}v.outputSchema!==void 0&&(c[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(v.outputSchema));let l=M===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:M,emissionState:y,tools:e}),d=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:c,session:v,tools:s,workflow:d});v=f.session;let p=f.modelTools,h=G?applyLastToolCacheBreakpoint(p,G):p,g=t.instrumentation?.hooks,_=activeTurnId(y),b=g===void 0?void 0:{attemptId:`${v.sessionId}:${_}:${y.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:u?.functionId??m,rootSessionId:E?.rootSessionId??v.sessionId,sessionId:v.sessionId,stepIndex:y.stepIndex,turnId:_},S=b===void 0||g===void 0?void 0:createAiSdkHookBridge(b,g,t.instrumentation?.runInContext),C=buildStepHooks({cachePath:W,emit:M,emissionState:y,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:G,session:v}),w=new ToolLoopAgent({headers:ie,instructions:n,model:U,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:C.onStepFinish,prepareStep:C.prepareStep,reasoning:v.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(u,m,i,S),toolApproval:buildToolApproval(p),tools:h}),executeModelCall=async()=>{if(M){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await w.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(M,y,r.fullStream,{excludedActionToolNames:n,tools:s});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([C.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(M,y,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:o,tools:s});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await w.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await C.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return b!==void 0&&await g?.publish({scope:b,type:`attempt.completed`}),e}catch(e){return b!==void 0&&await g?.publish({error:e,scope:b,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},se=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:se++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:v.sessionId,turnId:y.turnId},t.abortSignal),ce=prepareModelCallInput(),le=await continuePendingWorkflowInterrupt({childResults:I?.runtimeActionResults,config:t,emit:M,emissionState:y,runStep,session:v,tools:buildHarnessToolsWithDynamicSubagents(t.tools,V)});if(le!==null)return le;let ue=await enforceSessionTokenLimit({config:t,emit:M,emissionState:y,messages:z,session:v});if(ue!==null)return ue;let Z;try{Z=await runOneModelCall({preparedInput:ce,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:q,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(g&&recordErrorOnSpan(g,n),!M)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:v.sessionId,turnId:y.turnId}),y=await emitRecoverableFailedTurn(M,y,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:v.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(v,y)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),l=c===null?extractUpstreamRejectionMessage(n):null,u=c?.message??l?.message??toErrorMessage(n),f=c?.hint===void 0?u:`${u} ${c.hint}`,p=extractModelCallErrorDetails(n),m=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:l}),h=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||l!==null,sessionId:v.sessionId,turnId:y.turnId});if(o===`terminal`)return c===null?log.error(l?.message??`model call failed terminally`,h):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:v.sessionId,turnId:y.turnId}),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:v};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(l?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,h),n;return log.error(l?.message??`model call failed; failing the task run`,h),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:{done:!0,isError:!0,output:f},session:v}}log.error(l?.message??`model call failed — parking session for retry by the user`,h),y=await emitRecoverableFailedTurn(M,y,{code:`MODEL_CALL_FAILED`,continuationToken:v.continuationToken,details:m,message:u});let _={isError:!0,output:f};return{next:null,session:setHarnessEmissionState(v,y),settledTurn:_}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(v.state),turnId:y.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});v=setTurnUsageState(v,Q);let $;try{$=formatLanguageModelGatewayId(U)}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":t.tools.size}),handleStepResult({config:t,emit:M,emissionState:y,promptMessages:z,result:Z,runStep,session:v,runtimeActionTools:oe})}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:r,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(r,i),...a}:{errorId:i,message:toErrorMessage(r),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}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:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),h=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let _=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:g}),y=_.messages,b={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},x=t.workflow===!0?readWorkflowContinuationSecurity(b):void 0;if(x!==void 0){let e=await getWorkflowSandboxInterrupt(i,x);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:b,emissionState:o,interrupt:e,promptMessages:r,responseMessages:y})}}let S=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),C=new Set(S.map(e=>e.action.callId)),w=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...C])}),T=[...S,...w],D=getAdvertisedTools({session:b,tools:e.runtimeActionTools}),O=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>e.runtimeActionTools.get(t.toolName)?.runtimeAction!==void 0).filter(e=>D.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:b.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:D}));if(O.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:O,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:y,session:{...b,history:[...r]}}),o)};if(T.length>0){let e=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:T,responseMessages:y,session:{...b,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:T,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:null,session:e}}let k=findAuthorizationSignalFromToolResults(i.toolResults);if(k){let{challenges:e}=k;if(n){for(let t of getSupersededAuthorizationChallenges(b.state,e))await n(createAuthorizationCompletedEvent({authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode))}return{next:null,session:setHarnessEmissionState({...b,history:[...r],state:setPendingAuthorization(b.state,{challenges:e})},o)}}let ee=y,te=[...r,...ee],A={...b,history:te};return!(A.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(ee.at(-1)?.role===`tool`||_.outcomeEndsResponse||hasDeferredStepInput(A))?(n&&(o=advanceStep(o),A=setHarnessEmissionState(A,o)),{next:a,session:A}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h})}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?(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){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(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}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}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(e.force!==!0&&!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal,e.force===!0),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{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))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}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)))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({isRemote:!0,traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}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(t){let n=t.handleEvent,u=getInstrumentationConfig();u!==void 0&&ensureOtelIntegration();let p=u===void 0?void 0:trace.getTracer(`eve`),m=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(p&&hasStepInput(t)){let t=u?.functionId??m,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=p.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(p,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(p,h,g){let v=p;g&&(v=setTurnTraceState(v,g.spanContext()));let y=getHarnessEmissionState(v.state),S=contextStorage.getStore(),E=S?.get(ParentSessionKey),j=E!==void 0||S?.get(SessionCallbackKey)!==void 0,M=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,parentLineage:resolveParentLineage(E,S?.get(ChannelKey)),parentTraceContext:S?.get(ParentTraceContextKey),rootSessionId:E?.rootSessionId,sessionId:v.sessionId,turnId:activeTurnId(y)}),failModelSelection=async(n,r)=>{if(throwIfTurnAborted(t.abortSignal),g&&recordErrorOnSpan(g,n),!M)throw n;let a=createErrorId(),o=toErrorMessage(n);return log.error(`model selection failed terminally`,{error:n,errorId:a,sessionId:v.sessionId,turnId:r.turnId}),await emitFailedStep(M,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:a},message:o,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:v}};if(t.clearOnly===!0)return v={...v,compaction:{recentWindowSize:v.compaction.recentWindowSize,threshold:v.compaction.threshold,thresholdPercent:v.compaction.thresholdPercent},history:[]},await M?.(createContextClearedEvent({sequence:y.sequence,sessionId:v.sessionId,turnId:activeTurnId(y)})),await M?.(createSessionWaitingEvent()),{next:null,session:v};if(t.compactOnly===!0){if(v.history.length>0)try{let e=await resolveActiveRuntimeModel({config:t,ctx:contextStorage.getStore(),session:v});v=e.session;let n=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:{...y,turnId:activeTurnId(y)},force:!0,messages:[...v.history],model:e.model,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0});v={...n.session,compaction:{recentWindowSize:n.session.compaction.recentWindowSize,threshold:n.session.compaction.threshold,thresholdPercent:n.session.compaction.thresholdPercent},history:n.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:v.sessionId})}return await M?.(createSessionWaitingEvent()),{next:null,session:v}}let N=consumeDeferredStepInput({input:h,preferCurrentInput:t.mode!==`conversation`&&h!==void 0&&hasPendingApprovalBatch(v),session:v});v=N.session;let P=await resolvePendingRuntimeActions({emit:M,session:v,stepInput:N.input});if(P.outcome===`unresolved`)return{next:null,session:P.session};v=P.session;let ne=getPendingInputRequestIds(v.state),F=convertStaleResponsesToUserMessage({history:P.messages,pendingRequestIds:ne,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:ne,stepInput:N.input})}),I=F.stepInput,L=F.kind===`converted`?{...I,message:F.displayMessage}:I,R=resolvePendingInput({deferMessagesWhileApprovalsPending:t.mode!==`conversation`,history:P.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:v,stepInput:I});if(R.outcome===`unresolved`){if(M&&t.mode===`conversation`&&R.deferredMessage===!0&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}return y=await emitTurnEpilogue(M,y,t.mode),{next:null,session:setHarnessEmissionState(R.session,y)}}return{next:null,session:R.session}}if(M&&R.rejectedActions)for(let e of R.rejectedActions)for(let t of e.results)await M(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(M&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}v=setHarnessEmissionState(v,y),g&&g.setAttribute(`eve.turn.id`,y.turnId)}v=R.session;let z=R.messages,B=await applySessionLimitContinuation({config:t,emit:M,emissionState:y,limitContinuation:R.limitContinuation,session:v});if(B.result!==null)return B.result;if(v=B.session,t.persistentSubagentSessions===!0){let e=resolveAgentsAnnouncement({messages:z,store:getAgentHandleStore(v.state)});e!==void 0&&z.push({content:e,role:`user`})}if(I?.context!==void 0&&R.deferredContext!==!0)for(let e of I.context)z.push({content:e,role:`user`});let re=normalizeUserContent(I?.message);if(re!==void 0&&!R.deferredMessage&&!R.consumedMessage){let e=await stageAttachmentsToSandbox(re);z.push({content:e,role:`user`})}let V=S,H;try{V!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:V,event:{data:{sequence:y.sequence,stepIndex:y.stepIndex,turnId:y.turnId},type:`step.started`},messages:z}),H=await resolveActiveRuntimeModel({config:t,ctx:V,session:v})}catch(e){return failModelSelection(e,y)}v=H.session;let U=H.model;M&&await emitStepStarted(M,y,requireSessionModelReference(v).id,z);let W=detectPromptCachePath(U),G=W.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,ie=buildGatewayAttributionHeaders(U,t.runtimeIdentity);({messages:z,session:v}=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:y,messages:z,model:U,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0}));let K=getApprovedTools(v),q=v.outputSchema===void 0&&V!==void 0&&isScheduleAppAuth(V.get(AuthKey))&&V.get(ParentSessionKey)===void 0,ae=await hydrateSandboxAttachments(z),J=[],Y=[];for(let e of ae)e.role===`system`?J.push(e):Y.push(e);if(V!==void 0){J.push(...buildDynamicInstructionMessages(V));let e=V.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&J.push({role:`system`,content:e})}q&&J.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let X=Y,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=v.agent.system?[{role:`system`,content:v.agent.system}]:[],r=J.length>0||t.length>0?[...t,...n,...J]:void 0,i=r!==void 0&&G?applySystemCacheBreakpoint(r,G):r,a=i===void 0?v.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:u,emissionState:y,environment,modelInput:{instructions:a,messages:X},session:v})}},oe=t.tools,runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...X,{role:`user`,content:e.trailingUserNote}]:X,o=buildHarnessToolsWithDynamicSubagents(t.tools,V),s=getAdvertisedTools({session:v,tools:o});oe=s;let c=await buildToolSetWithProviderTools({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(v),tools:s,webSearchProvider:t.webSearchProvider});if(V!==void 0){let n=getAdvertisedTools({session:v,tools:buildDynamicTools(V)}),r=buildToolSetFromDefinitions({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){if(s.get(e)?.runtimeAction!==void 0)throw Error(`Dynamic tool "${e}" collides with a runtime-visible subagent.`);c[e]=t}}v.outputSchema!==void 0&&(c[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(v.outputSchema));let l=M===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:M,emissionState:y,tools:e}),d=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:c,session:v,tools:s,workflow:d});v=f.session;let p=f.modelTools,h=G?applyLastToolCacheBreakpoint(p,G):p,g=t.instrumentation?.hooks,_=activeTurnId(y),b=g===void 0?void 0:{attemptId:`${v.sessionId}:${_}:${y.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:u?.functionId??m,rootSessionId:E?.rootSessionId??v.sessionId,sessionId:v.sessionId,stepIndex:y.stepIndex,turnId:_},S=b===void 0||g===void 0?void 0:createAiSdkHookBridge(b,g,t.instrumentation?.runInContext),C=buildStepHooks({cachePath:W,emit:M,emissionState:y,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:G,session:v}),w=new ToolLoopAgent({headers:ie,instructions:n,model:U,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:C.onStepFinish,prepareStep:C.prepareStep,reasoning:v.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(u,m,i,S),toolApproval:buildToolApproval(p),tools:h}),executeModelCall=async()=>{if(M){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await w.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(M,y,r.fullStream,{excludedActionToolNames:n,tools:s});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([C.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(M,y,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:o,tools:s});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await w.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await C.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return b!==void 0&&await g?.publish({scope:b,type:`attempt.completed`}),e}catch(e){return b!==void 0&&await g?.publish({error:e,scope:b,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},se=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:se++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:v.sessionId,turnId:y.turnId},t.abortSignal),ce=prepareModelCallInput(),le=await continuePendingWorkflowInterrupt({childResults:I?.runtimeActionResults,config:t,emit:M,emissionState:y,runStep,session:v,tools:buildHarnessToolsWithDynamicSubagents(t.tools,V)});if(le!==null)return le;let ue=await enforceSessionTokenLimit({config:t,emit:M,emissionState:y,messages:z,session:v});if(ue!==null)return ue;let Z;try{Z=await runOneModelCall({preparedInput:ce,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:q,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(g&&recordErrorOnSpan(g,n),!M)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:v.sessionId,turnId:y.turnId}),y=await emitRecoverableFailedTurn(M,y,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:v.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(v,y)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),l=c===null?extractUpstreamRejectionMessage(n):null,u=c?.message??l?.message??toErrorMessage(n),f=c?.hint===void 0?u:`${u} ${c.hint}`,p=extractModelCallErrorDetails(n),m=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:l}),h=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||l!==null,sessionId:v.sessionId,turnId:y.turnId});if(o===`terminal`)return c===null?log.error(l?.message??`model call failed terminally`,h):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:v.sessionId,turnId:y.turnId}),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:v};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(l?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,h),n;return log.error(l?.message??`model call failed; failing the task run`,h),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:{done:!0,isError:!0,output:f},session:v}}log.error(l?.message??`model call failed — parking session for retry by the user`,h),y=await emitRecoverableFailedTurn(M,y,{code:`MODEL_CALL_FAILED`,continuationToken:v.continuationToken,details:m,message:u});let _={isError:!0,output:f};return{next:null,session:setHarnessEmissionState(v,y),settledTurn:_}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(v.state),turnId:y.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});v=setTurnUsageState(v,Q);let $;try{$=formatLanguageModelGatewayId(U)}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":t.tools.size}),handleStepResult({config:t,emit:M,emissionState:y,promptMessages:z,result:Z,runStep,session:v,runtimeActionTools:oe})}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:r,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(r,i),...a}:{errorId:i,message:toErrorMessage(r),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}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:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),h=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let _=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:g}),y=_.messages,b={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},x=t.workflow===!0?readWorkflowContinuationSecurity(b):void 0;if(x!==void 0){let e=await getWorkflowSandboxInterrupt(i,x);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:b,emissionState:o,interrupt:e,promptMessages:r,responseMessages:y})}}let S=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),C=new Set(S.map(e=>e.action.callId)),w=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...C])}),T=[...S,...w],D=getAdvertisedTools({session:b,tools:e.runtimeActionTools}),O=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>e.runtimeActionTools.get(t.toolName)?.runtimeAction!==void 0).filter(e=>D.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:b.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:D}));if(O.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:O,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:y,session:{...b,history:[...r]}}),o)};if(T.length>0){let e=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:T,responseMessages:y,session:{...b,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:T,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:hasDeferredStepInput(e)?a:null,session:e}}let k=findAuthorizationSignalFromToolResults(i.toolResults);if(k){let{challenges:e}=k;if(n){for(let t of getSupersededAuthorizationChallenges(b.state,e))await n(createAuthorizationCompletedEvent({authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode))}return{next:null,session:setHarnessEmissionState({...b,history:[...r],state:setPendingAuthorization(b.state,{challenges:e})},o)}}let ee=y,te=[...r,...ee],A={...b,history:te};return!(A.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(ee.at(-1)?.role===`tool`||_.outcomeEndsResponse||hasDeferredStepInput(A))?(n&&(o=advanceStep(o),A=setHarnessEmissionState(A,o)),{next:a,session:A}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h})}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?(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){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(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}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}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(e.force!==!0&&!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal,e.force===!0),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{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))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{appendMissingToolResultMessages,createToolLoopHarness};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.33.
|
|
1
|
+
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.33.1`,WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};function resolveFallbackPackageVersion(){return BUNDLED_FALLBACK_PACKAGE_VERSION.startsWith(`__`)?`0.0.0`:BUNDLED_FALLBACK_PACKAGE_VERSION}const FALLBACK_PACKAGE_INFO={name:EVE_PACKAGE_NAME,version:resolveFallbackPackageVersion()};function resolveCurrentModulePath(){return typeof __filename==`string`?__filename:resolveCurrentModulePathFromStack()}function resolveCurrentModulePathFromStack(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(e,t)=>t;let e=Error().stack?.[0]?.getFileName();if(typeof e!=`string`||e.length===0)throw Error(`Failed to resolve the current module path from the stack trace.`);return e.startsWith(`file:`)?fileURLToPath(e):e}finally{Error.prepareStackTrace=e}}const require=createRequire(resolveCurrentModulePath());function tryResolveVerifiedPackageRoot(e){try{let t=realpathSync.native(e);return tryReadInstalledPackageInfo(t,EVE_PACKAGE_NAME)===void 0?void 0:dirname(t)}catch{return}}function findNearestVerifiedPackageRoot(e){let t=e;for(;;){let e=tryResolveVerifiedPackageRoot(join(t,`package.json`));if(e!==void 0)return e;let n=dirname(t);if(n===t)return;t=n}}function tryResolveDirectBuildLocation(e){let t=dirname(e);for(;;){if(basename(t)===`dist`){let e=tryResolveVerifiedPackageRoot(join(dirname(t),`package.json`));if(e!==void 0)return{packageBuildRoot:t,packageRoot:e}}let e=dirname(t);if(e===t)return;t=e}}function isSourceCheckout(e){return existsSync(join(e,`src`,`internal`,`application`,`package.ts`))}function tryCreatePackageLocation(e){if(isSourceCheckout(e))return{packageBuildRoot:null,packageRoot:e};let n=join(e,`dist`);if(existsSync(n))return{packageBuildRoot:n,packageRoot:e}}function resolveSelfPackageJsonPath(t){return createRequire(t).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),i=tryResolveDirectBuildLocation(n);if(i!==void 0)return i;let a=findNearestVerifiedPackageRoot(dirname(n));if(a!==void 0&&isSourceCheckout(a))return{packageBuildRoot:null,packageRoot:a};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let o=a===void 0?void 0:tryCreatePackageLocation(a);if(o!==void 0)return o;throw Error(`Failed to resolve the eve package root from "${e}".`)}function resolvePackageLocation(){return cachedPackageLocation??=resolvePackageLocationFromModulePath(resolveCurrentModulePath()),cachedPackageLocation}function resolvePackageBuildRoot(){return resolvePackageLocation().packageBuildRoot}function resolvePackageRoot(){return resolvePackageLocation().packageRoot}function tryResolvePackageRoot(){try{return resolvePackageRoot()}catch{return}}function rewriteSourceFilePathForBuild(e){return e.replace(/\.[cm]?tsx?$/,`.js`)}function resolvePackageSourceFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),e):join(t,rewriteSourceFilePathForBuild(e))}function resolvePackageSourceDirectoryPath(e){let t=resolvePackageBuildRoot();return join(t===null?resolvePackageRoot():t,e)}function resolvePackageDependencyPath(e){return require.resolve(e)}function resolvePackageCompiledFilePath(e){let t=resolvePackageBuildRoot();return t===null?join(resolvePackageRoot(),`.generated`,`compiled`,e.replace(/^src\/compiled\//,``)):join(t,e)}function normalizeInstalledPackageInfo(e){let t=e;if(!(typeof t.name!=`string`||typeof t.version!=`string`))return{name:t.name,version:t.version}}function tryReadInstalledPackageInfo(e,t){let r=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(r?.name===t)return r}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolvePackageRoot(),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;try{let e=tryReadInstalledPackageInfo(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME);if(e)return cachedPackageInfo=e,cachedPackageInfo}catch{}return cachedPackageInfo={...FALLBACK_PACKAGE_INFO},cachedPackageInfo}function readWorkflowVersionFromManifest(e){let t=e;for(let e of[t.devDependencies,t.dependencies,t.peerDependencies]){let t=e?.[`@workflow/core`];if(typeof t==`string`&&t.trim().length>0)return t}}function resolveExpectedWorkflowVersion(){let e=tryResolvePackageRoot();if(e!==void 0)try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(join(e,`package.json`),`utf8`)))}catch{}try{return readWorkflowVersionFromManifest(JSON.parse(readFileSync(require.resolve(`${EVE_PACKAGE_NAME}/package.json`),`utf8`)))}catch{return}}function resolveWorkflowModulePath(e){if(e===`workflow`)return resolvePackageSourceFilePath(`src/internal/workflow/index.ts`);if(e===`workflow/api`||e===`workflow/runtime`)return resolvePackageSourceFilePath(`src/internal/workflow/runtime.ts`);if(e===`workflow/internal/builtins`)return resolvePackageSourceFilePath(`src/internal/workflow/builtins.ts`);let t=WORKFLOW_MODULE_ALIASES[e];return t===void 0?require.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.58`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.33.
|
|
1
|
+
import{pinnedNodeEngineMajor}from"../../node-engine.js";import{SUPPORTED_AUTHORED_MODULE_FILE_EXTENSIONS}from"../update/module-files.js";import{pathExists,writeTextFile}from"../files.js";import{blockingCreateInPlaceEntries}from"../create-in-place.js";import{resolveVersionToken}from"../version-tokens.js";import{applyPackageManagerWorkspaceConfiguration,isPackageManagerWorkspaceMember,patchWorkspaceRootPackageJson}from"../workspace-root.js";import{WEB_APP_TEMPLATE_FILES}from"./web-template.js";import{mkdir,readdir,stat}from"node:fs/promises";import{basename,join,resolve}from"node:path";const CURRENT_DIRECTORY_PROJECT_NAME=`.`,DEFAULT_AI_PACKAGE_VERSION=`^7.0.58`,DEFAULT_CONNECT_PACKAGE_VERSION=`0.4.3`,DEFAULT_ZOD_PACKAGE_VERSION=`4.4.3`,DEFAULT_EVE_PACKAGE_CONTRACT={version:`0.33.1`,nodeEngine:`>=24`};function resolveEvePackageContract(e=DEFAULT_EVE_PACKAGE_CONTRACT){return{version:resolveVersionToken(`evePackage.version`,e.version),nodeEngine:resolveVersionToken(`evePackage.nodeEngine`,e.nodeEngine)}}function modelProviderSlug(e){let t=(e.split(`/`)[0]??``).replaceAll(/[^A-Za-z0-9._-]/gu,``);return t.length>0?t:`anthropic`}function byokProviderEnvVar(e){let t=modelProviderSlug(e).toUpperCase().replaceAll(/[^A-Z0-9]/gu,`_`);return`${/^[0-9]/.test(t)?`_`:``}${t}_API_KEY`}function agentTemplateFiles(e,t){return{"agent/agent.ts":BASE_AGENT_TEMPLATE.replaceAll(`__EVE_INIT_MODEL__`,e).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t)),"agent/channels/eve.ts":WEB_APP_TEMPLATE_FILES[`agent/channels/eve.ts`],"agent/instructions.md":AGENT_INSTRUCTIONS_TEMPLATE}}function reasoningTemplateLine(e){return e===void 0||e===`provider-default`?``:` reasoning: "${e}",\n`}function renderTemplate(e,t){return e.replaceAll(`__EVE_INIT_APP_NAME__`,t.appName).replaceAll(`__EVE_INIT_MODEL__`,t.model).replaceAll(`__EVE_INIT_REASONING__`,reasoningTemplateLine(t.reasoning)).replaceAll(`__EVE_INIT_BYOK_PROVIDER__`,modelProviderSlug(t.model)).replaceAll(`__EVE_INIT_BYOK_ENV_VAR__`,byokProviderEnvVar(t.model)).replaceAll(`__EVE_INIT_PACKAGE_VERSION__`,formatEveDependencySpecifier(t.eveVersion)).replaceAll(`__EVE_INIT_AI_SDK_VERSION__`,t.aiPackageVersion).replaceAll(`__EVE_INIT_CONNECT_VERSION__`,t.connectPackageVersion).replaceAll(`__EVE_INIT_ZOD_VERSION__`,t.zodPackageVersion).replaceAll(`__EVE_INIT_TYPESCRIPT_VERSION__`,t.typescriptPackageVersion).replaceAll(`__EVE_INIT_TYPES_NODE_VERSION__`,t.nodeTypesVersion).replaceAll(`__EVE_INIT_NODE_ENGINE__`,t.nodeEngine)}function formatEveDependencySpecifier(e){return/^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z-.]+)?$/.test(e)?`^${e}`:e}const BASE_AGENT_TEMPLATE=`import { defineAgent } from "eve";
|
|
2
2
|
|
|
3
3
|
export default defineAgent({
|
|
4
4
|
model: "__EVE_INIT_MODEL__",
|