eve 0.76.0 → 0.76.2
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 +21 -0
- package/dist/src/channel/channel-address.d.ts +3 -1
- package/dist/src/channel/channel-address.js +1 -1
- package/dist/src/channel/session-stranded-error.d.ts +25 -0
- package/dist/src/channel/session-stranded-error.js +1 -0
- package/dist/src/channel/session.d.ts +13 -6
- package/dist/src/channel/types.d.ts +29 -1
- package/dist/src/chunks/{use-eve-agent-QmriPA-w.js → use-eve-agent-BtKWTEpm.js} +31 -14
- package/dist/src/chunks/{use-eve-agent-D2V9UhLt.js → use-eve-agent-jI6EsYAu.js} +31 -14
- package/dist/src/cli/commands/registry-project.d.ts +10 -3
- package/dist/src/cli/commands/registry-project.js +2 -2
- package/dist/src/cli/commands/registry.js +1 -1
- package/dist/src/cli/dev/tui/runner.js +3 -3
- package/dist/src/cli/dev/tui/stranded-session.d.ts +9 -0
- package/dist/src/cli/dev/tui/stranded-session.js +1 -0
- package/dist/src/client/client-error.d.ts +16 -0
- package/dist/src/client/client-error.js +1 -1
- package/dist/src/client/client.js +1 -1
- package/dist/src/client/index.d.ts +3 -2
- package/dist/src/client/index.js +1 -1
- package/dist/src/client/open-stream.d.ts +5 -3
- package/dist/src/client/open-stream.js +1 -1
- package/dist/src/client/session-controls.js +1 -1
- package/dist/src/client/session.js +1 -1
- package/dist/src/client/transcript-reducer.d.ts +46 -0
- package/dist/src/client/transcript-reducer.js +2 -0
- package/dist/src/compiled/.vendor-stamp.json +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +20 -20
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/compiler/manifest.js +1 -1
- package/dist/src/compiler/normalize-agent-config.js +1 -1
- package/dist/src/context/accessors.d.ts +1 -1
- package/dist/src/context/build-callback-context.js +1 -1
- package/dist/src/context/dynamic-resolve-context.js +1 -1
- package/dist/src/context/keys.d.ts +5 -0
- package/dist/src/context/keys.js +1 -1
- package/dist/src/context/providers/session.d.ts +1 -0
- package/dist/src/context/providers/session.js +1 -1
- package/dist/src/context/session-context.d.ts +8 -2
- package/dist/src/dynamic/definition.d.ts +7 -1
- package/dist/src/evals/types.d.ts +2 -1
- package/dist/src/eve-channel/index.js +1 -1
- package/dist/src/eve-channel/request.js +2 -2
- package/dist/src/eve-channel/support.d.ts +2 -0
- package/dist/src/eve-channel/support.js +1 -1
- package/dist/src/execution/agent-sessions/steps.js +1 -1
- package/dist/src/execution/dynamic-workflow/tool.js +1 -1
- package/dist/src/execution/eve-workflow-attributes.d.ts +15 -0
- package/dist/src/execution/eve-workflow-attributes.js +1 -1
- package/dist/src/execution/install-workflow-world.d.ts +7 -0
- package/dist/src/execution/install-workflow-world.js +1 -0
- package/dist/src/execution/legacy-session/authorization.js +1 -1
- package/dist/src/execution/legacy-session/inbox.js +1 -1
- package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
- package/dist/src/execution/session/entry.js +1 -1
- package/dist/src/execution/session/handoff-steps.d.ts +11 -0
- package/dist/src/execution/session/handoff-steps.js +1 -1
- package/dist/src/execution/session/program.js +1 -1
- package/dist/src/execution/session/timeout-steps.js +1 -1
- package/dist/src/execution/session-event-stream.d.ts +6 -0
- package/dist/src/execution/session-event-stream.js +1 -1
- package/dist/src/execution/session-inbox/address.d.ts +4 -0
- package/dist/src/execution/session-inbox/address.js +1 -1
- package/dist/src/execution/session-inbox/end-stranded-session.d.ts +22 -0
- package/dist/src/execution/session-inbox/end-stranded-session.js +1 -0
- package/dist/src/execution/session-inbox/hook-release.d.ts +4 -0
- package/dist/src/execution/session-inbox/hook-release.js +1 -0
- package/dist/src/execution/session-inbox/owner.d.ts +48 -0
- package/dist/src/execution/session-inbox/owner.js +1 -0
- package/dist/src/execution/session-inbox/resume.d.ts +12 -0
- package/dist/src/execution/session-inbox/resume.js +1 -1
- package/dist/src/execution/session-inbox/runnable-owner.d.ts +13 -0
- package/dist/src/execution/session-inbox/runnable-owner.js +1 -0
- package/dist/src/execution/session-inbox/stranded-replay-guard.d.ts +16 -0
- package/dist/src/execution/session-inbox/stranded-replay-guard.js +1 -0
- package/dist/src/execution/tools/agent-router-workflow.js +1 -1
- package/dist/src/execution/workflow-runtime.d.ts +5 -1
- package/dist/src/execution/workflow-runtime.js +1 -1
- package/dist/src/harness/compaction/step.js +1 -1
- package/dist/src/harness/input-request-resolution.js +1 -1
- package/dist/src/harness/model-call/call.d.ts +1 -1
- package/dist/src/harness/model-call/call.js +1 -1
- package/dist/src/harness/model-call/errors.d.ts +5 -6
- package/dist/src/harness/model-call/errors.js +1 -1
- package/dist/src/harness/model-call/recovery.d.ts +4 -3
- package/dist/src/harness/model-call/request.d.ts +2 -1
- package/dist/src/harness/model-call/request.js +1 -1
- package/dist/src/harness/model-call/tools.js +1 -1
- package/dist/src/harness/model-profile.d.ts +10 -3
- package/dist/src/harness/model-profile.js +1 -1
- package/dist/src/harness/prompt-cache.d.ts +6 -3
- package/dist/src/harness/prompt-cache.js +1 -1
- package/dist/src/harness/provider-safety.d.ts +2 -1
- package/dist/src/harness/provider-safety.js +1 -1
- package/dist/src/harness/provider-tools.d.ts +1 -1
- package/dist/src/harness/provider-tools.js +1 -1
- package/dist/src/harness/session-machine/transitions.d.ts +3 -1
- package/dist/src/harness/session-machine/transitions.js +1 -1
- package/dist/src/harness/step/context.js +1 -1
- package/dist/src/harness/step-hooks.js +1 -1
- package/dist/src/internal/application/compiled-artifacts.js +4 -4
- package/dist/src/internal/application/package.d.ts +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/application/stamped-package-version.d.ts +5 -0
- package/dist/src/internal/application/stamped-package-version.js +1 -0
- package/dist/src/internal/authored-definition/core.d.ts +3 -0
- package/dist/src/internal/authored-definition/core.js +1 -1
- package/dist/src/internal/model-auth/available-models.js +1 -1
- package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
- package/dist/src/internal/workflow/development-run-unavailable-error.d.ts +15 -0
- package/dist/src/internal/workflow/development-run-unavailable-error.js +1 -0
- package/dist/src/internal/workflow/development-world-server.js +1 -1
- package/dist/src/internal/workflow-bundle/workflow-builders.js +1 -1
- package/dist/src/protocol/message.d.ts +14 -0
- package/dist/src/protocol/message.js +1 -1
- package/dist/src/public/channels/index.d.ts +1 -1
- package/dist/src/public/channels/index.js +1 -1
- package/dist/src/public/context/index.d.ts +1 -1
- package/dist/src/public/definitions/callback-context.d.ts +1 -1
- package/dist/src/public/definitions/channel.d.ts +1 -0
- package/dist/src/public/definitions/channel.js +1 -1
- package/dist/src/public/models/openai/chatgpt/model.js +1 -1
- package/dist/src/public/models/openai/chatgpt/transport.js +1 -1
- package/dist/src/public/tanstack/index.d.ts +40 -0
- package/dist/src/public/tanstack/index.js +1 -0
- package/dist/src/runtime/agent/resolve-model.js +1 -1
- package/dist/src/runtime/resolve-agent.js +1 -1
- package/dist/src/setup/flows/model-login.js +1 -1
- package/dist/src/setup/integrations/web/framework.d.ts +8 -0
- package/dist/src/setup/integrations/web/framework.js +1 -0
- package/dist/src/setup/integrations/web/hosting.d.ts +43 -0
- package/dist/src/setup/integrations/web/hosting.js +15 -0
- package/dist/src/setup/integrations/web/setup.d.ts +6 -10
- package/dist/src/setup/integrations/web/setup.js +23 -17
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/setup/scaffold/create/web-template.d.ts +6 -2
- package/dist/src/setup/scaffold/create/web-template.js +39 -2
- package/dist/src/setup/scaffold/update/channels.js +1 -1
- package/dist/src/setup/vercel-project-framework.js +1 -1
- package/dist/src/shared/agent-definition.d.ts +25 -0
- package/dist/src/shared/agent-definition.js +1 -1
- package/dist/src/shared/chatgpt-model.d.ts +8 -0
- package/dist/src/shared/chatgpt-model.js +1 -1
- package/dist/src/subagents/callback-route.js +1 -1
- package/dist/src/svelte/index.js +1 -1
- package/dist/src/svelte/use-eve-agent.js +1 -1
- package/dist/src/tools/provided/ask-question-workflow.js +1 -1
- package/dist/src/tools/provided/sleep-workflow.js +1 -1
- package/dist/src/vue/index.js +1 -1
- package/dist/src/vue/use-eve-agent.js +1 -1
- package/docs/agent-config.md +32 -1
- package/docs/channels/custom.mdx +26 -0
- package/docs/channels/eve.mdx +8 -5
- package/docs/concepts/built-in-tools.md +17 -0
- package/docs/concepts/execution-model-and-durability.mdx +100 -0
- package/docs/concepts/project-structure.mdx +2 -2
- package/docs/concepts/sessions-runs-and-streaming.md +36 -34
- package/docs/guides/client/messages.mdx +10 -1
- package/docs/guides/deployment/overview.md +2 -2
- package/docs/guides/dev-tui.md +2 -0
- package/docs/guides/frontend/meta.json +9 -1
- package/docs/guides/frontend/nextjs.mdx +1 -1
- package/docs/guides/frontend/overview.mdx +9 -8
- package/docs/guides/frontend/tanstack.mdx +201 -0
- package/docs/guides/session-context.md +1 -0
- package/docs/install-integrations.mdx +1 -1
- package/docs/instructions.mdx +1 -1
- package/docs/reference/typescript-api.md +1 -1
- package/docs/tools/human-in-the-loop.md +2 -0
- package/docs/tutorial/ship-it.mdx +1 -1
- package/package.json +7 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{streamText}from"ai";import{createLogger,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{createCompactionCompletedEvent,createCompactionRequestedEvent}from"#protocol/message.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{drainMemoryCommit,prepareMemoryCompaction}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{activeTurnId}from"#harness/session-machine/view.js";import{
|
|
1
|
+
import{streamText}from"ai";import{createLogger,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{createCompactionCompletedEvent,createCompactionRequestedEvent}from"#protocol/message.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{drainMemoryCommit,prepareMemoryCompaction}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage,addUsageOutsideTurns}from"#harness/turn-tag-state.js";import{idle}from"#harness/session-machine/transitions.js";import{stepStartedForResolvers}from"#harness/session-machine/resolver-events.js";import{requireSessionModelReference}from"#harness/types.js";import{buildGatewayAttributionHeaders,resolveEffectiveRuntimeModel}from"#harness/model-call/model.js";import{compactMessages,getInputTokenCount,shouldCompact}from"#harness/compaction/engine.js";import{normalizeModelStreamError}from"#harness/model-call/errors.js";import{runModelCallWithRetries}from"#harness/model-call/retry.js";import{extractGatewayCostUsd,extractTokenUsageDelta,gatewayModelId}from"#harness/model-call/usage.js";import{resolveModelProfile}from"#harness/model-profile.js";import{getRequestEnvelopeTokens}from"#harness/request-envelope.js";import{resolveCallProviderOptions}from"#harness/provider-safety.js";const log=createLogger(`harness.tool-loop`);async function compactHistory(e){let{config:t}=e;if(e.session.history.length>0)try{if(e.ctx!==void 0&&t.dispatchDynamicModelEvent!==void 0){let n=e.position();await t.dispatchDynamicModelEvent({ctx:e.ctx,event:stepStartedForResolvers({modelId:e.session.agent.modelReference?.id??`dynamic`,sequence:n.sequence,stepIndex:n.stepIndex,turnId:activeTurnId(n)}),messages:validateHarnessModelMessages(e.projectHistory(e.session.history))})}let n=await resolveEffectiveRuntimeModel({config:t,ctx:e.ctx,session:e.session});e.session=n.session;let r=e.position(),i=await maybeCompact({abortSignal:t.abortSignal,auth:e.ctx?.get(AuthKey)??null,betweenTurns:!0,emissionState:{...r,turnId:activeTurnId(r)},force:!0,historyProjector:t.historyProjector,messages:[...e.session.history],model:n.model,publish:e.publish,requestEnvelopeTokens:getRequestEnvelopeTokens(e.session),resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:e.session,telemetry:e.instrumentation?.telemetry()});if(e.session=i.session,i.failure!==void 0)throw i.failure.error}catch(t){logError(log,`manual session compaction failed`,t,{sessionId:e.session.sessionId})}return await e.apply(idle(e.view())),{next:null,session:e.session}}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{emissionState:t,publish: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,e.requestEnvelopeTokens,getRequestEnvelopeTokens(i)),c=shouldCanonicalizeMemory(r);if(!s&&!c)return{compacted:!1,messages:r,session:i};let l=requireSessionModelReference(i),u=i.agent.compactionModelReference??l,d=u===l?e.model:await e.resolveModel(u),f=resolveModelProfile(d),p=resolveCallProviderOptions({auth:e.auth,profile:f,providerOptions:u.providerOptions,session:i}),m={abortSignal:e.abortSignal,headers:buildGatewayAttributionHeaders(f,e.runtimeIdentity),model:d,providerOptions:p,telemetry:e.telemetry&&{...e.telemetry,functionId:`eve.compaction`}},h=[],summarize=async n=>{let r=await runModelCallWithRetries(()=>streamCompactionSummary({...m,...n}),{sessionId:i.sessionId,turnId:t.turnId},e.abortSignal);if(h.push(r.usage),r.text.trim().length===0)throw Error(`The compaction model returned an empty summary. Finish reason: ${r.finishReason}.`);return r.text};{let a=contextStorage.getStore();a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await n(createCompactionRequestedEvent({modelId:gatewayModelId(d)??`unknown`,sequence:t.sequence,sessionId:i.sessionId,stepIndex:t.stepIndex,turnId:t.turnId,usageInputTokens:getInputTokenCount(o,i.compaction,e.requestEnvelopeTokens,getRequestEnvelopeTokens(i))}),o)}let g=canonicalizeMemoryRecords(r),_=validateHarnessModelMessages(e.historyProjector?.({messages:g.ordinary,state:i.state})??g.ordinary),v=e.requestEnvelopeTokens??0,y={...i.compaction,threshold:Math.max(1,i.compaction.threshold-v),lastKnownInputTokens:i.compaction.lastKnownInputTokens===void 0?void 0:Math.max(0,i.compaction.lastKnownInputTokens-Math.min(getRequestEnvelopeTokens(i)??0,v))},b=[..._],x;try{s&&(b=await compactMessages([..._],y,summarize,e.force===!0,e.requestEnvelopeTokens===void 0?void 0:Math.max(0,getInputTokenCount(o,i.compaction,v,getRequestEnvelopeTokens(i))-v)))}catch(e){x={error:e}}for(let n of h)i=e.betweenTurns===!0?addUsageOutsideTurns(i,n):addTurnUsage(i,t.turnId,n);if(x!==void 0)return{compacted:!1,failure:x,messages:e.messages,session:i};r=validateHarnessModelMessages([...g.memory,...b]);{let a=contextStorage.getStore();if(a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await n(createCompactionCompletedEvent({modelId:gatewayModelId(d)??`unknown`,sequence:t.sequence,sessionId:i.sessionId,stepIndex:t.stepIndex,turnId:t.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),a!==void 0){let e=drainMemoryCommit(a);e!==void 0&&(r=validateHarnessModelMessages([...r,...e.recalledMessages]),i={...i,state:e.state})}}return{compacted:!0,messages:r,session:replaceSessionHistory(i,r)}}async function streamCompactionSummary(e){let t=streamText({...e,onError:()=>{}});for await(let e of t.fullStream)if(e.type===`error`)throw normalizeModelStreamError(e.error);let[n,r,i,a]=await Promise.all([t.text,t.finishReason,t.usage,t.providerMetadata]);return{finishReason:r,text:n,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(a),usage:i})}}export{compactHistory,maybeCompact,replaceSessionHistory};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SEARCH_TOOL_NAME}from"#protocol/catalog-tools.js";import{createRuntimeToolResultFromValue}from"#harness/action-result-helpers.js";const TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function resolveInputOutcome(e,t){return e===`tool-approval`?resolveApprovalOutcome(t).status:t===void 0?`ignored`:`answered`}function resolveApprovalOutcome(e){
|
|
1
|
+
import{SEARCH_TOOL_NAME}from"#protocol/catalog-tools.js";import{createRuntimeToolResultFromValue}from"#harness/action-result-helpers.js";const TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function resolveInputOutcome(e,t){return e===`tool-approval`?resolveApprovalOutcome(t).status:t===void 0?`ignored`:`answered`}function resolveApprovalOutcome(e){if(e===void 0)return{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`};if(e.optionId===`approve`)return{approved:!0,reason:void 0,status:`approved`};if(e.optionId===`cancel`||e.optionId===`deny`){let t=e.text?.trim();return{approved:!1,reason:t?`${TOOL_EXECUTION_DENIED_MESSAGE} The person who denied it wrote: ${JSON.stringify(t)}`:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}}return{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}function unavailableToolMessage(e,t){return`The tool "${e}" is no longer available, so the call didn't run. If the task still needs it, ${t?`find an available tool with ${SEARCH_TOOL_NAME} and make a new call`:`make a new call with an available tool`}.`}function failedCall(e){let{callId:t,message:n,toolName:r}=e;return{part:{output:{type:`error-text`,value:n},toolCallId:t,toolName:r,type:`tool-result`},result:createRuntimeToolResultFromValue({callId:t,isError:!0,output:n,toolName:r})}}export{TOOL_EXECUTION_DENIED_MESSAGE,failedCall,resolveApprovalOutcome,resolveInputOutcome,unavailableToolMessage};
|
|
@@ -6,7 +6,7 @@ import { type ModelProfile } from "#harness/model-profile.js";
|
|
|
6
6
|
import type { Step } from "#harness/step/context.js";
|
|
7
7
|
import { type Prompt } from "#harness/step/prompt.js";
|
|
8
8
|
import { type HarnessStepResult } from "#harness/step-hooks.js";
|
|
9
|
-
import type
|
|
9
|
+
import { type StepResult } from "#harness/types.js";
|
|
10
10
|
import type { InstrumentationAttempt } from "#instrumentation/runtime.js";
|
|
11
11
|
import { type RequestMessages } from "./request.js";
|
|
12
12
|
/** How one attempt differs from the step's first: what recovery and retries change. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{buildGatewayAttributionHeaders}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{ContentFilteredModelResponseError,EmptyModelResponseError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{emitStreamContent}from"#harness/emission.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`);var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry()}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:a,onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){return i.interrupted?await d?.complete():await d?.fail(e),i.check(),rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,f.length>0||p.length>0);let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n)throw new EmptyModelResponseError}export{ModelCaller};
|
|
1
|
+
import{buildGatewayAttributionHeaders}from"./model.js";import{isEmptyModelResponse,rethrowNoOutputAsEmptyResponse}from"./recovery.js";import{modelInstructions,requestMessages,withTrailingUserNote}from"./request.js";import{answerSkippedToolCalls,appendMissingToolResultMessages,extractToolResultCallIds,withAccumulatedResponseMessages}from"./response.js";import{runModelCallWithRetries}from"./retry.js";import{logToolExecutionError,prepareModelTools}from"./tools.js";import{extractGatewayCostUsd,extractTokenUsageDelta}from"./usage.js";import{ToolLoopAgent,isStepCount}from"ai";import{createLogger,logError}from"#internal/logging.js";import{AuthKey,HistoryStateKey}from"#context/keys.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{createStepCompletedEvent}from"#protocol/message.js";import{activeTurnId}from"#harness/session-machine/view.js";import{addTurnUsage}from"#harness/turn-tag-state.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages}from"#harness/attachment-staging.js";import{workingTaskIds}from"#execution/tasks/model-step.js";import{toEntryStep,toEntryStream,toEntryTelemetry}from"#harness/execute-call.js";import{discardAttempt}from"#harness/session-machine/transitions.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{estimateTokens}from"#harness/token-estimate.js";import{requireSessionModelReference}from"#harness/types.js";import{ContentFilteredModelResponseError,EmptyModelResponseError}from"#harness/model-call/errors.js";import{resolveModelProfile}from"#harness/model-profile.js";import{estimateRequestEnvelope}from"#harness/request-envelope.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{buildToolApproval}from"#harness/tools.js";import{compactPrompt,projectPrompt,withClientContext}from"#harness/step/prompt.js";import{emitStreamContent}from"#harness/emission.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{maybeCompact}from"#harness/compaction/step.js";const environment=process.env.NODE_ENV??`unknown`,log=createLogger(`harness.tool-loop`);var ModelCaller=class{profile;attributionHeaders;projectedMessages;request;modelMessages=[];requestEnvelopeTokens=0;interruptedUsage;compactionFailure;attemptIndex=0;step;prompt;input;constructor(e,t,n){this.step=e,this.prompt=t,this.input=n,this.profile=resolveModelProfile(n.model,requireSessionModelReference(e.session).promptCache),this.attributionHeaders=buildGatewayAttributionHeaders(this.profile,e.config.runtimeIdentity),this.projectedMessages=n.projectedMessages,this.request=this.buildRequest()}async call(e){let t=new Map;return await runModelCallWithRetries(async n=>(n>1&&(await this.settleRetriedActions(t),t=new Map),await this.attempt({...e,suppressStepStartedEmission:n!==1||e.suppressStepStartedEmission},t)),{canRetry:()=>this.compactionFailure===void 0,sessionId:this.step.session.sessionId,turnId:this.step.position().turnId},this.input.generation.signal)}async settleRetriedActions(e){for(let[t,n]of e)await this.step.apply(discardAttempt(this.step.view(),{calls:[{callId:t,toolName:n}]})),e.delete(t)}throwIfCompactionFailed(){if(this.compactionFailure!==void 0)throw this.compactionFailure.error}async steered(){let{step:e}=this;return throwIfTurnAborted(e.config.abortSignal),e.ctx?.set(HistoryStateKey,this.request.historyState),this.interruptedUsage!==void 0&&(e.session=addTurnUsage(e.session,e.position().turnId,this.interruptedUsage)),await e.emit?.(createStepCompletedEvent({...e.position(),finishReason:`other`,usage:this.interruptedUsage})),{next:e.runStep,session:{...e.session,history:[...this.request.history]},steered:!0}}clearInterruptedUsage(){this.interruptedUsage=void 0}buildRequest(){return requestMessages(this.step,{catalog:this.input.catalog,hidesHeldText:this.input.hidesHeldText,messages:this.prompt.messages,pendingApprovalsNote:this.input.pendingApprovalsNote,projectedMessages:this.projectedMessages,turnMessages:this.input.turnMessages})}instructions(e){return modelInstructions({anthropicCache:this.profile.anthropicCache,extraSystemNote:e,session:this.step.session,systemMessages:this.request.systemMessages})}async prepare(e){let t=await prepareModelTools(this.step,{catalog:this.input.catalog,disabledProviderTools:e.disabledProviderTools,generation:this.input.generation,profile:this.profile});return this.request=this.buildRequest(),this.requestEnvelopeTokens=await estimateRequestEnvelope({history:this.projectedMessages,instructions:this.instructions(e.extraSystemNote),messages:withTrailingUserNote(this.request.nonSystemMessages,e.trailingUserNote),tools:t}),t}async compact(e,t){let{step:n,prompt:r}=this,{config:i}=n,a;try{if(a=await maybeCompact({abortSignal:i.abortSignal,auth:n.ctx?.get(AuthKey)??null,emissionState:n.position(),historyProjector:i.historyProjector,messages:[...r.messages],model:this.input.model,promptMessages:withClientContext(r),publish:n.publish,requestEnvelopeTokens:this.requestEnvelopeTokens,resolveModel:i.resolveModel,runtimeIdentity:i.runtimeIdentity,session:n.session,telemetry:n.instrumentation?.telemetry()}),a.failure!==void 0)throw a.failure.error}catch(e){throw this.compactionFailure={error:e},e}if(n.session=a.session,!a.compacted)return t;compactPrompt(n,r,a.messages);let{compaction:o}=n.session;return n.session={...n.session,compaction:{recentWindowSize:o.recentWindowSize,threshold:o.threshold,thresholdPercent:o.thresholdPercent}},this.projectedMessages=projectPrompt(n,r),await this.prepare(e)}async attempt(e,t){let{step:n}=this,{catalog:r,generation:i,model:a}=this.input,o=await this.compact(e,await this.prepare(e));this.requestEnvelopeTokens=Math.max(0,this.requestEnvelopeTokens-(estimateTokens(this.request.history)-estimateTokens(this.prompt.messages))),i.begin(),this.modelMessages=await hydrateSandboxAttachments(this.request.nonSystemMessages),this.profile.filesOutsideToolResults&&(this.modelMessages=moveToolResultFilesToUserMessages(this.modelMessages));let s=this.instructions(e.extraSystemNote),c=n.instrumentation?.resolveRuntimeContext({emissionState:n.position(),environment,modelInput:{instructions:s,messages:this.modelMessages},session:n.session})??{};e.retryReason&&(c[`eve.retry.reason`]=e.retryReason);let l=withTrailingUserNote(this.modelMessages,e.trailingUserNote),u=n.position(),d=n.instrumentation?.prepareAttempt({isFrameworkTool:e=>n.frameworkToolNames.has(e),attemptIndex:this.attemptIndex++,runtimeContext:c,stepIndex:u.stepIndex,turnId:activeTurnId(u)});this.input.setAttemptScope(d?.scope);let f=buildStepHooks({auth:n.ctx?.get(AuthKey)??null,profile:this.profile,session:n.session,startStep:e.suppressStepStartedEmission===!0?void 0:this.input.startStep}),p={headers:this.attributionHeaders,instructions:s,model:a,onLanguageModelCallEnd:e=>{i.interrupted||(this.interruptedUsage=extractTokenUsageDelta({costUsd:extractGatewayCostUsd(e.providerMetadata),usage:e.usage}))},onToolExecutionEnd:e=>logToolExecutionError(e,r.resolve),onError(e){i.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:f.onStepEnd,onStepStart:f.onStepStart,prepareStep:f.prepareStep,reasoning:n.session.agent.modelReference?.reasoning??n.session.agent.reasoning,runtimeContext:c,stopWhen:isStepCount(1),telemetry:toEntryTelemetry(d?.telemetry,r.resolve),toolApproval:buildToolApproval({abortSignal:i.signal,approvedTools:this.input.approvedTools,resolve:r.resolve}),tools:o},m=new ToolLoopAgent(p);try{let e=await this.stream(m,l,f.stepResult,t);return await d?.complete(),e}catch(e){return i.interrupted?await d?.complete():await d?.fail(e),i.check(),rethrowNoOutputAsEmptyResponse(e)}}async stream(e,t,n,r){let{step:i}=this,{catalog:a,generation:o}=this.input,s=new Set([REPLY_TOOL_NAME]),c=await e.stream({abortSignal:o.signal,messages:t}),{emittedActionCallIds:l,handledInlineToolResultCallIds:u,invalidInputToolCallIds:d,inlineAuthorizationResults:f,trailingInlineToolResultParts:p}=await emitStreamContent(i.publish,i.position(),toEntryStream(interruptStreamOnFailure(c.fullStream,o.signal),a.resolve),{excludedActionToolNames:s,hidesHeldText:this.input.hidesHeldText&&workingTaskIds(i.session).length>0,tools:a,unsettledActionToolNames:r});throwIfTurnAborted(i.config.abortSignal),o.check();let[m,h]=toEntryStep(...await Promise.all([n,c.responseMessages]),a.resolve);assertUsableResponse(m,h,f.length>0||p.length>0);let g=answerSkippedToolCalls(m,a);await emitStepActions(i.publish,i.position(),g.length===0?m:withAccumulatedResponseMessages({stepResult:m,responseMessages:appendMissingToolResultMessages({append:g,responseMessages:m.response.messages})}),{emittedActionCallIds:l,excludedActionCallIds:d,excludedActionToolNames:s,handledInlineToolResultCallIds:u,tools:a});let _=new Map(m.toolResults.map(e=>[e.toolCallId,e]));for(let e of f)_.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:d,responseMessages:appendMissingToolResultMessages({append:[...p,...answerSkippedToolCalls(m,a)],responseMessages:h}),stepResult:m,toolResults:[..._.values()]})}};function assertUsableResponse(e,t,n){if(e.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(e.providerMetadata));if(isEmptyModelResponse(e)&&extractToolResultCallIds(t).size===0&&!n)throw new EmptyModelResponseError}export{ModelCaller};
|
|
@@ -18,13 +18,12 @@ export interface UpstreamRejectionSummary {
|
|
|
18
18
|
*/
|
|
19
19
|
export declare function extractUpstreamRejectionMessage(error: unknown): UpstreamRejectionSummary | null;
|
|
20
20
|
/**
|
|
21
|
-
* Returns the distinct upstream
|
|
22
|
-
*
|
|
23
|
-
* provider attempt list.
|
|
21
|
+
* Returns the distinct upstream identifiers named by any unsupported provider tool rejection
|
|
22
|
+
* (see {@link UNSUPPORTED_PROVIDER_TOOL_MATCHERS}) in a model-call error.
|
|
24
23
|
*
|
|
25
|
-
* Walks the cause chain
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* Walks the cause chain and inspects both the structured `data` field and
|
|
25
|
+
* the raw `responseBody` JSON. Returns an empty array for errors that are
|
|
26
|
+
* not of this shape.
|
|
28
27
|
*
|
|
29
28
|
* Used by the harness recovery path to identify which framework tools
|
|
30
29
|
* to drop before retrying the failing step. Detection is by string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isObject}from"#shared/guards.js";import{toError,walkCauseChain}from"#shared/errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";const
|
|
1
|
+
import{isObject}from"#shared/guards.js";import{toError,walkCauseChain}from"#shared/errors.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";const UNSUPPORTED_PROVIDER_TOOL_MATCHERS=[e=>/tool type ['"]([\w.-]+)['"] is not supported/i.exec(e)?.[1],e=>/Input tag ['"]([\w.-]+)['"] found using ['"]type['"] does not match/i.exec(e)?.[1],e=>/Invalid value: ['"]([\w.-]+)['"]/i.exec(e)?.[1],e=>/web search is not supported for this request/i.test(e)?`web_search`:void 0];function extractUpstreamRejectionMessage(e){let t=readModelCallErrorSignals(e);if(isTransientHttpStatus(t.statusCode??t.upstreamStatusCode))return null;let n=t.apiErrorMessage;if(n!==void 0)return{name:upstreamRejectionName(t),message:n};if(t.statusCode===400&&isGatewayErrorSignal(t))return{name:`AI Gateway model request rejected`,message:`AI Gateway rejected the model request before the agent produced a response.`};let r=formatApiCallErrorFallback(t);return r===void 0?null:{name:upstreamRejectionName(t),message:r}}function upstreamRejectionName(e){return isGatewayErrorSignal(e)?`AI Gateway model request rejected`:`Model provider API error`}function isTransientHttpStatus(e){return e===408||e===429||e!==void 0&&e>=500}function extractUnsupportedProviderToolTypes(e){let t=new Set;for(let n of walkCauseChain(e)){collectUnsupportedToolTypesFromValue(readObjectField(n,`data`),t);let e=readStringField(n,`responseBody`);if(e!==void 0)try{collectUnsupportedToolTypesFromValue(JSON.parse(e),t)}catch{collectUnsupportedToolTypes(e,t)}}return[...t]}function collectUnsupportedToolTypes(e,t){for(let n of UNSUPPORTED_PROVIDER_TOOL_MATCHERS){let r=n(e);r!==void 0&&t.add(r)}}function collectUnsupportedToolTypesFromValue(e,t){if(e!=null){if(typeof e==`string`){collectUnsupportedToolTypes(e,t);return}if(Array.isArray(e)){for(let n of e)collectUnsupportedToolTypesFromValue(n,t);return}if(isObject(e))for(let n of Object.values(e))collectUnsupportedToolTypesFromValue(n,t)}}function extractModelCallErrorDetails(e){let t=readModelCallErrorSignals(e),n={};return e instanceof ContentFilteredModelResponseError&&(n.finishReason=`content-filter`,appendJsonField(n,`generationId`,e.generationId)),appendJsonField(n,`apiErrorMessage`,t.apiErrorMessage),appendJsonField(n,`gatewayName`,t.gatewayName),appendJsonField(n,`gatewayType`,t.gatewayType),appendJsonField(n,`statusCode`,t.statusCode),appendJsonField(n,`generationId`,t.generationId),appendJsonField(n,`upstreamStatusCode`,t.upstreamStatusCode),appendJsonField(n,`upstreamType`,t.upstreamType),appendJsonField(n,`upstreamMessage`,t.upstreamMessage),appendJsonField(n,`responseBodySnippet`,t.responseBodySnippet),n}function readErrorName(e){if(e instanceof Error||isObject(e)&&typeof e.name==`string`)return e.name}function readErrorMessage(e){return e instanceof Error||isObject(e)&&typeof e.message==`string`?e.message:``}var EmptyModelResponseError=class extends Error{constructor(e){super(`The model did not return a response. Please try again.`,e),this.name=`EmptyModelResponseError`}},ContentFilteredModelResponseError=class extends Error{generationId;constructor(e){super(`The model provider filtered this response.`),this.name=`ContentFilteredModelResponseError`,this.generationId=e}};function normalizeModelStreamError(e){let t=toError(e);return t===e||Object.defineProperty(t,"cause",{configurable:!0,value:e}),t}function isNoOutputGeneratedError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_NoOutputGeneratedError`)return!0;return!1}function classifyModelCallError(e){if(isTurnCancellation(e))return`terminal`;if(e instanceof EmptyModelResponseError)return`recoverable`;if(hasRetryableFlag(e))return`retry`;let t=summarizeKnownError(e);if(t?.tags.includes(`recoverable`)===!0)return`recoverable`;if(t?.tags.includes(`config`)===!0)return`terminal`;if(t?.tags.includes(`transient`)===!0)return`retry`;let n=readModelCallErrorSignals(e);if(n.statusCode===402)return`recoverable`;if(isRetryableGatewayType(n.upstreamType))return`retry`;if(isTerminalGatewayType(n.upstreamType)||n.gatewayType===`invalid_request_error`||n.gatewayName===`GatewayInvalidRequestError`)return`terminal`;let r=n.statusCode;if(r!==void 0){if(r===408||r===409||r===429||r>=500)return`retry`;if(isAmbiguousGatewayInternalBadRequest(n))return`recoverable`;if(r>=400&&r<500)return`terminal`}return`recoverable`}function hasRetryableFlag(e){for(let t of walkCauseChain(e))if(isObject(t)&&t.isRetryable===!0)return!0;return!1}function readModelCallErrorSignals(e){let t=findGatewayError(e),n=findUpstreamApiCallError(e),r=readStringField(n,`responseBody`),i=readGatewayErrorBody(n);return{apiCallError:n!==void 0,apiErrorMessage:i?.apiErrorMessage??firstInformativeApiMessage([readErrorMessage(n)]),gatewayName:readErrorName(t),gatewayType:readStringField(t,`type`),generationId:readStringField(t,`generationId`)??i?.generationId,responseBodySnippet:r===void 0?void 0:truncateSnippet(r,1e3),statusCode:readStatusCode(t)??readStatusCode(n)??findStatusCode(e),upstreamMessage:i?.message,upstreamStatusCode:readStatusCode(n),upstreamType:i?.type}}function findGatewayError(e){for(let t of walkCauseChain(e)){let e=readErrorName(t),n=readStringField(t,`type`);if(e?.startsWith(`Gateway`)||n?.endsWith(`_error`)||n===`rate_limit_exceeded`)return t}}function findUpstreamApiCallError(e){for(let t of walkCauseChain(e))if(readErrorName(t)===`AI_APICallError`||readStringField(t,`responseBody`)!==void 0||readObjectField(t,`data`)!==void 0||readObjectField(t,`requestBodyValues`)!==void 0)return t}function readGatewayErrorBody(e){let t=readGatewayErrorBodyFromValue(readObjectField(e,`data`));if(t!==void 0)return t;let n=readStringField(e,`responseBody`);if(n!==void 0)try{return readGatewayErrorBodyFromValue(JSON.parse(n))}catch{return}}function readGatewayErrorBodyFromValue(e){if(!isObject(e))return;let t=readObjectField(e,`error`),n=readStringField(e,`generationId`),r=readStringField(t,`message`)??readStringField(e,`message`),i=readStringField(t,`type`)??readStringField(e,`type`),a=firstInformativeApiMessage([r,...readNestedApiErrorMessages(t),...readNestedApiErrorMessages(e)]);return r===void 0&&i===void 0&&n===void 0&&a===void 0?void 0:{apiErrorMessage:a,generationId:n,message:r,type:i}}function readStatusCode(e){if(isObject(e))return typeof e.statusCode==`number`?e.statusCode:void 0}function findStatusCode(e){for(let t of walkCauseChain(e)){let e=readStatusCode(t);if(e!==void 0)return e}}function readStringField(e,t){if(!isObject(e))return;let n=e[t];return typeof n==`string`&&n.length>0?n:void 0}function readObjectField(e,t){if(!isObject(e))return;let n=e[t];return isObject(n)?n:void 0}function readNestedApiErrorMessages(e){if(!isObject(e))return[];let t=[];return appendString(t,readStringField(e,`message`)),appendString(t,readStringField(e,`error_description`)),appendNestedApiFieldMessages(t,e.error),appendNestedApiFieldMessages(t,e.code),t}function appendNestedApiFieldMessages(e,t){if(typeof t==`string`){appendString(e,t);return}isObject(t)&&(appendString(e,readStringField(t,`message`)),appendString(e,readStringField(t,`error`)),appendString(e,readStringField(t,`description`)),appendString(e,readStringField(t,`error_description`)),appendNestedApiFieldMessages(e,t.error))}function appendString(e,t){t!==void 0&&e.push(t)}function firstInformativeApiMessage(e){for(let t of e)if(t!==void 0&&isInformativeApiMessage(t))return truncateSnippet(t,800)}function isInformativeApiMessage(e){let t=e.trim();return t.length>0&&t!==`[object Object]`&&t!==`AI_APICallError`&&t!==`Bad Request`&&t!==`Internal Server Error`}function formatApiCallErrorFallback(e){if(!e.apiCallError)return;let t=e.statusCode??e.upstreamStatusCode,n=e.responseBodySnippet,r=e.upstreamType!==void 0&&isInformativeApiMessage(e.upstreamType)?e.upstreamType:void 0;if(t===void 0&&n===void 0&&r===void 0)return;let i=[t===void 0?void 0:`HTTP ${t}`,r].filter(e=>e!==void 0).join(`, `),a=i.length===0?`Model provider API request failed`:`Model provider API request failed (${i})`;return n===void 0?`${a}.`:`${a}: ${n}`}function isRetryableGatewayType(e){return e===`overloaded_error`||e===`rate_limit_exceeded`||e===`timeout_error`}function isTerminalGatewayType(e){return e===`authentication_error`||e===`invalid_request_error`||e===`model_not_found`}function isGatewayErrorSignal(e){return e.gatewayName!==void 0||e.gatewayType!==void 0}function isAmbiguousGatewayInternalBadRequest(e){return e.statusCode===400&&(e.gatewayName===`GatewayInternalServerError`||e.gatewayType===`internal_server_error`)&&(e.upstreamType===void 0||e.upstreamType===`internal_server_error`)}function appendJsonField(e,t,n){if(typeof n==`string`&&n.length>0){e[t]=n;return}typeof n==`number`&&Number.isFinite(n)&&(e[t]=n)}function truncateSnippet(e,t){return e.length<=t?e:`${e.slice(0,t)}...<truncated>`}export{ContentFilteredModelResponseError,EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError,normalizeModelStreamError};
|
|
@@ -11,9 +11,10 @@ type RecoveryCall = (options: {
|
|
|
11
11
|
* Recovers a failed model call, each recovery at most once and within the current step, so the
|
|
12
12
|
* reissue suppresses a second `step.started`:
|
|
13
13
|
*
|
|
14
|
-
* 1.
|
|
15
|
-
*
|
|
16
|
-
* capability went away. Only known provider tools
|
|
14
|
+
* 1. The host rejected a provider-specific tool it can't serve (an AI Gateway fallback provider,
|
|
15
|
+
* or an OpenAI-compatible endpoint without OpenAI web search): the call is reissued without
|
|
16
|
+
* it, and a system note tells the model which capability went away. Only known provider tools
|
|
17
|
+
* are dropped, never an authored one.
|
|
17
18
|
* 2. The response was empty (see {@link EmptyModelResponseError}), including the first
|
|
18
19
|
* recovery's: the call is reissued with {@link EMPTY_RESPONSE_NUDGE}, repeating what the first
|
|
19
20
|
* recovery removed.
|
|
@@ -2,6 +2,7 @@ import type { ModelMessage, SystemModelMessage } from "ai";
|
|
|
2
2
|
import type { StepCatalog } from "#execution/catalog/step-catalog.js";
|
|
3
3
|
import { createCurrentMessages } from "#harness/current-messages.js";
|
|
4
4
|
import { type HarnessModelMessage, type UserModelMessage } from "#harness/messages.js";
|
|
5
|
+
import type { ModelProfile } from "#harness/model-profile.js";
|
|
5
6
|
import type { Step } from "#harness/step/context.js";
|
|
6
7
|
import type { HarnessSession } from "#harness/types.js";
|
|
7
8
|
export type RequestMessages = ReturnType<typeof createCurrentMessages>;
|
|
@@ -22,7 +23,7 @@ export declare function requestMessages(step: Step, input: {
|
|
|
22
23
|
export declare function modelInstructions(input: {
|
|
23
24
|
readonly session: HarnessSession;
|
|
24
25
|
readonly systemMessages: readonly SystemModelMessage[];
|
|
25
|
-
readonly anthropicCache:
|
|
26
|
+
readonly anthropicCache: ModelProfile["anthropicCache"];
|
|
26
27
|
readonly extraSystemNote?: string;
|
|
27
28
|
}): SystemModelMessage | string | undefined;
|
|
28
29
|
/** A retry's note, trailing the call's messages. */
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{DynamicSkillManifestKey,HistoryStateKey}from"#context/keys.js";import{createFrameworkUserMessage}from"#harness/messages.js";import{dynamicSkillAnnouncements}from"#execution/skills/instructions.js";import{taskSystemMessages}from"#execution/tasks/model-step.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{catalogAnnouncements}from"#execution/catalog/listing.js";import{createCurrentMessages}from"#harness/current-messages.js";import{applySystemCacheBreakpoint}from"#harness/prompt-cache.js";function requestMessages(e,t){let{ctx:n}=e,r=createCurrentMessages(t.messages,{historyState:n?.get(HistoryStateKey),currentTurnMessages:t.turnMessages,projectedMessages:t.projectedMessages});n!==void 0&&r.addSystem(buildDynamicInstructionMessages(n)),r.addSystem(taskSystemMessages(t.catalog.offersTasks,{finalReplyOnly:t.hidesHeldText}));let i=n?.get(HistoryStateKey)?.announcements;return r.addAnnouncements({...catalogAnnouncements(t.catalog,i),...dynamicSkillAnnouncements(n?.get(DynamicSkillManifestKey),i)}),t.pendingApprovalsNote!==void 0&&r.add(t.pendingApprovalsNote,`context.state`,{cacheFriendly:!1}),r}function modelInstructions(e){let{session:t}=e,n=e.extraSystemNote?[{role:`system`,content:e.extraSystemNote}]:[];if(e.systemMessages.length===0&&n.length===0)return t.agent.system??void 0;let r=t.agent.system?[{role:`system`,content:t.agent.system}]:[],i=[...n,...r,...e.systemMessages];return mergeSystemInstructions(e.anthropicCache?applySystemCacheBreakpoint(i):i)}function withTrailingUserNote(e,t){return t?[...e,createFrameworkUserMessage(`execution.retry`,t)]:[...e]}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
|
|
1
|
+
import{DynamicSkillManifestKey,HistoryStateKey}from"#context/keys.js";import{createFrameworkUserMessage}from"#harness/messages.js";import{dynamicSkillAnnouncements}from"#execution/skills/instructions.js";import{taskSystemMessages}from"#execution/tasks/model-step.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{catalogAnnouncements}from"#execution/catalog/listing.js";import{createCurrentMessages}from"#harness/current-messages.js";import{applySystemCacheBreakpoint}from"#harness/prompt-cache.js";function requestMessages(e,t){let{ctx:n}=e,r=createCurrentMessages(t.messages,{historyState:n?.get(HistoryStateKey),currentTurnMessages:t.turnMessages,projectedMessages:t.projectedMessages});n!==void 0&&r.addSystem(buildDynamicInstructionMessages(n)),r.addSystem(taskSystemMessages(t.catalog.offersTasks,{finalReplyOnly:t.hidesHeldText}));let i=n?.get(HistoryStateKey)?.announcements;return r.addAnnouncements({...catalogAnnouncements(t.catalog,i),...dynamicSkillAnnouncements(n?.get(DynamicSkillManifestKey),i)}),t.pendingApprovalsNote!==void 0&&r.add(t.pendingApprovalsNote,`context.state`,{cacheFriendly:!1}),r}function modelInstructions(e){let{session:t}=e,n=e.extraSystemNote?[{role:`system`,content:e.extraSystemNote}]:[];if(e.systemMessages.length===0&&n.length===0)return t.agent.system??void 0;let r=t.agent.system?[{role:`system`,content:t.agent.system}]:[],i=[...n,...r,...e.systemMessages];return mergeSystemInstructions(e.anthropicCache?applySystemCacheBreakpoint(i,e.anthropicCache):i)}function withTrailingUserNote(e,t){return t?[...e,createFrameworkUserMessage(`execution.retry`,t)]:[...e]}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
3
|
`)};return t!==void 0&&(n.providerOptions=t),n}export{mergeSystemInstructions,modelInstructions,requestMessages,withTrailingUserNote};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createLogger,logError}from"#internal/logging.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{SKILL_ENTRY_NAME}from"#protocol/catalog-tools.js";import{toModelSchema}from"#tools/schema.js";import{dispatchesAfterStep}from"#harness/execute-call.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{buildToolSetWithProviderTools}from"#harness/tools.js";import{applyLastToolCacheBreakpoint}from"#harness/prompt-cache.js";import{buildFinalOutputTool}from"#harness/final-output.js";const log=createLogger(`harness.tool-loop`);async function prepareModelTools(e,t){let{catalog:n,profile:r}=t,i=await buildToolSetWithProviderTools({describe:n.describe,disabledProviderTools:t.disabledProviderTools,profile:r,resolve:n.resolve,tools:n.advertised});e.session.outputSchema!==void 0&&(i[REPLY_TOOL_NAME]=buildFinalOutputTool(e.session.outputSchema));let a=r.anthropicCache?applyLastToolCacheBreakpoint(i):i;for(let[e,r]of Object.entries(a)){r.inputSchema=toModelSchema(r.inputSchema,`input`),r.outputSchema!==void 0&&(r.outputSchema=toModelSchema(r.outputSchema,`output`));let i=r.execute;i!==void 0&&(r.execute=(...r)=>(dispatchesAfterStep(n.resolve({input:r[0],toolName:e}))||t.generation.protectToolExecution(),i(...r)))}return a}function endsTurnTools(e,t){return t?new Map([...e.entries].flatMap(([e,t])=>t.endsTurn===void 0||t.endsTurn===!1?[]:[[e,t.endsTurn]])):new Map}function frameworkToolNames(e){return new Set([...e.advertised.values(),...e.entries.values(),e.get(SKILL_ENTRY_NAME)].flatMap(e=>e?.frameworkTool===!0?[e.name]:[]))}function logToolExecutionError(e,t){e.toolOutput.type!==`tool-error`||isTurnCancellation(e.toolOutput.error)||logError(log,`tool execution failed`,e.toolOutput.error,{toolName:t(e.toolCall)?.definition.name??e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}export{endsTurnTools,frameworkToolNames,logToolExecutionError,prepareModelTools};
|
|
1
|
+
import{createLogger,logError}from"#internal/logging.js";import{REPLY_TOOL_NAME}from"#protocol/reply-tool.js";import{SKILL_ENTRY_NAME}from"#protocol/catalog-tools.js";import{toModelSchema}from"#tools/schema.js";import{dispatchesAfterStep}from"#harness/execute-call.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{buildToolSetWithProviderTools}from"#harness/tools.js";import{applyLastToolCacheBreakpoint}from"#harness/prompt-cache.js";import{buildFinalOutputTool}from"#harness/final-output.js";const log=createLogger(`harness.tool-loop`);async function prepareModelTools(e,t){let{catalog:n,profile:r}=t,i=await buildToolSetWithProviderTools({describe:n.describe,disabledProviderTools:t.disabledProviderTools,profile:r,resolve:n.resolve,tools:n.advertised});e.session.outputSchema!==void 0&&(i[REPLY_TOOL_NAME]=buildFinalOutputTool(e.session.outputSchema));let a=r.anthropicCache?applyLastToolCacheBreakpoint(i,r.anthropicCache):i;for(let[e,r]of Object.entries(a)){r.inputSchema=toModelSchema(r.inputSchema,`input`),r.outputSchema!==void 0&&(r.outputSchema=toModelSchema(r.outputSchema,`output`));let i=r.execute;i!==void 0&&(r.execute=(...r)=>(dispatchesAfterStep(n.resolve({input:r[0],toolName:e}))||t.generation.protectToolExecution(),i(...r)))}return a}function endsTurnTools(e,t){return t?new Map([...e.entries].flatMap(([e,t])=>t.endsTurn===void 0||t.endsTurn===!1?[]:[[e,t.endsTurn]])):new Map}function frameworkToolNames(e){return new Set([...e.advertised.values(),...e.entries.values(),e.get(SKILL_ENTRY_NAME)].flatMap(e=>e?.frameworkTool===!0?[e.name]:[]))}function logToolExecutionError(e,t){e.toolOutput.type!==`tool-error`||isTurnCancellation(e.toolOutput.error)||logError(log,`tool execution failed`,e.toolOutput.error,{toolName:t(e.toolCall)?.definition.name??e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}export{endsTurnTools,frameworkToolNames,logToolExecutionError,prepareModelTools};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { LanguageModel } from "ai";
|
|
2
|
+
import type { AgentPromptCacheDefinition, AnthropicPromptCacheTtl } from "#shared/agent-definition.js";
|
|
2
3
|
/**
|
|
3
4
|
* What eve assumes about the model serving one call. Every decision that shapes a request for
|
|
4
5
|
* its provider reads this record, so a step and its compaction agree about the model.
|
|
@@ -15,8 +16,10 @@ export interface ModelProfile {
|
|
|
15
16
|
* `anthropicCache`.
|
|
16
17
|
*/
|
|
17
18
|
readonly provider: string;
|
|
18
|
-
/** Takes Anthropic prompt-cache breakpoints
|
|
19
|
-
readonly anthropicCache:
|
|
19
|
+
/** Takes Anthropic prompt-cache breakpoints, which live for `ttl`. */
|
|
20
|
+
readonly anthropicCache: {
|
|
21
|
+
readonly ttl: AnthropicPromptCacheTtl;
|
|
22
|
+
} | undefined;
|
|
20
23
|
/** Chat Completions APIs can't carry files in tool results, so they move to user messages. */
|
|
21
24
|
readonly filesOutsideToolResults: boolean;
|
|
22
25
|
/**
|
|
@@ -25,4 +28,8 @@ export interface ModelProfile {
|
|
|
25
28
|
*/
|
|
26
29
|
readonly googleSearchDropsTools: boolean;
|
|
27
30
|
}
|
|
28
|
-
|
|
31
|
+
/**
|
|
32
|
+
* `promptCache` is the model's authored `modelOptions.promptCache`. It names the cache protocol
|
|
33
|
+
* of a model whose provider and id don't, such as a Bedrock application inference profile.
|
|
34
|
+
*/
|
|
35
|
+
export declare function resolveModelProfile(model: LanguageModel, promptCache?: AgentPromptCacheDefinition): ModelProfile;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function resolveModelProfile(e){let
|
|
1
|
+
function resolveModelProfile(e,t){let n=typeof e==`string`?`gateway`:lowerCaseOrEmpty(e.provider),r=typeof e==`string`?e:lowerCaseOrEmpty(e.modelId),i=n.split(`.`)[0];return i===`gateway`?{anthropicCache:void 0,filesOutsideToolResults:!1,gateway:!0,googleSearchDropsTools:PRE_GEMINI_3_MODEL.test(r),provider:r.split(`/`)[0]}:{anthropicCache:t?.anthropic!==void 0||n.includes(`anthropic`)||n.includes(`bedrock`)&&r.includes(`anthropic`)?{ttl:t?.anthropic?.ttl??`5m`}:void 0,filesOutsideToolResults:n.endsWith(`.chat`),gateway:!1,googleSearchDropsTools:PRE_GEMINI_3_MODEL.test(r),provider:i}}const PRE_GEMINI_3_MODEL=/(^|\/)gemini-(?:[12](?:[.-]|$)|pro(?:-vision)?$|robotics-er-1\.5(?:[.-]|$))/i;function lowerCaseOrEmpty(e){return typeof e==`string`?e.toLowerCase():``}export{resolveModelProfile};
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { ModelMessage, SystemModelMessage, ToolSet } from "ai";
|
|
2
|
+
import type { ModelProfile } from "#harness/model-profile.js";
|
|
3
|
+
type AnthropicCache = NonNullable<ModelProfile["anthropicCache"]>;
|
|
2
4
|
/**
|
|
3
5
|
* Returns a new `providerOptions` object with
|
|
4
6
|
* `gateway.caching = "auto"` merged into the existing `gateway` sub-object.
|
|
@@ -19,7 +21,7 @@ export declare function mergeGatewayAutoCaching(base: Readonly<Record<string, un
|
|
|
19
21
|
* No-op when `tools` has no entries. Preserves existing `providerOptions`
|
|
20
22
|
* on tools (merges the cache marker in via spread).
|
|
21
23
|
*/
|
|
22
|
-
export declare function applyLastToolCacheBreakpoint(tools: ToolSet): ToolSet;
|
|
24
|
+
export declare function applyLastToolCacheBreakpoint(tools: ToolSet, cache: AnthropicCache): ToolSet;
|
|
23
25
|
/**
|
|
24
26
|
* Marks the last system message in an instructions array with the Anthropic
|
|
25
27
|
* cache marker. This creates a cache breakpoint at the end of the system
|
|
@@ -29,7 +31,7 @@ export declare function applyLastToolCacheBreakpoint(tools: ToolSet): ToolSet;
|
|
|
29
31
|
* single-string system prompts don't support per-message providerOptions.
|
|
30
32
|
* No-op when the array is empty.
|
|
31
33
|
*/
|
|
32
|
-
export declare function applySystemCacheBreakpoint(instructions: readonly SystemModelMessage[]): SystemModelMessage[];
|
|
34
|
+
export declare function applySystemCacheBreakpoint(instructions: readonly SystemModelMessage[], cache: AnthropicCache): SystemModelMessage[];
|
|
33
35
|
/**
|
|
34
36
|
* Attaches the Anthropic cache marker to the last message in `messages`
|
|
35
37
|
* (whatever its role) and, as a stable mid-history anchor, to the most
|
|
@@ -52,4 +54,5 @@ export declare function applySystemCacheBreakpoint(instructions: readonly System
|
|
|
52
54
|
* appends more content blocks than Anthropic's backward boundary scan
|
|
53
55
|
* covers.
|
|
54
56
|
*/
|
|
55
|
-
export declare function applyConversationCacheControl(messages: readonly ModelMessage[]): ModelMessage[];
|
|
57
|
+
export declare function applyConversationCacheControl(messages: readonly ModelMessage[], cache: AnthropicCache): ModelMessage[];
|
|
58
|
+
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const ANTHROPIC_CACHE_MARKERS=Object.freeze({"5m":Object.freeze({anthropic:Object.freeze({cacheControl:Object.freeze({type:`ephemeral`})}),bedrock:Object.freeze({cachePoint:Object.freeze({type:`default`})})}),"1h":Object.freeze({anthropic:Object.freeze({cacheControl:Object.freeze({type:`ephemeral`,ttl:`1h`})}),bedrock:Object.freeze({cachePoint:Object.freeze({type:`default`,ttl:`1h`})})})});function mergeGatewayAutoCaching(e){let t=e?.gateway!==void 0&&typeof e.gateway==`object`&&e.gateway!==null?e.gateway:void 0,n={...t,caching:t?.caching??`auto`};return{...e,gateway:n}}function applyLastToolCacheBreakpoint(e,t){let n=Object.entries(e);if(n.length===0)return e;let r={};for(let e=0;e<n.length;e++){let[i,a]=n[e];if(e===n.length-1){let e=a.providerOptions!==void 0&&typeof a.providerOptions==`object`?a.providerOptions:void 0;r[i]={...a,providerOptions:{...e,...ANTHROPIC_CACHE_MARKERS[t.ttl]}}}else r[i]=a}return r}function applySystemCacheBreakpoint(e,t){if(e.length===0)return[...e];let n=[...e],r=n[n.length-1];return n[n.length-1]={...r,providerOptions:{...r.providerOptions,...ANTHROPIC_CACHE_MARKERS[t.ttl]}},n}function applyConversationCacheControl(e,t){if(e.length===0)return[...e];let n=[...e],mark=e=>{let r=n[e];r!==void 0&&(n[e]={...r,providerOptions:{...r.providerOptions,...ANTHROPIC_CACHE_MARKERS[t.ttl]}})};mark(n.length-1);for(let e=n.length-2;e>=0;e--)if(n[e]?.role===`assistant`){mark(e);break}return n}export{applyConversationCacheControl,applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,mergeGatewayAutoCaching};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { SessionAuthContext } from "#channel/types.js";
|
|
2
2
|
import type { ModelProfile } from "#harness/model-profile.js";
|
|
3
|
+
import type { HarnessSession } from "#harness/types.js";
|
|
3
4
|
/**
|
|
4
5
|
* Adds a provider-specific end-user safety identifier without disclosing the
|
|
5
6
|
* raw eve principal. Authored provider options take precedence over the default.
|
|
@@ -8,7 +9,7 @@ export declare function mergeProviderSafetyIdentifier(provider: string, provider
|
|
|
8
9
|
/** Composes the per-call defaults shared by model steps and compaction. */
|
|
9
10
|
export declare function resolveCallProviderOptions(input: {
|
|
10
11
|
readonly auth: SessionAuthContext | null;
|
|
11
|
-
readonly conversationId: string;
|
|
12
12
|
readonly profile: ModelProfile;
|
|
13
13
|
readonly providerOptions: Readonly<Record<string, unknown>> | undefined;
|
|
14
|
+
readonly session: Pick<HarnessSession, "rootSessionId" | "sessionId">;
|
|
14
15
|
}): Record<string, unknown> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{invocationOwnerKey}from"#internal/invocation/metadata.js";import{mergeObjects}from"#shared/objects.js";function mergeProviderSafetyIdentifier(e,t,n){if(n===null)return t;let r=invocationOwnerKey(n),i=e===`openai`?{openai:{safetyIdentifier:r}}:e===`anthropic`?{anthropic:{metadata:{userId:r}}}:void 0;return i===void 0?t:mergeObjects(i,t)}function resolveCallProviderOptions(e){let
|
|
1
|
+
import{createHash}from"node:crypto";import{resolveConversationId}from"#shared/conversation-identity.js";import{invocationOwnerKey}from"#internal/invocation/metadata.js";import{mergeObjects}from"#shared/objects.js";function mergeProviderSafetyIdentifier(e,t,n){if(n===null)return t;let r=invocationOwnerKey(n),i=e===`openai`?{openai:{safetyIdentifier:r}}:e===`anthropic`?{anthropic:{metadata:{userId:r}}}:void 0;return i===void 0?t:mergeObjects(i,t)}function resolveCallProviderOptions(e){let{session:t}=e,n=mergeProviderSafetyIdentifier(e.profile.provider,e.providerOptions,e.auth);return e.profile.gateway?mergeGatewaySessionId(n,resolveConversationId(t.rootSessionId??t.sessionId)):PROMPT_CACHE_KEY_PROVIDERS.has(e.profile.provider)?mergeOpenAIPromptCacheKey(n,t.sessionId):n}const PROMPT_CACHE_KEY_PROVIDERS=new Set([`openai`,`codex`]);function mergeOpenAIPromptCacheKey(e,t){let n=createHash(`sha256`).update(t,`utf8`).digest(`base64url`);return mergeObjects({openai:{promptCacheKey:n}},e)}function mergeGatewaySessionId(e,t){let n=e?.gateway,r=typeof n==`object`&&n&&!Array.isArray(n)?n:void 0;return typeof r?.sessionId==`string`&&r.sessionId.trim()?e:{...e,gateway:{...r,sessionId:t}}}export{mergeProviderSafetyIdentifier,resolveCallProviderOptions};
|
|
@@ -11,7 +11,7 @@ type WebSearchBackend = "anthropic" | "exa" | "google" | "openai" | "parallel" |
|
|
|
11
11
|
* `type`, or `null` when the type is not one we know how to remove.
|
|
12
12
|
*
|
|
13
13
|
* Used by the harness recovery path to decide which tools to drop when a
|
|
14
|
-
*
|
|
14
|
+
* host rejects a tool. Unknown types fall through to
|
|
15
15
|
* the existing terminal/recoverable handling.
|
|
16
16
|
*/
|
|
17
17
|
export declare function resolveFrameworkToolFromUpstreamType(type: string): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsonSchema}from"ai";import{WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA,WEB_SEARCH_EXA_OUTPUT_SCHEMA,WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA,WEB_SEARCH_OPENAI_OUTPUT_SCHEMA,WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA,WEB_SEARCH_TOOL_NAME}from"#harness/provider-tool-schemas.js";const UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME={web_search_20250305:WEB_SEARCH_TOOL_NAME};function resolveFrameworkToolFromUpstreamType(e){return UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME[e]??null}function resolveWebSearchOutputSchema(e){switch(e){case`anthropic`:return WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA;case`exa`:return WEB_SEARCH_EXA_OUTPUT_SCHEMA;case`google`:return WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA;case`openai`:return WEB_SEARCH_OPENAI_OUTPUT_SCHEMA;case`parallel`:return WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA}}function resolveWebSearchBackend(e,t={provider:`exa`}){return e.gateway?t.provider===`native`?resolveNativeWebSearchBackend(e)??t.fallback??null:t.provider:resolveNativeWebSearchBackend(e)}function resolveNativeWebSearchBackend(e){return!NATIVE_WEB_SEARCH_BACKENDS.has(e.provider)||e.provider===`google`&&e.googleSearchDropsTools?null:e.provider}const NATIVE_WEB_SEARCH_BACKENDS=new Set([`anthropic`,`google`,`openai`]);async function resolveWebSearchProviderTool(e){switch(e){case`browserbase`:{let{gateway:e}=await import(`ai`);return e.tools.browserbaseSearch()}case`openai`:{let{openai:t}=await import(`#compiled/@ai-sdk/openai/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch({}),e)}case`anthropic`:{let{anthropic:t}=await import(`#compiled/@ai-sdk/anthropic/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch_20250305(),e)}case`google`:{let{google:t}=await import(`#compiled/@ai-sdk/google/index.js`);return attachWebSearchOutputSchema(t.tools.googleSearch({}),e)}case`exa`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.exaSearch({contents:{highlights:{maxCharacters:1e3}},numResults:10}),e)}case`parallel`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.parallelSearch(),e)}}}function attachWebSearchOutputSchema(e,t){return{...e,outputSchema:jsonSchema(resolveWebSearchOutputSchema(t))}}export{resolveFrameworkToolFromUpstreamType,resolveWebSearchBackend,resolveWebSearchOutputSchema,resolveWebSearchProviderTool};
|
|
1
|
+
import{jsonSchema}from"ai";import{WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA,WEB_SEARCH_EXA_OUTPUT_SCHEMA,WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA,WEB_SEARCH_OPENAI_OUTPUT_SCHEMA,WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA,WEB_SEARCH_TOOL_NAME}from"#harness/provider-tool-schemas.js";const UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME={web_search_20250305:WEB_SEARCH_TOOL_NAME,web_search:WEB_SEARCH_TOOL_NAME,"web_search_call.action.sources":WEB_SEARCH_TOOL_NAME};function resolveFrameworkToolFromUpstreamType(e){return UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME[e]??null}function resolveWebSearchOutputSchema(e){switch(e){case`anthropic`:return WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA;case`exa`:return WEB_SEARCH_EXA_OUTPUT_SCHEMA;case`google`:return WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA;case`openai`:return WEB_SEARCH_OPENAI_OUTPUT_SCHEMA;case`parallel`:return WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA}}function resolveWebSearchBackend(e,t={provider:`exa`}){return e.gateway?t.provider===`native`?resolveNativeWebSearchBackend(e)??t.fallback??null:t.provider:resolveNativeWebSearchBackend(e)}function resolveNativeWebSearchBackend(e){return!NATIVE_WEB_SEARCH_BACKENDS.has(e.provider)||e.provider===`google`&&e.googleSearchDropsTools?null:e.provider}const NATIVE_WEB_SEARCH_BACKENDS=new Set([`anthropic`,`google`,`openai`]);async function resolveWebSearchProviderTool(e){switch(e){case`browserbase`:{let{gateway:e}=await import(`ai`);return e.tools.browserbaseSearch()}case`openai`:{let{openai:t}=await import(`#compiled/@ai-sdk/openai/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch({}),e)}case`anthropic`:{let{anthropic:t}=await import(`#compiled/@ai-sdk/anthropic/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch_20250305(),e)}case`google`:{let{google:t}=await import(`#compiled/@ai-sdk/google/index.js`);return attachWebSearchOutputSchema(t.tools.googleSearch({}),e)}case`exa`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.exaSearch({contents:{highlights:{maxCharacters:1e3}},numResults:10}),e)}case`parallel`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.parallelSearch(),e)}}}function attachWebSearchOutputSchema(e,t){return{...e,outputSchema:jsonSchema(resolveWebSearchOutputSchema(t))}}export{resolveFrameworkToolFromUpstreamType,resolveWebSearchBackend,resolveWebSearchOutputSchema,resolveWebSearchProviderTool};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ModelMessage, UserContent } from "ai";
|
|
2
2
|
import type { SubagentAuthorizationEventHookPayload, SubagentInputRequestHookPayload } from "#channel/types.js";
|
|
3
3
|
import type { AuthorizationChallenge } from "#harness/authorization.js";
|
|
4
|
-
import { type TurnWaitingOn, createSessionCompletedEvent, createSessionFailedEvent, type InputResolution, type RuntimeIdentity, type RuntimeTraceContext, type TaskCancelReason, type TaskStartedStreamEvent, type UnstampedMessageStreamEvent } from "#protocol/message.js";
|
|
4
|
+
import { type TurnWaitingOn, createSessionCompletedEvent, createSessionFailedEvent, type InputResolution, type RuntimeIdentity, type RuntimeTraceContext, type SessionPredecessor, type TaskCancelReason, type TaskStartedStreamEvent, type UnstampedMessageStreamEvent } from "#protocol/message.js";
|
|
5
5
|
import type { RuntimeActionResult } from "#shared/action-types.js";
|
|
6
6
|
import type { InputRequest } from "#shared/input.js";
|
|
7
7
|
import type { JsonObject, JsonValue } from "#shared/json.js";
|
|
@@ -21,6 +21,8 @@ export type ToolResultPart = Extract<ToolResponsePart, {
|
|
|
21
21
|
*/
|
|
22
22
|
export declare function receive(view: SessionView, input: {
|
|
23
23
|
readonly message?: string | UserContent;
|
|
24
|
+
/** The session this one replaced, when eve started it in place of a stranded one. */
|
|
25
|
+
readonly predecessor?: SessionPredecessor;
|
|
24
26
|
readonly runtime?: RuntimeIdentity;
|
|
25
27
|
readonly trace?: RuntimeTraceContext;
|
|
26
28
|
}): Transition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
|
|
1
|
+
import{activeTurnId,answeredCallIds,nextStepIndex,runningTasks,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({predecessor:t.predecessor,runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}for(let t of r)t.tasks.length!==0&&t.requests.length!==0&&(runningTasks(t).length>0||t.requests.some(t=>t.requestId in e.projection.inputs)||n.push(createInputRequestedEvent({requests:t.requests,...t.event})));let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}const RETRIED_CALL_RESULT={code:`MODEL_CALL_ATTEMPT_RETRIED`,message:`The model call attempt was retried before this tool could run.`};function discardAttempt(e,t){let n=at(e.projection);return unchanged(e,t.calls.map(({callId:e,toolName:t})=>createActionResultEvent({...n,result:{callId:e,isError:!0,kind:`tool-result`,output:{...RETRIED_CALL_RESULT},toolName:t}})))}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=findCall(n,t.toolCallId);if(r===void 0)return n.push({content:[t],role:`tool`}),n;let i={...t,toolName:r.call.toolName},a=n[r.index+1];return a?.role===`tool`?n[r.index+1]={...a,content:[...a.content,i]}:n.splice(r.index+1,0,{content:[i],role:`tool`}),n}function findCall(e,t){for(let[n,r]of e.entries()){if(r.role!==`assistant`||typeof r.content==`string`)continue;let e=r.content.find(e=>e.type===`tool-call`&&e.toolCallId===t);if(e!==void 0)return{call:e,index:n}}}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,discardAttempt,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createErrorId,createLogger}from"#internal/logging.js";import{recordAppliedSession}from"#harness/session-machine/current.js";import{ParentSessionKey,SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{drainMemoryCommit,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{applyTransition,sessionView}from"#harness/session-machine/commit.js";import{fail,receive}from"#harness/session-machine/transitions.js";import{isDynamicConnectionResolutionError}from"#context/dynamic-connection-lifecycle.js";import{isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";const log=createLogger(`harness.step`);function createStep(e){let{ctx:t,live:n}=e,r={session:e.session,frameworkToolNames:new Set,config:e.config,ctx:t,runStep:e.runStep,publish:e.publish,emit:e.emit,instrumentation:e.instrumentation,hasDelegatedCaller:t?.get(ParentSessionKey)!==void 0||t?.get(SessionCallbackKey)!==void 0,view:()=>sessionView(n.read(),r.session.state),position:()=>turnPosition(n.read()),async apply(n,i){r.session=await applyTransition(r.session,n,e.publish,i),t!==void 0&&recordAppliedSession(t,r.session)},projectHistory:(t,n=r.session.state)=>e.prepareHistory(t,n).messages};return r}async function openTurn(e,t){let{config:n,ctx:r}=e;r!==void 0&&(prepareDynamicInstructionPreamble(r,e.projectHistory(e.session.history)),prepareMemoryPreamble(r,{history:e.session.history,input:[...t.input],projector:n.historyProjector,state:e.session.state}));let i;try{let
|
|
1
|
+
import{createErrorId,createLogger}from"#internal/logging.js";import{recordAppliedSession}from"#harness/session-machine/current.js";import{ParentSessionKey,SessionCallbackKey,SessionPredecessorKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{drainMemoryCommit,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{applyTransition,sessionView}from"#harness/session-machine/commit.js";import{fail,receive}from"#harness/session-machine/transitions.js";import{isDynamicConnectionResolutionError}from"#context/dynamic-connection-lifecycle.js";import{isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";const log=createLogger(`harness.step`);function createStep(e){let{ctx:t,live:n}=e,r={session:e.session,frameworkToolNames:new Set,config:e.config,ctx:t,runStep:e.runStep,publish:e.publish,emit:e.emit,instrumentation:e.instrumentation,hasDelegatedCaller:t?.get(ParentSessionKey)!==void 0||t?.get(SessionCallbackKey)!==void 0,view:()=>sessionView(n.read(),r.session.state),position:()=>turnPosition(n.read()),async apply(n,i){r.session=await applyTransition(r.session,n,e.publish,i),t!==void 0&&recordAppliedSession(t,r.session)},projectHistory:(t,n=r.session.state)=>e.prepareHistory(t,n).messages};return r}async function openTurn(e,t){let{config:n,ctx:r}=e;r!==void 0&&(prepareDynamicInstructionPreamble(r,e.projectHistory(e.session.history)),prepareMemoryPreamble(r,{history:e.session.history,input:[...t.input],projector:n.historyProjector,state:e.session.state}));let i;try{let i=e.position(),a=await e.instrumentation?.preparePreamble({sequence:i.sequence,sessionStarted:i.sessionStarted,traceContext:e.instrumentation?.traceContext,turnId:activeTurnId(i)});await e.apply(receive(e.view(),{message:t.message,predecessor:r?.get(SessionPredecessorKey),runtime:n.runtimeIdentity,trace:a}),e.projectHistory([...e.session.history,...t.input]))}catch(e){i={error:e}}let a=r===void 0?[]:drainDynamicInstructionUserMessages(r),o=r===void 0?void 0:drainMemoryCommit(r);if(e.session={...e.session,history:validateHarnessModelMessages([...e.session.history,...o?.recalledMessages??[],...a]),state:o?.state??e.session.state},i!==void 0)return failBoundaryEvent(e,i.error);e.instrumentation?.setTurnId(e.position().turnId)}async function failBoundaryEvent(e,t){if(throwIfTurnAborted(e.config.abortSignal),isTurnCancellation(t))throw t;if(isDynamicModelSelectionError(t))return failModelSelection(e,t);if(isDynamicConnectionResolutionError(t))return failConnectionResolution(e,t);throw t}async function failConnectionResolution(e,t){if(e.emit===void 0)throw t;e.instrumentation?.recordError(t);let n=createErrorId(),r=toErrorMessage(t);return log.error(`dynamic connection resolver failed — parking session`,{error:t,errorId:n,sessionId:e.session.sessionId,turnId:activeTurnId(e.position())}),await e.apply(fail(e.view(),{code:`EVENT_HANDLER_FAILED`,details:{errorId:n},message:r})),e.session={...e.session,outputSchema:void 0},{next:null,session:e.session,settledTurn:{isError:!0,output:r}}}async function failModelSelection(e,t){if(throwIfTurnAborted(e.config.abortSignal),e.instrumentation?.recordError(t),e.emit===void 0)throw t;let n=createErrorId(),r=toErrorMessage(t),{session:i}=e;return log.error(`model selection failed terminally`,{error:t,errorId:n,sessionId:i.sessionId,turnId:activeTurnId(e.position())}),await e.apply(fail(e.view(),{code:`MODEL_SELECTION_FAILED`,details:{errorId:n},message:r,terminal:{sessionId:i.sessionId}})),{next:e.hasDelegatedCaller?{done:!0,isError:!0,output:r}:{done:!0,output:``},session:e.session}}export{createStep,failBoundaryEvent,failConnectionResolution,failModelSelection,openTurn};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{
|
|
1
|
+
import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{createRuntimeToolResultFromMessagePart,createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,toActionResult}from"#harness/action-result-helpers.js";import{requireSessionModelReference}from"#harness/types.js";import{resolveCallProviderOptions}from"#harness/provider-safety.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{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{applyConversationCacheControl,mergeGatewayAutoCaching}from"#harness/prompt-cache.js";function buildStepHooks(e){let t=e.session,n;return{onStepEnd:async e=>{n(e)},onStepStart:async({messages:t})=>{await e.startStep?.(t)},prepareStep:async({messages:n})=>{let{profile:r}=e,i={messages:r.anthropicCache?applyConversationCacheControl(n,r.anthropicCache):n},a=requireSessionModelReference(t),o=resolveCallProviderOptions({auth:e.auth??contextStorage.getStore()?.get(AuthKey)??null,profile:r,providerOptions:a.providerOptions,session:t});return r.gateway?i.providerOptions=mergeGatewayAutoCaching(o):o!==void 0&&(i.providerOptions=o),i},stepResult:new Promise(e=>{n=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,tools:r.tools}).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])),l=new Map(n.toolCalls.map(e=>[e.toolCallId,e.input]));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:toActionResult(r,l.get(r.callId)),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)));let n=new Map(e.toolCalls.map(e=>[e.toolCallId,e.toolName]));for(let r of extractToolResultParts(e.response.messages))r.providerExecuted!==!0&&(t.has(r.toolCallId)||t.set(r.toolCallId,createRuntimeToolResultFromMessagePart(r,n.get(r.toolCallId)??r.toolName)));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,16 +1,16 @@
|
|
|
1
1
|
import{copyFile,mkdir,readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{resolvePackageCompiledFilePath,resolvePackageSourceFilePath}from"#internal/application/package.js";import{buildPackageUserAgent}from"#internal/user-agent.js";import{sandboxPreparedArtifactsManifestSchema}from"#shared/sandbox-prepared-artifacts.js";import{stringifyEsmImportSpecifier}from"#internal/application/import-specifier.js";import{usesParentDevelopmentWorkflowWorld}from"#internal/workflow/development-world-protocol.js";import{prepareAuthoredRuntimeModules}from"#internal/authored-runtime-modules.js";import{readMaterializedAuthoredModuleIndex}from"#internal/materialized-authored-modules.js";import"#internal/instrumentation-layout.js";import{resolveWorkflowWorldImport}from"#internal/workflow/world-target.js";async function writeCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=join(e.outDir,`compiled-artifacts-module-map.mjs`),r=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),i=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),a=sandboxPreparedArtifactsManifestSchema.parse(JSON.parse(await readFile(e.compileResult.paths.sandboxPreparedArtifactsPath,`utf8`))),o=await prepareAuthoredRuntimeModules({appRoot:e.compileResult.project.appRoot,manifest:e.compileResult.manifest,moduleMapPath:e.compileResult.paths.moduleMapPath});await mkdir(e.outDir,{recursive:!0}),await writeFile(n,o.moduleMapCode),await writeFile(t,createCompiledArtifactsBootstrapSource({compileResult:e.compileResult,installModulePath:resolvePackageSourceFilePath(`src/runtime/loaders/bundled-artifacts.ts`),metadata:e.compileResult.metadata,moduleMapImportPath:n,sandboxPreparedArtifacts:a})),await writeFile(i,createWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world,defaultWorld:e.defaultWorkflowWorld}));let s={authoredWorkflowModules:o.authoredWorkflowModules,bootstrapPath:t,workflowWorldPluginPath:i},c=await writePreparedInstrumentation({instrumentation:o.instrumentation,outDir:e.outDir});return await writeFile(r,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,layout:c})),s.instrumentationPluginPath=r,s.instrumentationLayout=generatedInstrumentationLayout(c),s.instrumentationSourcePaths=instrumentationSourcePathsOf(c),s}async function writePreparedInstrumentation(e){let writeOne=async(t,n)=>{let r=join(e.outDir,`compiled-artifacts-instrumentation-${t}.mjs`);return await writeFile(r,n),r},t={};for(let[n,r]of Object.entries(e.instrumentation.moduleCodeBySlot))t[n]=await writeOne(n,r);return{kind:`directory`,modulePathsBySlot:t}}function instrumentationSourcePathsOf(e){return Object.values(e.modulePathsBySlot)}async function writeDevelopmentCompiledArtifactsFiles(e){let t=join(e.outDir,`compiled-artifacts-bootstrap.mjs`),n=join(e.outDir,`compiled-artifacts-instrumentation.mjs`),r=join(e.outDir,`compiled-artifacts-workflow-world.mjs`),i=await readMaterializedAuthoredModuleIndex(e.runtimeAppRoot);if(i===void 0)throw Error(`Development generation at "${e.runtimeAppRoot}" is not materialized.`);await mkdir(e.outDir,{recursive:!0}),await writeFile(t,createDevelopmentCompiledArtifactsBootstrapSource(e.compileResult.manifest.config.name)),await writeFile(r,createDevelopmentWorkflowWorldPluginSource({compiledArtifactsBootstrapPath:t,configuredWorld:e.compileResult.manifest.config.experimental?.workflow?.world}));let a={authoredWorkflowModules:e.authoredWorkflowModules,bootstrapPath:t,workflowWorldPluginPath:r};if(i.instrumentation!==void 0){let t=await copyMaterializedInstrumentation({instrumentation:i.instrumentation,outDir:e.outDir,runtimeAppRoot:e.runtimeAppRoot});await writeFile(n,createInstrumentationPluginSource({agentName:e.compileResult.manifest.config.name,layout:t})),a.instrumentationPluginPath=n,a.instrumentationLayout=generatedInstrumentationLayout(t),a.instrumentationSourcePaths=instrumentationSourcePathsOf(t)}return a}function generatedInstrumentationLayout(e){return{kind:`directory`,slots:Object.keys(e.modulePathsBySlot)}}async function copyMaterializedInstrumentation(e){let t=join(e.runtimeAppRoot,`.eve`,`compile`),copyOne=async(n,r)=>{let i=join(e.outDir,`compiled-artifacts-instrumentation-${n}.mjs`);return await copyFile(join(t,r),i),i},n={};for(let[t,r]of Object.entries(e.instrumentation.modulePathsBySlot))n[t]=await copyOne(t,r);return{kind:`directory`,modulePathsBySlot:n}}function createDevelopmentCompiledArtifactsBootstrapSource(e){return[`// Generated by eve. Do not edit by hand.`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(e)});`,``,`export default function installDevelopmentCompiledArtifactsPlugin() {}`,``].join(`
|
|
2
2
|
`)}function createCompiledArtifactsBootstrapSource(e){let t=e.compileResult.manifest.config.name;return[`// Generated by eve. Do not edit by hand.`,`import moduleMap from ${stringifyEsmImportSpecifier(e.moduleMapImportPath)};`,`import { installBundledCompiledArtifacts } from ${stringifyEsmImportSpecifier(e.installModulePath)};`,`import { installEveWorkflowQueueNamespace } from ${stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/queue-namespace.ts`))};`,``,`installEveWorkflowQueueNamespace(${JSON.stringify(t)});`,``,`const metadata = ${JSON.stringify(e.metadata,null,2)};`,``,`const manifest = ${JSON.stringify(e.compileResult.manifest,null,2)};`,``,`const sandboxPreparedArtifacts = ${JSON.stringify(e.sandboxPreparedArtifacts,null,2)};`,``,`export { moduleMap };`,``,`export function installCompiledArtifactsBootstrap() {`,` installBundledCompiledArtifacts({`,` manifest,`,` metadata,`,` moduleMap,`,` sandboxPreparedArtifacts,`,` });`,`}`,``,`installCompiledArtifactsBootstrap();`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installCompiledArtifactsPlugin() {`,` // Already installed on import above.`,`}`,``].join(`
|
|
3
|
-
`)}function resolveWorkflowWorldWiring(e){if(e===`@workflow/world-local`){let t=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-data-directory.ts`)),n=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-delivery-timeouts.ts`));return{moduleImportSpecifier:resolvePackageCompiledFilePath(`src/compiled/${e}/index.js`),extraImportLines:`
|
|
3
|
+
`)}function resolveInstallWorldImportSpecifier(){return resolvePackageSourceFilePath(`src/execution/install-workflow-world.ts`)}function resolveWorkflowWorldWiring(e){if(e===`@workflow/world-local`){let t=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-data-directory.ts`)),n=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/local-world-delivery-timeouts.ts`));return{moduleImportSpecifier:resolvePackageCompiledFilePath(`src/compiled/${e}/index.js`),extraImportLines:`
|
|
4
4
|
import { applyLocalWorkflowWorldDeliveryTimeoutDefaults } from ${n};
|
|
5
5
|
import { resolveLocalWorkflowWorldDataDirectory } from ${t};`.trimStart().split(`
|
|
6
|
-
`),
|
|
6
|
+
`),createWorldSource:`applyLocalWorkflowWorldDeliveryTimeoutDefaults();
|
|
7
7
|
const workflowWorld = await workflowWorldModule.createWorld({
|
|
8
8
|
dataDir: resolveLocalWorkflowWorldDataDirectory(process.cwd()),
|
|
9
9
|
});`}}if(e===`@workflow/world-vercel`){let t=stringifyEsmImportSpecifier(resolvePackageSourceFilePath(`src/internal/workflow/vercel-world-defaults.ts`)),n=resolvePackageCompiledFilePath(`src/compiled/${e}/index.js`),r=`
|
|
10
10
|
const workflowWorld = await workflowWorldModule.createWorld({
|
|
11
11
|
headers: { "User-Agent": ${JSON.stringify(buildPackageUserAgent())} },
|
|
12
12
|
});
|
|
13
|
-
applyVercelWorkflowWorldDefaults(workflowWorld);`.trimStart();return{moduleImportSpecifier:n,extraImportLines:[`import { applyVercelWorkflowWorldDefaults } from ${t};`],
|
|
14
|
-
`)}function createDevelopmentWorkflowWorldPluginSource(e){if(!usesParentDevelopmentWorkflowWorld(e.configuredWorld))return createWorkflowWorldPluginSource({...e,defaultWorld:`local`});let t=
|
|
13
|
+
applyVercelWorkflowWorldDefaults(workflowWorld);`.trimStart();return{moduleImportSpecifier:n,extraImportLines:[`import { applyVercelWorkflowWorldDefaults } from ${t};`],createWorldSource:r}}return{moduleImportSpecifier:e,extraImportLines:[`import { createWorldFromModule } from ${stringifyEsmImportSpecifier(resolvePackageCompiledFilePath(`src/compiled/@workflow/core/runtime.js`))};`],createWorldSource:`const workflowWorld = await createWorldFromModule(workflowWorldModule);`}}function createWorkflowWorldPluginSource(e){let t=e.configuredWorld??e.defaultWorld,n=resolveWorkflowWorldWiring(resolveWorkflowWorldImport(t));return[`// Generated by eve. Do not edit by hand.`,`import ${stringifyEsmImportSpecifier(e.compiledArtifactsBootstrapPath)};`,`import * as workflowWorldModule from ${stringifyEsmImportSpecifier(n.moduleImportSpecifier)};`,...n.extraImportLines,`import { installWorkflowWorld } from ${stringifyEsmImportSpecifier(resolveInstallWorldImportSpecifier())};`,``,n.createWorldSource,`await installWorkflowWorld({ packageName: ${JSON.stringify(e.configuredWorld)}, world: workflowWorld });`,``,`export default function installWorkflowWorldPlugin() {}`,``].join(`
|
|
14
|
+
`)}function createDevelopmentWorkflowWorldPluginSource(e){if(!usesParentDevelopmentWorkflowWorld(e.configuredWorld))return createWorkflowWorldPluginSource({...e,defaultWorld:`local`});let t=resolvePackageSourceFilePath(`src/internal/workflow/development-world-client.ts`);return[`// Generated by eve. Do not edit by hand.`,`import ${stringifyEsmImportSpecifier(e.compiledArtifactsBootstrapPath)};`,`import { createDevelopmentWorkflowWorld } from ${stringifyEsmImportSpecifier(t)};`,`import { installWorkflowWorld } from ${stringifyEsmImportSpecifier(resolveInstallWorldImportSpecifier())};`,``,`await installWorkflowWorld({ world: createDevelopmentWorkflowWorld() });`,``,`export default function installDevelopmentWorkflowWorldPlugin() {}`,``].join(`
|
|
15
15
|
`)}function createInstrumentationPluginSource(e){let t=JSON.stringify(e.agentName),n=resolvePackageSourceFilePath(`src/instrumentation/providers.ts`),r=Object.entries(e.layout.modulePathsBySlot);return[`// Generated by eve. Do not edit by hand.`,...r.map(([e,t],n)=>`import * as provider${n} from ${stringifyEsmImportSpecifier(t)}; // ${e}`),`import { finalizeInstrumentationProviders, registerInstrumentationProvider, seedInstrumentationProviders, shutdownInstrumentationProviders } from ${stringifyEsmImportSpecifier(n)};`,``,`seedInstrumentationProviders();`,``,...r.flatMap(([e],n)=>[`await registerInstrumentationProvider({`,` agentName: ${t},`,` slot: ${JSON.stringify(e)},`,` value: provider${n}.default,`,`});`]),``,`finalizeInstrumentationProviders({ serviceName: ${t} });`,``,`// Default export satisfies the Nitro plugin contract so this file`,`// can be used directly as a Nitro plugin without a separate wrapper.`,`export default function installInstrumentationPlugin(nitroApp) {`,` // The last point a buffered exporter can still reach the network.`,` nitroApp?.hooks?.hook('close', async () => {`,` await shutdownInstrumentationProviders();`,` });`,`}`,``].join(`
|
|
16
16
|
`)}export{createCompiledArtifactsBootstrapSource,createDevelopmentWorkflowWorldPluginSource,createWorkflowWorldPluginSource,writeCompiledArtifactsFiles,writeDevelopmentCompiledArtifactsFiles};
|
|
@@ -36,7 +36,7 @@ export declare function resolvePackageDependencyPath(specifier: string): string;
|
|
|
36
36
|
*/
|
|
37
37
|
export declare function resolvePackageCompiledFilePath(relativeCompiledPath: string): string;
|
|
38
38
|
/**
|
|
39
|
-
* Resolves
|
|
39
|
+
* Resolves eve's package identity from local or build-stamped metadata.
|
|
40
40
|
*/
|
|
41
41
|
export declare function resolveInstalledPackageInfo(): InstalledPackageInfo;
|
|
42
42
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";let cachedPackageInfo,cachedPackageLocation;const
|
|
1
|
+
import{createRequire}from"node:module";import{existsSync,readFileSync,realpathSync}from"node:fs";import{basename,dirname,join}from"node:path";import{fileURLToPath}from"node:url";import{EVE_PACKAGE_NAME}from"#internal/package-name.js";import{readStampedPackageVersion}from"#internal/application/stamped-package-version.js";let cachedPackageInfo,cachedPackageLocation;const WORKFLOW_MODULE_ALIASES={"workflow/errors":`src/compiled/@workflow/errors/index.js`,"workflow/internal/private":`src/compiled/@workflow/core/private.js`};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 packageRequire=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 findNearestSourceCheckoutRoot(e){let t=e;for(;;){if(isSourceCheckout(t))return t;let e=dirname(t);if(e===t)return;t=e}}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 tryResolveLocalPackageRoot(e){try{let t=realpathSync.native(e),n=tryResolveDirectBuildLocation(t);if(n!==void 0)return n.packageRoot;let r=findNearestSourceCheckoutRoot(dirname(t));return r===void 0?void 0:tryResolveVerifiedPackageRoot(join(r,`package.json`))}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){try{return packageRequire.resolve(e)}catch(t){let n=tryResolvePackageRoot(),r=n===void 0||!isSourceCheckout(n)?void 0:resolveSourceCheckoutExport(n,e);if(r!==void 0)return r;throw t}}function resolveSourceCheckoutExport(e,t){if(t!==EVE_PACKAGE_NAME&&!t.startsWith(`${EVE_PACKAGE_NAME}/`))return;let n=t===EVE_PACKAGE_NAME?`.`:`.${t.slice(EVE_PACKAGE_NAME.length)}`;try{let t=JSON.parse(readFileSync(join(e,`package.json`),`utf8`)).exports?.[n],r=typeof t==`string`?t:t?.[`eve-source`]??t?.import??t?.default;if(r===void 0)return;let i=r.replace(/^\.\/dist\/src\//,`src/`).replace(/\.[cm]?js$/u,`.ts`),a=join(e,i);return existsSync(a)?a:void 0}catch{return}}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 tryResolveSelfPackageInfo(){try{return tryReadInstalledPackageInfo(packageRequire.resolve(`${EVE_PACKAGE_NAME}/package.json`),EVE_PACKAGE_NAME)}catch{return}}function resolveInstalledPackageInfo(){if(cachedPackageInfo)return cachedPackageInfo;let e=tryResolveLocalPackageRoot(resolveCurrentModulePath()),t=e===void 0?void 0:tryReadInstalledPackageInfo(join(e,`package.json`),EVE_PACKAGE_NAME);if(t)return cachedPackageInfo=t,cachedPackageInfo;let n=readStampedPackageVersion();return n===void 0?(cachedPackageInfo=tryResolveSelfPackageInfo()??{name:EVE_PACKAGE_NAME,version:`0.0.0`},cachedPackageInfo):(cachedPackageInfo={name:EVE_PACKAGE_NAME,version:n},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(packageRequire.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?packageRequire.resolve(e):resolvePackageCompiledFilePath(t)}export{resolveExpectedWorkflowVersion,resolveInstalledPackageInfo,resolvePackageCompiledFilePath,resolvePackageDependencyPath,resolvePackageLocationFromModulePath,resolvePackageRoot,resolvePackageSourceDirectoryPath,resolvePackageSourceFilePath,resolveWorkflowModulePath};
|