eve 0.52.4 → 0.52.5
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 +14 -0
- package/dist/src/cli/commands/init-agent-workspace.d.ts +2 -0
- package/dist/src/cli/commands/init-agent-workspace.js +1 -1
- package/dist/src/cli/commands/init-install.d.ts +8 -0
- package/dist/src/cli/commands/init-install.js +1 -0
- package/dist/src/cli/commands/init.d.ts +3 -4
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/run.js +2 -2
- package/dist/src/cli/telemetry/index.d.ts +3 -0
- package/dist/src/cli/telemetry/index.js +1 -1
- package/dist/src/compiled/.vendor-stamp.json +3 -2
- package/dist/src/compiled/@workflow/world-local/index.js +1 -1
- package/dist/src/compiler/extension-compatibility.d.ts +2 -2
- package/dist/src/compiler/extension-compatibility.js +1 -1
- package/dist/src/context/dynamic-model-lifecycle.js +1 -1
- package/dist/src/context/keys.d.ts +11 -2
- package/dist/src/context/keys.js +1 -1
- package/dist/src/evals/mock-model.js +1 -1
- package/dist/src/evals/runner/run-evals.d.ts +1 -1
- package/dist/src/evals/runner/run-evals.js +1 -1
- package/dist/src/execution/activity-cohort.d.ts +20 -0
- package/dist/src/execution/activity-cohort.js +1 -0
- package/dist/src/execution/authorization-callback-match.d.ts +1 -0
- package/dist/src/execution/authorization-callback-match.js +1 -1
- package/dist/src/execution/parked-delivery-wait.js +1 -1
- package/dist/src/execution/session-activity-projection.d.ts +2 -0
- package/dist/src/execution/session-activity-projection.js +1 -1
- package/dist/src/execution/skills/instructions.js +1 -1
- package/dist/src/execution/tools/sleep-workflow.js +1 -1
- package/dist/src/execution/workflow-steps.js +1 -1
- package/dist/src/harness/approval-delivery-coordinator.js +1 -1
- package/dist/src/harness/authorization.d.ts +1 -0
- package/dist/src/harness/authorization.js +1 -1
- package/dist/src/harness/compaction.js +1 -1
- package/dist/src/harness/current-messages.d.ts +8 -2
- package/dist/src/harness/current-messages.js +1 -1
- package/dist/src/harness/hitl/approval-input-requests.js +1 -1
- package/dist/src/harness/input-requests.js +1 -1
- package/dist/src/harness/pending-input-batches.d.ts +4 -0
- package/dist/src/harness/pending-input-batches.js +1 -1
- package/dist/src/harness/tool-loop.js +2 -2
- package/dist/src/harness/turn-client-context.d.ts +1 -1
- package/dist/src/internal/application/package.js +1 -1
- package/dist/src/internal/mock-model-identity.d.ts +2 -0
- package/dist/src/internal/mock-model-identity.js +1 -0
- package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
- package/dist/src/public/tools/index.d.ts +1 -0
- package/dist/src/public/tools/index.js +1 -1
- package/dist/src/setup/scaffold/create/project.js +1 -1
- package/dist/src/tasks/delivery-context.d.ts +2 -2
- package/dist/src/tasks/delivery-context.js +2 -18
- package/dist/src/tasks/delivery-policy.js +1 -1
- package/dist/src/tools/durable-callbacks.d.ts +18 -1
- package/dist/src/tools/durable-callbacks.js +1 -1
- package/docs/channels/overview.mdx +2 -0
- package/docs/channels/slack.mdx +2 -0
- package/docs/evals/running.mdx +3 -1
- package/docs/guides/dynamic-capabilities.md +36 -1
- package/docs/guides/instrumentation.md +3 -2
- package/docs/instructions.mdx +1 -1
- package/docs/reference/cli.md +1 -1
- package/docs/reference/telemetry.md +1 -1
- package/docs/reference/typescript-api.md +36 -35
- package/docs/tools/overview.mdx +4 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=2,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:33,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,28,29,30,31,32,33],dropped:{14:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,15:`TaskExec replaces stageEffect with send`,16:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,17:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,18:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,19:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,20:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,21:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,22:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,23:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,24:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,25:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,26:`Background tools now use task yield descriptors`,27:`TaskExec.delegated was removed; migrate to workflow-backed background tools`}},dynamicTool:{current:
|
|
1
|
+
import{readFile,writeFile}from"node:fs/promises";import{z}from"#compiled/zod/index.js";import{join}from"node:path";import{formatValidationError}from"#runtime/validation.js";const EXTENSION_COMPATIBILITY_MANIFEST_KIND=`eve-extension`,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION=2,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME=`_manifest.json`,EXTENSION_CAPABILITY_CONTRACTS={extension:{current:1,supported:[1],dropped:{}},tool:{current:33,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,28,29,30,31,32,33],dropped:{14:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,15:`TaskExec replaces stageEffect with send`,16:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,17:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,18:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,19:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,20:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,21:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,22:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,23:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,24:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,25:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,26:`Background tools now use task yield descriptors`,27:`TaskExec.delegated was removed; migrate to workflow-backed background tools`}},dynamicTool:{current:32,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,22,28,29,30,31,32],dropped:{21:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`,23:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,24:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,25:`TaskExec.delegated was removed; migrate to workflow-backed background tools`,26:`Background tools now use task yield descriptors`,27:`TaskExec.delegated was removed; migrate to workflow-backed background tools`}},channel:{current:19,supported:[1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19],dropped:{12:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},schedule:{current:11,supported:[1,2,3,4,6,7,8,9,10,11],dropped:{5:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},subagent:{current:10,supported:[3,4,6,7,8,9,10],dropped:{1:`Persistent subagent sessions are now the default and the experimental opt-in was removed`,2:`Persistent subagent sessions are now the default and the experimental opt-in was removed`,5:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},connection:{current:15,supported:[1,2,3,4,5,6,7,8,11,12,13,14,15],dropped:{9:`Dynamic connection resolvers no longer receive conversation or channel continuation data`,10:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},hook:{current:22,supported:[10,11,12,13,14,15,17,18,19,20,21,22],dropped:{1:`Model identity moved from session.started runtime metadata to step.started call attribution.`,2:`Model identity moved from session.started runtime metadata to step.started call attribution.`,3:`Model identity moved from session.started runtime metadata to step.started call attribution.`,4:`Model identity moved from session.started runtime metadata to step.started call attribution.`,5:`Model identity moved from session.started runtime metadata to step.started call attribution.`,6:`Model identity moved from session.started runtime metadata to step.started call attribution.`,7:`Model identity moved from session.started runtime metadata to step.started call attribution.`,8:`Model identity moved from session.started runtime metadata to step.started call attribution.`,9:`Model identity moved from session.started runtime metadata to step.started call attribution.`,16:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},skill:{current:1,supported:[1],dropped:{}},dynamicSkill:{current:17,supported:[1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17],dropped:{13:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},instructions:{current:2,supported:[1,2],dropped:{}},dynamicInstructions:{current:18,supported:[1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18],dropped:{14:`Message and reasoning append events now expose deltas instead of cumulative snapshots.`}},config:{current:1,supported:[1],dropped:{}},state:{current:5,supported:[1,2,3,4,5],dropped:{}}},EXTENSION_CAPABILITY_VERSIONS=Object.fromEntries(Object.entries(EXTENSION_CAPABILITY_CONTRACTS).map(([e,t])=>[e,t.current])),EXTENSION_CAPABILITY_SUPPORT=Object.keys(EXTENSION_CAPABILITY_CONTRACTS).reduce((e,t)=>(e[t]=EXTENSION_CAPABILITY_CONTRACTS[t].supported,e),{}),extensionCompatibilityManifestV1Schema=z.object({kind:z.literal(EXTENSION_COMPATIBILITY_MANIFEST_KIND),formatVersion:z.literal(1),builtWithEve:z.string().min(1),requires:z.record(z.string(),z.number().int().positive())}).strict(),extensionCompatibilityManifestV2Schema=extensionCompatibilityManifestV1Schema.extend({formatVersion:z.literal(2),build:z.object({externalDependencies:z.array(z.string().min(1)).readonly()}).strict().optional()}),extensionCompatibilityManifestSchema=z.union([extensionCompatibilityManifestV1Schema,extensionCompatibilityManifestV2Schema]);function serializeExtensionCompatibilityManifest(e){return`${JSON.stringify(e,null,2)}\n`}function parseExtensionCompatibilityManifest(e,t){let n;try{n=JSON.parse(e)}catch(e){throw Error(`Extension compatibility manifest "${t}" is not valid JSON: ${e instanceof Error?e.message:String(e)}`)}let r=extensionCompatibilityManifestSchema.safeParse(n);if(!r.success)throw Error(`Extension compatibility manifest "${t}" is invalid. ${formatValidationError(r.error)}`);return r.data}async function readExtensionCompatibilityManifest(e){return parseExtensionCompatibilityManifest(await readFile(e,`utf8`),e)}async function writeExtensionCompatibilityManifest(e,t){await writeFile(join(e,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME),serializeExtensionCompatibilityManifest(t),`utf8`)}function findUnsupportedExtensionCapabilities(e,t=EXTENSION_CAPABILITY_SUPPORT){return Object.entries(e.requires).flatMap(([e,n])=>{let r=Object.hasOwn(t,e)?t[e]??[]:[];return r.includes(n)?[]:[{capability:e,requiredVersion:n,supportedVersions:r}]}).sort((e,t)=>e.capability.localeCompare(t.capability))}export{EXTENSION_CAPABILITY_SUPPORT,EXTENSION_CAPABILITY_VERSIONS,EXTENSION_COMPATIBILITY_MANIFEST_FILENAME,EXTENSION_COMPATIBILITY_MANIFEST_FORMAT_VERSION,EXTENSION_COMPATIBILITY_MANIFEST_KIND,findUnsupportedExtensionCapabilities,parseExtensionCompatibilityManifest,readExtensionCompatibilityManifest,serializeExtensionCompatibilityManifest,writeExtensionCompatibilityManifest};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LiveStepDynamicModelSelectionKey,SessionDynamicModelReferenceKey,TurnDynamicModelReferenceKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{loadDynamicRuntimeModelDefinition,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels}from"#runtime/agent/resolve-model.js";const ALLOWED_DYNAMIC_MODEL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),DYNAMIC_MODEL_SELECTION_ERROR_CODE=`EVE_DYNAMIC_MODEL_SELECTION_FAILED`;var DynamicModelSelectionError=class extends Error{code=DYNAMIC_MODEL_SELECTION_ERROR_CODE;name=`DynamicModelSelectionError`;constructor(e){super(toErrorMessage(e),{cause:e})}};function isDynamicModelSelectionError(e){return e instanceof DynamicModelSelectionError||typeof e==`object`&&!!e&&e.code===DYNAMIC_MODEL_SELECTION_ERROR_CODE}function isDynamicModelEventName(e){return ALLOWED_DYNAMIC_MODEL_EVENTS.has(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicModelReferenceKey;case`turn.started`:return TurnDynamicModelReferenceKey;case`step.started`:return}}function getActiveDynamicModelSelection(e){let t=e.get(LiveStepDynamicModelSelectionKey);if(t!=null)return t;let n=e.get(TurnDynamicModelReferenceKey);if(n!=null)return{reference:n};let r=e.get(SessionDynamicModelReferenceKey);return r==null?null:{reference:r}}async function dispatchDynamicModelEvent(e){if(e.dynamicModel!==void 0&&isDynamicModelEventName(e.event.type)&&e.dynamicModel.eventNames.includes(e.event.type)){setSelectionForEvent(e.ctx,e.event.type,null);try{let t=(await loadDynamicRuntimeModelDefinition({dynamicModel:e.dynamicModel,scope:e.scope})).events[e.event.type];if(t===void 0)throw Error(`Dynamic model resolver is missing its compiled "${e.event.type}" handler.`);let n=await t(e.event,buildResolveContext(e.ctx,e.messages)),r=await resolveRuntimeModelSelection({durability:e.event.type===`step.started`?`live`:`durable`,selection:n,state:e.ctx});setSelectionForEvent(e.ctx,e.event.type,r)}catch(e){throw isDynamicModelSelectionError(e)?e:new DynamicModelSelectionError(e)}}}function setSelectionForEvent(e,t,n){if(t===`step.started`){let t=n!==null&&n.model!==void 0&&shouldMockAuthoredRuntimeModels()?{reference:n.reference}:n;e.setVirtualContext(LiveStepDynamicModelSelectionKey,t);return}let r=durableKeyForEvent(t);r!==void 0&&e.set(r,n?.reference??null)}export{DynamicModelSelectionError,dispatchDynamicModelEvent,getActiveDynamicModelSelection,isDynamicModelSelectionError};
|
|
1
|
+
import{LiveStepDynamicModelSelectionKey,SessionDynamicModelReferenceKey,TurnDynamicModelReferenceKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{buildResolveContext}from"#context/dynamic-resolve-context.js";import{isMockModel}from"#internal/mock-model-identity.js";import{loadDynamicRuntimeModelDefinition,resolveRuntimeModelSelection,shouldMockAuthoredRuntimeModels}from"#runtime/agent/resolve-model.js";const ALLOWED_DYNAMIC_MODEL_EVENTS=new Set([`session.started`,`turn.started`,`step.started`]),DYNAMIC_MODEL_SELECTION_ERROR_CODE=`EVE_DYNAMIC_MODEL_SELECTION_FAILED`;var DynamicModelSelectionError=class extends Error{code=DYNAMIC_MODEL_SELECTION_ERROR_CODE;name=`DynamicModelSelectionError`;constructor(e){super(toErrorMessage(e),{cause:e})}};function isDynamicModelSelectionError(e){return e instanceof DynamicModelSelectionError||typeof e==`object`&&!!e&&e.code===DYNAMIC_MODEL_SELECTION_ERROR_CODE}function isDynamicModelEventName(e){return ALLOWED_DYNAMIC_MODEL_EVENTS.has(e)}function durableKeyForEvent(e){switch(e){case`session.started`:return SessionDynamicModelReferenceKey;case`turn.started`:return TurnDynamicModelReferenceKey;case`step.started`:return}}function getActiveDynamicModelSelection(e){let t=e.get(LiveStepDynamicModelSelectionKey);if(t!=null)return t;let n=e.get(TurnDynamicModelReferenceKey);if(n!=null)return{reference:n};let r=e.get(SessionDynamicModelReferenceKey);return r==null?null:{reference:r}}async function dispatchDynamicModelEvent(e){if(e.dynamicModel!==void 0&&isDynamicModelEventName(e.event.type)&&e.dynamicModel.eventNames.includes(e.event.type)){setSelectionForEvent(e.ctx,e.event.type,null);try{let t=(await loadDynamicRuntimeModelDefinition({dynamicModel:e.dynamicModel,scope:e.scope})).events[e.event.type];if(t===void 0)throw Error(`Dynamic model resolver is missing its compiled "${e.event.type}" handler.`);let n=await t(e.event,buildResolveContext(e.ctx,e.messages)),r=await resolveRuntimeModelSelection({durability:e.event.type===`step.started`?`live`:`durable`,selection:n,state:e.ctx});setSelectionForEvent(e.ctx,e.event.type,r)}catch(e){throw isDynamicModelSelectionError(e)?e:new DynamicModelSelectionError(e)}}}function setSelectionForEvent(e,t,n){if(t===`step.started`){let t=n!==null&&n.model!==void 0&&!isMockModel(n.model)&&shouldMockAuthoredRuntimeModels()?{reference:n.reference}:n;e.setVirtualContext(LiveStepDynamicModelSelectionKey,t);return}let r=durableKeyForEvent(t);r!==void 0&&e.set(r,n?.reference??null)}export{DynamicModelSelectionError,dispatchDynamicModelEvent,getActiveDynamicModelSelection,isDynamicModelSelectionError};
|
|
@@ -62,8 +62,13 @@ export declare const ChannelDeliveryKey: ContextKey<ChannelDeliveryMetadata>;
|
|
|
62
62
|
export declare const TurnDeliveryIdsKey: ContextKey<readonly string[]>;
|
|
63
63
|
/** Task-reporting phase for the active root turn. */
|
|
64
64
|
export declare const TurnTaskDeliveryKey: ContextKey<"initiating" | "none" | "pending" | "settled">;
|
|
65
|
-
/**
|
|
66
|
-
export
|
|
65
|
+
/** Last framework announcements recorded in the retained session history. */
|
|
66
|
+
export interface HistoryState {
|
|
67
|
+
readonly availableSkills?: string;
|
|
68
|
+
readonly taskState?: string;
|
|
69
|
+
readonly deliveryInstruction?: string;
|
|
70
|
+
}
|
|
71
|
+
export declare const HistoryStateKey: ContextKey<HistoryState>;
|
|
67
72
|
export interface ActiveChannelDelivery {
|
|
68
73
|
readonly agentName?: string;
|
|
69
74
|
readonly channelType?: string;
|
|
@@ -91,6 +96,10 @@ export declare const OtelTraceEnabledKey: ContextKey<boolean>;
|
|
|
91
96
|
*/
|
|
92
97
|
export declare const CapabilitiesKey: ContextKey<SessionCapabilities>;
|
|
93
98
|
export declare const ActivityObserverKey: ContextKey<ActivityObserverConfig>;
|
|
99
|
+
/** Originating root turn that owns the current user-visible activity artifact. */
|
|
100
|
+
export declare const ActivityRootTurnIdKey: ContextKey<string>;
|
|
101
|
+
/** Pending HITL request identities that keep the current activity artifact open. */
|
|
102
|
+
export declare const ActivityPendingBlockersKey: ContextKey<readonly string[]>;
|
|
94
103
|
/**
|
|
95
104
|
* Optional framework-owned caller callback captured when the session is created.
|
|
96
105
|
*/
|
package/dist/src/context/keys.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ContextKey}from"#context/key.js";import{SESSION_INBOX_CONTEXT_KEY}from"#execution/wire/session-inbox-contract.js";import{SESSION_CALLBACK_CONTEXT_KEY_NAME}from"#context/key-names.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),SessionInboxKey=new ContextKey(SESSION_INBOX_CONTEXT_KEY),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),LocalDevRequestKey=new ContextKey(`eve.internal.localDevRequest`),ScheduleIdKey=new ContextKey(`eve.scheduleId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),TurnDeliveryIdsKey=new ContextKey(`eve.turnDeliveryIds`),TurnTaskDeliveryKey=new ContextKey(`eve.turnTaskDelivery`),
|
|
1
|
+
import{ContextKey}from"#context/key.js";import{SESSION_INBOX_CONTEXT_KEY}from"#execution/wire/session-inbox-contract.js";import{SESSION_CALLBACK_CONTEXT_KEY_NAME}from"#context/key-names.js";const AuthKey=new ContextKey(`eve.auth`),InitiatorAuthKey=new ContextKey(`eve.initiatorAuth`),SessionIdKey=new ContextKey(`eve.sessionId`),SessionInboxKey=new ContextKey(SESSION_INBOX_CONTEXT_KEY),ContinuationTokenKey=new ContextKey(`eve.continuationToken`),ChannelRequestIdKey=new ContextKey(`eve.channelRequestId`),LocalDevRequestKey=new ContextKey(`eve.internal.localDevRequest`),ScheduleIdKey=new ContextKey(`eve.scheduleId`),ChannelDeliveryKey=new ContextKey(`eve.channelDelivery`),TurnDeliveryIdsKey=new ContextKey(`eve.turnDeliveryIds`),TurnTaskDeliveryKey=new ContextKey(`eve.turnTaskDelivery`),HistoryStateKey=new ContextKey(`eve.historyState`),ActiveChannelDeliveriesKey=new ContextKey(`eve.activeChannelDeliveries`),ChannelInstrumentationKey=new ContextKey(`eve.channelInstrumentation`),ModeKey=new ContextKey(`eve.mode`),ParentSessionKey=new ContextKey(`eve.parentSession`),ParentTraceContextKey=new ContextKey(`eve.parentTraceContext`),SessionTraceSeedKey=new ContextKey(`eve.sessionTraceSeed`),OtelTraceEnabledKey=new ContextKey(`eve.otelTraceEnabled`),CapabilitiesKey=new ContextKey(`eve.capabilities`),ActivityObserverKey=new ContextKey(`eve.activityObserver`),ActivityRootTurnIdKey=new ContextKey(`eve.activityRootTurnId`),ActivityPendingBlockersKey=new ContextKey(`eve.activityPendingBlockers`),SessionCallbackKey=new ContextKey(SESSION_CALLBACK_CONTEXT_KEY_NAME),SessionKey=new ContextKey(`eve.session`),SandboxKey=new ContextKey(`eve.sandbox`),HandleEventKey=new ContextKey(`eve.internal.handleEvent`),SessionDynamicModelReferenceKey=new ContextKey(`eve.sessionDynamicModelReference`),TurnDynamicModelReferenceKey=new ContextKey(`eve.turnDynamicModelReference`),RuntimeModelMetadataCacheKey=new ContextKey(`eve.runtimeModelMetadataCache`),LiveStepDynamicModelSelectionKey=new ContextKey(`eve.liveStepDynamicModelSelection`),SessionDynamicToolMetadataKey=new ContextKey(`eve.sessionDynamicToolMetadata`),SessionDynamicToolRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicToolRuntimeRevision`),TurnDynamicToolMetadataKey=new ContextKey(`eve.turnDynamicToolMetadata`),TurnMemoryLocksKey=new ContextKey(`eve.memory.turnLocks`),PreparedMemoryPreambleKey=new ContextKey(`eve.memory.preparedPreamble`),PendingMemoryCommitKey=new ContextKey(`eve.memory.pendingCommit`),PreparedMemoryCompactionKey=new ContextKey(`eve.memory.preparedCompaction`),StepDynamicToolMetadataKey=new ContextKey(`eve.stepDynamicToolMetadata`),SessionDynamicSubagentSelectionsKey=new ContextKey(`eve.sessionDynamicSubagentSelections`),TurnDynamicSubagentSelectionsKey=new ContextKey(`eve.turnDynamicSubagentSelections`),SessionDynamicSubagentRuntimeRevisionKey=new ContextKey(`eve.sessionDynamicSubagentRuntimeRevision`),DynamicSubagentAgentConfigKey=new ContextKey(`eve.dynamicSubagentAgentConfig`),DynamicSkillManifestKey=new ContextKey(`eve.dynamicSkillManifest`),SessionDynamicInstructionsKey=new ContextKey(`eve.sessionDynamicInstructions`),TurnDynamicInstructionsKey=new ContextKey(`eve.turnDynamicInstructions`),DynamicInstructionResolveMessagesKey=new ContextKey(`eve.dynamicInstructionResolveMessages`),PendingDynamicInstructionUserMessagesKey=new ContextKey(`eve.pendingDynamicInstructionUserMessages`);export{ActiveChannelDeliveriesKey,ActivityObserverKey,ActivityPendingBlockersKey,ActivityRootTurnIdKey,AuthKey,CapabilitiesKey,ChannelDeliveryKey,ChannelInstrumentationKey,ChannelRequestIdKey,ContinuationTokenKey,DynamicInstructionResolveMessagesKey,DynamicSkillManifestKey,DynamicSubagentAgentConfigKey,HandleEventKey,HistoryStateKey,InitiatorAuthKey,LiveStepDynamicModelSelectionKey,LocalDevRequestKey,ModeKey,OtelTraceEnabledKey,ParentSessionKey,ParentTraceContextKey,PendingDynamicInstructionUserMessagesKey,PendingMemoryCommitKey,PreparedMemoryCompactionKey,PreparedMemoryPreambleKey,RuntimeModelMetadataCacheKey,SandboxKey,ScheduleIdKey,SessionCallbackKey,SessionDynamicInstructionsKey,SessionDynamicModelReferenceKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicSubagentSelectionsKey,SessionDynamicToolMetadataKey,SessionDynamicToolRuntimeRevisionKey,SessionIdKey,SessionInboxKey,SessionKey,SessionTraceSeedKey,StepDynamicToolMetadataKey,TurnDeliveryIdsKey,TurnDynamicInstructionsKey,TurnDynamicModelReferenceKey,TurnDynamicSubagentSelectionsKey,TurnDynamicToolMetadataKey,TurnMemoryLocksKey,TurnTaskDeliveryKey};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MockLanguageModelV3}from"ai/test";import{AGENTS_SNIPPET_LABEL}from"#subagents/handles/prompt.js";import{isPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";const RESPONSE_TIMESTAMP=Date.parse(`2026-01-01T00:00:00.000Z`);function mockModel(e={}){let t=normalizeOptions(e),n=normalizeResponder(t.respond),r=t.modelId??`model`;return new MockLanguageModelV3({modelId:r,provider:t.provider??`eve-mock`,doGenerate:async e=>createGenerateResult(await n(createRequest(e)),e,r),doStream:async e=>createStreamResult(createGenerateResult(await n(createRequest(e)),e,r))})}function normalizeOptions(e){return typeof e==`string`||typeof e==`function`?{respond:e}:e}function normalizeResponder(e){if(typeof e==`function`)return e;let t=e??`Mock response`;return()=>t}function createRequest(e){let t=e.prompt.map(e=>({role:e.role,text:extractMessageText(e)})),n=t.filter(e=>e.role===`user`).map(e=>e.text).filter(e=>!isFrameworkScaffolding(e));return{lastUserMessage:n.at(-1)??null,messages:t,toolResults:extractToolResults(e),tools:extractTools(e),userMessageCount:n.length,userMessages:n}}function isFrameworkScaffolding(e){let t=e.trim();return t.startsWith(AGENTS_SNIPPET_LABEL)||isPendingApprovalsSnippet(t)}function extractMessageText(e){return typeof e.content==`string`?e.content:e.content.flatMap(e=>{switch(e.type){case`reasoning`:case`text`:return[e.text];case`tool-result`:return[formatValue(normalizeToolOutput(e.output))];default:return[]}}).join(``)}function extractTools(e){return(e.tools??[]).map(e=>e.type===`function`?{description:e.description,inputSchema:e.inputSchema,name:e.name}:{name:e.name})}function extractToolResults(e){return e.prompt.flatMap(e=>typeof e.content==`string`?[]:e.content.flatMap(e=>e.type===`tool-result`?[{id:e.toolCallId,isError:e.output.type===`error-json`||e.output.type===`error-text`||e.output.type===`execution-denied`,name:e.toolName,output:normalizeToolOutput(e.output)}]:[]))}function normalizeToolOutput(e){switch(e.type){case`error-json`:case`error-text`:case`json`:case`text`:return e.value;case`execution-denied`:return e.reason??`Tool execution denied`;case`content`:return e.value}}function createGenerateResult(e,t,n){let r=typeof e==`string`?{text:e}:e,i=r.toolCalls??[];if(!(`text`in r)&&i.length===0)throw Error(`mockModel responders must return text or at least one item in "toolCalls".`);let a=[];r.text!==void 0&&a.push({text:r.text,type:`text`});for(let[e,n]of i.entries())a.push({input:JSON.stringify(n.input??{}),toolCallId:n.id??`mock-tool-call-${countUserMessages(t)}-${countToolResults(t)}-${e+1}`,toolName:n.name,type:`tool-call`});let o=t.prompt.map(e=>extractMessageText(e)).join(` `),s=[r.text??``,...i.map(e=>formatValue(e.input??{}))].join(` `),c=r.usage?.inputTokens??estimateTokens(o),l=r.usage?.outputTokens??estimateTokens(s);return{content:a,finishReason:{raw:void 0,unified:i.length>0?`tool-calls`:`stop`},response:{id:`mock-response-${countUserMessages(t)}-${countToolResults(t)}`,modelId:n,timestamp:new Date(RESPONSE_TIMESTAMP)},usage:{inputTokens:{cacheRead:0,cacheWrite:0,noCache:c,total:c},outputTokens:{reasoning:0,text:l,total:l}},warnings:[]}}function createStreamResult(e){let t=[{type:`stream-start`,warnings:e.warnings}];e.response!==void 0&&t.push({...e.response,type:`response-metadata`});let n=0;for(let r of e.content){if(r.type===`text`){let e=`mock-text-${n}`;n+=1,t.push({id:e,type:`text-start`}),r.text.length>0&&t.push({delta:r.text,id:e,type:`text-delta`}),t.push({id:e,type:`text-end`});continue}r.type===`tool-call`&&t.push(r)}return t.push({finishReason:e.finishReason,type:`finish`,usage:e.usage}),{stream:new ReadableStream({start(e){for(let n of t)e.enqueue(n);e.close()}})}}function countUserMessages(e){return e.prompt.filter(e=>e.role===`user`).length}function countToolResults(e){return extractToolResults(e).length}function estimateTokens(e){return Math.max(1,Math.ceil(e.trim().length/4))}function formatValue(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}export{mockModel};
|
|
1
|
+
import{markMockModel}from"#internal/mock-model-identity.js";import{MockLanguageModelV3}from"ai/test";import{AGENTS_SNIPPET_LABEL}from"#subagents/handles/prompt.js";import{isPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";const RESPONSE_TIMESTAMP=Date.parse(`2026-01-01T00:00:00.000Z`);function mockModel(e={}){let t=normalizeOptions(e),n=normalizeResponder(t.respond),r=t.modelId??`model`;return markMockModel(new MockLanguageModelV3({modelId:r,provider:t.provider??`eve-mock`,doGenerate:async e=>createGenerateResult(await n(createRequest(e)),e,r),doStream:async e=>createStreamResult(createGenerateResult(await n(createRequest(e)),e,r))}))}function normalizeOptions(e){return typeof e==`string`||typeof e==`function`?{respond:e}:e}function normalizeResponder(e){if(typeof e==`function`)return e;let t=e??`Mock response`;return()=>t}function createRequest(e){let t=e.prompt.map(e=>({role:e.role,text:extractMessageText(e)})),n=t.filter(e=>e.role===`user`).map(e=>e.text).filter(e=>!isFrameworkScaffolding(e));return{lastUserMessage:n.at(-1)??null,messages:t,toolResults:extractToolResults(e),tools:extractTools(e),userMessageCount:n.length,userMessages:n}}function isFrameworkScaffolding(e){let t=e.trim();return t.startsWith(AGENTS_SNIPPET_LABEL)||isPendingApprovalsSnippet(t)}function extractMessageText(e){return typeof e.content==`string`?e.content:e.content.flatMap(e=>{switch(e.type){case`reasoning`:case`text`:return[e.text];case`tool-result`:return[formatValue(normalizeToolOutput(e.output))];default:return[]}}).join(``)}function extractTools(e){return(e.tools??[]).map(e=>e.type===`function`?{description:e.description,inputSchema:e.inputSchema,name:e.name}:{name:e.name})}function extractToolResults(e){return e.prompt.flatMap(e=>typeof e.content==`string`?[]:e.content.flatMap(e=>e.type===`tool-result`?[{id:e.toolCallId,isError:e.output.type===`error-json`||e.output.type===`error-text`||e.output.type===`execution-denied`,name:e.toolName,output:normalizeToolOutput(e.output)}]:[]))}function normalizeToolOutput(e){switch(e.type){case`error-json`:case`error-text`:case`json`:case`text`:return e.value;case`execution-denied`:return e.reason??`Tool execution denied`;case`content`:return e.value}}function createGenerateResult(e,t,n){let r=typeof e==`string`?{text:e}:e,i=r.toolCalls??[];if(!(`text`in r)&&i.length===0)throw Error(`mockModel responders must return text or at least one item in "toolCalls".`);let a=[];r.text!==void 0&&a.push({text:r.text,type:`text`});for(let[e,n]of i.entries())a.push({input:JSON.stringify(n.input??{}),toolCallId:n.id??`mock-tool-call-${countUserMessages(t)}-${countToolResults(t)}-${e+1}`,toolName:n.name,type:`tool-call`});let o=t.prompt.map(e=>extractMessageText(e)).join(` `),s=[r.text??``,...i.map(e=>formatValue(e.input??{}))].join(` `),c=r.usage?.inputTokens??estimateTokens(o),l=r.usage?.outputTokens??estimateTokens(s);return{content:a,finishReason:{raw:void 0,unified:i.length>0?`tool-calls`:`stop`},response:{id:`mock-response-${countUserMessages(t)}-${countToolResults(t)}`,modelId:n,timestamp:new Date(RESPONSE_TIMESTAMP)},usage:{inputTokens:{cacheRead:0,cacheWrite:0,noCache:c,total:c},outputTokens:{reasoning:0,text:l,total:l}},warnings:[]}}function createStreamResult(e){let t=[{type:`stream-start`,warnings:e.warnings}];e.response!==void 0&&t.push({...e.response,type:`response-metadata`});let n=0;for(let r of e.content){if(r.type===`text`){let e=`mock-text-${n}`;n+=1,t.push({id:e,type:`text-start`}),r.text.length>0&&t.push({delta:r.text,id:e,type:`text-delta`}),t.push({id:e,type:`text-end`});continue}r.type===`tool-call`&&t.push(r)}return t.push({finishReason:e.finishReason,type:`finish`,usage:e.usage}),{stream:new ReadableStream({start(e){for(let n of t)e.enqueue(n);e.close()}})}}function countUserMessages(e){return e.prompt.filter(e=>e.role===`user`).length}function countToolResults(e){return extractToolResults(e).length}function estimateTokens(e){return Math.max(1,Math.ceil(e.trim().length/4))}function formatValue(e){if(typeof e==`string`)return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}export{mockModel};
|
|
@@ -22,7 +22,7 @@ export interface RunEvalsOptions {
|
|
|
22
22
|
readonly maxConcurrency?: number;
|
|
23
23
|
/** Overrides every eval's `timeoutMs` when set (CLI `--timeout`). */
|
|
24
24
|
readonly timeoutMs?: number;
|
|
25
|
-
/** Receives
|
|
25
|
+
/** Receives verbose activity lines as evals run. */
|
|
26
26
|
readonly onEvalLog?: (evalId: string, message: string) => void;
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{resolveArtifactDirectory,writeArtifacts}from"#evals/runner/artifacts.js";import{executeEval}from"#evals/runner/execute-eval.js";async function runEvals(e){let{config:t,target:n,client:r,appRoot:i}=e,a=e.maxConcurrency??t.maxConcurrency??8;if(!Number.isInteger(a)||a<1)throw Error(`Eval maxConcurrency must be a positive integer; got ${String(e.maxConcurrency??t.maxConcurrency)}.`);let o=e.evaluations.map(e=>applyConfigDefaults(e,t)),s=new Date().toISOString(),c=buildReporterBindings({...e,evaluations:o});for(let e of c)await e.reporter.onRunStart(o.filter(t=>e.evalIds.has(t.id)),n);let l=[],u=[...o],d=new Set,f=Promise.resolve(),enqueueReporterCallback=(e,t)=>{f=f.then(async()=>{for(let n of c)n.evalIds.has(e.id)&&await t(n.reporter)})};for(;u.length>0||d.size>0;){for(;u.length>0&&d.size<a;){let t=u.shift();if(t===void 0)break;let i=new Date().toISOString();enqueueReporterCallback(t,async e=>{await e.onEvalStart?.({evaluation:t,startedAt:i,target:n})});let a=(async()=>{let a=await executeEval({client:r,evaluation:t,onLog:e.onEvalLog===void 0?void 0:n=>e.onEvalLog?.(t.id,n),onSessionStart:e=>{enqueueReporterCallback(t,async r=>{await r.onSessionStart?.({evaluation:t,primary:e.primary,sessionId:e.sessionId,startedAt:e.startedAt,target:n,traceContext:e.traceContext})})},startedAt:i,target:n,timeoutMs:e.timeoutMs});l.push(a)
|
|
1
|
+
import{resolveArtifactDirectory,writeArtifacts}from"#evals/runner/artifacts.js";import{executeEval}from"#evals/runner/execute-eval.js";async function runEvals(e){let{config:t,target:n,client:r,appRoot:i}=e,a=e.maxConcurrency??t.maxConcurrency??8;if(!Number.isInteger(a)||a<1)throw Error(`Eval maxConcurrency must be a positive integer; got ${String(e.maxConcurrency??t.maxConcurrency)}.`);let o=e.evaluations.map(e=>applyConfigDefaults(e,t)),s=new Date().toISOString(),c=buildReporterBindings({...e,evaluations:o});for(let e of c)await e.reporter.onRunStart(o.filter(t=>e.evalIds.has(t.id)),n);let l=[],u=[...o],d=new Set,f=Promise.resolve(),enqueueReporterCallback=(e,t)=>{f=f.then(async()=>{for(let n of c)n.evalIds.has(e.id)&&await t(n.reporter)})};for(;u.length>0||d.size>0;){for(;u.length>0&&d.size<a;){let t=u.shift();if(t===void 0)break;let i=new Date().toISOString();enqueueReporterCallback(t,async e=>{await e.onEvalStart?.({evaluation:t,startedAt:i,target:n})});let a=(async()=>{let a=await executeEval({client:r,evaluation:t,onLog:e.onEvalLog===void 0?void 0:n=>e.onEvalLog?.(t.id,n),onSessionStart:e=>{enqueueReporterCallback(t,async r=>{await r.onSessionStart?.({evaluation:t,primary:e.primary,sessionId:e.sessionId,startedAt:e.startedAt,target:n,traceContext:e.traceContext})})},startedAt:i,target:n,timeoutMs:e.timeoutMs});l.push(a);for(let n of a.result.sessions??[]){if(n.sessionId===void 0)continue;let r=n.primary?`primary session`:`secondary session`;e.onEvalLog?.(t.id,`workflow run id (${r}): ${n.sessionId}`)}enqueueReporterCallback(t,async e=>{await e.onEvalComplete(a,{evaluation:t,target:n,traceContexts:a.result.traceContexts})})})().finally(()=>{d.delete(a)});d.add(a)}d.size>0&&await Promise.race(d)}await f;let p=new Map(o.map((e,t)=>[e.id,t]));l.sort((e,t)=>(p.get(e.id)??0)-(p.get(t.id)??0));let m=buildSummary(n,l,s),h=resolveArtifactDirectory(i);await writeArtifacts(h,m);for(let e of c)await e.reporter.onRunComplete(scopeSummary(m,e.evalIds));return m}function buildReporterBindings(e){let t=new Set(e.evaluations.map(e=>e.id)),n=new Set(e.reporters);if(e.includeEvalReporters!==!1)for(let t of e.config.reporters??[])n.add(t);let r=[...n].map(e=>({reporter:e,evalIds:t}));if(e.includeEvalReporters===!1)return r;let i=new Map;for(let t of e.evaluations)for(let e of t.reporters??[]){if(n.has(e))continue;let r=i.get(e)??new Set;r.add(t.id),i.set(e,r)}for(let[e,t]of i)r.push({reporter:e,evalIds:t});return r}function applyConfigDefaults(e,t){let n=e.judge??t.judge,r=e.timeoutMs??t.timeoutMs;return n===e.judge&&r===e.timeoutMs?e:{...e,judge:n,timeoutMs:r}}function buildSummary(e,t,n){return{target:e,results:t,startedAt:n,completedAt:new Date().toISOString(),passed:countVerdicts(t,`passed`),failed:countVerdicts(t,`failed`),scored:countVerdicts(t,`scored`),skipped:countVerdicts(t,`skipped`),errored:t.filter(e=>e.error!==void 0).length}}function scopeSummary(e,t){if(e.results.every(e=>t.has(e.id)))return e;let n=e.results.filter(e=>t.has(e.id));return{...e,results:n,passed:countVerdicts(n,`passed`),failed:countVerdicts(n,`failed`),scored:countVerdicts(n,`scored`),skipped:countVerdicts(n,`skipped`),errored:n.filter(e=>e.error!==void 0).length}}function countVerdicts(e,t){return e.filter(e=>e.verdict===t).length}export{runEvals};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DeliverHookPayload } from "#channel/types.js";
|
|
2
|
+
import type { MatchedAuthorizationCallback } from "#execution/authorization-callback-match.js";
|
|
3
|
+
import type { PendingAuthorizationState } from "#harness/authorization.js";
|
|
4
|
+
import type { ContextContainer } from "#context/container.js";
|
|
5
|
+
import type { SessionStateMap } from "#harness/types.js";
|
|
6
|
+
import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
|
|
7
|
+
export declare function updateActivityRootForDelivery(input: {
|
|
8
|
+
readonly activeTurnId: string;
|
|
9
|
+
readonly ctx: ContextContainer;
|
|
10
|
+
readonly delivery?: DeliverHookPayload;
|
|
11
|
+
readonly sessionState: SessionStateMap | undefined;
|
|
12
|
+
readonly taskRootTurnId?: string;
|
|
13
|
+
}): void;
|
|
14
|
+
export declare function restoreAuthorizationActivity(input: {
|
|
15
|
+
readonly ctx: ContextContainer;
|
|
16
|
+
readonly matches: readonly MatchedAuthorizationCallback[];
|
|
17
|
+
readonly pending: PendingAuthorizationState;
|
|
18
|
+
}): readonly string[];
|
|
19
|
+
export declare function updateActivityBlockers(ctx: ContextContainer, event: UnstampedMessageStreamEvent): void;
|
|
20
|
+
export declare function clearActivityBlockers(ctx: ContextContainer, ids: readonly string[]): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ActivityObserverKey,ActivityPendingBlockersKey,ActivityRootTurnIdKey}from"#context/keys.js";import{activityRequestIdsForRootTurn,activityRootTurnIdForInputResponses}from"#harness/pending-input-batches.js";function updateActivityRootForDelivery(e){if(!e.ctx.has(ActivityObserverKey))return;if(e.taskRootTurnId!==void 0){e.ctx.set(ActivityRootTurnIdKey,e.taskRootTurnId);return}let t=e.delivery;if(t===void 0)return;if(t.payloads.some(e=>e.message!==void 0)&&t.taskDeliveryId===void 0){e.ctx.set(ActivityRootTurnIdKey,e.activeTurnId),e.ctx.delete(ActivityPendingBlockersKey);return}let n=new Set(t.payloads.flatMap(e=>(e.inputResponses??[]).map(e=>e.requestId)));if(n.size===0)return;let r=activityRootTurnIdForInputResponses(e.sessionState,n)??e.ctx.get(ActivityRootTurnIdKey)??e.activeTurnId;e.ctx.set(ActivityRootTurnIdKey,r),e.ctx.set(ActivityPendingBlockersKey,activityRequestIdsForRootTurn(e.sessionState,r))}function restoreAuthorizationActivity(e){let t=e.matches.map(e=>e.result.attemptId??e.candidateId??e.result.name),n=t.map(t=>e.pending.activityRootTurnIds?.[t]).find(Boolean);return n!==void 0&&(e.ctx.set(ActivityRootTurnIdKey,n),e.ctx.set(ActivityPendingBlockersKey,Object.entries(e.pending.activityRootTurnIds??{}).flatMap(([e,t])=>t===n?[e]:[]))),clearActivityBlockers(e.ctx,t),t}function updateActivityBlockers(e,t){e.has(ActivityObserverKey)&&(t.type===`input.requested`?addActivityBlockers(e,t.data.requests.map(e=>e.requestId)):t.type===`input.resolved`?clearActivityBlockers(e,t.data.resolutions.map(e=>e.requestId)):t.type===`authorization.required`?addActivityBlockers(e,[authorizationBlockerId(t)]):t.type===`authorization.completed`&&clearActivityBlockers(e,[authorizationBlockerId(t)]))}function clearActivityBlockers(e,t){let n=new Set(t),r=(e.get(ActivityPendingBlockersKey)??[]).filter(e=>!n.has(e));r.length===0?e.delete(ActivityPendingBlockersKey):e.set(ActivityPendingBlockersKey,r)}function addActivityBlockers(e,t){e.set(ActivityPendingBlockersKey,[...new Set([...e.get(ActivityPendingBlockersKey)??[],...t])])}function authorizationBlockerId(e){return e.data.attemptId??e.data.candidateId??`${e.data.turnId}:${String(e.data.stepIndex)}:${e.data.name}`}export{clearActivityBlockers,restoreAuthorizationActivity,updateActivityBlockers,updateActivityRootForDelivery};
|
|
@@ -3,6 +3,7 @@ import type { AuthorizationResult, PendingAuthorizationState } from "#harness/au
|
|
|
3
3
|
import type { ConnectionAuthorizationChallenge } from "#connections/errors.js";
|
|
4
4
|
export interface MatchedAuthorizationCallback {
|
|
5
5
|
readonly authorization: ConnectionAuthorizationChallenge;
|
|
6
|
+
readonly candidateId?: string;
|
|
6
7
|
readonly result: {
|
|
7
8
|
readonly name: string;
|
|
8
9
|
} & AuthorizationResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,instanceId:o.instanceId,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
|
|
1
|
+
function matchAuthorizationCallbacks(e,t){let n=[],r=[],i=new Set;for(let a of t){let t=a.authorizationCallback;if(t===void 0){r.push(a);continue}let o=e.challenges.find(e=>e.name===t.connectionName?t.legacy===!0?e.attemptId===void 0:e.attemptId===t.attemptId:!1),s=o?.attemptId??o?.candidateId??o?.name;o===void 0||s===void 0||o.principal===void 0&&t.legacy!==!0||i.has(s)||(i.add(s),n.push({authorization:o.challenge,candidateId:o.candidateId,result:{attemptId:o.attemptId,callback:t.callback,hookUrl:o.hookUrl,instanceId:o.instanceId,name:o.name,principal:o.principal,resume:o.resume}}))}return{matches:n,remainingPayloads:r}}export{matchAuthorizationCallbacks};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getSessionTaskCohorts}from"#tasks/session-task-cohorts.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries,getSessionTaskCohorts(e.stateCursor.sessionState.snapshot?.session.state)),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e,t){let n=e.shift();if(n===void 0)throw Error(`Cannot take a turn delivery from an empty buffer.`);let r=
|
|
1
|
+
import{jsonValuesEqual}from"#shared/json.js";import{coalesceDeliveries}from"#harness/messages.js";import{cancelAllIndexedSessionTasksStep}from"#execution/cancel-indexed-session-tasks-step.js";import{reportDroppedWirePayloadStep}from"#execution/report-dropped-wire-payload-step.js";import{SessionInboxWireError,sessionInboxWire}from"#execution/wire/session-inbox-wire.js";import{routeDeliverToChildren}from"#execution/route-child-delivery.js";import{getSessionTaskCohorts}from"#tasks/session-task-cohorts.js";async function nextTurnDelivery(e){if(e.awaitAuthorizationCallbacks!==!0)return await awaitNextTurnDelivery(e);e.commandInbox.setAuthorizationWindow(!0);try{return await awaitNextTurnDelivery(e)}finally{e.commandInbox.setAuthorizationWindow(!1)}}async function awaitNextTurnDelivery(e){let t=e.cancelledTaskIds??new Set,n=e.seenTaskDeliveries??new Set;for(;;){let r=await waitForNextSessionAction({bufferedDeliveries:e.bufferedDeliveries,bufferedSessionControls:e.bufferedSessionControls,cancelledTaskIds:t,commandInbox:e.commandInbox,deferDeliveries:e.deferDeliveries,seenTaskDeliveries:n,stateCursor:e.stateCursor});if(r.kind===`authorization`)return r;if(r.kind!==`delivery`)return{kind:r.kind};let i=r.delivery;if(i===null)return{kind:`closed`};let a=await routeDeliverToChildren({delivery:i,parentWritable:e.driverWritable,serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState});if(e.stateCursor.adoptState(a),a.kind===`cancel-turn`)return{kind:`cancel-turn`};if(a.remainder!==void 0)return{delivery:a.remainder,kind:`turn`}}}async function waitForNextSessionAction(e){let t=e.bufferedSessionControls.shift();if(t!==void 0)return{kind:t};for(;e.bufferedDeliveries[0]!==void 0&&isCancelledTaskDelivery(e.bufferedDeliveries[0],e.cancelledTaskIds);)e.bufferedDeliveries.shift();if(e.deferDeliveries!==!0&&!e.commandInbox.hasReadyAuthorization()&&e.bufferedDeliveries.length>0)return{delivery:takeBufferedTurnDelivery(e.bufferedDeliveries,getSessionTaskCohorts(e.stateCursor.sessionState.snapshot?.session.state)),kind:`delivery`};for(;;){let{result:t,source:n}=await e.commandInbox.nextWithSource();if(e.commandInbox.consumeNext(),n===`authorization`)return t.done?{closed:!0,kind:`authorization`,payloads:[]}:{closed:!1,kind:`authorization`,payloads:t.value.kind===`deliver`?t.value.payloads:[]};if(t.done)return{delivery:null,kind:`delivery`};if(t.value.kind===`runtime-action-result`)continue;let r;try{r=sessionInboxWire.decode(t.value)}catch(e){if(!(e instanceof SessionInboxWireError))throw e;await reportDroppedWirePayloadStep({detail:e.message,family:`session-inbox`});continue}if(r.kind===`session-timeout`)return{kind:`expired`};if(r.kind===`clear`||r.kind===`compact`||r.kind===`reset`)return{kind:r.kind};if(r.kind===`cancel`){if(`tasks`in r&&r.tasks===!0&&await cancelAllIndexedSessionTasksStep({serializedContext:e.stateCursor.serializedContext,sessionState:e.stateCursor.sessionState}),r.taskId!==void 0){e.cancelledTaskIds.add(r.taskId);let t=e.bufferedDeliveries.filter(t=>!isCancelledTaskDelivery(t,e.cancelledTaskIds));e.bufferedDeliveries.splice(0,e.bufferedDeliveries.length,...t)}continue}let i=r.taskDeliveryId??r.caller?.taskId;if(!(i!==void 0&&isCancelledTaskDeliveryId(i,e.cancelledTaskIds))){if(i!==void 0){if(e.seenTaskDeliveries.has(i))continue;e.seenTaskDeliveries.add(i)}if(e.deferDeliveries===!0){e.bufferedDeliveries.push(r);continue}return{delivery:r,kind:`delivery`}}}}function isCancelledTaskDelivery(e,t){let n=e.taskDeliveryId??e.caller?.taskId;return n!==void 0&&isCancelledTaskDeliveryId(n,t)}function isCancelledTaskDeliveryId(e,t){return[...t].some(t=>e===t||e.startsWith(`${t}:`))}function takeBufferedTurnDelivery(e,t){let n=e.shift();if(n===void 0)throw Error(`Cannot take a turn delivery from an empty buffer.`);let r=completionCohort(n,t),i=n.auth!=null&&n.auth.principalType!==`anonymous`,a=[n],o=n.caller;for(;e.length>0;){let s=e[0];if(s===void 0||(n.taskDeliveryId!==void 0||s.taskDeliveryId!==void 0)&&(r===void 0||completionCohort(s,t)!==r)||n.taskDeliveryId===void 0&&(!i||!jsonValuesEqual(n.auth,s.auth))||o!==void 0&&s.caller!==void 0)break;let c=e.shift();if(c===void 0)throw Error(`Buffered turn delivery disappeared while partitioning.`);a.push(c),o??=c.caller}return coalesceDeliveries(a)}function completionCohort(e,t){if(e.caller===void 0&&e.taskDeliveryId?.endsWith(`:ready:completed`))return t.get(e.taskDeliveryId.slice(0,-16))}export{nextTurnDelivery};
|
|
@@ -9,6 +9,8 @@ export declare function observeSessionActivity(input: {
|
|
|
9
9
|
}): Promise<void>;
|
|
10
10
|
export declare function projectSessionActivity(input: {
|
|
11
11
|
readonly event: MessageStreamEvent;
|
|
12
|
+
readonly rootTurnId?: string;
|
|
12
13
|
readonly sessionId: string;
|
|
14
|
+
readonly suppressRootSettlement?: boolean;
|
|
13
15
|
readonly workIdentity?: ActivityWorkIdentityV1;
|
|
14
16
|
}): readonly ActivityEventV1[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ActivityObserverKey,TurnTaskDeliveryKey}from"#context/keys.js";import{deriveRootTurnActivityWorkId}from"#execution/activity-work-id.js";import{projectActivityEvents}from"#execution/activity-events.js";import{submitActivity}from"#execution/submit-activity.js";async function observeSessionActivity(e){let t=e.ctx.get(ActivityObserverKey);if(t===void 0)return;let n=e.ctx.get(TurnTaskDeliveryKey);(t.workIdentity!==void 0||n!==`pending`&&n!==`settled`)&&await submitActivity({events:projectSessionActivity({event:e.event,sessionId:e.sessionId,workIdentity:t.workIdentity}),sink:t.sink})}function projectSessionActivity(e){let t=workFor(e);if(t===void 0)return[];let n=[];return(t.kind===`root-turn`&&e.event.type===`turn.started`||t.kind!==`root-turn`&&(e.event.type===`session.started`||e.event.type===`turn.started`))&&n.push({eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.event.meta.at,work:t}),n.push(...projectActivityEvents({at:e.event.meta.at,event:e.event,eventId:e.event.meta.id,lineage:t})),n}function workFor(e){let t=eventTurnId(e.event);if(e.workIdentity!==void 0)return{...e.workIdentity,sessionId:e.sessionId,turnId:t??e.workIdentity.turnId};if(t
|
|
1
|
+
import{ActivityObserverKey,ActivityPendingBlockersKey,ActivityRootTurnIdKey,TurnTaskDeliveryKey}from"#context/keys.js";import{deriveRootTurnActivityWorkId}from"#execution/activity-work-id.js";import{projectActivityEvents}from"#execution/activity-events.js";import{submitActivity}from"#execution/submit-activity.js";async function observeSessionActivity(e){let t=e.ctx.get(ActivityObserverKey);if(t===void 0)return;let n=e.ctx.get(TurnTaskDeliveryKey);(t.workIdentity!==void 0||e.ctx.get(ActivityRootTurnIdKey)!==void 0||n!==`pending`&&n!==`settled`)&&await submitActivity({events:projectSessionActivity({event:e.event,rootTurnId:e.ctx.get(ActivityRootTurnIdKey),sessionId:e.sessionId,suppressRootSettlement:n===`initiating`||n===`pending`||(e.ctx.get(ActivityPendingBlockersKey)?.length??0)>0,workIdentity:t.workIdentity}),sink:t.sink})}function projectSessionActivity(e){let t=workFor(e);if(t===void 0)return[];let n=[];return(t.kind===`root-turn`&&e.event.type===`turn.started`||t.kind!==`root-turn`&&(e.event.type===`session.started`||e.event.type===`turn.started`))&&n.push({eventId:`${t.id}:started`,kind:`work.started`,startedAt:e.event.meta.at,work:t}),e.suppressRootSettlement===!0&&t.kind===`root-turn`&&(e.event.type===`turn.completed`||e.event.type===`turn.failed`||e.event.type===`turn.cancelled`)||n.push(...projectActivityEvents({at:e.event.meta.at,event:e.event,eventId:e.event.meta.id,lineage:t})),n}function workFor(e){let t=eventTurnId(e.event);if(e.workIdentity!==void 0)return{...e.workIdentity,sessionId:e.sessionId,turnId:t??e.workIdentity.turnId};if(t===void 0)return;let n=e.rootTurnId??t;return{id:deriveRootTurnActivityWorkId({sessionId:e.sessionId,turnId:n}),kind:`root-turn`,rootSessionId:e.sessionId,rootTurnId:n,sessionId:e.sessionId,turnId:t}}function eventTurnId(e){if(`data`in e&&`turnId`in e.data&&typeof e.data.turnId==`string`)return e.data.turnId}export{observeSessionActivity,projectSessionActivity};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{FALLBACK_SKILL_ROOT,MODEL_SKILL_ROOT}from"#shared/skill-paths.js";function formatAvailableSkillsSection(e,t={}){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best available alternative.`,formatSkillLocationLine(t),"When a loaded SKILL.md mentions sibling files such as `references/foo.md`, resolve them relative to the directory containing that specific SKILL.md.",...e.map(e=>formatAvailableSkillLine({skill:e,skillRoot:t.skillRoot}))].join(`
|
|
1
|
+
import{FALLBACK_SKILL_ROOT,MODEL_SKILL_ROOT}from"#shared/skill-paths.js";function formatAvailableSkillsSection(e,t={}){return e.length===0?null:[`Available skills`,`Listed skills are available in this run. Do not claim a listed skill is inaccessible unless activation or workspace inspection actually fails.`,`Dynamic skill announcements update this list. They replace earlier dynamic skills and override static skills with the same name.`,`If the user names a skill or the request clearly matches one of the descriptions below, call load_skill before proceeding.`,`If multiple skills match, activate the minimal set that covers the task. After activation, follow the returned instructions instead of improvising around them.`,`If activation fails, say so briefly and continue with the best available alternative.`,formatSkillLocationLine(t),"When a loaded SKILL.md mentions sibling files such as `references/foo.md`, resolve them relative to the directory containing that specific SKILL.md.",...e.map(e=>formatAvailableSkillLine({skill:e,skillRoot:t.skillRoot}))].join(`
|
|
2
2
|
`)}function formatSkillLocationLine(e){return e.skillRoot===void 0?`Skill files live under \`${MODEL_SKILL_ROOT}/<skill>/\`, with \`${FALLBACK_SKILL_ROOT}/<skill>/\` as the fallback when \`$HOME\` is unavailable.`:`Skill files live under \`${e.skillRoot}/<skill>/\`.`}function formatAvailableSkillLine(e){return`${`- ${e.skill.name}: ${e.skill.description}`} (path: ${e.skillRoot??MODEL_SKILL_ROOT}/${e.skill.name}/SKILL.md)`}export{formatAvailableSkillsSection};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.52.
|
|
1
|
+
import{sleep}from"#compiled/@workflow/core/index.js";async function executeSleepTool(e){"use workflow";return await sleep(Math.ceil(e.seconds*1e3)),{waitedSeconds:e.seconds}}executeSleepTool.workflowId=`workflow//eve@0.52.5//executeSleepTool`;export{executeSleepTool};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,ChannelDeliveryKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TurnDeliveryIdsKey,TurnTaskDeliveryKey,TurnTaskStateKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{activeTurnId}from"#harness/active-turn-id.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskCallIds,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{TASK_UPDATE_SESSION_INSTRUCTION}from"#tools/framework/task-update.js";import{deferMismatchedInlineTurnStep}from"#execution/accepted-delivery-deployment.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(e){"use step";let t=deferMismatchedInlineTurnStep(e);if(t!==void 0)return t;let n=e,r=await readDurableSession(n.sessionState),i=await deserializeContext(n.serializedContext);e.input?.kind===`deliver`&&(i.set(TurnTaskDeliveryKey,`none`),i.delete(TurnTaskStateKey));let a=i.require(ChannelKey),o=i.require(BundleKey),s=resolveEffectiveAgentRuntime(o,i),c=r.taskId!==void 0&&s.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.target.kind===`task-update`);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&i.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let l=getPendingAuthorization(r.state),u;if(l&&n.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(l,n.input.payloads);if(n={...n,input:{...n.input,payloads:t}},e.length>0){let a=e.map(e=>e.result);i.set(PendingAuthorizationResultKey,a),r={...r,state:clearPendingAuthorization(r.state,a.map(e=>e.attemptId??e.name))},u=e,t.length===0&&(n={...n,input:void 0})}}n.input?.kind===`deliver`&&n.input.auth!==void 0&&i.set(AuthKey,n.input.auth??null);let d=hydrateDurableSession({compactionOverrides:{thresholdPercent:s.thresholdPercent},durable:r,turnAgent:s.turnAgent}),f=createExecutionHistoryView(d),p=bindSessionInstrumentation({agentName:s.turnAgent.id,ctx:i,rootSessionId:d.rootSessionId??d.sessionId,sessionId:d.sessionId}),m=getHarnessEmissionState(d.state);e.input?.kind===`deliver`&&e.input.payloads.some(e=>e.message!==void 0)?i.set(TurnDeliveryIdsKey,e.input.deliveryMetadata?.map(e=>e.deliveryId)??[]):!m.sessionStarted&&i.get(ChannelDeliveryKey)!==void 0&&i.set(TurnDeliveryIdsKey,[i.require(ChannelDeliveryKey).deliveryId]),e.input?.kind===`deliver`&&await contextStorage.run(i,()=>p?.instrumentChannelDelivery({agentName:o.turnAgent.id,ctx:i,delivery:e.input,rootSessionId:d.rootSessionId??d.sessionId,sequence:m.sequence,sessionId:d.sessionId,turnId:activeTurnId(m)}));let failChannelDeliveries=async e=>{await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await p?.flush()},h=buildAdapterContext(a,i),g;if(n.input?.kind===`deliver`){let e=[];try{for(let t of n.input.payloads){let n=a.deliver?await a.deliver(t,h):defaultDeliverResult(t);n!=null&&e.push(n)}}catch(e){throw await failChannelDeliveries(e),e}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else n.input?.kind===`runtime-action-result`&&(n.input.acceptedAtMsByCallId!==void 0&&i.set(RuntimeActionSettlementTimesKey,n.input.acceptedAtMsByCallId),g={runtimeActionResults:n.input.results});if(g!==void 0&&e.input?.kind===`deliver`&&e.input.taskDeliveryId!==void 0){let t=resolveTaskDeliveryContext({state:r.state,taskDeliveryId:e.input.taskDeliveryId});t!==void 0&&(i.set(TurnTaskDeliveryKey,t.phase),g={...g,context:[...g.context??[],t.context]})}if(i.get(TurnTaskDeliveryKey)===`none`){let e=resolveInitiatingTaskContext({state:r.state,turnId:activeTurnId(m)});e!==void 0&&(i.set(TurnTaskDeliveryKey,e.phase),i.set(TurnTaskStateKey,e.context))}if(n.input?.kind===`deliver`){let e={...a,state:{...h.state}};setChannelContext(i,e)}if(n.input?.kind===`deliver`&&g===void 0){await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,includeTurn:!1,outcome:`completed`})),await p?.flush();let e=reconcileSessionContinuationToken(i,d),t=serializeContext(i),r=e===d?n.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r}}let _=o.hookRegistry,v=bindDynamicConnections(i,o.resolvedAgent),y=o.resolvedAgent.dynamicInstructionsResolvers??[],b=o.resolvedAgent.dynamicSkillResolvers??[],x=o.subagentRegistry.dynamicResolvers??[],S=o.resolvedAgent.dynamicToolResolvers??[],C={...o.graph.root,turnAgent:s.turnAgent},w=buildRuntimeIdentity(C);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(o.compiledArtifactsSource);if(!m.sessionStarted)i.set(SessionDynamicSubagentRuntimeRevisionKey,t),i.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:w});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:i,resolvers:x,event:e,messages:f.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:i,resolvers:S,event:e,messages:f.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:i,event:createTurnStartedEvent({sequence:m.sequence,turnId:activeTurnId(m)}),messages:f.initial.messages,resolvers:S})}}catch(e){throw await failChannelDeliveries(e),e}let T=n.parentWritable.getWriter(),emit=async e=>{let t=await callAdapterEventHandler(a,e,h);setChannelContext(i,{...a,state:{...h.state}});let n=stampMessageStreamEvent(t,i.get(TurnDeliveryIdsKey));return await T.write(encodeMessageStreamEvent(n)),n},handleEvent=async(e,t)=>{let r=await forwardTaskEventToSessionCallback(i,e)?stampMessageStreamEvent(e,i.get(TurnDeliveryIdsKey)):await emit(e),a=await dispatchMemoryLifecycleEvent({abortSignal:n.abortSignal,appRoot:C.agent?.metadata?.appRoot??``,ctx:i,event:e,memories:C.agent?.memories??[],messages:t,nodeId:o.nodeId??`__root__`});observeSessionActivity({ctx:i,event:r,sessionId:d.sessionId}),await dispatchStreamEventHooks({ctx:i,registry:_,event:r}),r.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:i,dynamicModel:s.turnAgent.dynamicModel,event:r,messages:a,scope:{moduleMap:o.moduleMap,nodeId:o.nodeId}}),await v.dispatch(r),await dispatchDynamicSubagentEvent({ctx:i,resolvers:x,event:r,messages:a}),await dispatchDynamicToolEvent({ctx:i,resolvers:S,event:r,messages:a}),await dispatchDynamicSkillEvent({ctx:i,resolvers:b,event:r,messages:a}),await dispatchDynamicInstructionEvent({ctx:i,resolvers:y,event:r,messages:a})},E=i.require(ModeKey),D;try{throwIfTurnAborted(n.abortSignal),D=await runBackgroundStep(i,d,async e=>{i.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:s.turnAgent.outputSchema,input:g,mode:E,session:e});if(await v.rehydrate(m,w,isHarnessBetweenTurns(t)),u){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(i,f.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:p});try{e=await emitTurnPreamble(handleEvent,{},e,w,r)}finally{n=drainDynamicInstructionUserMessages(i),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of u){let r=l?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let r=i.get(CapabilitiesKey);return(async(e,t)=>{let i=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:s.thresholdPercent},session:e,systemPromptAdditions:c?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:s.turnAgent}),a=i;return createExecutionNodeStep({abortSignal:n.abortSignal,capabilities:r,clearOnly:n.input?.kind===`clear`,compactOnly:n.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:f.projector,historyView:f.prepare(a),instrumentation:p,mode:E,modelResolutionScope:{moduleMap:o.moduleMap,nodeId:o.nodeId},node:C,workflowMaxSubagents:i.workflowMaxSubagents})(a,t)})(t,g)})}catch(e){if(!isTurnCancellation(e)&&n.abortSignal?.aborted!==!0)throw await failChannelDeliveries(e),e;T.releaseLock();let t=serializeContext(i),r=readRetainedBackgroundToolResult(i),a=await contextStorage.run(i,()=>preserveCancelledTurnMessage(r?.backgroundTaskSession??d,g));return{action:`cancelled`,...r===void 0?{}:{backgroundTaskState:createDurableSessionState({session:a}),backgroundTasks:r.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection({...n.serializedContext,[TurnDeliveryIdsKey.name]:t[TurnDeliveryIdsKey.name]},t),t),t),sessionState:createDurableSessionState({session:a})}}let O=reconcileSessionContinuationToken(i,D.session),k=serializeContext(i);D={...D,session:O};let A=createDurableSessionState({session:D.session}),j=D.backgroundTasks===void 0||D.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:D.backgroundTaskSession}),backgroundTasks:D.backgroundTasks};if(D.next!==null&&typeof D.next==`object`&&`done`in D.next){if(E===`task`&&hasPendingInputBatch(D.session.state))throw T.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await T.close();let e=getTurnUsageState(D.session.state)?.session;return{action:`done`,...j,output:D.next.output,isError:D.next.isError,serializedContext:k,sessionState:A,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(D.session).delta}}if(D.next===null){T.releaseLock();let e=getPendingWorkflowInterrupt(D.session.state);if(e!==void 0&&isWorkflowTaskInterrupt(e.interrupt))return{action:`dispatch-workflow-tasks`,...j,pendingTaskCallIds:getWorkflowTaskCallIds(e.interrupt),serializedContext:k,sessionState:A};let t=derivePendingState(D.session);if(D.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(D.session);return{action:`park`,...j,...t,serializedContext:k,sessionState:createDurableSessionState({session:n}),settled:{output:D.settledTurn.output,isError:D.settledTurn.isError,usage:e}}}return{action:`park`,...j,...t,serializedContext:k,sessionState:A}}return T.releaseLock(),{action:`continue`,...j,serializedContext:k,sessionState:A}}export{turnStep};
|
|
1
|
+
import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{contextStorage}from"#context/container.js";import{AuthKey,CapabilitiesKey,ChannelDeliveryKey,HandleEventKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey,TurnDeliveryIdsKey,TurnTaskDeliveryKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,createTurnStartedEvent,encodeMessageStreamEvent,stampMessageStreamEvent}from"#protocol/message.js";import{BundleKey,ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission.js";import{createWorkflowRuntime}from"#execution/workflow-runtime.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{activeTurnId}from"#harness/active-turn-id.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowTaskCallIds,isWorkflowTaskInterrupt}from"#harness/workflow-task-state.js";import{TASK_UPDATE_SESSION_INSTRUCTION}from"#tools/framework/task-update.js";import{deferMismatchedInlineTurnStep}from"#execution/accepted-delivery-deployment.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{dispatchDynamicToolEvent,rebindMissingCompiledDynamicToolCallbacks,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{observeSessionActivity}from"#execution/session-activity-projection.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{bindSessionInstrumentation}from"#instrumentation/runtime.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{preserveSerializedSessionDynamicModelSelection}from"#context/serialized-dynamic-model-selection.js";import{dispatchDynamicInstructionEvent,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchMemoryLifecycleEvent}from"#context/memory-event-lifecycle.js";import{preserveSerializedInstrumentationState}from"#instrumentation/state.js";import{RuntimeActionSettlementTimesKey}from"#harness/runtime-action-settlement-state.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{derivePendingState}from"#execution/pending-turn-state.js";import{forwardTaskEventToSessionCallback}from"#execution/task-event-callback.js";import{resolveEffectiveOutputSchema}from"#execution/effective-output-schema.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{resolveInitiatingTaskContext,resolveTaskDeliveryContext}from"#tasks/delivery-context.js";import{readRetainedBackgroundToolResult,runBackgroundStep}from"#execution/tasks/parent/tool-execution.js";import{prepareWorkflowPreambleTrace}from"#execution/workflow-trace-context.js";import{createExecutionHistoryView}from"#execution/history-view.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";import{bindDynamicConnections}from"#execution/dynamic-connections.js";import{preserveCancelledTurnMessage}from"#execution/cancelled-turn-message.js";import*as activityCohort from"#execution/activity-cohort.js";function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}async function turnStep(e){"use step";let t=deferMismatchedInlineTurnStep(e);if(t!==void 0)return t;let n=e,r=await readDurableSession(n.sessionState),i=await deserializeContext(n.serializedContext);e.input?.kind===`deliver`&&i.set(TurnTaskDeliveryKey,`none`);let a=i.require(ChannelKey),o=i.require(BundleKey),s=resolveEffectiveAgentRuntime(o,i),c=r.taskId!==void 0&&s.turnAgent.tools.some(e=>e.kind===`authored-tool`&&e.behavior?.handling?.kind===`dispatch`&&e.behavior.handling.target.kind===`task-update`);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&i.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let l=getPendingAuthorization(r.state),u;if(l&&n.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(l,n.input.payloads);if(n={...n,input:{...n.input,payloads:t}},e.length>0){let a=activityCohort.restoreAuthorizationActivity({ctx:i,matches:e,pending:l}),o=e.map(e=>e.result);i.set(PendingAuthorizationResultKey,o),r={...r,state:clearPendingAuthorization(r.state,a)},u=e,t.length===0&&(n={...n,input:void 0})}}n.input?.kind===`deliver`&&n.input.auth!==void 0&&i.set(AuthKey,n.input.auth??null);let d=hydrateDurableSession({compactionOverrides:{thresholdPercent:s.thresholdPercent},durable:r,turnAgent:s.turnAgent}),f=createExecutionHistoryView(d),p=bindSessionInstrumentation({agentName:s.turnAgent.id,ctx:i,rootSessionId:d.rootSessionId??d.sessionId,sessionId:d.sessionId}),m=getHarnessEmissionState(d.state);e.input?.kind===`deliver`&&e.input.payloads.some(e=>e.message!==void 0)?i.set(TurnDeliveryIdsKey,e.input.deliveryMetadata?.map(e=>e.deliveryId)??[]):!m.sessionStarted&&i.get(ChannelDeliveryKey)!==void 0&&i.set(TurnDeliveryIdsKey,[i.require(ChannelDeliveryKey).deliveryId]),e.input?.kind===`deliver`&&await contextStorage.run(i,()=>p?.instrumentChannelDelivery({agentName:o.turnAgent.id,ctx:i,delivery:e.input,rootSessionId:d.rootSessionId??d.sessionId,sequence:m.sequence,sessionId:d.sessionId,turnId:activeTurnId(m)}));let failChannelDeliveries=async e=>{await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,error:e,errorCode:channelDeliveryErrorCode(e),includeTurn:!1,outcome:`failed`})),await p?.flush()},h=buildAdapterContext(a,i),g;if(n.input?.kind===`deliver`){let e=[];try{for(let t of n.input.payloads){let n=a.deliver?await a.deliver(t,h):defaultDeliverResult(t);n!=null&&e.push(n)}}catch(e){throw await failChannelDeliveries(e),e}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else n.input?.kind===`runtime-action-result`&&(n.input.acceptedAtMsByCallId!==void 0&&i.set(RuntimeActionSettlementTimesKey,n.input.acceptedAtMsByCallId),g={runtimeActionResults:n.input.results});let _;if(g!==void 0&&e.input?.kind===`deliver`&&e.input.taskDeliveryId!==void 0){let t=resolveTaskDeliveryContext({state:r.state,taskDeliveryId:e.input.taskDeliveryId});t!==void 0&&(i.set(TurnTaskDeliveryKey,t.phase),_=t.rootTurnId,g={...g,context:[...g.context??[],t.context]})}activityCohort.updateActivityRootForDelivery({activeTurnId:activeTurnId(m),ctx:i,delivery:e.input?.kind===`deliver`?e.input:void 0,sessionState:r.state,taskRootTurnId:_});let v=i.get(TurnTaskDeliveryKey);if(v===`none`||v===`initiating`){let e=resolveInitiatingTaskContext({state:r.state,turnId:activeTurnId(m)});e!==void 0&&i.set(TurnTaskDeliveryKey,e.phase)}if(n.input?.kind===`deliver`){let e={...a,state:{...h.state}};setChannelContext(i,e)}if(n.input?.kind===`deliver`&&g===void 0){await contextStorage.run(i,()=>p?.instrumentChannelDelivery({ctx:i,includeTurn:!1,outcome:`completed`})),await p?.flush();let e=reconcileSessionContinuationToken(i,d),t=serializeContext(i),r=e===d?n.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:r}}let y=o.hookRegistry,b=bindDynamicConnections(i,o.resolvedAgent),x=o.resolvedAgent.dynamicInstructionsResolvers??[],S=o.resolvedAgent.dynamicSkillResolvers??[],C=o.subagentRegistry.dynamicResolvers??[],w=o.resolvedAgent.dynamicToolResolvers??[],T={...o.graph.root,turnAgent:s.turnAgent},E=buildRuntimeIdentity(T);try{let e=process.env.VERCEL_DEPLOYMENT_ID?.trim(),t=e?`deployment:${e}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(o.compiledArtifactsSource);if(!m.sessionStarted)i.set(SessionDynamicSubagentRuntimeRevisionKey,t),i.set(SessionDynamicToolRuntimeRevisionKey,t);else{let e=createSessionStartedEvent({runtime:E});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:i,resolvers:C,event:e,messages:f.initial.messages,runtimeRevision:t}),refreshDynamicSessionToolsForRuntimeRevision({ctx:i,resolvers:w,event:e,messages:f.initial.messages,runtimeRevision:t})]),await rebindMissingCompiledDynamicToolCallbacks({ctx:i,event:createTurnStartedEvent({sequence:m.sequence,turnId:activeTurnId(m)}),messages:f.initial.messages,resolvers:w})}}catch(e){throw await failChannelDeliveries(e),e}let D=n.parentWritable.getWriter(),emit=async e=>{let t=await callAdapterEventHandler(a,e,h);setChannelContext(i,{...a,state:{...h.state}});let n=stampMessageStreamEvent(t,i.get(TurnDeliveryIdsKey));return await D.write(encodeMessageStreamEvent(n)),n},handleEvent=async(e,t)=>{activityCohort.updateActivityBlockers(i,e);let r=await forwardTaskEventToSessionCallback(i,e)?stampMessageStreamEvent(e,i.get(TurnDeliveryIdsKey)):await emit(e),a=await dispatchMemoryLifecycleEvent({abortSignal:n.abortSignal,appRoot:T.agent?.metadata?.appRoot??``,ctx:i,event:e,memories:T.agent?.memories??[],messages:t,nodeId:o.nodeId??`__root__`});observeSessionActivity({ctx:i,event:r,sessionId:d.sessionId}),await dispatchStreamEventHooks({ctx:i,registry:y,event:r}),r.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:i,dynamicModel:s.turnAgent.dynamicModel,event:r,messages:a,scope:{moduleMap:o.moduleMap,nodeId:o.nodeId}}),await b.dispatch(r),await dispatchDynamicSubagentEvent({ctx:i,resolvers:C,event:r,messages:a}),await dispatchDynamicToolEvent({ctx:i,resolvers:w,event:r,messages:a}),await dispatchDynamicSkillEvent({ctx:i,resolvers:S,event:r,messages:a}),await dispatchDynamicInstructionEvent({ctx:i,resolvers:x,event:r,messages:a})},O=i.require(ModeKey),k;try{throwIfTurnAborted(n.abortSignal),k=await runBackgroundStep(i,d,async e=>{i.setVirtualContext(HandleEventKey,handleEvent);let t=resolveEffectiveOutputSchema({agentOutputSchema:s.turnAgent.outputSchema,input:g,mode:O,session:e});if(await b.rehydrate(m,E,isHarnessBetweenTurns(t)),u){let e=getHarnessEmissionState(t.state);if(isHarnessBetweenTurns(t)){prepareDynamicInstructionPreamble(i,f.messages(t));let n=[],r=await prepareWorkflowPreambleTrace({emissionState:e,instrumentation:p});try{e=await emitTurnPreamble(handleEvent,{},e,E,r)}finally{n=drainDynamicInstructionUserMessages(i),t={...t,history:[...t.history,...n]}}t=setHarnessEmissionState(t,e)}for(let{authorization:t,result:n}of u){let r=l?.challenges.find(e=>e.attemptId===n.attemptId)?.candidateId;await handleEvent(createAuthorizationCompletedEvent({attemptId:n.attemptId,authorization:t,candidateId:r,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}}let r=i.get(CapabilitiesKey);return(async(e,t)=>{let i=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:s.thresholdPercent},session:e,systemPromptAdditions:c?[TASK_UPDATE_SESSION_INSTRUCTION]:void 0,turnAgent:s.turnAgent}),a=i;return createExecutionNodeStep({abortSignal:n.abortSignal,capabilities:r,clearOnly:n.input?.kind===`clear`,compactOnly:n.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,historyProjector:f.projector,historyView:f.prepare(a),instrumentation:p,mode:O,modelResolutionScope:{moduleMap:o.moduleMap,nodeId:o.nodeId},node:T,workflowMaxSubagents:i.workflowMaxSubagents})(a,t)})(t,g)})}catch(e){if(!isTurnCancellation(e)&&n.abortSignal?.aborted!==!0)throw await failChannelDeliveries(e),e;D.releaseLock();let t=serializeContext(i),r=readRetainedBackgroundToolResult(i),a=await contextStorage.run(i,()=>preserveCancelledTurnMessage(r?.backgroundTaskSession??d,g));return{action:`cancelled`,...r===void 0?{}:{backgroundTaskState:createDurableSessionState({session:a}),backgroundTasks:r.backgroundTasks},serializedContext:preserveSerializedInstrumentationState(preserveSerializedAgentTraceState(preserveSerializedSessionDynamicModelSelection({...n.serializedContext,[TurnDeliveryIdsKey.name]:t[TurnDeliveryIdsKey.name]},t),t),t),sessionState:createDurableSessionState({session:a})}}let A=reconcileSessionContinuationToken(i,k.session),j=serializeContext(i);k={...k,session:A};let M=createDurableSessionState({session:k.session}),N=k.backgroundTasks===void 0||k.backgroundTaskSession===void 0?{}:{backgroundTaskState:createDurableSessionState({session:k.backgroundTaskSession}),backgroundTasks:k.backgroundTasks};if(k.next!==null&&typeof k.next==`object`&&`done`in k.next){if(O===`task`&&hasPendingInputBatch(k.session.state))throw D.releaseLock(),Error(`Task mode cannot complete while input requests remain pending.`);await D.close();let e=getTurnUsageState(k.session.state)?.session;return{action:`done`,...N,output:k.next.output,isError:k.next.isError,serializedContext:j,sessionState:M,usage:e===void 0?void 0:toUsage(e),usageDelta:takeSessionUsageDelta(k.session).delta}}if(k.next===null){D.releaseLock();let e=getPendingWorkflowInterrupt(k.session.state);if(e!==void 0&&isWorkflowTaskInterrupt(e.interrupt))return{action:`dispatch-workflow-tasks`,...N,pendingTaskCallIds:getWorkflowTaskCallIds(e.interrupt),serializedContext:j,sessionState:M};let t=derivePendingState(k.session);if(k.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(k.session);return{action:`park`,...N,...t,serializedContext:j,sessionState:createDurableSessionState({session:n}),settled:{output:k.settledTurn.output,isError:k.settledTurn.isError,usage:e}}}return{action:`park`,...N,...t,serializedContext:j,sessionState:M}}return D.releaseLock(),{action:`continue`,...N,serializedContext:j,sessionState:M}}export{turnStep};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{contextStorage}from"#context/container.js";import{AuthKey,SessionKey}from"#context/keys.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildApprovalResponseAuth,handleApprovalResponsePolicyError}from"#execution/tool-auth.js";import{clearPendingAuthorization,getAuthorizationResult,getPendingAuthorization,isAuthorizationSignal}from"#harness/authorization.js";import{createApprovalCandidate,expireApprovalCandidates,finishApprovalCandidate,getActiveApprovalCandidate,getApprovalAuditState,markApprovalCandidateAuthorizationRequired,settleAllowedCandidate,settleDirectApprovalResponse}from"#harness/approval-candidates.js";import{isApprovalRequest}from"#harness/input-request-class.js";
|
|
1
|
+
import{contextStorage}from"#context/container.js";import{AuthKey,SessionKey}from"#context/keys.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildApprovalResponseAuth,handleApprovalResponsePolicyError}from"#execution/tool-auth.js";import{getPendingInputBatches}from"#harness/pending-input-batches.js";import{clearPendingAuthorization,getAuthorizationResult,getPendingAuthorization,isAuthorizationSignal}from"#harness/authorization.js";import{createApprovalCandidate,expireApprovalCandidates,finishApprovalCandidate,getActiveApprovalCandidate,getApprovalAuditState,markApprovalCandidateAuthorizationRequired,settleAllowedCandidate,settleDirectApprovalResponse}from"#harness/approval-candidates.js";import{isApprovalRequest}from"#harness/input-request-class.js";const UNAUTHENTICATED_APPROVAL_FEEDBACK=`Authentication is required to respond to this approval.`;function shouldPrepareApprovalPolicyTools(e){let t=getPendingInputBatches(e.session.state),n=[...(e.stepInput?.attributedInputResponses??[]).map(({response:e})=>e),...e.stepInput?.inputResponses??[]];if(t.some(e=>e.requests.some(e=>isApprovalRequest(e)&&n.some(t=>t.requestId===e.requestId))))return!1;let r=e.now??Date.now();return getApprovalAuditState(e.session.state).activeCandidates.some(e=>e.expiresAt>r&&(e.status===`pending`||(e.authorizationChallenges?.some(e=>getAuthorizationResult(e.name)!==void 0)??!1)))}function shouldPrepareApprovalReplayTools(e){if(shouldPrepareApprovalPolicyTools(e))return!0;let t=getPendingInputBatches(e.session.state),n=[...(e.stepInput?.attributedInputResponses??[]).map(({response:e})=>e),...e.stepInput?.inputResponses??[]],r=t.length===1?t[0]:void 0;r!==void 0&&typeof e.stepInput?.message==`string`&&!n.some(e=>r.requests.some(t=>t.requestId===e.requestId))&&n.push(...resolveTextToResponses(e.stepInput.message,r.requests.filter(e=>!r.responseAuthRequiredRequestIds?.includes(e.requestId))));let i=new Set(n.filter(e=>e.optionId===`approve`).map(e=>e.requestId));return t.some(e=>e.requests.some(e=>isApprovalRequest(e)&&i.has(e.requestId)))}async function coordinateApprovalDelivery(e){let t=e.now??Date.now(),n=getApprovalAuditState(e.session.state).activeCandidates.filter(e=>e.expiresAt<=t).flatMap(e=>e.authorizationChallenges?.map(e=>e.name)??[]),r=expireApprovalCandidates({now:t,state:e.session.state}),i={...e.session,state:clearPendingAuthorization(r,n)},a=getApprovalAuditState(i.state),o=getPendingInputBatches(i.state),s=new Set(o.flatMap(e=>e.requests.map(e=>e.requestId))),c=a.settlements.filter(e=>s.has(e.requestId)),l=new Set(a.settlements.map(e=>e.requestId)),u=hasResponseForRequest(e.stepInput,l),d=u?removeConsumedResponses(e.stepInput,l):e.stepInput;if(u&&c.length===0&&!hasMeaningfulInput(d))return deliveryResult(i,d,`park`);if(o.length===0)return deliveryResult(i,d);let f=d,p=new Set(o.flatMap(e=>e.responseAuthRequiredRequestIds??[])),m=o.flatMap(e=>e.requests),h=new Map(m.map(e=>[e.requestId,e])),g=[],_=[],v=new Set,y=!1,b=getApprovalAuditState(i.state).activeCandidates,x=[...f?.attributedInputResponses??[],...(f?.inputResponses??[]).map(e=>({auth:void 0,response:e}))];for(let{auth:e,response:n}of x){let r=h.get(n.requestId);if(r===void 0||!isApprovalRequest(r))continue;if(!p.has(n.requestId)){let r=contextStorage.getStore(),a=e===void 0?r?.get(AuthKey)??r?.get(SessionKey)?.auth.current??null:e;if(a!==null&&(n.optionId===`approve`||n.optionId===`cancel`)){let e=settleDirectApprovalResponse({actor:a,outcome:n.optionId===`approve`?`allowed`:`cancelled`,requestId:n.requestId,settledAt:t,state:i.state});i={...i,state:e.state},y||=e.changed}continue}if(v.add(n.requestId),n.optionId===`cancel`){let r=e===void 0?buildCallbackContext().session.auth.current:e;if(r===null){_.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let a=settleDirectApprovalResponse({actor:r,outcome:`cancelled`,requestId:n.requestId,settledAt:t,state:i.state});i={...i,state:a.state},y||=a.changed;continue}if(n.optionId!==`approve`)continue;let a=e===void 0?buildCallbackContext().session.auth.current:e;if(a===null){_.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let o=createApprovalCandidate({candidateIdPrefix:approvalCandidateIdPrefix(r.requestId,a),createdAt:t,expiresAt:t+6e5,requestId:r.requestId,responder:a,state:i.state});i={...i,state:o.state},y||=o.changed}let S=removeConsumedResponses(f,v);if(v.size>0)return deliveryResult(i,S,y?`continue-coordination`:`continue`,[],_);if(y)return deliveryResult(i,S,`continue`,[],_);let C=new Set(getPendingAuthorization(i.state)?.challenges.map(e=>e.name)??[]);for(let n of b){if(n.status===`authorization-required`){let e=n.authorizationChallenges??[];if(!e.some(e=>getAuthorizationResult(e.name)!==void 0)){g.push(...e.filter(e=>!C.has(e.name)));continue}}let r=h.get(n.requestId);if(r===void 0||getActiveApprovalCandidate(i.state,n.candidateId)===void 0)continue;let a=await authorizeCandidate({candidateId:n.candidateId,now:t,request:r,responder:n.responder,session:i,tools:e.tools});i=a.session,y||=a.didCommit,g.push(...a.challenges);let o=getApprovalAuditState(i.state).settlements.find(e=>e.requestId===n.requestId);o!==void 0&&c.push(o)}let w=appendSettledResponses(S,c);return c.length>0?deliveryResult(i,w,`continue`):y?deliveryResult(i,w,`continue-coordination`):deliveryResult(i,w,g.length>0?`authorization-required`:`continue`,g)}async function authorizeCandidate(e){let t={...e.session,state:expireApprovalCandidates({now:e.now,state:e.session.state})};if(getActiveApprovalCandidate(t.state,e.candidateId)===void 0)return{challenges:[],didCommit:!1,session:t};let n=e.tools.get(e.request.action.toolName)?.approval,r=n!==void 0&&typeof n!=`function`?n.response:void 0;if(r===void 0)return failCandidate({...e,reason:`Approval authorization is temporarily unavailable. Please try again.`,session:t});try{let n=buildCallbackContext(),i=await withAuthorizerTimeout(r({auth:buildApprovalResponseAuth({responder:e.responder,scope:e.candidateId}),request:{callId:e.request.action.callId,requestId:e.request.requestId,toolInput:e.request.action.input,toolName:e.request.action.toolName},response:{decision:`approve`},responder:e.responder,session:{id:n.session.id,initiator:n.session.auth.initiator,parent:n.session.parent,turn:n.session.turn}}));if(i.status===`rejected`)return t={...t,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:i.reason,state:t.state,status:`rejected`})},{challenges:[],didCommit:!0,session:t};if(i.status!==`allowed`)return failCandidate({...e,session:t});let a=settleAllowedCandidate({candidateId:e.candidateId,settledAt:e.now,state:t.state});return{challenges:[],didCommit:a.changed,session:{...t,state:a.state}}}catch(n){let r=await handleApprovalResponsePolicyError(n).catch(()=>void 0);if(isAuthorizationSignal(r)){let n=r.challenges.map(e=>Date.parse(e.challenge.expiresAt??``)).filter(Number.isFinite).sort((e,t)=>e-t)[0];return t={...t,state:markApprovalCandidateAuthorizationRequired({authorizationChallenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),candidateId:e.candidateId,expiresAt:n,state:t.state})},{challenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),didCommit:!0,session:t}}return failCandidate({...e,session:t})}}function failCandidate(e){let t=e.reason??`We couldn’t verify your approval. Please try again.`;return{challenges:[],didCommit:!0,session:{...e.session,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:t,state:e.session.state,status:`failed`})}}}function hasResponseForRequest(e,t){return e?.attributedInputResponses?.some(({response:e})=>t.has(e.requestId))===!0||e?.inputResponses?.some(e=>t.has(e.requestId))===!0}function hasMeaningfulInput(e){return e?.message!==void 0||(e?.attributedInputResponses?.length??0)>0||(e?.inputResponses?.length??0)>0||(e?.runtimeActionResults?.length??0)>0}function appendSettledResponses(e,t){return t.length===0?e:{...e,inputResponses:[...e?.inputResponses??[],...t.map(e=>({optionId:e.outcome===`allowed`?`approve`:`cancel`,requestId:e.requestId}))]}}function removeConsumedResponses(e,t){if(e===void 0)return;let n=(e.attributedInputResponses??[]).filter(({response:e})=>!t.has(e.requestId)),r=[...(e.inputResponses??[]).filter(e=>!t.has(e.requestId)),...n.map(({response:e})=>e)];return{...e,attributedInputResponses:void 0,inputResponses:r}}function deliveryResult(e,t,n=`continue`,r=[],i=[]){return{challenges:r,feedback:i,kind:n,session:e,stepInput:t}}function approvalCandidateIdPrefix(e,t){let n=[t.authenticator,t.issuer??``,t.principalType,t.principalId].join(`:`);return`${encodeCandidateIdPart(e)}.${encodeCandidateIdPart(n)}`}function encodeCandidateIdPart(e){return Array.from(e,e=>e.codePointAt(0).toString(36)).join(`-`)}async function withAuthorizerTimeout(e){let t;try{return await Promise.race([Promise.resolve(e),new Promise((e,n)=>{t=setTimeout(()=>n(Error(`Approval response authorizer timed out.`)),1e4)})])}finally{t!==void 0&&clearTimeout(t)}}export{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools,shouldPrepareApprovalReplayTools};
|
|
@@ -162,6 +162,7 @@ export declare const CallbackBaseUrlKey: ContextKey<string>;
|
|
|
162
162
|
/** Hook token of a runtime that owns its callback instead of using the session hook. */
|
|
163
163
|
export declare const AuthorizationHookKey: ContextKey<string>;
|
|
164
164
|
export interface PendingAuthorizationState {
|
|
165
|
+
readonly activityRootTurnIds?: Readonly<Record<string, string>>;
|
|
165
166
|
readonly challenges: readonly AuthorizationChallenge[];
|
|
166
167
|
}
|
|
167
168
|
export declare function setPendingAuthorization(sessionState: Record<string, unknown> | undefined, value: PendingAuthorizationState): Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{loadContext}from"#context/container.js";import{SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(t&&t.length!==0)return e===void 0?t[0]:t.find(t=>t.name===e)}function getAuthorizationResults(){return loadContext().get(PendingAuthorizationResultKey)??[]}function consumeAuthorizationResult(e,t){let n=loadContext(),r=n.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(n=>n.name===e&&n.instanceId===t);if(i===-1&&t!==void 0&&r.some(t=>t.name===e&&t.instanceId!==void 0))throw Error(`Authorization for "${e}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return n.delete(PendingAuthorizationResultKey),o.length>0&&n.set(PendingAuthorizationResultKey,o),a}function getHookUrl(e,t){let n=loadContext(),r=n.get(SessionIdKey),i=n.get(CallbackBaseUrlKey),a=n.get(AuthorizationHookKey)??(r?authHookToken(r):void 0);if(a&&i)return createWorkflowCallbackUrl(i,createEveConnectionCallbackRoutePath(e,t,a))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),AuthorizationHookKey=new ContextKey(`eve.authorizationHook`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=resolveActiveAuthorizationChallenges(t.challenges),r=getPendingAuthorization(e)?.challenges??[],
|
|
1
|
+
import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{contextStorage,loadContext}from"#context/container.js";import{ActivityRootTurnIdKey,SessionIdKey}from"#context/keys.js";import{ContextKey}from"#context/key.js";import{createWorkflowCallbackUrl}from"#execution/workflow-callback-url.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(t&&t.length!==0)return e===void 0?t[0]:t.find(t=>t.name===e)}function getAuthorizationResults(){return loadContext().get(PendingAuthorizationResultKey)??[]}function consumeAuthorizationResult(e,t){let n=loadContext(),r=n.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(n=>n.name===e&&n.instanceId===t);if(i===-1&&t!==void 0&&r.some(t=>t.name===e&&t.instanceId!==void 0))throw Error(`Authorization for "${e}" cannot complete because its resolved connection changed while sign-in was pending. Start sign-in again.`);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return n.delete(PendingAuthorizationResultKey),o.length>0&&n.set(PendingAuthorizationResultKey,o),a}function getHookUrl(e,t){let n=loadContext(),r=n.get(SessionIdKey),i=n.get(CallbackBaseUrlKey),a=n.get(AuthorizationHookKey)??(r?authHookToken(r):void 0);if(a&&i)return createWorkflowCallbackUrl(i,createEveConnectionCallbackRoutePath(e,t,a))}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),AuthorizationHookKey=new ContextKey(`eve.authorizationHook`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=resolveActiveAuthorizationChallenges(t.challenges),r=getPendingAuthorization(e),i=r?.challenges??[],a=getSupersededAuthorizationChallenges(e,n),o=contextStorage.getStore()?.get(ActivityRootTurnIdKey),s={...r?.activityRootTurnIds};for(let e of a)delete s[authorizationAttemptKey(e)];if(o!==void 0)for(let e of n)s[authorizationAttemptKey(e)]=o;return{...e,[PENDING_AUTHORIZATION_KEY]:{...Object.keys(s).length===0?{}:{activityRootTurnIds:s},challenges:[...i.filter(e=>!a.includes(e)),...n]}}}function resolveActiveAuthorizationChallenges(e){return e.filter((t,n)=>!e.slice(n+1).some(e=>t.name===e.name&&samePrincipal(t.principal,e.principal)))}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(authorizationAttemptKey(e)));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:pendingAuthorizationValue(n,i)}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function pendingAuthorizationValue(e,t){let n=Object.fromEntries(t.flatMap(t=>{let n=authorizationAttemptKey(t),r=e.activityRootTurnIds?.[n];return r===void 0?[]:[[n,r]]}));return{...Object.keys(n).length===0?{}:{activityRootTurnIds:n},challenges:t}}function authorizationAttemptKey(e){return e.attemptId??e.candidateId??e.name}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(typeof t==`object`&&t)return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{AuthorizationHookKey,CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getAuthorizationResults,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,resolveActiveAuthorizationChallenges,setPendingAuthorization};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{generateText}from"ai";import{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,COMPACTION_RESUMPTION_MESSAGE,TODO_COMPACTION_PRESERVATION_LABEL,TRANSCRIPT_PAYLOAD_LIMIT,createCompactionPrompt,sliceUtf16Safe,stubContentOutputFileParts}from"#harness/compaction-prompt.js";import{estimateTokens}from"#harness/token-estimate.js";const COMPACTION_PROMPT_OVERHEAD_TOKENS=estimateTokens([{content:COMPACTION_PROMPT_ENVELOPE.system,role:`system`},{content:COMPACTION_PROMPT_ENVELOPE.prompt,role:`user`}]);function getInputTokenCount(e,t){let n=t.lastKnownInputTokens,r=t.lastKnownPromptMessageCount;return n===void 0||r===void 0||!Number.isInteger(r)||r<0||r>e.length?estimateTokens(e):n+estimateTokens(e.slice(r))}function shouldCompact(e,t){return e.length>0&&getInputTokenCount(e,t)+COMPACTION_PROMPT_OVERHEAD_TOKENS>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}const COMPACTION_HEURISTICS=[toolResultCapHeuristic];function toolResultCapHeuristic(e){let t=withResumptionGuard([...e.previousCheckpoint===void 0?[]:[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:e.previousCheckpoint,role:`assistant`}],...capToolResults(e.older),...e.recent],e.conversation);return evaluateThreshold(t,e.config,`should-compact`,e.tokenEstimateAdjustment).type===`within-limit`?{messages:t,type:`within-limit`}:{type:`insufficient`}}function evaluateThreshold(e,t,n,r=0){let i=n===`should-compact`?COMPACTION_PROMPT_OVERHEAD_TOKENS:0,a=estimateTokens(e)+i+r;return{estimatedTokens:a,type:a<=t.threshold?`within-limit`:`over-limit`}}async function compactMessages(e,t,n,r,i,a,o,s=!1){let{conversation:c,previousCheckpoint:l}=extractPreviousCheckpoint(e),u=selectRecentWindowSize(c,s?{...n,recentWindowSize:1}:n);if(!s){let{older:t,recent:r}=splitMessagesForCompaction(c,u);if(t.length===0&&l===void 0)return keepNonToolResultMessages(r);let i=Math.max(0,getInputTokenCount(e,n)-estimateTokens(e));for(let e of COMPACTION_HEURISTICS){let a=e({config:n,conversation:c,older:t,previousCheckpoint:l,recent:r,tokenEstimateAdjustment:i});if(a.type===`within-limit`)return a.messages}}for(;;){let{older:e,recent:s}=splitMessagesForCompaction(c,u),d=createCompactionPrompt({messages:e,previousCheckpoint:l,transcriptBudgetTokens:n.threshold}),f=await generateText({abortSignal:o,headers:a,model:t,prompt:d.prompt,providerOptions:r,system:d.system,telemetry:i?{...i,functionId:`eve.compaction`}:void 0,temperature:0});if(f.text.trim().length===0)throw Error(`The compaction model returned an empty summary. Finish reason: ${f.finishReason}.`);let p=[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:f.text,role:`assistant`}],m=withResumptionGuard([...p,...s],c);if(evaluateThreshold(m,n,`estimate`).type===`within-limit`)return m;let h=withResumptionGuard([...p,...keepNonToolResultMessages(s)],c);if(evaluateThreshold(h,n,`estimate`).type===`within-limit`||u===0)return h;--u}}function capToolResults(e){return e.map(e=>{if(e.role!==`tool`||typeof e.content==`string`)return e;let t=!1,n=e.content.map(e=>{if(e.type!==`tool-result`)return e;let n=stubContentOutputFileParts(e.output),r=JSON.stringify(n)??``;return r.length<=TRANSCRIPT_PAYLOAD_LIMIT?n===e.output?e:(t=!0,{...e,output:n}):(t=!0,{...e,output:{type:`text`,value:`[Truncated by eve: tool result reduced during context compaction. Re-run the tool if you need the full output.]\n\n${sliceUtf16Safe(r,TRANSCRIPT_PAYLOAD_LIMIT)}`}})});return t?{...e,content:n}:e})}function withResumptionGuard(e,t){let
|
|
1
|
+
import{generateText}from"ai";import{COMPACTION_CHECKPOINT_MARKER,COMPACTION_PROMPT_ENVELOPE,COMPACTION_RESUMPTION_MESSAGE,TODO_COMPACTION_PRESERVATION_LABEL,TRANSCRIPT_PAYLOAD_LIMIT,createCompactionPrompt,sliceUtf16Safe,stubContentOutputFileParts}from"#harness/compaction-prompt.js";import{estimateTokens}from"#harness/token-estimate.js";const COMPACTION_PROMPT_OVERHEAD_TOKENS=estimateTokens([{content:COMPACTION_PROMPT_ENVELOPE.system,role:`system`},{content:COMPACTION_PROMPT_ENVELOPE.prompt,role:`user`}]);function getInputTokenCount(e,t){let n=t.lastKnownInputTokens,r=t.lastKnownPromptMessageCount;return n===void 0||r===void 0||!Number.isInteger(r)||r<0||r>e.length?estimateTokens(e):n+estimateTokens(e.slice(r))}function shouldCompact(e,t){return e.length>0&&getInputTokenCount(e,t)+COMPACTION_PROMPT_OVERHEAD_TOKENS>t.threshold}async function resolveCompactionModel(e){let t=e.compactionModelReference??e.modelReference;return{model:t===e.modelReference?e.model:await e.resolveModel(t),providerOptions:t.providerOptions}}const COMPACTION_HEURISTICS=[toolResultCapHeuristic];function toolResultCapHeuristic(e){let t=withResumptionGuard([...e.previousCheckpoint===void 0?[]:[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:e.previousCheckpoint,role:`assistant`}],...capToolResults(e.older),...e.recent],e.conversation,e.config.threshold);return evaluateThreshold(t,e.config,`should-compact`,e.tokenEstimateAdjustment).type===`within-limit`?{messages:t,type:`within-limit`}:{type:`insufficient`}}function evaluateThreshold(e,t,n,r=0){let i=n===`should-compact`?COMPACTION_PROMPT_OVERHEAD_TOKENS:0,a=estimateTokens(e)+i+r;return{estimatedTokens:a,type:a<=t.threshold?`within-limit`:`over-limit`}}async function compactMessages(e,t,n,r,i,a,o,s=!1){let{conversation:c,previousCheckpoint:l}=extractPreviousCheckpoint(e),u=selectRecentWindowSize(c,s?{...n,recentWindowSize:1}:n);if(!s){let{older:t,recent:r}=splitMessagesForCompaction(c,u);if(t.length===0&&l===void 0)return keepNonToolResultMessages(r);let i=Math.max(0,getInputTokenCount(e,n)-estimateTokens(e));for(let e of COMPACTION_HEURISTICS){let a=e({config:n,conversation:c,older:t,previousCheckpoint:l,recent:r,tokenEstimateAdjustment:i});if(a.type===`within-limit`)return a.messages}}for(;;){let{older:e,recent:s}=splitMessagesForCompaction(c,u),d=createCompactionPrompt({messages:e,previousCheckpoint:l,transcriptBudgetTokens:n.threshold}),f=await generateText({abortSignal:o,headers:a,model:t,prompt:d.prompt,providerOptions:r,system:d.system,telemetry:i?{...i,functionId:`eve.compaction`}:void 0,temperature:0});if(f.text.trim().length===0)throw Error(`The compaction model returned an empty summary. Finish reason: ${f.finishReason}.`);let p=[{content:COMPACTION_CHECKPOINT_MARKER,role:`user`},{content:f.text,role:`assistant`}],m=withResumptionGuard([...p,...s],c,n.threshold);if(evaluateThreshold(m,n,`estimate`).type===`within-limit`)return m;let h=withResumptionGuard([...p,...keepNonToolResultMessages(s)],c,n.threshold);if(evaluateThreshold(h,n,`estimate`).type===`within-limit`||u===0)return h;--u}}function capToolResults(e){return e.map(e=>{if(e.role!==`tool`||typeof e.content==`string`)return e;let t=!1,n=e.content.map(e=>{if(e.type!==`tool-result`)return e;let n=stubContentOutputFileParts(e.output),r=JSON.stringify(n)??``;return r.length<=TRANSCRIPT_PAYLOAD_LIMIT?n===e.output?e:(t=!0,{...e,output:n}):(t=!0,{...e,output:{type:`text`,value:`[Truncated by eve: tool result reduced during context compaction. Re-run the tool if you need the full output.]\n\n${sliceUtf16Safe(r,TRANSCRIPT_PAYLOAD_LIMIT)}`}})});return t?{...e,content:n}:e})}function withResumptionGuard(e,t,n){let r=e.at(-1)?.role,i=findLastRealUserMessage(t),a=i!==void 0&&e.some(e=>e.role===`user`&&e.content===i.content);return r!==void 0&&r!==`assistant`?r===`tool`&&i!==void 0&&!a&&estimateTokens([i])<=n?[...e,i]:e:[...e,i!==void 0&&!a?i:{content:COMPACTION_RESUMPTION_MESSAGE,role:`user`}]}function findLastRealUserMessage(e){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n?.role===`user`&&typeof n.content==`string`&&!(n.content===COMPACTION_RESUMPTION_MESSAGE||n.content===COMPACTION_CHECKPOINT_MARKER||n.content.startsWith(TODO_COMPACTION_PRESERVATION_LABEL)))return n}}function extractPreviousCheckpoint(e){let t=e[0],n=e[1];return t?.role!==`user`||t.content!==COMPACTION_CHECKPOINT_MARKER||n?.role!==`assistant`?{conversation:[...e],previousCheckpoint:void 0}:{conversation:e.slice(2),previousCheckpoint:assistantMessageText(n)}}function keepNonToolResultMessages(e){let t=[];for(let n of e)if(n.role!==`tool`){if(n.role===`assistant`){let e=assistantMessageText(n);e.length>0&&t.push({content:e,role:`assistant`});continue}t.push(n)}return t}function assistantMessageText(e){return typeof e.content==`string`?e.content.trim():e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).trim()}function selectRecentWindowSize(e,t){let n=Math.min(t.recentWindowSize,Math.max(e.length-1,0)),r=resolveCompactionSummaryReserve(t),i=0,a=0;for(let o=e.length-1;o>=0&&i<n;--o){let n=e[o];if(n===void 0)continue;let s=estimateTokens([n]);if(a+s+r>t.threshold)break;a+=s,i+=1}return i}function resolveCompactionSummaryReserve(e){return Math.min(2048,Math.max(64,Math.floor(e.threshold/4)))}function splitMessagesForCompaction(e,t){if(t<=0)return{older:[...e],recent:[]};let n=e.length-t;for(;n<e.length&&e[n]?.role===`tool`;)n+=1;return{older:e.slice(0,n),recent:e.slice(n)}}export{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact};
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import type { ModelMessage, SystemModelMessage } from "ai";
|
|
2
|
+
import type { HistoryState } from "#context/keys.js";
|
|
2
3
|
interface AddCurrentMessageOptions {
|
|
3
4
|
readonly cacheFriendly?: boolean;
|
|
4
5
|
}
|
|
5
6
|
interface CurrentMessagesOptions {
|
|
7
|
+
readonly historyState?: HistoryState;
|
|
6
8
|
readonly currentTurnMessages?: readonly ModelMessage[];
|
|
9
|
+
readonly projectedMessages?: readonly ModelMessage[];
|
|
7
10
|
}
|
|
8
|
-
/**
|
|
11
|
+
/** Builds the model view and durable history for one step. */
|
|
9
12
|
export declare function createCurrentMessages(history: readonly ModelMessage[], options?: CurrentMessagesOptions): {
|
|
13
|
+
readonly history: readonly ModelMessage[];
|
|
14
|
+
readonly historyState: HistoryState;
|
|
10
15
|
readonly nonSystemMessages: readonly ModelMessage[];
|
|
11
16
|
readonly systemMessages: readonly SystemModelMessage[];
|
|
12
|
-
add(
|
|
17
|
+
add(message: string, options?: AddCurrentMessageOptions): void;
|
|
18
|
+
addAnnouncements(announcements: HistoryState): void;
|
|
13
19
|
addSystem(messages: SystemModelMessage | readonly SystemModelMessage[]): void;
|
|
14
20
|
};
|
|
15
21
|
/** True when the history ends with a tool message carrying a tool-approval-response. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function createCurrentMessages(e,t={}){let n=[],r=[],
|
|
1
|
+
function createCurrentMessages(e,t={}){let n=[...e],r={...t.historyState},i=[],a=[],o=new Set(t.currentTurnMessages),s;for(let n of t.projectedMessages??e)s===void 0&&o.has(n)&&(s=a.length),n.role===`system`?i.push(n):a.push(n);let c=s??a.length,l=e.findIndex(e=>o.has(e)),u=l===-1?e.length:l,d=s!==void 0||!hasTailApprovalResponse(a);function add(e,{cacheFriendly:t=!0}={}){if(t&&d){let t={role:`user`,content:e};return a.splice(c,0,t),n.splice(u,0,t),c+=1,u+=1,!0}return i.push({role:`system`,content:e}),!1}return{add,addAnnouncements(e){for(let t of[`availableSkills`,`taskState`,`deliveryInstruction`]){let n=e[t];n!==void 0&&n.length!==0&&r[t]!==n&&add(n)&&(r[t]=n)}},addSystem(e){i.push(...Array.isArray(e)?e:[e])},get nonSystemMessages(){return[...a]},get history(){return[...n]},get historyState(){return{...r}},get systemMessages(){return[...i]}}}function hasTailApprovalResponse(e){let t=e.at(-1);return t?.role===`tool`&&t.content.some(e=>e.type===`tool-approval-response`)}export{createCurrentMessages,hasTailApprovalResponse};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{getPendingInputBatches,queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{TOOL_EXECUTION_DENIED_MESSAGE,buildResolvedInputBatch,resolveApprovalOutcome}from"#harness/input-request-resolution.js";import{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches}from"#harness/hitl/pending-input-resolution.js";import{buildQuestionToolResponsePart,findAnsweredQuestionBatches,resolveQuestionBatches}from"#harness/hitl/question-input-requests.js";const APPROVED_TOOLS_KEY=`eve.runtime.hitl.approvedTools`;function hasAnsweredApprovalBatch(e,t){let n=new Set(t.map(e=>e.requestId));return e.some(e=>e.requests.every(e=>!isApprovalRequest(e)||n.has(e.requestId)))}function resolveApprovalInputBatches(e){let t=new Set(e.responses.map(e=>e.requestId)),n=new Set(e.approvalBatches.filter(e=>e.requests.every(e=>!isApprovalRequest(e)||t.has(e.requestId)))),r=new Set(findAnsweredQuestionBatches(e.questionBatches,e.responses)),i=e.batches.filter(e=>n.has(e)||r.has(e)),a=i.findIndex(e=>e.requests.some(e=>isApprovalRequest(e)));a>=0&&(i=i.slice(0,a+1));let o=e.batches.filter(e=>!i.includes(e)),s=responsesForBatches(e.responses,o);if(i.length===0){if(e.resolvedStepInput?.message===void 0)return{outcome:`unresolved`,messages:[...e.baseHistory],session:queueDeferredStepInput(e.session,compactStepInput(e.resolvedStepInput))};let t=s.length===0?e.session:queueDeferredStepInput(e.session,{inputResponses:s});return{consumedMessage:e.resolvedStepInput.messageConsumed,outcome:`continue`,messages:[...e.baseHistory],session:t}}let c=i.find(e=>e.requests.some(e=>isApprovalRequest(e))),l=i.filter(e=>e!==c),u=resolveQuestionBatches({batches:l,messages:[...e.baseHistory],responses:e.responses}),d=c===void 0?{messages:u,session:e.session}:resolveApprovalBatch({batch:c,messages:u,resolveApprovalKey:e.resolveApprovalKey,responses:e.responses,session:e.session});return finishResolvedInput({deferTurnInput:c!==void 0||e.deferTurnInput,leftoverResponses:s,messages:d.messages,rejectedActions:d.rejectedActions,resolvedInputs:i.flatMap(t=>{let n=buildResolvedInputBatch(t,e.responses);return n===void 0?[]:[n]}),resolvedStepInput:e.resolvedStepInput,session:removePendingInputBatches(d.session,i)})}function getApprovedTools(e,t){let n=readRecordedApprovedTools(e);for(let r of getPendingInputBatches(e.state))for(let e of r.requests)isApprovalRequest(e)&&n.delete(t?.(e)??e.action.toolName);return n}function readRecordedApprovedTools(e){let t=e.state?.[APPROVED_TOOLS_KEY];return Array.isArray(t)?new Set(t):new Set}function resolveApprovalBatch(e){let t=recordApprovedTools({pendingBatch:e.batch,resolveApprovalKey:e.resolveApprovalKey,responses:e.responses,session:e.session}),n=buildApprovalBatchToolResponseParts(e.batch,e.responses);appendResolvedBatchTranscript(e.messages,e.batch,n);let r=buildRejectedActionBatch(e.batch,e.responses);return{messages:e.messages,rejectedActions:r===void 0?void 0:[r],session:t}}function recordApprovedTools(e){let t=new Set(e.responses.filter(e=>e.optionId===`approve`).map(e=>e.requestId)),n=e.pendingBatch.requests.filter(e=>isApprovalRequest(e)&&t.has(e.requestId)).map(t=>e.resolveApprovalKey?.(t)??t.action.toolName);if(n.length===0)return e.session;let r={...e.session.state};return r[APPROVED_TOOLS_KEY]=[...new Set([...readRecordedApprovedTools(e.session),...n])],{...e.session,state:r}}function buildRejectedActionBatch(e,t){if(e.event===void 0)return;let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests){if(!isApprovalRequest(t))continue;let{approved:e,reason:i,status:a}=resolveApprovalOutcome(n.get(t.requestId));e||r.push({callId:t.action.callId,isError:!0,kind:`tool-result`,output:{approval:{requestId:t.requestId,status:a},code:`TOOL_EXECUTION_DENIED`,message:i??TOOL_EXECUTION_DENIED_MESSAGE,tool:{result:`not_run`}},toolName:t.action.toolName})}return r.length>0?{event:e.event,results:r}:void 0}function buildApprovalBatchToolResponseParts(e,t){let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests){let e=n.get(t.requestId);switch(t.kind){case`tool-approval`:r.push(...buildApprovalToolResponseParts(t,e));break;case`question`:r.push(buildQuestionToolResponsePart(t,e));break;case`session-limit`:throw TypeError(`Session-limit pending input batches must contain only session-limit requests.`);default:{let e=t.kind;throw TypeError(`Unhandled pending input request kind: ${String(e)}`)}}}return r}function buildApprovalToolResponseParts(e,t){let{approved:n,reason:r}=resolveApprovalOutcome(t),i=[{approvalId:e.requestId,approved:n,reason:r,type:`tool-approval-response`}];return n||i.push({output:{type:`execution-denied`,reason:r},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}),i}export{getApprovedTools,hasAnsweredApprovalBatch,resolveApprovalInputBatches};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readClientContext}from"#internal/client-context.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{
|
|
1
|
+
import{readClientContext}from"#internal/client-context.js";import{resolveTextToResponses}from"#channel/resolve-text.js";import{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{resolveToolCallInputObject}from"#harness/coordination.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{compactStepInput}from"#harness/hitl/pending-input-resolution.js";import{resolveQuestionOnlyInputBatches}from"#harness/hitl/question-input-requests.js";import{hasTailApprovalResponse}from"#harness/current-messages.js";import{getApprovedTools,hasAnsweredApprovalBatch,resolveApprovalInputBatches}from"#harness/hitl/approval-input-requests.js";import{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput}from"#harness/hitl/session-limit-input-requests.js";function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function hasPendingApprovalBatch(e){return getPendingInputBatches(e.state).some(e=>e.requests.some(e=>isApprovalRequest(e)))}function resolvePendingInput(e){let t=[...e.history??e.session.history],n=getPendingInputBatches(e.session.state);if(n.length===0)return{outcome:`continue`,messages:t,session:e.session};let r=routePendingInput(n),i=hasTailApprovalResponse(t),a=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,o=a===void 0?e.stepInput:resolveTextMessageInput(a,e.stepInput),s=canonicalizeInputResponses(o?.inputResponses??[]);if(r.kind===`approval`&&e.deferMessagesWhileApprovalsPending===!0&&o?.message!==void 0&&!hasAnsweredApprovalBatch(r.approvalBatches,s))return{deferredMessage:!0,outcome:`unresolved`,messages:t,session:queueDeferredStepInput(e.session,compactStepInput(o))};if(s.length===0&&o?.message===void 0){let n=compactStepInput(o);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||readClientContext(n)!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let c={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:o,responses:s,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...c,pendingBatch:r.batch});case`approval`:return resolveApprovalInputBatches({...c,approvalBatches:r.approvalBatches,questionBatches:r.questionBatches,resolveApprovalKey:e.resolveApprovalKey});case`question`:return resolveQuestionOnlyInputBatches(c)}}function routePendingInput(e){let t=e.map(e=>({batch:e,domain:classifyPendingInputBatch(e)})),n=t.find(({domain:e})=>e===`session-limit`)?.batch;if(n!==void 0)return{batch:n,kind:`session-limit`};let r=t.filter(({domain:e})=>e===`approval`).map(({batch:e})=>e);if(r.length>0){let t=new Set(r);return{approvalBatches:r,kind:`approval`,questionBatches:e.filter(e=>!t.has(e))}}return{kind:`question`}}function classifyPendingInputBatch(e){for(let t of e.requests)switch(t.kind){case`question`:case`session-limit`:case`tool-approval`:break;default:{let e=t.kind;throw TypeError(`Unhandled pending input request kind: ${String(e)}`)}}return isSessionLimitInputBatch(e)?`session-limit`:e.requests.some(e=>isApprovalRequest(e))?`approval`:`question`}function canonicalizeInputResponses(e){let t=new Map;for(let n of e)t.set(n.requestId,n);return[...t.values()]}function resolveTextMessageInput(e,t){if(typeof t?.message!=`string`)return t;let n=new Set(e.requests.map(e=>e.requestId));if(t.inputResponses?.some(e=>n.has(e.requestId)))return t;let r=new Set(e.responseAuthRequiredRequestIds??[]),i=e.requests.filter(e=>!r.has(e.requestId)),a=resolveTextToResponses(t.message,i);return a.length===0?t:compactStepInput({...t,inputResponses:[...t.inputResponses??[],...a],messageConsumed:!0,message:void 0})}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}export{appendPendingInputBatch,clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasPendingInputBatch,hasStepInput,resolvePendingInput};
|
|
@@ -16,6 +16,7 @@ export interface PendingInputBatchEvent {
|
|
|
16
16
|
*/
|
|
17
17
|
export interface PendingInputBatch {
|
|
18
18
|
readonly event?: PendingInputBatchEvent;
|
|
19
|
+
readonly activityRootTurnId?: string;
|
|
19
20
|
readonly requests: readonly InputRequest[];
|
|
20
21
|
readonly responseAuthRequiredRequestIds?: readonly string[];
|
|
21
22
|
readonly responseMessages: readonly ModelMessage[];
|
|
@@ -50,11 +51,14 @@ export declare function removePendingInputBatches(session: HarnessSession, batch
|
|
|
50
51
|
*/
|
|
51
52
|
export declare function appendPendingInputBatch(input: {
|
|
52
53
|
readonly event?: PendingInputBatchEvent;
|
|
54
|
+
readonly activityRootTurnId?: string;
|
|
53
55
|
readonly requests: readonly InputRequest[];
|
|
54
56
|
readonly responseAuthRequiredRequestIds?: readonly string[];
|
|
55
57
|
readonly responseMessages: readonly ModelMessage[];
|
|
56
58
|
readonly session: HarnessSession;
|
|
57
59
|
}): HarnessSession;
|
|
60
|
+
export declare function activityRootTurnIdForInputResponses(state: SessionStateMap | undefined, requestIds: ReadonlySet<string>): string | undefined;
|
|
61
|
+
export declare function activityRequestIdsForRootTurn(state: SessionStateMap | undefined, rootTurnId: string): readonly string[];
|
|
58
62
|
/**
|
|
59
63
|
* Merges any queued follow-up input into the current step input and clears it
|
|
60
64
|
* from session state. When `preferCurrentInput` is set, fresh input is returned
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(Array.isArray(t.requests)&&Array.isArray(t.responseMessages))return t}function getPendingInputBatches(e){let t=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(t)){let e=t.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let n=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),r=n===void 0?[]:[n];return assertUniqueRequestIds(r),r}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,t){assertUniqueRequestIds(t);let n={...e.state};return delete n[LEGACY_PENDING_INPUT_BATCH_KEY],t.length===0?delete n[PENDING_INPUT_BATCHES_KEY]:n[PENDING_INPUT_BATCHES_KEY]=t.map(e=>({event:e.event,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(n).length>0?n:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:e.requests,responseMessages:e.responseMessages}])}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;if(e.preferCurrentInput===!0&&e.input!==void 0)return{input:e.input,session:e.session};let n=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:n}:{input:coalesceTurnInputs(t,e.input),session:n}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let n=getDeferredStepInput(e),r=n===void 0?t:coalesceTurnInputs(n,t),i={...e.state};return i[DEFERRED_STEP_INPUT_KEY]=r,{...e,state:i}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
|
|
1
|
+
import{contextStorage}from"#context/container.js";import{ActivityRootTurnIdKey}from"#context/keys.js";import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(Array.isArray(t.requests)&&Array.isArray(t.responseMessages))return t}function getPendingInputBatches(e){let t=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(t)){let e=t.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let n=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),r=n===void 0?[]:[n];return assertUniqueRequestIds(r),r}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,t){assertUniqueRequestIds(t);let n={...e.state};return delete n[LEGACY_PENDING_INPUT_BATCH_KEY],t.length===0?delete n[PENDING_INPUT_BATCHES_KEY]:n[PENDING_INPUT_BATCHES_KEY]=t.map(e=>({event:e.event,activityRootTurnId:e.activityRootTurnId,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(n).length>0?n:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,activityRootTurnId:e.activityRootTurnId??contextStorage.getStore()?.get(ActivityRootTurnIdKey),responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,requests:e.requests,responseMessages:e.responseMessages}])}function activityRootTurnIdForInputResponses(e,t){return getPendingInputBatches(e).find(e=>e.requests.some(e=>t.has(e.requestId)))?.activityRootTurnId}function activityRequestIdsForRootTurn(e,t){return getPendingInputBatches(e).flatMap(e=>e.activityRootTurnId===t?e.requests.map(e=>e.requestId):[])}function consumeDeferredStepInput(e){let t=getDeferredStepInput(e.session);if(t===void 0)return e;if(e.preferCurrentInput===!0&&e.input!==void 0)return{input:e.input,session:e.session};let n=clearDeferredStepInput(e.session);return e.input===void 0?{input:t,session:n}:{input:coalesceTurnInputs(t,e.input),session:n}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,t){let n=getDeferredStepInput(e),r=n===void 0?t:coalesceTurnInputs(n,t),i={...e.state};return i[DEFERRED_STEP_INPUT_KEY]=r,{...e,state:i}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{activityRequestIdsForRootTurn,activityRootTurnIdForInputResponses,appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
|