eve 0.54.2 → 0.54.3
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 +9 -0
- package/dist/src/cli/dev/tui/setup-commands.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +3 -1
- package/dist/src/compiled/just-secrets/LICENSE +21 -0
- package/dist/src/compiled/just-secrets/index.d.ts +20 -0
- package/dist/src/compiled/just-secrets/index.js +2 -0
- package/dist/src/compiled/just-secrets/windows.ps1 +138 -0
- package/dist/src/compiler/extension-compatibility.d.ts +6 -6
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/normalize-manifest-helpers.d.ts +2 -1
- package/dist/src/compiler/normalize-manifest-helpers.js +1 -1
- package/dist/src/compiler/normalize-manifest.js +1 -1
- package/dist/src/compiler/resolve-workspace-subagent.d.ts +13 -0
- package/dist/src/compiler/resolve-workspace-subagent.js +1 -0
- package/dist/src/execution/durable-session-migrations/snapshot.d.ts +0 -16
- package/dist/src/execution/durable-session-migrations/snapshot.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/harness/compaction.js +1 -1
- package/dist/src/harness/messages.d.ts +1 -1
- package/dist/src/harness/messages.js +1 -1
- package/dist/src/harness/step-hooks.d.ts +16 -10
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/harness/tool-loop.js +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/nitro/routes/index.d.ts +6 -0
- package/dist/src/internal/nitro/routes/index.js +7 -7
- package/dist/src/internal/vercel/assemble-eve-services.js +1 -1
- package/dist/src/internal/vercel/build-agent-workspace.js +1 -1
- package/dist/src/internal/vercel/build-multi-agent-landing-page.d.ts +3 -0
- package/dist/src/internal/vercel/build-multi-agent-landing-page.js +1 -0
- package/dist/src/internal/vercel/eve-service-contribution.d.ts +4 -0
- package/dist/src/internal/vercel/eve-service-contribution.js +1 -1
- package/dist/src/public/definitions/workspace-agent.d.ts +25 -0
- package/dist/src/public/definitions/workspace-agent.js +1 -0
- package/dist/src/public/index.d.ts +1 -0
- package/dist/src/public/index.js +1 -1
- package/dist/src/public/models/openai/chatgpt/credential-store.d.ts +22 -4
- package/dist/src/public/models/openai/chatgpt/credential-store.js +1 -1
- package/dist/src/public/models/openai/chatgpt/oauth.d.ts +6 -4
- package/dist/src/public/models/openai/chatgpt/token-broker.js +1 -1
- package/dist/src/setup/flows/chatgpt-auth.js +1 -1
- package/dist/src/setup/flows/model.d.ts +0 -2
- package/dist/src/setup/flows/model.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/docs/guides/instrumentation.md +9 -0
- package/docs/reference/typescript-api.md +7 -3
- package/docs/subagents/index.mdx +31 -0
- package/package.json +2 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import type { PrepareStepFunction, ProviderMetadata, StepResult, ToolSet } from "ai";
|
|
1
|
+
import type { GenerateTextOnStepStartCallback, PrepareStepFunction, ProviderMetadata, StepResult, ToolSet } from "ai";
|
|
2
2
|
import type { HarnessEmissionState } from "#harness/emission.js";
|
|
3
3
|
import { type AnthropicCacheMarker, type PromptCachePath } from "#harness/prompt-cache.js";
|
|
4
4
|
import { type HarnessEmitFn, type HarnessSession, type ToolLoopHarnessConfig } from "#harness/types.js";
|
|
5
5
|
/**
|
|
6
6
|
* The subset of `StepResult` that the harness reads after a step completes.
|
|
7
7
|
*
|
|
8
|
-
* Used by both the streaming (`
|
|
8
|
+
* Used by both the streaming (`onStepEnd` callback) and non-streaming
|
|
9
9
|
* (`generateText` result) code paths.
|
|
10
10
|
*/
|
|
11
11
|
export type HarnessStepResult = Pick<StepResult<ToolSet>, "content" | "finishReason" | "providerMetadata" | "response" | "text" | "toolCalls" | "toolResults" | "usage"> & {
|
|
@@ -20,7 +20,7 @@ interface StepHooksInput {
|
|
|
20
20
|
readonly emit?: HarnessEmitFn;
|
|
21
21
|
readonly emissionState: HarnessEmissionState;
|
|
22
22
|
/**
|
|
23
|
-
* When `false`, `
|
|
23
|
+
* When `false`, `onStepStart` skips the `step.started` emission.
|
|
24
24
|
* Used by the harness recovery path to avoid emitting `step.started`
|
|
25
25
|
* twice when retrying the same step with a degraded toolset.
|
|
26
26
|
*
|
|
@@ -35,21 +35,27 @@ interface StepHooksInput {
|
|
|
35
35
|
*/
|
|
36
36
|
interface StepHooks {
|
|
37
37
|
/**
|
|
38
|
-
* `ToolLoopAgent` `
|
|
38
|
+
* `ToolLoopAgent` `onStepStart` callback.
|
|
39
|
+
*
|
|
40
|
+
* Emits the `step.started` event from the prepared step input.
|
|
41
|
+
*/
|
|
42
|
+
readonly onStepStart: GenerateTextOnStepStartCallback<ToolSet>;
|
|
43
|
+
/**
|
|
44
|
+
* `ToolLoopAgent` `onStepEnd` callback.
|
|
39
45
|
*
|
|
40
46
|
* Emits `actions.requested`, `action.result`, and `step.completed` events
|
|
41
47
|
* from the captured step result.
|
|
42
48
|
*/
|
|
43
|
-
readonly
|
|
49
|
+
readonly onStepEnd: (step: StepResult<ToolSet>) => Promise<void>;
|
|
44
50
|
/**
|
|
45
51
|
* `ToolLoopAgent` `prepareStep` callback.
|
|
46
52
|
*
|
|
47
|
-
* Handles
|
|
48
|
-
*
|
|
53
|
+
* Handles cache/provider metadata. Compaction happens in the tool-loop
|
|
54
|
+
* before `agent.stream()`.
|
|
49
55
|
*/
|
|
50
56
|
readonly prepareStep: PrepareStepFunction<ToolSet>;
|
|
51
57
|
/**
|
|
52
|
-
* Promise that resolves when `
|
|
58
|
+
* Promise that resolves when `onStepEnd` has completed.
|
|
53
59
|
*
|
|
54
60
|
* Await this after consuming the stream to ensure all step events
|
|
55
61
|
* have been emitted before proceeding to post-step handling.
|
|
@@ -61,14 +67,14 @@ interface StepHooks {
|
|
|
61
67
|
*
|
|
62
68
|
* Never settles when the step does not finish — e.g. the AI SDK's
|
|
63
69
|
* incomplete-stream rejection (`NoOutputGeneratedError`) skips
|
|
64
|
-
* `
|
|
70
|
+
* `onStepEnd` entirely. Consumers must surface stream errors as
|
|
65
71
|
* throws before awaiting this promise (`emitStreamContent` does), or
|
|
66
72
|
* the await hangs.
|
|
67
73
|
*/
|
|
68
74
|
readonly stepResult: Promise<HarnessStepResult>;
|
|
69
75
|
}
|
|
70
76
|
/**
|
|
71
|
-
* Builds composable `prepareStep
|
|
77
|
+
* Builds composable `onStepStart`, `prepareStep`, and `onStepEnd` closures that
|
|
72
78
|
* own all step-internal work: emission, compaction, and prompt caching.
|
|
73
79
|
*
|
|
74
80
|
* The harness passes these hooks to `ToolLoopAgent` and reads the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{emitStepStarted}from"#harness/emission.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{createRuntimeToolResultFromMessagePart,createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError}from"#harness/action-result-helpers.js";import{isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyConversationCacheControl,mergeGatewayAutoCaching}from"#harness/prompt-cache.js";import{mergeProviderSafetyIdentifier}from"#harness/provider-safety.js";import{requireSessionModelReference}from"#harness/types.js";function buildStepHooks(e){let t=e.session,n=e.emit,r;return{
|
|
1
|
+
import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{emitStepStarted}from"#harness/emission.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{createRuntimeToolResultFromMessagePart,createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError}from"#harness/action-result-helpers.js";import{isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyConversationCacheControl,mergeGatewayAutoCaching}from"#harness/prompt-cache.js";import{mergeProviderSafetyIdentifier}from"#harness/provider-safety.js";import{requireSessionModelReference}from"#harness/types.js";function buildStepHooks(e){let t=e.session,n=e.emit,r;return{onStepEnd:async e=>{r(e)},onStepStart:async({messages:r})=>{n&&e.emitStepStarted!==!1&&await emitStepStarted(n,e.emissionState,requireSessionModelReference(t).id,r)},prepareStep:async({messages:n})=>{let r=n;e.cachePath.kind===`anthropic-direct`&&e.marker&&(r=applyConversationCacheControl([...n],e.marker));let i={messages:r},a=requireSessionModelReference(t),o=mergeProviderSafetyIdentifier(a,a.providerOptions,e.auth??contextStorage.getStore()?.get(AuthKey)??null);return e.cachePath.kind===`gateway-auto`?i.providerOptions=mergeGatewayAutoCaching(o):o!==void 0&&(i.providerOptions=o),i},stepResult:new Promise(e=>{r=e})}}async function emitStepActions(e,t,n,r){let i=new Set(n.toolCalls.filter(isProviderExecutedToolCall).map(e=>e.toolCallId)),a=new Set([...r.excludedActionCallIds??[],...i,...extractToolApprovalInputRequests({content:n.content??[],excludedCallIds:r.excludedActionCallIds}).map(e=>e.action.callId),...n.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId)]),isExcluded=(e,t)=>a.has(e)||r.excludedActionToolNames.has(t),o=n.toolCalls.filter(e=>!isExcluded(e.toolCallId,e.toolName)&&!r.emittedActionCallIds?.has(e.toolCallId)).map(e=>createPresentedRuntimeActionRequestFromToolCall({toolCall:e,tools:r.tools}));o.length>0&&await e(createActionsRequestedEvent({actions:o.map(({action:e})=>e),presentation:collectActionPresentation(o),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));let s=r.handledInlineToolResultCallIds,c=new Map(n.toolResults.map(e=>[e.toolCallId,e.output]));for(let r of reconcileToolResults(n)){if(isExcluded(r.callId,r.toolName)||s?.has(r.callId))continue;let n=c.get(r.callId);shouldSkipAuthorizationActionResult(r.callId,n)||await e(createActionResultEvent({result:r,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}))}await e(createStepCompletedEvent({finishReason:normalizeAssistantStepFinishReason(n.finishReason),providerMetadata:extractStepProviderMetadata(n.providerMetadata),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId,usage:extractStepUsage({costUsd:extractGatewayCostUsd(n.providerMetadata),usage:n.usage})}))}function isProviderExecutedToolCall(e){return e.providerExecuted===!0}function reconcileToolResults(e){let t=new Map;for(let n of e.toolResults)n.providerExecuted!==!0&&t.set(n.toolCallId,createRuntimeToolResultFromStepResult(n));for(let n of e.content??[])n.type===`tool-error`&&n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromToolError(n)));for(let n of extractToolResultParts(e.response.messages))n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromMessagePart(n)));return[...t.values()]}function shouldSkipAuthorizationActionResult(e,t){if(t!==void 0&&isPendingAuthorizationToolOutput(t))return!0;let n=contextStorage.getStore();if(n===void 0)return!1;let r=readToolInterrupt(n,e);return r!==void 0&&isAuthorizationSignal(r)}function extractToolResultParts(e){let t=[];for(let n of e)if(n.role===`tool`&&Array.isArray(n.content))for(let e of n.content)e.type===`tool-result`&&t.push(e);return t}function extractStepUsage(e){let t={};e.costUsd!==void 0&&(t.costUsd=e.costUsd);let n=e.usage;return n===void 0?Object.keys(t).length>0?t:void 0:(n.inputTokens!==void 0&&(t.inputTokens=n.inputTokens),n.outputTokens!==void 0&&(t.outputTokens=n.outputTokens),n.inputTokenDetails?.cacheReadTokens!==void 0&&(t.cacheReadTokens=n.inputTokenDetails.cacheReadTokens),n.inputTokenDetails?.cacheWriteTokens!==void 0&&(t.cacheWriteTokens=n.inputTokenDetails.cacheWriteTokens),Object.keys(t).length>0?t:void 0)}function extractStepProviderMetadata(e){let t=readGatewayGenerationId(e);return t===void 0?void 0:{gateway:{generationId:t}}}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 readGatewayGenerationId(e){let t=readGatewayMetadata(e)?.generationId;return typeof t==`string`&&t.length>0?t:void 0}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}export{buildStepHooks,emitStepActions,readGatewayGenerationId};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import{readClientContext}from"#internal/client-context.js";import{createErrorId,createLogger,formatError,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey,ParentSessionKey,ScheduleIdKey,SessionCallbackKey,TurnTaskDeliveryKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageCompletedEvent,createResultCompletedEvent,createSessionWaitingEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{createFrameworkUserMessage,createUserMessage,frameworkMessageKindForStepInput,normalizeModelMessages,normalizeUserContent,resolveAssistantStepText,validateHarnessModelMessages}from"#harness/messages.js";import{buildDynamicTools,buildResponseAuthorizationTools}from"#context/build-dynamic-tools.js";import{BoundaryHookError}from"#shared/boundary-hook-error.js";import{drainMemoryCommit,prepareMemoryCompaction,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,clearMemorySessionState,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{projectParkedAgentHandles,resolveAgentsAnnouncement}from"#subagents/handles/prompt.js";import{renderPendingApprovalsInstruction,renderPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";import{getPendingInputBatches,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{getAgentHandleStore}from"#subagents/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createCoordinationRequestFromToolCall,resolvePendingCoordination,setPendingCoordinationBatch}from"#harness/coordination.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskInterrupts,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{ASK_QUESTION_TOOL_NAME}from"#harness/request-input-tool.js";import{getSupersededAuthorizationChallenges,setPendingAuthorization}from"#harness/authorization.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{BackgroundToolExecutorKey,createBackgroundToolCallBatch}from"#harness/background-tools.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{buildDynamicInstructionMessages,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{resolveInitiatingTaskContext}from"#tasks/delivery-context.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{getApprovalAuditState,markApprovalCandidateHistoryEventEmitted,markApprovalCandidatePendingEventEmitted,markApprovalSettlementEventEmitted}from"#harness/approval-candidates.js";import{clearTurnClientContextState,getTurnClientContextState,setTurnClientContextState}from"#harness/turn-client-context.js";import{EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{createCurrentMessages}from"#harness/current-messages.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{mergeProviderSafetyIdentifier}from"#harness/provider-safety.js";import{requireSessionModelReference}from"#harness/types.js";import{emitWorkflowActionResults,emitWorkflowActionsRequested}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionUsageLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{coordinateApprovalDelivery,shouldPrepareApprovalReplayTools}from"#harness/approval-delivery-coordinator.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{resolveDeliveryPolicy}from"#tasks/delivery-policy.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#harness/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
|
|
2
2
|
|
|
3
|
-
`)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(e){let t=e.handleEvent;async function runStep(t,n){return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},e=>executeStepBody(e.session,n,e))??executeStepBody(t,n)}async function executeStepBody(n,r,i){let a=n,o=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});o(a.history,a.state);let projectHistory=(e,t)=>o(e,t).messages,s=getHarnessEmissionState(a.state),c=contextStorage.getStore(),l=c?.get(ParentSessionKey),u=c?.get(SessionCallbackKey),d=l!==void 0||u!==void 0,f,p=i?.createHandleEvent({getAttemptScope:()=>f,handleEvent:t,turnId:activeTurnId(s)})??t,failModelSelection=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),i?.recordError(t),!p)throw t;let r=createErrorId(),o=toErrorMessage(t);return log.error(`model selection failed terminally`,{error:t,errorId:r,sessionId:a.sessionId,turnId:n.turnId}),await emitFailedStep(p,n,{code:`MODEL_SELECTION_FAILED`,details:{errorId:r},message:o,sessionId:a.sessionId}),{next:e.mode===`task`||d?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:a}},failBoundaryEvent=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),isTurnCancellation(t))throw t;if(isDynamicModelSelectionError(t))return failModelSelection(t,n);if(!p||e.mode!==`conversation`||!(t instanceof BoundaryHookError))throw t;i?.recordError(t);let r=createErrorId(),o=toErrorMessage(t);return log.error(`turn boundary handler failed — parking session`,{error:t,errorId:r,sessionId:a.sessionId,turnId:n.turnId}),s=await emitRecoverableFailedTurn(p,n,{code:`EVENT_HANDLER_FAILED`,continuationToken:a.continuationToken,details:{errorId:r},message:o}),{next:null,session:setHarnessEmissionState({...a,outputSchema:void 0},s),settledTurn:{isError:!0,output:o}}},preparePreambleTrace=async()=>await i?.preparePreamble({sequence:s.sequence,sessionStarted:s.sessionStarted,traceContext:i?.traceContext,turnId:`turn_${s.sequence}`});if(e.clearOnly===!0)return a={...a,state:clearMemorySessionState(a.state)},a=replaceSessionHistory(a,[]),await p?.(createContextClearedEvent({sequence:s.sequence,sessionId:a.sessionId,turnId:activeTurnId(s)})),await p?.(createSessionWaitingEvent()),{next:null,session:a};if(e.compactOnly===!0){if(a.history.length>0)try{let t=contextStorage.getStore(),n=await resolveActiveRuntimeModel({config:e,ctx:t,session:a});a=n.session,a=(await maybeCompact({abortSignal:e.abortSignal,auth:t?.get(AuthKey)??null,emit:p,emissionState:{...s,turnId:activeTurnId(s)},force:!0,historyProjector:e.historyProjector,messages:[...a.history],model:n.model,onCompaction:e.onCompaction,resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:a,telemetry:i?.telemetry()})).session}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:a.sessionId})}return await p?.(createSessionWaitingEvent()),{next:null,session:a}}let m=consumeDeferredStepInput({input:r,preferCurrentInput:e.mode!==`conversation`&&r!==void 0&&hasPendingApprovalBatch(a),session:a});a=m.session;let h=await resolvePendingCoordination({emit:p,session:a,stepInput:m.input,tools:e.tools});if(h.outcome===`unresolved`)return{next:null,session:h.session};a=h.session;let g=getPendingInputRequestIds(a.state),_=convertStaleResponsesToUserMessage({history:h.messages,pendingRequestIds:g,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:g,stepInput:m.input}),tools:e.tools}),v=_.stepInput,y=_.kind===`converted`?{...v,message:_.displayMessage}:v,b=contextStorage.getStore();b!==void 0&&e.resolveStepDynamicTools!==void 0&&shouldPrepareApprovalReplayTools({session:a,stepInput:v})&&await e.resolveStepDynamicTools({ctx:b,event:createStepStartedEvent({modelId:a.agent.modelReference?.id??`dynamic`,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}),messages:projectHistory(h.messages,a.state)});let x=shouldPrepareApprovalReplayTools({session:a,stepInput:v})?buildResponseAuthorizationTools({authoredTools:e.tools,context:b}):e.tools,S=await coordinateApprovalDelivery({session:a,stepInput:v,tools:x});if(a=S.session,p){for(let e of S.feedback)await p(createMessageCompletedEvent({message:e,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));let e=getApprovalAuditState(a.state);for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await p(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:a.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await p(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:a.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await p(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:a.state})}}if(S.kind===`park`)return{next:null,session:a};if(S.kind===`continue-coordination`)return{next:runStep,session:S.stepInput===void 0?a:queueDeferredStepInput(a,S.stepInput)};if(S.challenges.length>0){if(p)for(let e of S.challenges)await p(createAuthorizationRequiredEvent({authorization:e.challenge,candidateId:e.candidateId,description:e.challenge.instructions??`Authorization required for ${e.name}`,name:e.name,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId,webhookUrl:e.hookUrl}));let e=S.stepInput===void 0?a:queueDeferredStepInput(a,S.stepInput);return{next:null,session:{...e,state:setPendingAuthorization(e.state,{challenges:S.challenges})}}}let C=resolvePendingInput({deferMessagesWhileApprovalsPending:e.mode!==`conversation`,history:h.messages,resolveApprovalKey:resolveApprovalKeyFromTools(x),session:a,stepInput:S.stepInput});if(C.outcome===`unresolved`){let t=h.outcome===`resolved`?{...C.session,history:validateHarnessModelMessages(h.messages)}:C.session;if(p&&e.mode===`conversation`&&C.deferredMessage===!0&&hasStepInput(r)){c!==void 0&&prepareDynamicInstructionPreamble(c,projectHistory(t.history,t.state));let n=[];try{let t=await preparePreambleTrace();s=await emitTurnPreamble(p,y??{},s,e.runtimeIdentity,t)}catch(e){return n=c===void 0?[]:drainDynamicInstructionUserMessages(c),t={...t,history:validateHarnessModelMessages([...t.history,...n])},a=t,failBoundaryEvent(e,{sessionStarted:!0,sequence:s.sequence,stepIndex:0,turnId:`turn_${s.sequence}`})}return n=c===void 0?[]:drainDynamicInstructionUserMessages(c),t={...t,history:validateHarnessModelMessages([...t.history,...n])},s=await emitTurnEpilogue(p,s,e.mode),{next:null,session:setHarnessEmissionState(t,s)}}return h.outcome===`resolved`?(p&&e.mode===`conversation`&&(s=await emitTurnEpilogue(p,s,e.mode),t=setHarnessEmissionState(t,s)),{next:null,session:t}):{next:null,session:C.session}}if(C.resolvedInputs!==void 0)for(let e of C.resolvedInputs)await i?.publishInputResolutions({batch:e,sessionId:a.sessionId}),p&&await p(createInputResolvedEvent({resolutions:e.inputs.map(e=>{let t={kind:e.request.kind,outcome:e.outcome,requestId:e.request.requestId};return e.response===void 0?t:{...t,response:e.response}}),sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(p&&C.rejectedActions)for(let e of C.rejectedActions)for(let t of e.results)await p(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));let w=activeTurnId(s),T=getTurnClientContextState(C.session.state,w),E=C.deferredContext===!0?void 0:readClientContext(v),D=(E??T?.messages)?.map(e=>createFrameworkUserMessage(`context.instruction`,e))??[],O=[];if(v?.context!==void 0&&C.deferredContext!==!0)for(let e of v.context)O.push(createFrameworkUserMessage(`context.instruction`,e));let k=frameworkMessageKindForStepInput(v),A=normalizeUserContent(v?.message),j=A!==void 0&&!C.deferredMessage&&!C.consumedMessage?await stageAttachmentsToSandbox(A):void 0;j!==void 0&&O.push(k===void 0?createUserMessage(`user`,j):createFrameworkUserMessage(k,j));let M=[],N;if(p&&hasStepInput(r)){c!==void 0&&(prepareDynamicInstructionPreamble(c,projectHistory(C.session.history,C.session.state)),prepareMemoryPreamble(c,{history:C.messages,input:[...D,...O],state:C.session.state}));try{let t=await preparePreambleTrace();s=await emitTurnPreamble(p,y??{},s,e.runtimeIdentity,t)}catch(e){return M=c===void 0?[]:drainDynamicInstructionUserMessages(c),N=c===void 0?void 0:drainMemoryCommit(c),a={...C.session,history:validateHarnessModelMessages([...N?.history??C.session.history,...M]),state:N?.state??C.session.state},failBoundaryEvent(e,{sessionStarted:!0,sequence:s.sequence,stepIndex:0,turnId:`turn_${s.sequence}`})}M=c===void 0?[]:drainDynamicInstructionUserMessages(c),N=c===void 0?void 0:drainMemoryCommit(c),i?.setTurnId(s.turnId)}let ee=N?.history??C.session.history,P=C.session.history.length;a=setHarnessEmissionState({...C.session,history:validateHarnessModelMessages([...ee,...M]),state:N?.state??C.session.state},s);let F=validateHarnessModelMessages([...N?.history??C.messages.slice(0,P),...M,...N===void 0?C.messages.slice(P):[]]),I=await applySessionLimitContinuation({config:e,emit:p,emissionState:s,limitContinuation:C.limitContinuation,session:a});if(I.result!==null)return I.result;a=I.session;let te=getAgentHandleStore(a.state);if(!hasUnansweredToolCall(F)){let e=await c?.get(BackgroundToolExecutorKey)?.readAgentViews?.(),t=e===void 0||e.length===0?void 0:[...projectParkedAgentHandles(te??{handles:[]}).map(e=>({availability:`available`,id:e.identity.id,name:e.identity.name,statusLine:e.phase===`parked`?e.lastStatus:void 0})),...e],n=resolveAgentsAnnouncement({agentViews:t,messages:projectHistory(F,a.state),store:te});n!==void 0&&F.push(createFrameworkUserMessage(`context.state`,n))}let L=T;E!==void 0&&(L={insertionIndex:T?.insertionIndex??F.length,messages:E,turnId:w}),L!==void 0&&(a=setTurnClientContextState(a,L)),F=[...F,...O];let createModelMessages=e=>{if(L===void 0||L.messages.length===0)return[...e];let t=Math.min(Math.max(0,L.insertionIndex),e.length);return[...e.slice(0,t),...L.messages.map(e=>createFrameworkUserMessage(`context.instruction`,e)),...e.slice(t)]},R=validateHarnessModelMessages(projectHistory(createModelMessages(F),a.state)),z=c,B;try{z!==void 0&&e.dispatchDynamicModelEvent!==void 0&&await e.dispatchDynamicModelEvent({ctx:z,event:{data:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},type:`step.started`},messages:R}),B=await resolveActiveRuntimeModel({config:e,ctx:z,session:a})}catch(e){return failModelSelection(e,s)}a=B.session;let V=B.model,ne=detectPromptCachePath(V),H=ne.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,re=buildGatewayAttributionHeaders(V,e.runtimeIdentity),U=L===void 0?void 0:Math.max(0,F.length-L.insertionIndex),W=await maybeCompact({abortSignal:e.abortSignal,auth:z?.get(AuthKey)??null,emit:p,emissionState:s,historyProjector:e.historyProjector,messages:[...F],model:V,onCompaction:e.onCompaction,promptMessages:createModelMessages(F),resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:a,telemetry:i?.telemetry()});if(a=W.session,W.compacted&&(F=W.messages,L!==void 0&&U!==void 0&&(L={...L,insertionIndex:Math.max(0,F.length-U)},a=setTurnClientContextState(a,L))),R=validateHarnessModelMessages(normalizeModelMessages(projectHistory(createModelMessages(F),a.state))),p)try{await emitStepStarted(p,s,requireSessionModelReference(a).id,R)}catch(e){return failBoundaryEvent(e,s)}let G=getApprovedTools(a,resolveApprovalKeyFromTools(buildResponseAuthorizationTools({authoredTools:e.tools,context:z}))),K=s.sequence===0,ie=K&&z?.get(ScheduleIdKey)!==void 0,q=resolveDeliveryPolicy({hasScheduleProvenance:ie,hasOutputSchema:a.outputSchema!==void 0,isChild:z?.get(ParentSessionKey)!==void 0,isFirstTurn:K,taskDeliveryPhase:z?.get(TurnTaskDeliveryKey)}),J=createCurrentMessages(F,{historyState:z?.get(HistoryStateKey),currentTurnMessages:O,projectedMessages:R});z!==void 0&&J.addSystem(buildDynamicInstructionMessages(z));let ae=z?.get(TurnTaskDeliveryKey)===`initiating`?resolveInitiatingTaskContext({state:a.state,turnId:w}):void 0;J.addAnnouncements({availableSkills:z?.get(PendingSkillAnnouncementKey),taskState:ae?.context,deliveryInstruction:q.instruction});let Y=renderPendingApprovalsInstruction(getPendingInputBatches(a.state).flatMap(e=>e.requests));Y!==void 0&&J.add(Y,`context.state`,{cacheFriendly:!1});let oe=J.history,X=await hydrateSandboxAttachments(J.nonSystemMessages),prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=a.agent.system?[{role:`system`,content:a.agent.system}]:[],r=J.systemMessages.length>0||t.length>0?[...t,...n,...J.systemMessages]:void 0,o=r!==void 0&&H?applySystemCacheBreakpoint(r,H):r,c=o===void 0?a.agent.system??void 0:mergeSystemInstructions(o);return{instructions:c,telemetryRuntimeContext:i?.resolveRuntimeContext({eveVersion,emissionState:s,environment,modelInput:{instructions:c,messages:X},session:a})}},se=e.tools,runSingleModelCall=async t=>{let{instructions:n,telemetryRuntimeContext:r={}}=t.preparedInput??prepareModelCallInput(t.extraSystemNote);t.retryReason&&(r[`eve.retry.reason`]=t.retryReason);let o=t.trailingUserNote?[...X,createFrameworkUserMessage(`execution.retry`,t.trailingUserNote)]:[...X],c=buildHarnessToolsWithDynamicSubagents(e.tools,z),l=createBackgroundToolCallBatch(),u=getAdvertisedTools({session:a,tools:c});se=u;let d=await buildToolSetWithProviderTools({approvedTools:G,backgroundBatch:l,capabilities:e.capabilities,disabledProviderTools:t.disabledProviderTools,modelReference:requireSessionModelReference(a),tools:u});if(z!==void 0){let n=getAdvertisedTools({session:a,tools:buildDynamicTools(z)}),r=buildToolSetFromDefinitions({approvedTools:G,backgroundBatch:l,capabilities:e.capabilities,disabledProviderTools:t.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){let n=u.get(e);if(n?.runtimeAction!==void 0||n?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);d[e]=t}}a.outputSchema!==void 0&&(d[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(a.outputSchema));let m=e.workflow===!0?{maxSubagents:e.workflowMaxSubagents}:void 0,h=await getAdvertisedTools({modelTools:d,session:a,tools:u,workflow:m});a=h.session;let g=h.modelTools,_=H?applyLastToolCacheBreakpoint(g,H):g,v=activeTurnId(s),y=i?.prepareAttempt({attemptIndex:t.attemptIndex,runtimeContext:r,stepIndex:s.stepIndex,turnId:v});f=y?.scope;let b=buildStepHooks({auth:z?.get(AuthKey)??null,cachePath:ne,emit:p,emissionState:s,emitStepStarted:t.suppressStepStartedEmission!==!0,marker:H,session:a}),x={headers:re,instructions:n,model:V,onLanguageModelCallEnd(e){for(let t of e.content)t.type!==`tool-call`||t.providerExecuted===!0||isInvalidToolCall(t)||l.register({callId:t.toolCallId,input:t.input,toolName:t.toolName})},onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:b.onStepFinish,prepareStep:b.prepareStep,reasoning:a.agent.reasoning,runtimeContext:r,stopWhen:isStepCount(1),telemetry:y?.telemetry,toolApproval:buildToolApproval(g),tools:_},S=new ToolLoopAgent(x),executeModelCall=async()=>{if(p){let t=[...e.tools].filter(([e,t])=>t.runtimeAction!==void 0&&u.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...t]),r=await S.stream({abortSignal:e.abortSignal,messages:o}),{emittedActionCallIds:i,handledInlineToolResultCallIds:a,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:d}=await emitStreamContent(p,s,r.fullStream,{excludedActionToolNames:n,tools:u});throwIfTurnAborted(e.abortSignal);let[f,m]=await Promise.all([b.stepResult,r.responseMessages]);if(f.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(f.providerMetadata));if(isEmptyModelResponse(f)&&extractToolResultCallIds(m).size===0&&l.length===0&&d.length===0)throw new EmptyModelResponseError;await emitStepActions(p,s,f,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:a,tools:u});let h=f.toolResults,g=new Map(h.map(e=>[e.toolCallId,e]));for(let e of l)g.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:d,responseMessages:m}),stepResult:f,toolResults:[...g.values()]})}let t=await S.generate({abortSignal:e.abortSignal,messages:o});throwIfTurnAborted(e.abortSignal);let n=await b.stepResult;if(n.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(n.providerMetadata));if(isEmptyModelResponse(n)&&extractToolResultCallIds(t.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:t.responseMessages,stepResult:n})};try{let e=await executeModelCall();return await y?.complete(),e}catch(e){return await y?.fail(e),rethrowNoOutputAsEmptyResponse(e)}},ce=0,runOneModelCall=async t=>runModelCallWithRetries(e=>runSingleModelCall({...t,attemptIndex:ce++,preparedInput:e===1?t.preparedInput:void 0,suppressStepStartedEmission:e!==1||t.suppressStepStartedEmission}),{sessionId:a.sessionId,turnId:s.turnId},e.abortSignal),le=prepareModelCallInput(),ue=await continuePendingWorkflowInterrupt({childResults:v?.runtimeActionResults,config:e,emit:p,emissionState:s,runStep,session:a,tools:buildHarnessToolsWithDynamicSubagents(e.tools,z)});if(ue!==null)return ue;let de=await enforceSessionUsageLimit({config:e,emit:p,emissionState:s,messages:R,session:a});if(de!==null)return de;let Z;try{Z=await runOneModelCall({preparedInput:le,suppressStepStartedEmission:!0})}catch(t){throwIfTurnAborted(e.abortSignal);let n=await runModelCallRecoveryPipeline({error:t,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:a.sessionId,turnId:s.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:q.allowsEmptyDelivery,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:a.sessionId,turnId:s.turnId})]});if(throwIfTurnAborted(e.abortSignal),n.outcome===`recovered`)Z=n.result;else{let t=n.error;if(i?.recordError(t),!p)throw t;let r=extractWorkflowStreamWriteErrorDetails(t);if(r!==null){let e=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...r,errorId:e,error:t,sessionId:a.sessionId,turnId:s.turnId}),s=await emitRecoverableFailedTurn(p,s,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:a.continuationToken,details:{...r,errorId:e},message:toErrorMessage(t)}),{next:null,session:setHarnessEmissionState(a,s)}}let o=classifyModelCallError(t),c=createErrorId(),l=summarizeKnownError(t),u=l===null?extractUpstreamRejectionMessage(t):null,f=l?.message??u?.message??toErrorMessage(t),m=l?.hint===void 0?f:`${f} ${l.hint}`,h=extractModelCallErrorDetails(t),g=buildModelCallFailureDetails({catalogSummary:l,error:t,errorId:c,modelCallDetails:h,upstreamRejection:u}),_=buildModelCallFailureLogFields({error:t,errorId:c,modelCallDetails:h,recognized:l!==null||u!==null,sessionId:a.sessionId,turnId:s.turnId});if(o===`terminal`)return l===null?log.error(u?.message??`model call failed terminally`,_):log.error(`${l.name}: ${l.message}`,{errorId:c,hint:l.hint,sessionId:a.sessionId,turnId:s.turnId}),await emitFailedStep(p,s,{code:`MODEL_CALL_FAILED`,details:g,message:f,sessionId:a.sessionId}),{next:e.mode===`task`||d?{done:!0,isError:!0,output:m}:{done:!0,output:``},session:a};if(e.mode===`task`){if(o===`recoverable`&&!(t instanceof EmptyModelResponseError)&&!(t instanceof ContentFilteredModelResponseError))throw log.warn(u?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,_),t;return log.error(u?.message??`model call failed; failing the task run`,_),await emitFailedStep(p,s,{code:`MODEL_CALL_FAILED`,details:g,message:f,sessionId:a.sessionId}),{next:{done:!0,isError:!0,output:m},session:a}}log.error(u?.message??`model call failed — parking session for retry by the user`,_),s=await emitRecoverableFailedTurn(p,s,{code:`MODEL_CALL_FAILED`,continuationToken:a.continuationToken,details:g,message:f});let v={isError:!0,output:m};return a={...a,outputSchema:void 0},{next:null,session:setHarnessEmissionState(a,s),settledTurn:v}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(a.state),turnId:s.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});a=setTurnUsageState(a,Q);let $;try{$=formatLanguageModelGatewayId(V)}catch{$=void 0}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":e.tools.size});let fe=await handleStepResult({config:e,emit:p,emissionState:s,durableModelPromptMessageCount:L===void 0||L.messages.length===0?X.length:void 0,promptMessages:oe,result:Z,runStep,session:a,coordinationTools:se});return z?.set(HistoryStateKey,J.historyState),fe}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(t!==void 0||e.costUsd!==void 0)return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:n,errorId:r,modelCallDetails:i,upstreamRejection:a}=e;if(t!==null){let e={errorId:r,message:t.message,name:t.name,semanticErrorId:t.id,...i};return t.hint!==void 0&&(e.hint=t.hint),e}return a===null?{...formatError(n,r),...i}:{errorId:r,message:toErrorMessage(n),name:a.name,...i}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}function hasUnansweredToolCall(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r.content))for(let e of r.content)typeof e==`object`&&e&&(e.type===`tool-call`&&t.add(e.toolCallId),e.type===`tool-result`&&n.add(e.toolCallId));for(let e of t)if(!n.has(e))return!0;return!1}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep: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}),p=l?null:c,m=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&m.add(e.toolCallId);let h=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:m}),g=h.messages,_={...s,compaction:createNextCompactionConfig(s.compaction,e.durableModelPromptMessageCount,i)},v=t.workflow===!0?readWorkflowContinuationSecurity(_):void 0;if(v!==void 0){let t=await getWorkflowSandboxInterrupt(i,v);if(t!==void 0){if(!isWorkflowTaskInterrupt(t))throw Error(`Unsupported Workflow interrupt kind "${t.payload.kind}".`);return await parkOnWorkflowInterrupt({baseSession:_,emit:n,emissionState:o,interrupt:t,promptMessages:r,responseMessages:g,tools:e.coordinationTools,usedCalls:0})}}let y=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),b=new Set(y.map(e=>e.action.callId)),x=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...b]),tools:e.coordinationTools}),S=[...y,...x],C=renderPendingApprovalsSnippet(y),w=g.findIndex(e=>e.role!==`tool`),T=w===-1?g:g.slice(0,w),E=g.slice(T.length),D=validateHarnessModelMessages([...r,...T,...C===void 0?[]:[createFrameworkUserMessage(`context.state`,C)]]),O=getAdvertisedTools({session:_,tools:e.coordinationTools}),k=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>isDeferredHarnessTool(e.coordinationTools.get(t.toolName))).filter(e=>isDeferredHarnessTool(O.get(e.toolName))?!0:(log.warn(`deferred tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:_.sessionId,toolName:e.toolName}),!1)).map(e=>createCoordinationRequestFromToolCall({toolCall:e,tools:O}));if(k.length>0){let e=k.flatMap(e=>e.kind===`runtime-action`?[e.request]:[]),t=k.flatMap(e=>e.kind===`task`?[e.request]:[]);if(S.length===0)return{next:null,session:setHarnessEmissionState(setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:g,session:{..._,history:validateHarnessModelMessages(r)}}),advanceStep(o))};let i=setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:E,session:{..._,history:D}});return i=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:S,responseMessages:[],session:i}),n&&await n(createInputRequestedEvent({requests:S,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{next:null,session:setHarnessEmissionState(i,advanceStep(o))}}if(S.length>0){let e=buildResponseAuthorizationTools({authoredTools:t.tools,context:contextStorage.getStore()}),r=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:S,responseAuthRequiredRequestIds:y.filter(t=>{let n=e.get(t.action.toolName)?.approval;return n!==void 0&&typeof n!=`function`&&n.response!==void 0}).map(e=>e.requestId),responseMessages:E,session:{..._,history:D}});return n&&(await n(createInputRequestedEvent({requests:S,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),r=setHarnessEmissionState(r,o))),{next:hasDeferredStepInput(r)?a:null,session:r}}let A=resolveInlineAuthorizationInterrupt({messages:[...r,...g],toolResults:i.toolResults});if(A){let{challenges:e,history:r}=A;if(n){for(let t of getSupersededAuthorizationChallenges(_.state,e))await n(createAuthorizationCompletedEvent({attemptId:t.attemptId,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({attemptId:t.attemptId,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({..._,history:validateHarnessModelMessages(r),state:setPendingAuthorization(_.state,{challenges:e})},o)}}let j=g,M=validateHarnessModelMessages([...r,...j]),N={..._,history:M};return(N.outputSchema===void 0||extractFinalOutput(i)===void 0)&&(j.at(-1)?.role===`tool`||h.outcomeEndsResponse||hasDeferredStepInput(N))?(n&&(o=advanceStep(o),N=setHarnessEmissionState(N,o)),{next:a,session:N}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:N.outputSchema,session:N,stepOutput:p}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:N.outputSchema,session:N,stepOutput:p})}function isDeferredHarnessTool(e){return e?.runtimeAction!==void 0||e?.workflowId!==void 0&&e.execution!==`background`}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(s={...s,outputSchema:void 0},t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){s={...s,outputSchema:void 0},t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowTaskInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let r=e.childResults??[],i=getWorkflowTaskInterrupts(n);e.emit!==void 0&&r.length>0&&await emitWorkflowActionResults({emit:e.emit,emissionState:e.emissionState,interrupts:i,results:r});let a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),i=n,s=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:i,resolution:r[s]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowTaskInterrupt(n.interrupt)||s+1>=r.length)break;let c=getWorkflowTaskInterrupts(n.interrupt)[0];if(c===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);s++,i=c}}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(validateHarnessModelMessages([...e.session.history,...t.responseMessages]),n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowTaskInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let n=e.session.history.length,r=l.slice(0,n),i=l.slice(n);return u={...u,history:r},await parkOnWorkflowInterrupt({baseSession:u,emit:e.emit,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:r,responseMessages:i,tools:e.tools,usedCalls:t.usedCalls})}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}})}async function parkOnWorkflowInterrupt(e){let t=getWorkflowTaskInterrupts(e.interrupt),n=t[0];if(n===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);e.emit!==void 0&&await emitWorkflowActionsRequested({emit:e.emit,emissionState:e.emissionState,interrupts:t,tools:e.tools});let r={...e.baseSession,history:[...e.promptMessages]},i=setPendingWorkflowInterrupt({interrupt:n,responseMessages:e.responseMessages,session:r,usedCalls:e.usedCalls});return{next:null,session:setHarnessEmissionState(i,e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}function replaceSessionHistory(e,t){return contextStorage.getStore()?.delete(HistoryStateKey),{...e,history:t,compaction:{recentWindowSize:e.compaction.recentWindowSize,threshold:e.compaction.threshold,thresholdPercent:e.compaction.thresholdPercent}}}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session,a=e.promptMessages??r,o=validateHarnessModelMessages(e.historyProjector?.({messages:a,state:i.state})??a),s=e.force===!0||shouldCompact(o,i.compaction),c=shouldCanonicalizeMemory(r);if(!s&&!c)return{compacted:!1,messages:r,session:i};let l=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel}),u=i.agent.compactionModelReference??requireSessionModelReference(i),d=mergeProviderSafetyIdentifier(u,l.providerOptions,e.auth);if(t){let e=contextStorage.getStore();e!==void 0&&prepareMemoryCompaction(e,{history:r,state:i.state}),await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(o,i.compaction)}),o)}let f=canonicalizeMemoryRecords(r),p=validateHarnessModelMessages(e.historyProjector?.({messages:f.ordinary,state:i.state})??f.ordinary),m=s?await compactMessages([...p],l.model,i.compaction,d,e.telemetry,buildGatewayAttributionHeaders(l.model,e.runtimeIdentity),e.abortSignal,e.force===!0):[...p];if(r=validateHarnessModelMessages([...f.memory,...m]),e.onCompaction)for(let t of e.onCompaction())r.push(t);if(t){let a=contextStorage.getStore();if(a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),a!==void 0){let e=drainMemoryCommit(a);e!==void 0&&(r=validateHarnessModelMessages(e.history),i={...i,state:e.state})}}return{compacted:!0,messages:r,session:replaceSessionHistory(i,r)}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}export{appendMissingToolResultMessages,createToolLoopHarness};
|
|
3
|
+
`)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(e){let t=e.handleEvent;async function runStep(t,n){return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},e=>executeStepBody(e.session,n,e))??executeStepBody(t,n)}async function executeStepBody(n,r,i){let a=n,o=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});o(a.history,a.state);let projectHistory=(e,t)=>o(e,t).messages,s=getHarnessEmissionState(a.state),c=contextStorage.getStore(),l=c?.get(ParentSessionKey),u=c?.get(SessionCallbackKey),d=l!==void 0||u!==void 0,f,p=i?.createHandleEvent({getAttemptScope:()=>f,handleEvent:t,turnId:activeTurnId(s)})??t,failModelSelection=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),i?.recordError(t),!p)throw t;let r=createErrorId(),o=toErrorMessage(t);return log.error(`model selection failed terminally`,{error:t,errorId:r,sessionId:a.sessionId,turnId:n.turnId}),await emitFailedStep(p,n,{code:`MODEL_SELECTION_FAILED`,details:{errorId:r},message:o,sessionId:a.sessionId}),{next:e.mode===`task`||d?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:a}},failBoundaryEvent=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),isTurnCancellation(t))throw t;if(isDynamicModelSelectionError(t))return failModelSelection(t,n);if(!p||e.mode!==`conversation`||!(t instanceof BoundaryHookError))throw t;i?.recordError(t);let r=createErrorId(),o=toErrorMessage(t);return log.error(`turn boundary handler failed — parking session`,{error:t,errorId:r,sessionId:a.sessionId,turnId:n.turnId}),s=await emitRecoverableFailedTurn(p,n,{code:`EVENT_HANDLER_FAILED`,continuationToken:a.continuationToken,details:{errorId:r},message:o}),{next:null,session:setHarnessEmissionState({...a,outputSchema:void 0},s),settledTurn:{isError:!0,output:o}}},preparePreambleTrace=async()=>await i?.preparePreamble({sequence:s.sequence,sessionStarted:s.sessionStarted,traceContext:i?.traceContext,turnId:`turn_${s.sequence}`});if(e.clearOnly===!0)return a={...a,state:clearMemorySessionState(a.state)},a=replaceSessionHistory(a,[]),await p?.(createContextClearedEvent({sequence:s.sequence,sessionId:a.sessionId,turnId:activeTurnId(s)})),await p?.(createSessionWaitingEvent()),{next:null,session:a};if(e.compactOnly===!0){if(a.history.length>0)try{let t=contextStorage.getStore(),n=await resolveActiveRuntimeModel({config:e,ctx:t,session:a});a=n.session,a=(await maybeCompact({abortSignal:e.abortSignal,auth:t?.get(AuthKey)??null,emit:p,emissionState:{...s,turnId:activeTurnId(s)},force:!0,historyProjector:e.historyProjector,messages:[...a.history],model:n.model,onCompaction:e.onCompaction,resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:a,telemetry:i?.telemetry()})).session}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:a.sessionId})}return await p?.(createSessionWaitingEvent()),{next:null,session:a}}let m=consumeDeferredStepInput({input:r,preferCurrentInput:e.mode!==`conversation`&&r!==void 0&&hasPendingApprovalBatch(a),session:a});a=m.session;let h=await resolvePendingCoordination({emit:p,session:a,stepInput:m.input,tools:e.tools});if(h.outcome===`unresolved`)return{next:null,session:h.session};a=h.session;let g=getPendingInputRequestIds(a.state),_=convertStaleResponsesToUserMessage({history:h.messages,pendingRequestIds:g,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:g,stepInput:m.input}),tools:e.tools}),v=_.stepInput,y=_.kind===`converted`?{...v,message:_.displayMessage}:v,b=contextStorage.getStore();b!==void 0&&e.resolveStepDynamicTools!==void 0&&shouldPrepareApprovalReplayTools({session:a,stepInput:v})&&await e.resolveStepDynamicTools({ctx:b,event:createStepStartedEvent({modelId:a.agent.modelReference?.id??`dynamic`,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}),messages:projectHistory(h.messages,a.state)});let x=shouldPrepareApprovalReplayTools({session:a,stepInput:v})?buildResponseAuthorizationTools({authoredTools:e.tools,context:b}):e.tools,S=await coordinateApprovalDelivery({session:a,stepInput:v,tools:x});if(a=S.session,p){for(let e of S.feedback)await p(createMessageCompletedEvent({message:e,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId}));let e=getApprovalAuditState(a.state);for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await p(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:a.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await p(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:a.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await p(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId})),a={...a,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:a.state})}}if(S.kind===`park`)return{next:null,session:a};if(S.kind===`continue-coordination`)return{next:runStep,session:S.stepInput===void 0?a:queueDeferredStepInput(a,S.stepInput)};if(S.challenges.length>0){if(p)for(let e of S.challenges)await p(createAuthorizationRequiredEvent({authorization:e.challenge,candidateId:e.candidateId,description:e.challenge.instructions??`Authorization required for ${e.name}`,name:e.name,sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId,webhookUrl:e.hookUrl}));let e=S.stepInput===void 0?a:queueDeferredStepInput(a,S.stepInput);return{next:null,session:{...e,state:setPendingAuthorization(e.state,{challenges:S.challenges})}}}let C=resolvePendingInput({deferMessagesWhileApprovalsPending:e.mode!==`conversation`,history:h.messages,resolveApprovalKey:resolveApprovalKeyFromTools(x),session:a,stepInput:S.stepInput});if(C.outcome===`unresolved`){let t=h.outcome===`resolved`?{...C.session,history:validateHarnessModelMessages(h.messages)}:C.session;if(p&&e.mode===`conversation`&&C.deferredMessage===!0&&hasStepInput(r)){c!==void 0&&prepareDynamicInstructionPreamble(c,projectHistory(t.history,t.state));let n=[];try{let t=await preparePreambleTrace();s=await emitTurnPreamble(p,y??{},s,e.runtimeIdentity,t)}catch(e){return n=c===void 0?[]:drainDynamicInstructionUserMessages(c),t={...t,history:validateHarnessModelMessages([...t.history,...n])},a=t,failBoundaryEvent(e,{sessionStarted:!0,sequence:s.sequence,stepIndex:0,turnId:`turn_${s.sequence}`})}return n=c===void 0?[]:drainDynamicInstructionUserMessages(c),t={...t,history:validateHarnessModelMessages([...t.history,...n])},s=await emitTurnEpilogue(p,s,e.mode),{next:null,session:setHarnessEmissionState(t,s)}}return h.outcome===`resolved`?(p&&e.mode===`conversation`&&(s=await emitTurnEpilogue(p,s,e.mode),t=setHarnessEmissionState(t,s)),{next:null,session:t}):{next:null,session:C.session}}if(C.resolvedInputs!==void 0)for(let e of C.resolvedInputs)await i?.publishInputResolutions({batch:e,sessionId:a.sessionId}),p&&await p(createInputResolvedEvent({resolutions:e.inputs.map(e=>{let t={kind:e.request.kind,outcome:e.outcome,requestId:e.request.requestId};return e.response===void 0?t:{...t,response:e.response}}),sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(p&&C.rejectedActions)for(let e of C.rejectedActions)for(let t of e.results)await p(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));let w=activeTurnId(s),T=getTurnClientContextState(C.session.state,w),E=C.deferredContext===!0?void 0:readClientContext(v),D=(E??T?.messages)?.map(e=>createFrameworkUserMessage(`context.instruction`,e))??[],O=[];if(v?.context!==void 0&&C.deferredContext!==!0)for(let e of v.context)O.push(createFrameworkUserMessage(`context.instruction`,e));let k=frameworkMessageKindForStepInput(v),A=normalizeUserContent(v?.message),j=A!==void 0&&!C.deferredMessage&&!C.consumedMessage?await stageAttachmentsToSandbox(A):void 0;j!==void 0&&O.push(k===void 0?createUserMessage(`user`,j):createFrameworkUserMessage(k,j));let M=[],N;if(p&&hasStepInput(r)){c!==void 0&&(prepareDynamicInstructionPreamble(c,projectHistory(C.session.history,C.session.state)),prepareMemoryPreamble(c,{history:C.messages,input:[...D,...O],state:C.session.state}));try{let t=await preparePreambleTrace();s=await emitTurnPreamble(p,y??{},s,e.runtimeIdentity,t)}catch(e){return M=c===void 0?[]:drainDynamicInstructionUserMessages(c),N=c===void 0?void 0:drainMemoryCommit(c),a={...C.session,history:validateHarnessModelMessages([...N?.history??C.session.history,...M]),state:N?.state??C.session.state},failBoundaryEvent(e,{sessionStarted:!0,sequence:s.sequence,stepIndex:0,turnId:`turn_${s.sequence}`})}M=c===void 0?[]:drainDynamicInstructionUserMessages(c),N=c===void 0?void 0:drainMemoryCommit(c),i?.setTurnId(s.turnId)}let ee=N?.history??C.session.history,P=C.session.history.length;a=setHarnessEmissionState({...C.session,history:validateHarnessModelMessages([...ee,...M]),state:N?.state??C.session.state},s);let F=validateHarnessModelMessages([...N?.history??C.messages.slice(0,P),...M,...N===void 0?C.messages.slice(P):[]]),I=await applySessionLimitContinuation({config:e,emit:p,emissionState:s,limitContinuation:C.limitContinuation,session:a});if(I.result!==null)return I.result;a=I.session;let te=getAgentHandleStore(a.state);if(!hasUnansweredToolCall(F)){let e=await c?.get(BackgroundToolExecutorKey)?.readAgentViews?.(),t=e===void 0||e.length===0?void 0:[...projectParkedAgentHandles(te??{handles:[]}).map(e=>({availability:`available`,id:e.identity.id,name:e.identity.name,statusLine:e.phase===`parked`?e.lastStatus:void 0})),...e],n=resolveAgentsAnnouncement({agentViews:t,messages:projectHistory(F,a.state),store:te});n!==void 0&&F.push(createFrameworkUserMessage(`context.state`,n))}let L=T;E!==void 0&&(L={insertionIndex:T?.insertionIndex??F.length,messages:E,turnId:w}),L!==void 0&&(a=setTurnClientContextState(a,L)),F=[...F,...O];let createModelMessages=e=>{if(L===void 0||L.messages.length===0)return[...e];let t=Math.min(Math.max(0,L.insertionIndex),e.length);return[...e.slice(0,t),...L.messages.map(e=>createFrameworkUserMessage(`context.instruction`,e)),...e.slice(t)]},R=validateHarnessModelMessages(projectHistory(createModelMessages(F),a.state)),z=c,B;try{z!==void 0&&e.dispatchDynamicModelEvent!==void 0&&await e.dispatchDynamicModelEvent({ctx:z,event:{data:{sequence:s.sequence,stepIndex:s.stepIndex,turnId:s.turnId},type:`step.started`},messages:R}),B=await resolveActiveRuntimeModel({config:e,ctx:z,session:a})}catch(e){return failModelSelection(e,s)}a=B.session;let V=B.model,ne=detectPromptCachePath(V),H=ne.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,re=buildGatewayAttributionHeaders(V,e.runtimeIdentity),U=L===void 0?void 0:Math.max(0,F.length-L.insertionIndex),W=await maybeCompact({abortSignal:e.abortSignal,auth:z?.get(AuthKey)??null,emit:p,emissionState:s,historyProjector:e.historyProjector,messages:[...F],model:V,onCompaction:e.onCompaction,promptMessages:createModelMessages(F),resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:a,telemetry:i?.telemetry()});if(a=W.session,W.compacted&&(F=W.messages,L!==void 0&&U!==void 0&&(L={...L,insertionIndex:Math.max(0,F.length-U)},a=setTurnClientContextState(a,L))),R=validateHarnessModelMessages(normalizeModelMessages(projectHistory(createModelMessages(F),a.state))),p)try{await emitStepStarted(p,s,requireSessionModelReference(a).id,R)}catch(e){return failBoundaryEvent(e,s)}let G=getApprovedTools(a,resolveApprovalKeyFromTools(buildResponseAuthorizationTools({authoredTools:e.tools,context:z}))),K=s.sequence===0,ie=K&&z?.get(ScheduleIdKey)!==void 0,q=resolveDeliveryPolicy({hasScheduleProvenance:ie,hasOutputSchema:a.outputSchema!==void 0,isChild:z?.get(ParentSessionKey)!==void 0,isFirstTurn:K,taskDeliveryPhase:z?.get(TurnTaskDeliveryKey)}),J=createCurrentMessages(F,{historyState:z?.get(HistoryStateKey),currentTurnMessages:O,projectedMessages:R});z!==void 0&&J.addSystem(buildDynamicInstructionMessages(z));let ae=z?.get(TurnTaskDeliveryKey)===`initiating`?resolveInitiatingTaskContext({state:a.state,turnId:w}):void 0;J.addAnnouncements({availableSkills:z?.get(PendingSkillAnnouncementKey),taskState:ae?.context,deliveryInstruction:q.instruction});let Y=renderPendingApprovalsInstruction(getPendingInputBatches(a.state).flatMap(e=>e.requests));Y!==void 0&&J.add(Y,`context.state`,{cacheFriendly:!1});let oe=J.history,X=await hydrateSandboxAttachments(J.nonSystemMessages),prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=a.agent.system?[{role:`system`,content:a.agent.system}]:[],r=J.systemMessages.length>0||t.length>0?[...t,...n,...J.systemMessages]:void 0,o=r!==void 0&&H?applySystemCacheBreakpoint(r,H):r,c=o===void 0?a.agent.system??void 0:mergeSystemInstructions(o);return{instructions:c,telemetryRuntimeContext:i?.resolveRuntimeContext({eveVersion,emissionState:s,environment,modelInput:{instructions:c,messages:X},session:a})}},se=e.tools,runSingleModelCall=async t=>{let{instructions:n,telemetryRuntimeContext:r={}}=t.preparedInput??prepareModelCallInput(t.extraSystemNote);t.retryReason&&(r[`eve.retry.reason`]=t.retryReason);let o=t.trailingUserNote?[...X,createFrameworkUserMessage(`execution.retry`,t.trailingUserNote)]:[...X],c=buildHarnessToolsWithDynamicSubagents(e.tools,z),l=createBackgroundToolCallBatch(),u=getAdvertisedTools({session:a,tools:c});se=u;let d=await buildToolSetWithProviderTools({approvedTools:G,backgroundBatch:l,capabilities:e.capabilities,disabledProviderTools:t.disabledProviderTools,modelReference:requireSessionModelReference(a),tools:u});if(z!==void 0){let n=getAdvertisedTools({session:a,tools:buildDynamicTools(z)}),r=buildToolSetFromDefinitions({approvedTools:G,backgroundBatch:l,capabilities:e.capabilities,disabledProviderTools:t.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){let n=u.get(e);if(n?.runtimeAction!==void 0||n?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);d[e]=t}}a.outputSchema!==void 0&&(d[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(a.outputSchema));let m=e.workflow===!0?{maxSubagents:e.workflowMaxSubagents}:void 0,h=await getAdvertisedTools({modelTools:d,session:a,tools:u,workflow:m});a=h.session;let g=h.modelTools,_=H?applyLastToolCacheBreakpoint(g,H):g,v=activeTurnId(s),y=i?.prepareAttempt({attemptIndex:t.attemptIndex,runtimeContext:r,stepIndex:s.stepIndex,turnId:v});f=y?.scope;let b=buildStepHooks({auth:z?.get(AuthKey)??null,cachePath:ne,emit:p,emissionState:s,emitStepStarted:t.suppressStepStartedEmission!==!0,marker:H,session:a}),x={headers:re,instructions:n,model:V,onLanguageModelCallEnd(e){for(let t of e.content)t.type!==`tool-call`||t.providerExecuted===!0||isInvalidToolCall(t)||l.register({callId:t.toolCallId,input:t.input,toolName:t.toolName})},onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:b.onStepEnd,onStepStart:b.onStepStart,prepareStep:b.prepareStep,reasoning:a.agent.reasoning,runtimeContext:r,stopWhen:isStepCount(1),telemetry:y?.telemetry,toolApproval:buildToolApproval(g),tools:_},S=new ToolLoopAgent(x),executeModelCall=async()=>{if(p){let t=[...e.tools].filter(([e,t])=>t.runtimeAction!==void 0&&u.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...t]),r=await S.stream({abortSignal:e.abortSignal,messages:o}),{emittedActionCallIds:i,handledInlineToolResultCallIds:a,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:d}=await emitStreamContent(p,s,r.fullStream,{excludedActionToolNames:n,tools:u});throwIfTurnAborted(e.abortSignal);let[f,m]=await Promise.all([b.stepResult,r.responseMessages]);if(f.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(f.providerMetadata));if(isEmptyModelResponse(f)&&extractToolResultCallIds(m).size===0&&l.length===0&&d.length===0)throw new EmptyModelResponseError;await emitStepActions(p,s,f,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:a,tools:u});let h=f.toolResults,g=new Map(h.map(e=>[e.toolCallId,e]));for(let e of l)g.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:d,responseMessages:m}),stepResult:f,toolResults:[...g.values()]})}let t=await S.generate({abortSignal:e.abortSignal,messages:o});throwIfTurnAborted(e.abortSignal);let n=await b.stepResult;if(n.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(n.providerMetadata));if(isEmptyModelResponse(n)&&extractToolResultCallIds(t.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:t.responseMessages,stepResult:n})};try{let e=await executeModelCall();return await y?.complete(),e}catch(e){return await y?.fail(e),rethrowNoOutputAsEmptyResponse(e)}},ce=0,runOneModelCall=async t=>runModelCallWithRetries(e=>runSingleModelCall({...t,attemptIndex:ce++,preparedInput:e===1?t.preparedInput:void 0,suppressStepStartedEmission:e!==1||t.suppressStepStartedEmission}),{sessionId:a.sessionId,turnId:s.turnId},e.abortSignal),le=prepareModelCallInput(),ue=await continuePendingWorkflowInterrupt({childResults:v?.runtimeActionResults,config:e,emit:p,emissionState:s,runStep,session:a,tools:buildHarnessToolsWithDynamicSubagents(e.tools,z)});if(ue!==null)return ue;let de=await enforceSessionUsageLimit({config:e,emit:p,emissionState:s,messages:R,session:a});if(de!==null)return de;let Z;try{Z=await runOneModelCall({preparedInput:le,suppressStepStartedEmission:!0})}catch(t){throwIfTurnAborted(e.abortSignal);let n=await runModelCallRecoveryPipeline({error:t,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:a.sessionId,turnId:s.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:q.allowsEmptyDelivery,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:a.sessionId,turnId:s.turnId})]});if(throwIfTurnAborted(e.abortSignal),n.outcome===`recovered`)Z=n.result;else{let t=n.error;if(i?.recordError(t),!p)throw t;let r=extractWorkflowStreamWriteErrorDetails(t);if(r!==null){let e=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...r,errorId:e,error:t,sessionId:a.sessionId,turnId:s.turnId}),s=await emitRecoverableFailedTurn(p,s,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:a.continuationToken,details:{...r,errorId:e},message:toErrorMessage(t)}),{next:null,session:setHarnessEmissionState(a,s)}}let o=classifyModelCallError(t),c=createErrorId(),l=summarizeKnownError(t),u=l===null?extractUpstreamRejectionMessage(t):null,f=l?.message??u?.message??toErrorMessage(t),m=l?.hint===void 0?f:`${f} ${l.hint}`,h=extractModelCallErrorDetails(t),g=buildModelCallFailureDetails({catalogSummary:l,error:t,errorId:c,modelCallDetails:h,upstreamRejection:u}),_=buildModelCallFailureLogFields({error:t,errorId:c,modelCallDetails:h,recognized:l!==null||u!==null,sessionId:a.sessionId,turnId:s.turnId});if(o===`terminal`)return l===null?log.error(u?.message??`model call failed terminally`,_):log.error(`${l.name}: ${l.message}`,{errorId:c,hint:l.hint,sessionId:a.sessionId,turnId:s.turnId}),await emitFailedStep(p,s,{code:`MODEL_CALL_FAILED`,details:g,message:f,sessionId:a.sessionId}),{next:e.mode===`task`||d?{done:!0,isError:!0,output:m}:{done:!0,output:``},session:a};if(e.mode===`task`){if(o===`recoverable`&&!(t instanceof EmptyModelResponseError)&&!(t instanceof ContentFilteredModelResponseError))throw log.warn(u?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,_),t;return log.error(u?.message??`model call failed; failing the task run`,_),await emitFailedStep(p,s,{code:`MODEL_CALL_FAILED`,details:g,message:f,sessionId:a.sessionId}),{next:{done:!0,isError:!0,output:m},session:a}}log.error(u?.message??`model call failed — parking session for retry by the user`,_),s=await emitRecoverableFailedTurn(p,s,{code:`MODEL_CALL_FAILED`,continuationToken:a.continuationToken,details:g,message:f});let v={isError:!0,output:m};return a={...a,outputSchema:void 0},{next:null,session:setHarnessEmissionState(a,s),settledTurn:v}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(a.state),turnId:s.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});a=setTurnUsageState(a,Q);let $;try{$=formatLanguageModelGatewayId(V)}catch{$=void 0}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":e.tools.size});let fe=await handleStepResult({config:e,emit:p,emissionState:s,durableModelPromptMessageCount:L===void 0||L.messages.length===0?X.length:void 0,promptMessages:oe,result:Z,runStep,session:a,coordinationTools:se});return z?.set(HistoryStateKey,J.historyState),fe}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(t!==void 0||e.costUsd!==void 0)return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:n,errorId:r,modelCallDetails:i,upstreamRejection:a}=e;if(t!==null){let e={errorId:r,message:t.message,name:t.name,semanticErrorId:t.id,...i};return t.hint!==void 0&&(e.hint=t.hint),e}return a===null?{...formatError(n,r),...i}:{errorId:r,message:toErrorMessage(n),name:a.name,...i}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}function hasUnansweredToolCall(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r.content))for(let e of r.content)typeof e==`object`&&e&&(e.type===`tool-call`&&t.add(e.toolCallId),e.type===`tool-result`&&n.add(e.toolCallId));for(let e of t)if(!n.has(e))return!0;return!1}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep: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}),p=l?null:c,m=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&m.add(e.toolCallId);let h=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:m}),g=h.messages,_={...s,compaction:createNextCompactionConfig(s.compaction,e.durableModelPromptMessageCount,i)},v=t.workflow===!0?readWorkflowContinuationSecurity(_):void 0;if(v!==void 0){let t=await getWorkflowSandboxInterrupt(i,v);if(t!==void 0){if(!isWorkflowTaskInterrupt(t))throw Error(`Unsupported Workflow interrupt kind "${t.payload.kind}".`);return await parkOnWorkflowInterrupt({baseSession:_,emit:n,emissionState:o,interrupt:t,promptMessages:r,responseMessages:g,tools:e.coordinationTools,usedCalls:0})}}let y=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),b=new Set(y.map(e=>e.action.callId)),x=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...b]),tools:e.coordinationTools}),S=[...y,...x],C=renderPendingApprovalsSnippet(y),w=g.findIndex(e=>e.role!==`tool`),T=w===-1?g:g.slice(0,w),E=g.slice(T.length),D=validateHarnessModelMessages([...r,...T,...C===void 0?[]:[createFrameworkUserMessage(`context.state`,C)]]),O=getAdvertisedTools({session:_,tools:e.coordinationTools}),k=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>isDeferredHarnessTool(e.coordinationTools.get(t.toolName))).filter(e=>isDeferredHarnessTool(O.get(e.toolName))?!0:(log.warn(`deferred tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:_.sessionId,toolName:e.toolName}),!1)).map(e=>createCoordinationRequestFromToolCall({toolCall:e,tools:O}));if(k.length>0){let e=k.flatMap(e=>e.kind===`runtime-action`?[e.request]:[]),t=k.flatMap(e=>e.kind===`task`?[e.request]:[]);if(S.length===0)return{next:null,session:setHarnessEmissionState(setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:g,session:{..._,history:validateHarnessModelMessages(r)}}),advanceStep(o))};let i=setPendingCoordinationBatch({runtimeActions:e,tasks:t,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:E,session:{..._,history:D}});return i=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:S,responseMessages:[],session:i}),n&&await n(createInputRequestedEvent({requests:S,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{next:null,session:setHarnessEmissionState(i,advanceStep(o))}}if(S.length>0){let e=buildResponseAuthorizationTools({authoredTools:t.tools,context:contextStorage.getStore()}),r=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:S,responseAuthRequiredRequestIds:y.filter(t=>{let n=e.get(t.action.toolName)?.approval;return n!==void 0&&typeof n!=`function`&&n.response!==void 0}).map(e=>e.requestId),responseMessages:E,session:{..._,history:D}});return n&&(await n(createInputRequestedEvent({requests:S,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),r=setHarnessEmissionState(r,o))),{next:hasDeferredStepInput(r)?a:null,session:r}}let A=resolveInlineAuthorizationInterrupt({messages:[...r,...g],toolResults:i.toolResults});if(A){let{challenges:e,history:r}=A;if(n){for(let t of getSupersededAuthorizationChallenges(_.state,e))await n(createAuthorizationCompletedEvent({attemptId:t.attemptId,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({attemptId:t.attemptId,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({..._,history:validateHarnessModelMessages(r),state:setPendingAuthorization(_.state,{challenges:e})},o)}}let j=g,M=validateHarnessModelMessages([...r,...j]),N={..._,history:M};return(N.outputSchema===void 0||extractFinalOutput(i)===void 0)&&(j.at(-1)?.role===`tool`||h.outcomeEndsResponse||hasDeferredStepInput(N))?(n&&(o=advanceStep(o),N=setHarnessEmissionState(N,o)),{next:a,session:N}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:N.outputSchema,session:N,stepOutput:p}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:N.outputSchema,session:N,stepOutput:p})}function isDeferredHarnessTool(e){return e?.runtimeAction!==void 0||e?.workflowId!==void 0&&e.execution!==`background`}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(s={...s,outputSchema:void 0},t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){s={...s,outputSchema:void 0},t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowTaskInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let r=e.childResults??[],i=getWorkflowTaskInterrupts(n);e.emit!==void 0&&r.length>0&&await emitWorkflowActionResults({emit:e.emit,emissionState:e.emissionState,interrupts:i,results:r});let a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),i=n,s=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:i,resolution:r[s]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowTaskInterrupt(n.interrupt)||s+1>=r.length)break;let c=getWorkflowTaskInterrupts(n.interrupt)[0];if(c===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);s++,i=c}}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(validateHarnessModelMessages([...e.session.history,...t.responseMessages]),n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowTaskInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let n=e.session.history.length,r=l.slice(0,n),i=l.slice(n);return u={...u,history:r},await parkOnWorkflowInterrupt({baseSession:u,emit:e.emit,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:r,responseMessages:i,tools:e.tools,usedCalls:t.usedCalls})}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}})}async function parkOnWorkflowInterrupt(e){let t=getWorkflowTaskInterrupts(e.interrupt),n=t[0];if(n===void 0)throw Error(`Workflow continuation contains no pending workflow-task interrupt.`);e.emit!==void 0&&await emitWorkflowActionsRequested({emit:e.emit,emissionState:e.emissionState,interrupts:t,tools:e.tools});let r={...e.baseSession,history:[...e.promptMessages]},i=setPendingWorkflowInterrupt({interrupt:n,responseMessages:e.responseMessages,session:r,usedCalls:e.usedCalls});return{next:null,session:setHarnessEmissionState(i,e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}function replaceSessionHistory(e,t){return contextStorage.getStore()?.delete(HistoryStateKey),{...e,history:t,compaction:{recentWindowSize:e.compaction.recentWindowSize,threshold:e.compaction.threshold,thresholdPercent:e.compaction.thresholdPercent}}}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session,a=e.promptMessages??r,o=validateHarnessModelMessages(e.historyProjector?.({messages:a,state:i.state})??a),s=e.force===!0||shouldCompact(o,i.compaction),c=shouldCanonicalizeMemory(r);if(!s&&!c)return{compacted:!1,messages:r,session:i};let l=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel}),u=i.agent.compactionModelReference??requireSessionModelReference(i),d=mergeProviderSafetyIdentifier(u,l.providerOptions,e.auth);if(t){let e=contextStorage.getStore();e!==void 0&&prepareMemoryCompaction(e,{history:r,state:i.state}),await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(o,i.compaction)}),o)}let f=canonicalizeMemoryRecords(r),p=validateHarnessModelMessages(e.historyProjector?.({messages:f.ordinary,state:i.state})??f.ordinary),m=s?await compactMessages([...p],l.model,i.compaction,d,e.telemetry,buildGatewayAttributionHeaders(l.model,e.runtimeIdentity),e.abortSignal,e.force===!0):[...p];if(r=validateHarnessModelMessages([...f.memory,...m]),e.onCompaction)for(let t of e.onCompaction())r.push(t);if(t){let a=contextStorage.getStore();if(a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),a!==void 0){let e=drainMemoryCommit(a);e!==void 0&&(r=validateHarnessModelMessages(e.history),i={...i,state:e.state})}}return{compacted:!0,messages:r,session:replaceSessionHistory(i,r)}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}export{appendMissingToolResultMessages,createToolLoopHarness};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{basename,dirname,join}from"node:path";import{existsSync,readFileSync,realpathSync}from"node:fs";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.54.
|
|
1
|
+
import{createRequire}from"node:module";import{basename,dirname,join}from"node:path";import{existsSync,readFileSync,realpathSync}from"node:fs";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const BUNDLED_FALLBACK_PACKAGE_VERSION=`0.54.3`,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 t=join(e,`dist`);if(existsSync(t))return{packageBuildRoot:t,packageRoot:e}}function resolveSelfPackageJsonPath(e){return createRequire(e).resolve(`${EVE_PACKAGE_NAME}/package.json`)}function resolvePackageLocationFromModulePath(e,t=resolveSelfPackageJsonPath){let n=realpathSync.native(e),r=tryResolveDirectBuildLocation(n);if(r!==void 0)return r;let i=findNearestVerifiedPackageRoot(dirname(n));if(i!==void 0&&isSourceCheckout(i))return{packageBuildRoot:null,packageRoot:i};try{let e=tryResolveVerifiedPackageRoot(t(n)),r=e===void 0?void 0:tryCreatePackageLocation(e);if(r!==void 0)return r}catch{}let a=i===void 0?void 0:tryCreatePackageLocation(i);if(a!==void 0)return a;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 n=normalizeInstalledPackageInfo(JSON.parse(readFileSync(e,`utf8`)));if(n?.name===t)return n}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,3 +1,9 @@
|
|
|
1
|
+
/** Render the shared lightweight deployment status page. */
|
|
2
|
+
export declare function buildHomePageHtml(input: {
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly statusDetail: string;
|
|
5
|
+
readonly terminalCommand?: string;
|
|
6
|
+
}): string;
|
|
1
7
|
/**
|
|
2
8
|
* Builds the barebones home page response for one request. Exposed
|
|
3
9
|
* for tests so callers can supply a real {@link Request}; production
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const AGENT_NAME_PLACEHOLDER=`{{AGENT_NAME}}`,STATUS_DETAIL_PLACEHOLDER=`{{STATUS_DETAIL}}`,TERMINAL_PLACEHOLDER=`{{TERMINAL}}`,HOME_PAGE_HTML_TEMPLATE=`<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
@@ -170,13 +170,13 @@ const DEPLOYMENT_URL_PLACEHOLDER=`{{DEPLOYMENT_URL}}`,AGENT_NAME_PLACEHOLDER=`{{
|
|
|
170
170
|
<div class="agent-row">
|
|
171
171
|
<strong class="agent-name">${AGENT_NAME_PLACEHOLDER}</strong>
|
|
172
172
|
</div>
|
|
173
|
-
<p class="lede"><span class="status"><span class="status-dot" aria-hidden="true"></span>Ready</span><span class="lede-divider" aria-hidden="true">/</span><span
|
|
174
|
-
|
|
175
|
-
<span class="terminal-prompt" aria-hidden="true">$</span>
|
|
176
|
-
<span class="terminal-cmd">eve dev ${DEPLOYMENT_URL_PLACEHOLDER}</span>
|
|
177
|
-
</div>
|
|
173
|
+
<p class="lede"><span class="status"><span class="status-dot" aria-hidden="true"></span>Ready</span><span class="lede-divider" aria-hidden="true">/</span><span>${STATUS_DETAIL_PLACEHOLDER}</span> <a href="https://eve.dev/docs">Docs<span class="lede-arrow" aria-hidden="true"> →</span></a></p>
|
|
174
|
+
${TERMINAL_PLACEHOLDER}
|
|
178
175
|
</section>
|
|
179
176
|
</main>
|
|
180
177
|
</body>
|
|
181
178
|
</html>
|
|
182
|
-
`;function escapeHtml(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function pickFirstForwardedValue(e){if(e===null)return;let t=e.split(`,`)[0]?.trim();if(t!==void 0&&t.length!==0)return t}function resolveDeploymentUrl(e){let t=e.headers,n=new URL(e.url),r=pickFirstForwardedValue(t.get(`x-forwarded-host`)),i=pickFirstForwardedValue(t.get(`x-forwarded-proto`)),a=r??t.get(`host`)??n.host;return`${i??n.protocol.replace(/:$/,``)}://${a}`}function
|
|
179
|
+
`;function escapeHtml(e){return e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`)}function pickFirstForwardedValue(e){if(e===null)return;let t=e.split(`,`)[0]?.trim();if(t!==void 0&&t.length!==0)return t}function resolveDeploymentUrl(e){let t=e.headers,n=new URL(e.url),r=pickFirstForwardedValue(t.get(`x-forwarded-host`)),i=pickFirstForwardedValue(t.get(`x-forwarded-proto`)),a=r??t.get(`host`)??n.host;return`${i??n.protocol.replace(/:$/,``)}://${a}`}function buildHomePageHtml(e){let t=e.terminalCommand===void 0?``:`<div class="terminal mono" role="group" aria-label="Send a message from your terminal">
|
|
180
|
+
<span class="terminal-prompt" aria-hidden="true">$</span>
|
|
181
|
+
<span class="terminal-cmd">${escapeHtml(e.terminalCommand)}</span>
|
|
182
|
+
</div>`;return HOME_PAGE_HTML_TEMPLATE.replace(AGENT_NAME_PLACEHOLDER,()=>escapeHtml(e.name)).replace(STATUS_DETAIL_PLACEHOLDER,()=>escapeHtml(e.statusDetail)).replace(TERMINAL_PLACEHOLDER,()=>t)}function buildHomePageResponse(e,t){let n=resolveDeploymentUrl(t),r=buildHomePageHtml({name:e.agentName,statusDetail:`Agent is up and accepting messages.`,terminalCommand:`eve dev ${n}`});return new Response(r,{headers:{"cache-control":`no-store`,"content-type":`text/html; charset=utf-8`}})}export{buildHomePageHtml,buildHomePageResponse};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{findConfiguredEveServiceEntry,insertEveServiceRequestPathRoute,insertEveServiceRoutes}from"#internal/vercel/vercel-service-config-operations.js";import{compileEveVercelService}from"#internal/vercel/eve-service-contribution.js";function assembleEveVercelServices(e){let t=e.services??{},n={...t},r=[],i=[];for(let{agent:a,target:o}of e.agents){let e=compileEveVercelService({agent:a,target:o}),s=findConfiguredEveServiceEntry(t,a),c=s?.name??e.serviceName;s===void 0&&r.push(e.rootDirectory),n[c]=s===void 0?e.service:{...s.service,routes:insertEveServiceRequestPathRoute(s.service.routes,e.routeSrc)},i.push({routeSrc:e.routeSrc,serviceName:c})}return{rootDirectories:r,routes:insertEveServiceRoutes(e.routes??[],i),services:n}}export{assembleEveVercelServices};
|
|
1
|
+
import{findConfiguredEveServiceEntry,insertEveServiceRequestPathRoute,insertEveServiceRoutes}from"#internal/vercel/vercel-service-config-operations.js";import{compileEveVercelService}from"#internal/vercel/eve-service-contribution.js";function assembleEveVercelServices(e){let t=e.services??{},n={...t},r=[],i=[];for(let{agent:a,target:o}of e.agents){let e=compileEveVercelService({agent:a,target:o}),s=findConfiguredEveServiceEntry(t,a),c=s?.name??e.serviceName;s===void 0&&r.push(e.rootDirectory),n[c]=s===void 0?e.service:{...s.service,routes:insertEveServiceRequestPathRoute(s.service.routes,e.routeSrc)},i.push({routeSrc:e.routeSrc,serviceName:c}),e.homeRouteSrc!==void 0&&i.push({routeSrc:e.homeRouteSrc,serviceName:c})}return{rootDirectories:r,routes:insertEveServiceRoutes(e.routes??[],i),services:n}}export{assembleEveVercelServices};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{mkdir,rm,writeFile}from"node:fs/promises";import{join,relative}from"node:path";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH,VERCEL_EVE_MULTI_AGENT_SUMMARY_KIND,VERCEL_EVE_MULTI_AGENT_SUMMARY_VERSION}from"#internal/vercel-agent-summary.js";import{readVercelJsonFile}from"#internal/vercel/vercel-services-config.js";import{assembleEveVercelServices}from"#internal/vercel/assemble-eve-services.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{resolveEveBinaryPath}from"#shared/resolve-eve-binary.js";function createMultiAgentSummary(e){return{agents:e.members.map(t=>({name:t.name,routePrefix:`/${t.name}`,summaryPath:relative(e.root,join(t.appRoot,VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH)).replaceAll(`\\`,`/`)})),generatorVersion:resolveInstalledPackageInfo().version,kind:VERCEL_EVE_MULTI_AGENT_SUMMARY_KIND,schemaVersion:VERCEL_EVE_MULTI_AGENT_SUMMARY_VERSION}}async function buildAgentWorkspace(e){let t=await readVercelJsonFile(join(e.root,`vercel.json`));if(t.services!==void 0||t.experimentalServices!==void 0||t.experimentalServicesV2!==void 0)throw Error("This project defines its Vercel service graph in vercel.json. Run `vercel build` to build the complete project, or run `eve build` from an individual agent directory.");let n=e.members.map(t=>({agent:{appRoot:t.appRoot,buildCommand:`node ${quoteVercelShellArgument(toVercelRelativePath(t.appRoot,resolveEveBinaryPath(t.appRoot)))} build`,name:t.name,publicRoutePrefix:`/${t.name}`,workspaceMember:!0},target:{hostOutputDirectory:join(e.root,`.vercel`,`output`),projectRoot:e.root}})),r=assembleEveVercelServices({agents:n}),i=join(e.root,`.vercel`,`output`);
|
|
1
|
+
import{mkdir,rm,writeFile}from"node:fs/promises";import{join,relative}from"node:path";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH,VERCEL_EVE_MULTI_AGENT_SUMMARY_KIND,VERCEL_EVE_MULTI_AGENT_SUMMARY_VERSION}from"#internal/vercel-agent-summary.js";import{readVercelJsonFile}from"#internal/vercel/vercel-services-config.js";import{assembleEveVercelServices}from"#internal/vercel/assemble-eve-services.js";import{buildMultiAgentLandingPage}from"#internal/vercel/build-multi-agent-landing-page.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{resolveEveBinaryPath}from"#shared/resolve-eve-binary.js";function createMultiAgentSummary(e){return{agents:e.members.map(t=>({name:t.name,routePrefix:`/${t.name}`,summaryPath:relative(e.root,join(t.appRoot,VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH)).replaceAll(`\\`,`/`)})),generatorVersion:resolveInstalledPackageInfo().version,kind:VERCEL_EVE_MULTI_AGENT_SUMMARY_KIND,schemaVersion:VERCEL_EVE_MULTI_AGENT_SUMMARY_VERSION}}async function buildAgentWorkspace(e){let t=await readVercelJsonFile(join(e.root,`vercel.json`));if(t.services!==void 0||t.experimentalServices!==void 0||t.experimentalServicesV2!==void 0)throw Error("This project defines its Vercel service graph in vercel.json. Run `vercel build` to build the complete project, or run `eve build` from an individual agent directory.");let n=e.members.map(t=>({agent:{appRoot:t.appRoot,buildCommand:`node ${quoteVercelShellArgument(toVercelRelativePath(t.appRoot,resolveEveBinaryPath(t.appRoot)))} build`,name:t.name,publicRoutePrefix:`/${t.name}`,workspaceMember:!0},target:{hostOutputDirectory:join(e.root,`.vercel`,`output`),projectRoot:e.root}})),r=assembleEveVercelServices({agents:n}),i=join(e.root,`.vercel`,`output`);await rm(i,{force:!0,recursive:!0}),await mkdir(i,{recursive:!0}),await Promise.all(r.rootDirectories.map(e=>mkdir(e,{recursive:!0}))),await mkdir(join(e.root,`.eve`),{recursive:!0}),await writeFile(join(e.root,VERCEL_EVE_AGENT_SUMMARY_OUTPUT_PATH),`${JSON.stringify(createMultiAgentSummary(e),null,2)}\n`);let a=join(i,`static`);return await mkdir(a,{recursive:!0}),await writeFile(join(a,`index.html`),buildMultiAgentLandingPage(e)),await writeFile(join(i,`config.json`),`${JSON.stringify({version:3,routes:[...r.routes,{handle:`filesystem`}],services:r.services},null,2)}\n`),i}export{buildAgentWorkspace};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{buildHomePageHtml}from"#internal/nitro/routes/index.js";function buildMultiAgentLandingPage(e){let t=e.members.length;return buildHomePageHtml({name:`eve agents`,statusDetail:`${t} ${t===1?`agent is`:`agents are`} up and accepting messages.`})}export{buildMultiAgentLandingPage};
|
|
@@ -11,6 +11,7 @@ export interface EveVercelBuildTarget {
|
|
|
11
11
|
readonly projectRoot: string;
|
|
12
12
|
}
|
|
13
13
|
export interface EveVercelServiceContribution {
|
|
14
|
+
readonly homeRouteSrc: string | undefined;
|
|
14
15
|
readonly rootDirectory: string;
|
|
15
16
|
readonly routeSrc: string;
|
|
16
17
|
readonly service: GeneratedVercelServiceConfig;
|
|
@@ -20,6 +21,9 @@ export interface EveVercelServiceContribution {
|
|
|
20
21
|
export declare function createEveServiceName(name: string | undefined): string;
|
|
21
22
|
export declare function createEveServiceRouteSrc(publicRoutePrefix: string): string;
|
|
22
23
|
export declare function createEveRequestPathRoute(routeSrc: string): VercelRouteConfig;
|
|
24
|
+
export declare function createEveHomeRouteSrc(publicRoutePrefix: string): string | undefined;
|
|
25
|
+
/** Route a member's public base path to its package-owned home channel. */
|
|
26
|
+
export declare function createEveHomePathRoute(publicRoutePrefix: string): VercelRouteConfig | undefined;
|
|
23
27
|
export declare function createEvePublicRoute(serviceName: string, routeSrc: string): VercelRouteConfig;
|
|
24
28
|
/** Compile one eve agent into its complete Vercel service and ingress contribution. */
|
|
25
29
|
export declare function compileEveVercelService(input: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createHash}from"node:crypto";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{join}from"node:path";import{EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV,EVE_INTERNAL_BUILD_OUTPUT_DIRECTORY_ENV,EVE_INTERNAL_HOST_BUILD_OUTPUT_DIRECTORY_ENV}from"#internal/application/build-output-environment.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{MAX_VERCEL_SERVICE_NAME_LENGTH,assertValidVercelServiceName,isValidVercelServiceName}from"#internal/vercel/vercel-service-name.js";function createServiceNameHash(e){return[...createHash(`sha256`).update(e).digest().subarray(0,10)].map(e=>String.fromCharCode(97+e%26)).join(``)}function createEveServiceName(e){if(e===void 0)return`eve`;let t=`eve-${e}`;if(isValidVercelServiceName(t))return t;let n=createServiceNameHash(e),r=e.replace(/[^a-z_-]+/g,`-`).replace(/^[^a-z]+|[^a-z]+$/g,``)||`agent`,i=MAX_VERCEL_SERVICE_NAME_LENGTH-5-n.length,a=`eve-${r.slice(0,i).replace(/[^a-z]+$/g,``)||`agent`}-${n}`;return assertValidVercelServiceName(a,`Generated eve service name`),a}function createEveServiceRouteSrc(e){return e.length===0?`^${EVE_ROUTE_PREFIX}/(.*)$`:`^${(e.startsWith(`/`)?e:`/${e}`)
|
|
1
|
+
import{createHash}from"node:crypto";import{EVE_ROUTE_PREFIX}from"#protocol/routes.js";import{join}from"node:path";import{EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV,EVE_INTERNAL_BUILD_OUTPUT_DIRECTORY_ENV,EVE_INTERNAL_HOST_BUILD_OUTPUT_DIRECTORY_ENV}from"#internal/application/build-output-environment.js";import{EVE_PUBLIC_ROUTE_PREFIX_ENV,normalizePublicRoutePrefix}from"#shared/public-route-prefix.js";import{quoteVercelShellArgument,toVercelRelativePath}from"#internal/vercel/build-command.js";import{MAX_VERCEL_SERVICE_NAME_LENGTH,assertValidVercelServiceName,isValidVercelServiceName}from"#internal/vercel/vercel-service-name.js";function createServiceNameHash(e){return[...createHash(`sha256`).update(e).digest().subarray(0,10)].map(e=>String.fromCharCode(97+e%26)).join(``)}function createEveServiceName(e){if(e===void 0)return`eve`;let t=`eve-${e}`;if(isValidVercelServiceName(t))return t;let n=createServiceNameHash(e),r=e.replace(/[^a-z_-]+/g,`-`).replace(/^[^a-z]+|[^a-z]+$/g,``)||`agent`,i=MAX_VERCEL_SERVICE_NAME_LENGTH-5-n.length,a=`eve-${r.slice(0,i).replace(/[^a-z]+$/g,``)||`agent`}-${n}`;return assertValidVercelServiceName(a,`Generated eve service name`),a}function escapeVercelRouteLiteral(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function createEveServiceRouteSrc(e){return e.length===0?`^${EVE_ROUTE_PREFIX}/(.*)$`:`^${escapeVercelRouteLiteral(e.startsWith(`/`)?e:`/${e}`)}${EVE_ROUTE_PREFIX}/(.*)$`}function createEveRequestPathRoute(e){return{src:e,transforms:[{args:`${EVE_ROUTE_PREFIX}/$1`,op:`set`,type:`request.path`}]}}function createEveHomeRouteSrc(e){return e.length===0?void 0:`^${escapeVercelRouteLiteral(e.startsWith(`/`)?e:`/${e}`)}/?$`}function createEveHomePathRoute(e){let t=createEveHomeRouteSrc(e);return t===void 0?void 0:{src:t,transforms:[{args:`/`,op:`set`,type:`request.path`}]}}function createEvePublicRoute(e,t){return{destination:{service:e,type:`service`},src:t}}function createIsolatedBuild(e){let t=join(e.projectRoot,`.eve/vercel-services`,e.serviceName),n=join(t,`.vercel`,`output`),r=normalizePublicRoutePrefix(e.agent.publicRoutePrefix),i=r===void 0?``:` && export ${EVE_PUBLIC_ROUTE_PREFIX_ENV}=${quoteVercelShellArgument(r)}`,a=e.agent.workspaceMember===!0?` && export ${EVE_INTERNAL_AGENT_WORKSPACE_MEMBER_ENV}=1`:``;return{buildCommand:`cd ${quoteVercelShellArgument(toVercelRelativePath(t,e.agent.appRoot))} && export ${EVE_INTERNAL_BUILD_OUTPUT_DIRECTORY_ENV}=${quoteVercelShellArgument(toVercelRelativePath(e.agent.appRoot,n))} && export ${EVE_INTERNAL_HOST_BUILD_OUTPUT_DIRECTORY_ENV}=${quoteVercelShellArgument(toVercelRelativePath(e.agent.appRoot,e.hostOutputDirectory))}${i}${a} && ${e.agent.buildCommand}`,root:toVercelRelativePath(e.projectRoot,t),rootDirectory:t}}function compileEveVercelService(e){let t=createEveServiceName(e.agent.name),n=createEveServiceRouteSrc(e.agent.publicRoutePrefix),r=e.agent.workspaceMember===!0?createEveHomeRouteSrc(e.agent.publicRoutePrefix):void 0,i=e.agent.workspaceMember===!0?createEveHomePathRoute(e.agent.publicRoutePrefix):void 0,a=createIsolatedBuild({agent:e.agent,hostOutputDirectory:e.target.hostOutputDirectory,projectRoot:e.target.projectRoot,serviceName:t});return{homeRouteSrc:r,rootDirectory:a.rootDirectory,routeSrc:n,service:{buildCommand:a.buildCommand,framework:`eve`,root:a.root,routes:[...i===void 0?[]:[i],createEveRequestPathRoute(n)],...e.agent.publicRoutePrefix.length>0?{routePrefix:e.agent.publicRoutePrefix}:{}},serviceName:t}}export{compileEveVercelService,createEveHomePathRoute,createEveHomeRouteSrc,createEvePublicRoute,createEveRequestPathRoute,createEveServiceName,createEveServiceRouteSrc};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { StandardJSONSchemaV1 } from "#compiled/@standard-schema/spec/index.js";
|
|
2
|
+
import type { HeadersValue } from "#client/types.js";
|
|
3
|
+
import { type OutboundAuthFn } from "#public/agents/auth.js";
|
|
4
|
+
import { type RemoteAgentDefinition, type RemoteAgentUrl } from "#public/definitions/remote-agent.js";
|
|
5
|
+
import type { JsonObject } from "#shared/json.js";
|
|
6
|
+
/** Runtime transport for one workspace peer. */
|
|
7
|
+
export interface WorkspaceAgentTransport {
|
|
8
|
+
readonly auth?: OutboundAuthFn;
|
|
9
|
+
readonly headers?: HeadersValue;
|
|
10
|
+
readonly url: RemoteAgentUrl;
|
|
11
|
+
}
|
|
12
|
+
/** A workspace peer exposed as one remote subagent. */
|
|
13
|
+
export interface WorkspaceAgentDefinition {
|
|
14
|
+
/** Overrides the peer agent's description in the parent's tool definition. */
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
readonly forwardPrincipal?: boolean;
|
|
17
|
+
readonly outputSchema?: StandardJSONSchemaV1<unknown, unknown> | JsonObject;
|
|
18
|
+
/** Name of the peer workspace member, such as `research`. */
|
|
19
|
+
readonly name: string;
|
|
20
|
+
/** Overrides environment-aware workspace routing and service authentication. */
|
|
21
|
+
readonly transport?: WorkspaceAgentTransport;
|
|
22
|
+
}
|
|
23
|
+
/** Defines one workspace peer as a remote subagent. */
|
|
24
|
+
export declare function defineWorkspaceAgent(definition: WorkspaceAgentDefinition): RemoteAgentDefinition;
|
|
25
|
+
export declare function workspaceSubagentName(value: unknown): string | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{vercelOidc}from"#public/agents/auth.js";import{defineRemoteAgent}from"#public/definitions/remote-agent.js";const WORKSPACE_AGENT_NAME=Symbol.for(`eve.workspace-agent.name`);function defineWorkspaceAgent(e){let t=e.transport??defaultWorkspaceAgentTransport(e.name),n=defineRemoteAgent({auth:t.auth,description:e.description??``,forwardPrincipal:e.forwardPrincipal,headers:t.headers,outputSchema:e.outputSchema,url:t.url});return Object.defineProperty(n,WORKSPACE_AGENT_NAME,{value:e.name}),n}function workspaceSubagentName(e){return isBrandedWorkspaceSubagent(e)?e[WORKSPACE_AGENT_NAME]:void 0}function isBrandedWorkspaceSubagent(e){return typeof e==`object`&&!!e&&Reflect.has(e,WORKSPACE_AGENT_NAME)}function defaultWorkspaceAgentTransport(e){let t=vercelOidc();return{auth:async()=>(requireVercelWorkspaceEnvironment(),t()),url:()=>{requireVercelWorkspaceEnvironment();let t=process.env.VERCEL_ENV===`production`?process.env.VERCEL_PROJECT_PRODUCTION_URL:process.env.VERCEL_URL;if(t===void 0||t.length===0)throw Error(`The default workspace-agent transport requires VERCEL_URL, or VERCEL_PROJECT_PRODUCTION_URL in production.`);return`https://${t}/${e}`}}}function requireVercelWorkspaceEnvironment(){if(!process.env.VERCEL)throw Error(`No default workspace-agent transport is available in this environment. Provide transport to defineWorkspaceAgent().`)}export{defineWorkspaceAgent,workspaceSubagentName};
|
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export { type AgentCompactionDefinition, type AgentDefinition, type AgentExperimentalDefinition, type AgentLimitsDefinition, type AgentModelDefinition, type AgentModelOptionsDefinition, type AgentReasoningDefinition, type AgentStaticModelDefinition, type AgentWorkflowDefinition, type AgentWorkflowRetentionDefinition, type AgentWorkflowWorldDefinition, type DefinedAgent, type DynamicSubagentDefinition, type DynamicLocalSubagentDefinition, defineAgent, defineDynamic, } from "#public/definitions/agent.js";
|
|
5
5
|
export type { DynamicResolveContext, DynamicSentinel } from "#dynamic/definition.js";
|
|
6
|
+
export { defineWorkspaceAgent, type WorkspaceAgentDefinition, type WorkspaceAgentTransport, } from "#public/definitions/workspace-agent.js";
|
|
6
7
|
export { type RemoteAgentDefinition, type RemoteAgentDefinitionInput, type RemoteAgentUrl, defineRemoteAgent, } from "#public/definitions/remote-agent.js";
|
package/dist/src/public/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineAgent,defineDynamic}from"#public/definitions/agent.js";import{defineRemoteAgent}from"#public/definitions/remote-agent.js";export{defineAgent,defineDynamic,defineRemoteAgent};
|
|
1
|
+
import{defineAgent,defineDynamic}from"#public/definitions/agent.js";import{defineWorkspaceAgent}from"#public/definitions/workspace-agent.js";import{defineRemoteAgent}from"#public/definitions/remote-agent.js";export{defineAgent,defineDynamic,defineRemoteAgent,defineWorkspaceAgent};
|
|
@@ -1,6 +1,24 @@
|
|
|
1
|
-
import type { ChatGptCredentials } from "./oauth.js";
|
|
1
|
+
import type { ChatGptCredentials, ChatGptRefreshCredentials } from "./oauth.js";
|
|
2
|
+
export declare class ChatGptInvalidStoredSessionError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
2
5
|
export interface ChatGptCredentialStore {
|
|
3
|
-
read(): Promise<ChatGptCredentials | undefined>;
|
|
4
|
-
update(callback: (current: ChatGptCredentials | undefined) => Promise<ChatGptCredentials
|
|
6
|
+
read(): Promise<ChatGptRefreshCredentials | ChatGptCredentials | undefined>;
|
|
7
|
+
update(callback: (current: ChatGptRefreshCredentials | ChatGptCredentials | undefined) => Promise<ChatGptCredentials>, options?: {
|
|
8
|
+
replace?: boolean;
|
|
9
|
+
}): Promise<ChatGptCredentials>;
|
|
10
|
+
}
|
|
11
|
+
interface SecretStore {
|
|
12
|
+
get(input: {
|
|
13
|
+
service: string;
|
|
14
|
+
name: string;
|
|
15
|
+
}): Promise<string | null>;
|
|
16
|
+
set(input: {
|
|
17
|
+
service: string;
|
|
18
|
+
name: string;
|
|
19
|
+
value: string;
|
|
20
|
+
}): Promise<void>;
|
|
5
21
|
}
|
|
6
|
-
export declare function createChatGptCredentialStore(path?: string): ChatGptCredentialStore;
|
|
22
|
+
export declare function createChatGptCredentialStore(path?: string, secretStore?: SecretStore): ChatGptCredentialStore;
|
|
23
|
+
export declare function getDefaultChatGptCredentialStore(): ChatGptCredentialStore;
|
|
24
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID}from"node:crypto";import{mkdir,
|
|
1
|
+
import{randomUUID}from"node:crypto";import{mkdir,rm,stat}from"node:fs/promises";import{dirname,join}from"node:path";import{isErrnoCode,isObject}from"#shared/guards.js";import{homedir}from"node:os";import{setTimeout}from"node:timers/promises";import{secrets}from"#compiled/just-secrets/index.js";const SECRET_ID={service:`eve`,name:`chatgpt`},MAX_SECRET_BYTES=2560;var ChatGptInvalidStoredSessionError=class extends Error{constructor(){super(`The ChatGPT session in the OS secret store is invalid. Sign in again from /model to replace it.`)}};function createChatGptCredentialStore(e=join(homedir(),`.eve`,`auth`,`chatgpt.json`),t=secrets){let n;async function removeLegacyFile(){try{await rm(e,{force:!0})}catch{throw Error(`ChatGPT credentials are stored securely, but the old plaintext session could not be removed. Stop older eve processes, remove ~/.eve/auth/chatgpt.json, and retry.`)}}async function load(){let e;try{e=await t.get(SECRET_ID)}catch{throw secretStoreError()}if(e===null){n=void 0;return}let r;try{if(Buffer.byteLength(e)>MAX_SECRET_BYTES)throw Error();r=JSON.parse(e)}catch{throw new ChatGptInvalidStoredSessionError}if(!isObject(r)||typeof r.sessionId!=`string`||!r.sessionId||typeof r.refreshToken!=`string`||!r.refreshToken)throw new ChatGptInvalidStoredSessionError;let i={refreshToken:r.refreshToken,...typeof r.accountId==`string`&&{accountId:r.accountId},...typeof r.accountLabel==`string`&&{accountLabel:r.accountLabel}},a=n?.sessionId===r.sessionId?{...i,accessToken:n.credentials.accessToken,expiresAt:n.credentials.expiresAt}:i;return await removeLegacyFile(),{sessionId:r.sessionId,credentials:a}}return{async read(){return(await load())?.credentials},async update(r,i){await mkdir(dirname(e),{recursive:!0,mode:448});let a=`${e}.lock`,o=Date.now()+35e3;for(;;)try{await mkdir(a,{mode:448});break}catch(e){if(!isErrnoCode(e,`EEXIST`))throw e;let t=await stat(a).catch(e=>{if(!isErrnoCode(e,`ENOENT`))throw e});if(t&&Date.now()-t.mtimeMs>6e5){await rm(a,{recursive:!0,force:!0});continue}if(Date.now()>=o)throw Error(`Another eve process is updating the ChatGPT session. Retry shortly.`);await setTimeout(100)}try{let e=i?.replace?void 0:await load(),a=await r(e?.credentials),o=e?.sessionId??randomUUID(),s=JSON.stringify({sessionId:o,refreshToken:a.refreshToken,...a.accountId&&{accountId:a.accountId},...a.accountLabel&&{accountLabel:a.accountLabel}});if(Buffer.byteLength(s)>MAX_SECRET_BYTES)throw Error(`The ChatGPT refresh session exceeds the OS secret store's 2,560-byte limit. Use an API-key model instead.`);try{await t.set({...SECRET_ID,value:s})}catch{throw secretStoreError()}return n={sessionId:o,credentials:a},await removeLegacyFile(),a}finally{await rm(a,{recursive:!0,force:!0})}}}}let defaultStore;function getDefaultChatGptCredentialStore(){return defaultStore??=createChatGptCredentialStore()}function secretStoreError(){let e=process.platform===`linux`?`Install libsecret-tools and start or unlock a Secret Service keyring with a session D-Bus. Headless sessions may need an API-key model.`:process.platform===`win32`?`Allow Windows PowerShell and Credential Manager access in your user session.`:`Unlock your login keychain and allow credential access.`;return Error(`Could not access ChatGPT credentials in the OS secret store. ${e} Retry from /model.`)}export{ChatGptInvalidStoredSessionError,createChatGptCredentialStore,getDefaultChatGptCredentialStore};
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
export declare const CHATGPT_ISSUER = "https://auth.openai.com";
|
|
2
2
|
export declare const CHATGPT_CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
3
3
|
export declare const CHATGPT_LOGIN_HINT = "Open `/model` in `eve dev` and select ChatGPT subscription to sign in.";
|
|
4
|
-
export interface
|
|
5
|
-
readonly accessToken: string;
|
|
4
|
+
export interface ChatGptRefreshCredentials {
|
|
6
5
|
readonly refreshToken: string;
|
|
7
|
-
readonly expiresAt: number;
|
|
8
6
|
readonly accountId?: string;
|
|
9
7
|
readonly accountLabel?: string;
|
|
10
8
|
}
|
|
9
|
+
export interface ChatGptCredentials extends ChatGptRefreshCredentials {
|
|
10
|
+
readonly accessToken: string;
|
|
11
|
+
readonly expiresAt: number;
|
|
12
|
+
}
|
|
11
13
|
export declare class ChatGptSignInRequiredError extends Error {
|
|
12
14
|
constructor();
|
|
13
15
|
}
|
|
14
16
|
export declare function requestChatGptTokens(parameters: Record<string, string>, options?: {
|
|
15
17
|
fetch?: typeof fetch;
|
|
16
18
|
signal?: AbortSignal;
|
|
17
|
-
previous?:
|
|
19
|
+
previous?: ChatGptRefreshCredentials;
|
|
18
20
|
now?: () => number;
|
|
19
21
|
}): Promise<ChatGptCredentials>;
|
|
20
22
|
export declare function readChatGptAuthResponse(response: Response): Promise<unknown>;
|