eve 0.32.0 → 0.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/README.md +8 -4
  3. package/dist/src/channel/channel-address.d.ts +4 -1
  4. package/dist/src/channel/channel-address.js +1 -1
  5. package/dist/src/channel/channel-operations.d.ts +3 -1
  6. package/dist/src/channel/compiled-channel.d.ts +2 -1
  7. package/dist/src/channel/cross-channel-receive.d.ts +5 -2
  8. package/dist/src/channel/cross-channel-receive.js +1 -1
  9. package/dist/src/channel/session.d.ts +6 -2
  10. package/dist/src/channel/session.js +1 -1
  11. package/dist/src/channel/types.d.ts +6 -0
  12. package/dist/src/channel/types.js +1 -1
  13. package/dist/src/chunks/{use-eve-agent-CX87G1vU.js → use-eve-agent-3oBnxzhV.js} +27 -17
  14. package/dist/src/chunks/{use-eve-agent-DwyRde1N.js → use-eve-agent-B-Hky2f4.js} +27 -17
  15. package/dist/src/cli/commands/agent-prompt/collect-intent.md +3 -0
  16. package/dist/src/cli/commands/agent-prompt/scaffold.md +4 -2
  17. package/dist/src/cli/commands/info.js +1 -1
  18. package/dist/src/cli/commands/init-repl.d.ts +1 -1
  19. package/dist/src/cli/commands/init-repl.js +1 -1
  20. package/dist/src/cli/commands/init.d.ts +7 -0
  21. package/dist/src/cli/commands/init.js +1 -1
  22. package/dist/src/cli/commands/integration-connect.d.ts +3 -3
  23. package/dist/src/cli/commands/integration-connect.js +1 -1
  24. package/dist/src/cli/commands/integration-setup.js +1 -1
  25. package/dist/src/cli/commands/set.d.ts +20 -0
  26. package/dist/src/cli/commands/set.js +1 -0
  27. package/dist/src/cli/dev/tui/runner.js +1 -1
  28. package/dist/src/cli/dev/tui/setup-issues.js +1 -1
  29. package/dist/src/cli/option-parsers.d.ts +3 -0
  30. package/dist/src/cli/option-parsers.js +1 -1
  31. package/dist/src/cli/run.js +1 -1
  32. package/dist/src/client/agent-info-schema.d.ts +28 -5
  33. package/dist/src/client/agent-info-schema.js +1 -1
  34. package/dist/src/client/session.js +1 -1
  35. package/dist/src/client/types.d.ts +3 -0
  36. package/dist/src/compiler/extension-compatibility.d.ts +19 -9
  37. package/dist/src/compiler/extension-compatibility.js +1 -1
  38. package/dist/src/compiler/manifest.d.ts +119 -19
  39. package/dist/src/compiler/manifest.js +1 -1
  40. package/dist/src/compiler/model-catalog.d.ts +2 -30
  41. package/dist/src/compiler/model-catalog.js +1 -1
  42. package/dist/src/compiler/module-map.d.ts +2 -2
  43. package/dist/src/compiler/module-map.js +2 -2
  44. package/dist/src/compiler/normalize-agent-config.js +1 -1
  45. package/dist/src/compiler/normalize-instructions.js +1 -1
  46. package/dist/src/compiler/normalize-manifest.js +2 -2
  47. package/dist/src/compiler/normalize-skill.js +1 -1
  48. package/dist/src/compiler/normalize-subagent.d.ts +5 -1
  49. package/dist/src/compiler/normalize-subagent.js +1 -1
  50. package/dist/src/compiler/remote-agent-node.d.ts +4 -1
  51. package/dist/src/compiler/workspace-resources.js +1 -1
  52. package/dist/src/context/dynamic-model-lifecycle.d.ts +7 -2
  53. package/dist/src/context/dynamic-model-lifecycle.js +1 -1
  54. package/dist/src/context/dynamic-subagent-lifecycle.js +1 -1
  55. package/dist/src/context/hook-lifecycle.js +1 -1
  56. package/dist/src/context/keys.d.ts +8 -0
  57. package/dist/src/context/keys.js +1 -1
  58. package/dist/src/evals/session.js +1 -1
  59. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +3 -9
  60. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  61. package/dist/src/execution/durable-session-store.d.ts +5 -0
  62. package/dist/src/execution/durable-session-store.js +1 -1
  63. package/dist/src/execution/effective-agent-config.js +1 -1
  64. package/dist/src/execution/node-step.js +1 -1
  65. package/dist/src/execution/parked-delivery-wait.d.ts +8 -0
  66. package/dist/src/execution/parked-delivery-wait.js +1 -1
  67. package/dist/src/execution/route-child-delivery.js +1 -1
  68. package/dist/src/execution/session-command-wire.js +1 -1
  69. package/dist/src/execution/session.d.ts +2 -0
  70. package/dist/src/execution/session.js +2 -2
  71. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  72. package/dist/src/execution/subagent-hitl-proxy.d.ts +1 -0
  73. package/dist/src/execution/subagent-hitl-proxy.js +1 -1
  74. package/dist/src/execution/turn-control-receiver.d.ts +2 -0
  75. package/dist/src/execution/turn-control-receiver.js +1 -1
  76. package/dist/src/execution/turn-workflow.js +1 -1
  77. package/dist/src/execution/workflow-entry.js +1 -1
  78. package/dist/src/execution/workflow-steps.d.ts +4 -1
  79. package/dist/src/execution/workflow-steps.js +1 -1
  80. package/dist/src/harness/emission.d.ts +1 -1
  81. package/dist/src/harness/emission.js +1 -1
  82. package/dist/src/harness/hitl/approval-input-requests.d.ts +13 -0
  83. package/dist/src/harness/hitl/approval-input-requests.js +1 -0
  84. package/dist/src/harness/hitl/pending-input-resolution.d.ts +51 -0
  85. package/dist/src/harness/hitl/pending-input-resolution.js +1 -0
  86. package/dist/src/harness/hitl/question-input-requests.d.ts +15 -0
  87. package/dist/src/harness/hitl/question-input-requests.js +1 -0
  88. package/dist/src/harness/hitl/session-limit-input-requests.d.ts +10 -0
  89. package/dist/src/harness/hitl/session-limit-input-requests.js +1 -0
  90. package/dist/src/harness/input-requests.d.ts +17 -105
  91. package/dist/src/harness/input-requests.js +1 -1
  92. package/dist/src/harness/pending-input-batches.d.ts +77 -0
  93. package/dist/src/harness/pending-input-batches.js +1 -0
  94. package/dist/src/harness/proxy-input-requests.d.ts +13 -3
  95. package/dist/src/harness/proxy-input-requests.js +1 -1
  96. package/dist/src/harness/session-limit-enforcement.js +1 -1
  97. package/dist/src/harness/step-hooks.d.ts +1 -1
  98. package/dist/src/harness/step-hooks.js +1 -1
  99. package/dist/src/harness/tool-loop.d.ts +1 -1
  100. package/dist/src/harness/tool-loop.js +2 -2
  101. package/dist/src/harness/types.d.ts +11 -5
  102. package/dist/src/harness/types.js +1 -1
  103. package/dist/src/internal/application/package.js +1 -1
  104. package/dist/src/internal/authored-definition/core.js +1 -1
  105. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  106. package/dist/src/internal/authored-module-loader.js +1 -1
  107. package/dist/src/internal/authored-module-map-loader.js +1 -1
  108. package/dist/src/internal/model-catalog.d.ts +46 -0
  109. package/dist/src/internal/model-catalog.js +1 -0
  110. package/dist/src/internal/nitro/host/build-vercel-agent-summary.js +1 -1
  111. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  112. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  113. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response-from-manifest.js +1 -1
  114. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.d.ts +20 -10
  115. package/dist/src/internal/nitro/routes/agent-info/build-agent-info-response.js +1 -1
  116. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  117. package/dist/src/internal/nitro/routes/info.js +1 -1
  118. package/dist/src/internal/vercel-agent-summary.d.ts +12 -3
  119. package/dist/src/internal/vercel-agent-summary.js +1 -1
  120. package/dist/src/protocol/message.d.ts +2 -2
  121. package/dist/src/protocol/message.js +1 -1
  122. package/dist/src/public/channels/chat-sdk/chatSdkChannel.d.ts +5 -5
  123. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  124. package/dist/src/public/channels/discord/discordChannel.d.ts +3 -1
  125. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  126. package/dist/src/public/channels/eve.d.ts +3 -1
  127. package/dist/src/public/channels/eve.js +1 -1
  128. package/dist/src/public/channels/github/githubChannel.d.ts +3 -1
  129. package/dist/src/public/channels/github/githubChannel.js +1 -1
  130. package/dist/src/public/channels/index.d.ts +1 -1
  131. package/dist/src/public/channels/linear/linearChannel.d.ts +3 -1
  132. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  133. package/dist/src/public/channels/photon/photonIMessageChannel.d.ts +3 -1
  134. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  135. package/dist/src/public/channels/slack/slackChannel.d.ts +3 -1
  136. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  137. package/dist/src/public/channels/teams/teamsChannel.d.ts +3 -1
  138. package/dist/src/public/channels/teams/teamsChannel.js +1 -1
  139. package/dist/src/public/channels/telegram/telegramChannel.d.ts +3 -1
  140. package/dist/src/public/channels/telegram/telegramChannel.js +1 -1
  141. package/dist/src/public/channels/twilio/twilioChannel.d.ts +3 -1
  142. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  143. package/dist/src/public/definitions/agent.d.ts +5 -7
  144. package/dist/src/public/definitions/agent.js +1 -1
  145. package/dist/src/public/definitions/channel.d.ts +3 -1
  146. package/dist/src/public/definitions/channel.js +1 -1
  147. package/dist/src/public/definitions/tool.d.ts +1 -5
  148. package/dist/src/public/definitions/tool.js +1 -1
  149. package/dist/src/public/index.d.ts +1 -1
  150. package/dist/src/runtime/agent/bootstrap.d.ts +19 -6
  151. package/dist/src/runtime/agent/bootstrap.js +1 -1
  152. package/dist/src/runtime/agent/model-catalog.d.ts +10 -0
  153. package/dist/src/runtime/agent/model-catalog.js +1 -0
  154. package/dist/src/runtime/agent/resolve-model.d.ts +8 -4
  155. package/dist/src/runtime/agent/resolve-model.js +1 -1
  156. package/dist/src/runtime/framework-channels/index.js +1 -1
  157. package/dist/src/runtime/resolve-agent-graph.js +1 -1
  158. package/dist/src/runtime/resolve-agent.d.ts +2 -2
  159. package/dist/src/runtime/resolve-agent.js +1 -1
  160. package/dist/src/runtime/resolve-channel.js +1 -1
  161. package/dist/src/runtime/resolve-dynamic-subagent.d.ts +2 -5
  162. package/dist/src/runtime/subagents/dynamic-agent-config.d.ts +8 -7
  163. package/dist/src/runtime/subagents/dynamic-agent-config.js +1 -1
  164. package/dist/src/runtime/types.d.ts +11 -4
  165. package/dist/src/setup/flows/deploy.d.ts +5 -3
  166. package/dist/src/setup/flows/deploy.js +1 -1
  167. package/dist/src/setup/flows/ensure-vercel-project.d.ts +5 -1
  168. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  169. package/dist/src/setup/flows/model-source-change.d.ts +1 -0
  170. package/dist/src/setup/flows/model-source-change.js +1 -1
  171. package/dist/src/setup/integrations/discord/setup.js +1 -1
  172. package/dist/src/setup/integrations/github/setup.js +1 -1
  173. package/dist/src/setup/integrations/linear/setup.js +1 -1
  174. package/dist/src/setup/integrations/photon/setup-flow.js +1 -1
  175. package/dist/src/setup/integrations/slack/setup.js +1 -1
  176. package/dist/src/setup/scaffold/create/add-to-project.d.ts +2 -0
  177. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  178. package/dist/src/setup/scaffold/create/project.d.ts +3 -1
  179. package/dist/src/setup/scaffold/create/project.js +4 -4
  180. package/dist/src/setup/scaffold/create/web-template.d.ts +9 -0
  181. package/dist/src/setup/scaffold/create/web-template.js +291 -1
  182. package/dist/src/setup/scaffold/index.d.ts +1 -1
  183. package/dist/src/setup/scaffold/update/channels.d.ts +4 -13
  184. package/dist/src/setup/scaffold/update/channels.js +2 -2
  185. package/dist/src/setup/scaffold/update/web-options.d.ts +15 -0
  186. package/dist/src/setup/scaffold/update/web-options.js +1 -0
  187. package/dist/src/setup/vercel-project.js +0 -0
  188. package/dist/src/shared/agent-definition.d.ts +23 -23
  189. package/dist/src/shared/agent-definition.js +1 -1
  190. package/dist/src/shared/channel-definition.d.ts +3 -1
  191. package/dist/src/shared/dynamic-tool-definition.d.ts +4 -10
  192. package/dist/src/shared/dynamic-tool-definition.js +1 -1
  193. package/dist/src/svelte/index.js +1 -1
  194. package/dist/src/svelte/use-eve-agent.js +1 -1
  195. package/dist/src/vue/index.js +1 -1
  196. package/dist/src/vue/use-eve-agent.js +1 -1
  197. package/docs/agent-config.md +30 -19
  198. package/docs/channels/chat-sdk.mdx +5 -5
  199. package/docs/channels/custom.mdx +20 -0
  200. package/docs/channels/discord.mdx +1 -0
  201. package/docs/channels/eve.mdx +2 -0
  202. package/docs/channels/github.mdx +1 -1
  203. package/docs/channels/linear.mdx +1 -1
  204. package/docs/channels/overview.mdx +19 -0
  205. package/docs/channels/photon.mdx +5 -2
  206. package/docs/channels/slack.mdx +5 -11
  207. package/docs/concepts/execution-model-and-durability.mdx +5 -8
  208. package/docs/concepts/sessions-runs-and-streaming.md +6 -6
  209. package/docs/guides/dynamic-capabilities.md +24 -20
  210. package/docs/guides/frontend/overview.mdx +31 -10
  211. package/docs/guides/frontend/use-eve-agent-svelte.mdx +37 -15
  212. package/docs/guides/frontend/use-eve-agent-vue.mdx +38 -15
  213. package/docs/installation.mdx +7 -1
  214. package/docs/reference/cli.md +33 -8
  215. package/docs/tools/human-in-the-loop.md +2 -2
  216. package/package.json +1 -1
@@ -1 +1 @@
1
- import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,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,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.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{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{sendCommandToDelivery}from"#execution/session-command-wire.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey),d=resolveEffectiveAgentRuntime(u,c);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let f=getPendingAuthorization(s.state),p;if(f&&o.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(f,o.input.payloads);if(o={...o,input:{...o.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);c.set(PendingAuthorizationResultKey,n),s={...s,state:clearPendingAuthorization(s.state,n.map(e=>e.attemptId??e.name))},p=e,t.length===0&&(o={...o,input:void 0})}}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let m=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:s,turnAgent:d.turnAgent}),h=buildAdapterContext(l,c),g;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,h):defaultDeliverResult(n);r!=null&&e.push(r)}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),g={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...h.state}}),o.input?.kind===`deliver`&&g===void 0){let e=reconcileSessionContinuationToken(c,m),t=serializeContext(c),n=e===m?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let _=u.hookRegistry,v=u.resolvedAgent.dynamicInstructionsResolvers??[],y=u.resolvedAgent.dynamicSkillResolvers??[],b=u.subagentRegistry.dynamicResolvers??[],x=u.resolvedAgent.config.experimental?.subagentPersistentSessions===!0,S=u.resolvedAgent.dynamicToolResolvers??[],C={...u.graph.root,turnAgent:d.turnAgent},w=buildRuntimeIdentity(C),T=process.env.VERCEL_DEPLOYMENT_ID?.trim(),E=T?`deployment:${T}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);if(!getHarnessEmissionState(m.state).sessionStarted)c.set(SessionDynamicSubagentRuntimeRevisionKey,E),c.set(SessionDynamicToolRuntimeRevisionKey,E);else{let e=createSessionStartedEvent({runtime:w});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:c,resolvers:b,event:e,messages:m.history,persistentSessions:x,runtimeRevision:E}),refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:S,event:e,messages:m.history,runtimeRevision:E})])}let D=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,h);setChannelContext(c,{...l,state:{...h.state}});let r=stampMessageStreamEvent(n);return await D.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:_,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:d.turnAgent.dynamicModel,event:n,fallback:d.turnAgent.model,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicSubagentEvent({ctx:c,resolvers:b,event:n,messages:t??[],persistentSessions:x}),await dispatchDynamicToolEvent({ctx:c,resolvers:S,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:v,event:n,messages:t??[]})},O=c.require(ModeKey),k;try{throwIfTurnAborted(o.abortSignal),k=await runStep(c,m,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:d.turnAgent.outputSchema,input:g,mode:O,session:e});if(p){let e=getHarnessEmissionState(t.state);isHarnessBetweenTurns(t)&&(e=await emitTurnPreamble(handleEvent,{},e,w),t=setHarnessEmissionState(t,e));for(let{authorization:t,result:n}of p)await handleEvent(createAuthorizationCompletedEvent({authorization:t,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:d.thresholdPercent},session:e,turnAgent:d.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,clearOnly:o.input?.kind===`clear`,compactOnly:o.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,mode:O,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:C,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,g)})}catch(e){if(!isTurnCancellation(e))throw e;return D.releaseLock(),{action:`cancelled`,serializedContext:preserveSerializedAgentTraceState(o.serializedContext,serializeContext(c)),sessionState:o.sessionState}}let A=reconcileSessionContinuationToken(c,k.session),j=serializeContext(c);k={...k,session:A};let M=createDurableSessionState({session:k.session}),N=readTurnSleepDurationMs(c),P=N===void 0?{}:{sleepDurationMs:N};if(k.next!==null&&typeof k.next==`object`&&`done`in k.next){await D.close();let e=getTurnUsageState(k.session.state)?.session;return{action:`done`,output:k.next.output,isError:k.next.isError,...P,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&&isWorkflowRuntimeActionInterrupt(e.interrupt))return{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...P,serializedContext:j,sessionState:M};let t=derivePendingState(k.session);if(!t.hasPendingAuthorization&&!t.hasPendingInputBatch&&(t.pendingRuntimeActionKeys?.length??0)===0&&k.settledTurn!==void 0){let{delta:e,session:n}=takeSessionUsageDelta(k.session);return{action:`park`,...t,...P,serializedContext:j,sessionState:createDurableSessionState({session:n}),settled:{output:k.settledTurn.output,isError:k.settledTurn.isError,usage:e}}}return{action:`park`,...t,...P,serializedContext:j,sessionState:M}}return D.releaseLock(),{action:`continue`,...P,serializedContext:j,sessionState:M}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationAttemptIds:n?.challenges.flatMap(e=>e.attemptId===void 0?[]:[e.attemptId]),authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let t of n.forChildren)await resumeHook(t.childContinuationToken,sendCommandToDelivery({auth:e.auth,kind:`send`,payload:t.payload}));return n.parentAction??{kind:`continue`,remainder:n.forSelf}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
1
+ import{callAdapterEventHandler,defaultDeliverResult}from"#channel/adapter.js";import{AuthKey,CapabilitiesKey,ModeKey,SessionDynamicSubagentRuntimeRevisionKey,SessionDynamicToolRuntimeRevisionKey}from"#context/keys.js";import{createAuthorizationCompletedEvent,createSessionStartedEvent,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,startWorkflowPreferLatest,turnWorkflowReference}from"#execution/workflow-runtime.js";import{resolveWorkflowCallbackBaseUrl}from"#execution/workflow-callback-url.js";import{deserializeContext,serializeContext}from"#context/serialize.js";import{createDurableSessionState,readDurableSession,replaceDurableSessionSnapshot}from"#execution/durable-session-store.js";import{dispatchDynamicSubagentEvent,refreshDynamicSessionSubagentsForRuntimeRevision}from"#context/dynamic-subagent-lifecycle.js";import{hydrateDurableSession,refreshSessionFromTurnAgent}from"#execution/session.js";import{resolveEffectiveAgentRuntime}from"#execution/effective-agent-config.js";import{resumeHook}from"#internal/workflow/runtime.js";import{coalesceTurnInputs}from"#harness/messages.js";import{buildAdapterContext}from"#channel/adapter-context.js";import{getPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{preserveSerializedAgentTraceState}from"#tracing/agent-trace-context-store.js";import{getPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getRuntimeActionKeysFromWorkflowInterrupt,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{retireProxyInputRequests}from"#harness/proxy-input-requests.js";import{dispatchDynamicModelEvent}from"#context/dynamic-model-lifecycle.js";import{sendCommandToDelivery}from"#execution/session-command-wire.js";import{setChannelContext}from"#execution/channel-context.js";import{dispatchStreamEventHooks}from"#context/hook-lifecycle.js";import{runStep}from"#context/run-step.js";import{reconcileSessionContinuationToken}from"#execution/reconcile-session-continuation-token.js";import{hasPendingInputBatch}from"#harness/input-requests.js";import{routeDeliverPayload}from"#execution/subagent-hitl-proxy.js";import{CallbackBaseUrlKey,PendingAuthorizationResultKey,clearPendingAuthorization,getPendingAuthorization}from"#harness/authorization.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{createTurnWorkflowInput}from"#execution/durable-session-migrations/turn-workflow.js";import{buildTurnAttributes,readRootSessionId}from"#execution/eve-workflow-attributes.js";import{normalizeEveAttributes}from"#runtime/attributes/normalize.js";import{dispatchDynamicInstructionEvent}from"#context/dynamic-instruction-lifecycle.js";import{dispatchDynamicSkillEvent}from"#context/dynamic-skill-lifecycle.js";import{dispatchDynamicToolEvent,refreshDynamicSessionToolsForRuntimeRevision}from"#context/dynamic-tool-lifecycle.js";import{matchAuthorizationCallbacks}from"#execution/authorization-callback-match.js";import{readTurnSleepDurationMs}from"#harness/turn-sleep.js";import{getTurnUsageState,takeSessionUsageDelta,toUsage}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{buildRuntimeIdentity,createExecutionNodeStep}from"#execution/node-step.js";import{recordSubagentUsageSpans}from"#execution/subagent-usage-span.js";import{resolveRuntimeCompiledArtifactsVersionedCacheKey}from"#runtime/cache-key.js";async function turnStep(a){"use step";let o=a,s=await readDurableSession(o.sessionState),c=await deserializeContext(o.serializedContext),l=c.require(ChannelKey),u=c.require(BundleKey),d=resolveEffectiveAgentRuntime(u,c);try{let{getWorkflowMetadata:e}=await import(`#compiled/@workflow/core/index.js`),t=e();typeof t.url==`string`&&c.set(CallbackBaseUrlKey,resolveWorkflowCallbackBaseUrl(t.url))}catch{}let f=getPendingAuthorization(s.state),p;if(f&&o.input?.kind===`deliver`){let{matches:e,remainingPayloads:t}=matchAuthorizationCallbacks(f,o.input.payloads);if(o={...o,input:{...o.input,payloads:t}},e.length>0){let n=e.map(e=>e.result);c.set(PendingAuthorizationResultKey,n),s={...s,state:clearPendingAuthorization(s.state,n.map(e=>e.attemptId??e.name))},p=e,t.length===0&&(o={...o,input:void 0})}}o.input?.kind===`deliver`&&o.input.auth!==void 0&&c.set(AuthKey,o.input.auth??null);let m=hydrateDurableSession({compactionOverrides:{thresholdPercent:d.thresholdPercent},durable:s,turnAgent:d.turnAgent}),h=buildAdapterContext(l,c),g;if(o.input?.kind===`deliver`){let e=[];for(let n of o.input.payloads){let r=l.deliver?await l.deliver(n,h):defaultDeliverResult(n);r!=null&&e.push(r)}g=e.length===0?void 0:e.reduce(coalesceTurnInputs)}else o.input?.kind===`runtime-action-result`&&(recordSubagentUsageSpans(o.input.results),g={runtimeActionResults:o.input.results});if(o.input?.kind===`deliver`&&setChannelContext(c,{...l,state:{...h.state}}),o.input?.kind===`deliver`&&g===void 0){let e=reconcileSessionContinuationToken(c,m),t=serializeContext(c),n=e===m?o.sessionState:createDurableSessionState({session:e});return{action:`park`,...derivePendingState(e),serializedContext:t,sessionState:n}}let _=u.hookRegistry,v=u.resolvedAgent.dynamicInstructionsResolvers??[],y=u.resolvedAgent.dynamicSkillResolvers??[],b=u.subagentRegistry.dynamicResolvers??[],x=u.resolvedAgent.config?.experimental?.subagentPersistentSessions===!0,S=u.resolvedAgent.dynamicToolResolvers??[],C={...u.graph.root,turnAgent:d.turnAgent},w=buildRuntimeIdentity(C),T=process.env.VERCEL_DEPLOYMENT_ID?.trim(),E=T?`deployment:${T}`:await resolveRuntimeCompiledArtifactsVersionedCacheKey(u.compiledArtifactsSource);if(!getHarnessEmissionState(m.state).sessionStarted)c.set(SessionDynamicSubagentRuntimeRevisionKey,E),c.set(SessionDynamicToolRuntimeRevisionKey,E);else{let e=createSessionStartedEvent({runtime:w});await Promise.all([refreshDynamicSessionSubagentsForRuntimeRevision({ctx:c,resolvers:b,event:e,messages:m.history,persistentSessions:x,runtimeRevision:E}),refreshDynamicSessionToolsForRuntimeRevision({ctx:c,resolvers:S,event:e,messages:m.history,runtimeRevision:E})])}let D=o.parentWritable.getWriter(),emit=async t=>{let n=await callAdapterEventHandler(l,t,h);setChannelContext(c,{...l,state:{...h.state}});let r=stampMessageStreamEvent(n);return await D.write(encodeMessageStreamEvent(r)),r},handleEvent=async(e,t)=>{let n=await emit(e);await dispatchStreamEventHooks({ctx:c,registry:_,event:n}),n.type!==`step.started`&&await dispatchDynamicModelEvent({ctx:c,dynamicModel:d.turnAgent.dynamicModel,event:n,messages:t??[],scope:{moduleMap:u.moduleMap,nodeId:u.nodeId}}),await dispatchDynamicSubagentEvent({ctx:c,resolvers:b,event:n,messages:t??[],persistentSessions:x}),await dispatchDynamicToolEvent({ctx:c,resolvers:S,event:n,messages:t??[]}),await dispatchDynamicSkillEvent({ctx:c,resolvers:y,event:n,messages:t??[]}),await dispatchDynamicInstructionEvent({ctx:c,resolvers:v,event:n,messages:t??[]})},O=c.require(ModeKey),k;try{throwIfTurnAborted(o.abortSignal),k=await runStep(c,m,async e=>{let t=resolveEffectiveOutputSchema({agentOutputSchema:d.turnAgent.outputSchema,input:g,mode:O,session:e});if(p){let e=getHarnessEmissionState(t.state);isHarnessBetweenTurns(t)&&(e=await emitTurnPreamble(handleEvent,{},e,w),t=setHarnessEmissionState(t,e));for(let{authorization:t,result:n}of p)await handleEvent(createAuthorizationCompletedEvent({authorization:t,name:n.name,outcome:`authorized`,sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId}))}let n=c.get(CapabilitiesKey);return(async(e,t)=>{let r=refreshSessionFromTurnAgent({compactionOverrides:{thresholdPercent:d.thresholdPercent},session:e,turnAgent:d.turnAgent});return createExecutionNodeStep({abortSignal:o.abortSignal,capabilities:n,clearOnly:o.input?.kind===`clear`,compactOnly:o.input?.kind===`compact`,createRuntime:createWorkflowRuntime,handleEvent,mode:O,modelResolutionScope:{moduleMap:u.moduleMap,nodeId:u.nodeId},node:C,workflowMaxSubagents:r.workflowMaxSubagents})(r,t)})(t,g)})}catch(e){if(!isTurnCancellation(e))throw e;return D.releaseLock(),{action:`cancelled`,serializedContext:preserveSerializedAgentTraceState(o.serializedContext,serializeContext(c)),sessionState:o.sessionState}}let A=reconcileSessionContinuationToken(c,k.session),j=serializeContext(c);k={...k,session:A};let M=createDurableSessionState({session:k.session}),N=readTurnSleepDurationMs(c),P=N===void 0?{}:{sleepDurationMs:N};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`,output:k.next.output,isError:k.next.isError,...P,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&&isWorkflowRuntimeActionInterrupt(e.interrupt))return{action:`dispatch-workflow-runtime-actions`,pendingRuntimeActionKeys:getRuntimeActionKeysFromWorkflowInterrupt(e.interrupt),...P,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`,...t,...P,serializedContext:j,sessionState:createDurableSessionState({session:n}),settled:{output:k.settledTurn.output,isError:k.settledTurn.isError,usage:e}}}return{action:`park`,...t,...P,serializedContext:j,sessionState:M}}return D.releaseLock(),{action:`continue`,...P,serializedContext:j,sessionState:M}}function derivePendingState(e){let t=getPendingRuntimeActionBatch(e.state),n=getPendingAuthorization(e.state),r={authorizationAttemptIds:n?.challenges.flatMap(e=>e.attemptId===void 0?[]:[e.attemptId]),authorizationNames:n?.challenges.map(e=>e.name),hasPendingAuthorization:n!==void 0,hasPendingInputBatch:hasPendingInputBatch(e.state)};return t===void 0?r:{...r,pendingRuntimeActionKeys:t.actions.map(e=>getRuntimeActionRequestKey(e))}}function resolveEffectiveOutputSchema(e){let{agentOutputSchema:t,input:n,mode:r,session:i}=e;return n?.outputSchema===void 0?r===`task`&&i.outputSchema===void 0&&t!==void 0?{...i,outputSchema:t}:i:{...i,outputSchema:n.outputSchema}}async function routeProxiedDeliverStep(e){"use step";let t=await readDurableSession(e.sessionState),n=routeDeliverPayload({payload:e.payload,state:t.state});for(let r of n.forChildren)await resumeHook(r.childContinuationToken,sendCommandToDelivery({auth:e.auth,kind:`send`,payload:r.payload})),t=retireProxyInputRequests(t,r.retireRequestIds);let r=n.forChildren.length===0?e.sessionState:replaceDurableSessionSnapshot({session:t,state:e.sessionState});return n.parentAction===void 0?{kind:`continue`,remainder:n.forSelf,sessionState:r}:{...n.parentAction,sessionState:r}}async function dispatchTurnStep(e){"use step";return{runId:(await startWorkflowPreferLatest(turnWorkflowReference,[createTurnWorkflowInput(e)],{allowReservedAttributes:!0,attributes:normalizeEveAttributes(buildTurnAttributes({parentSessionId:e.sessionState.sessionId,requestId:e.delivery.kind===`deliver`?e.delivery.requestId:void 0,rootSessionId:readRootSessionId(e.serializedContext)??e.sessionState.sessionId}))})).runId}}export{dispatchTurnStep,resolveEffectiveOutputSchema,routeProxiedDeliverStep,turnStep};
@@ -20,7 +20,7 @@ export declare function emitTurnPreamble(emitFn: HarnessEmitFn, input: StepInput
20
20
  /**
21
21
  * Emits `step.started` for one model call.
22
22
  */
23
- export declare function emitStepStarted(emitFn: HarnessEmitFn, state: HarnessEmissionState, messages?: readonly import("ai").ModelMessage[]): Promise<void>;
23
+ export declare function emitStepStarted(emitFn: HarnessEmitFn, state: HarnessEmissionState, modelId: string, messages?: readonly import("ai").ModelMessage[]): Promise<void>;
24
24
  interface FailedStepPayload {
25
25
  readonly code: string;
26
26
  readonly details?: JsonObject;
@@ -1 +1 @@
1
- import{createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{createRuntimeActionRequestFromToolCall}from"#harness/runtime-actions.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{createInvalidToolCallInputError,isInvalidToolCall,resolveProviderToolCallRequest}from"#harness/tool-call-input-errors.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission-state.js";async function emitTurnPreamble(e,t,n,r){let i=`turn_${n.sequence}`;return n.sessionStarted||await e(createSessionStartedEvent({runtime:r})),await e(createTurnStartedEvent({sequence:n.sequence,turnId:i})),t.message!==void 0&&await e(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:i})),{sessionStarted:!0,sequence:n.sequence,stepIndex:0,turnId:i}}async function emitStepStarted(e,t,n){await e(createStepStartedEvent({sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),n)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t,n){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),n===`conversation`?await e(createSessionWaitingEvent()):await e(createSessionCompletedEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function normalizeAssistantStepFinishReason(e){switch(e){case`content-filter`:case`error`:case`length`:case`stop`:case`tool-calls`:return e;default:return`other`}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(a,o,s,c,l){let u=``,d=``,f=`stop`,p,m=new Set,h=new Set,g=new Set,_=new Set,v=new Set,y=new Set,b=[],x=[],flushCurrentMessage=async()=>{d.length!==0&&(await a(createMessageCompletedEvent({finishReason:`tool-calls`,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),d=``)},emitActionRequest=async e=>{h.has(e.callId)||(d.trim().length>0&&await flushCurrentMessage(),h.add(e.callId),await a(createActionsRequestedEvent({actions:[e],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},collectProviderToolCall=async e=>{if(_.has(e.toolCallId)||(_.add(e.toolCallId),h.has(e.toolCallId)))return;h.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage();let t=resolveProviderToolCallRequest(e);if(t.toolError!==void 0){y.add(e.toolCallId),await emitActionResult(createRuntimeToolResultFromToolError(t.toolError)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(t.toolError));return}c.observe(t.request)},emitActionResult=async e=>{g.has(e.callId)||(g.add(e.callId),await a(createActionResultEvent({result:e,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},emitActionPartial=async t=>{await a(createActionPartialEvent({result:t,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}))},emitToolCall=async e=>{if(isInvalidToolCall(e)){y.add(e.toolCallId);return}if(!(l===void 0||l.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createRuntimeActionRequestFromToolCall({toolCall:e,tools:l.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});y.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let e of s)if(p===void 0)switch(e.type){case`reasoning-delta`:await c.flush(),u+=e.text,await a(createReasoningAppendedEvent({reasoningDelta:e.text,reasoningSoFar:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`text-delta`:await c.flush(),u.trim().length>0&&(await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),u=``),d+=e.text,await a(createMessageAppendedEvent({messageDelta:e.text,messageSoFar:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`tool-call`:{let t=e;m.add(t.toolCallId),t.providerExecuted===!0?await collectProviderToolCall(t):(await c.flush(),await emitToolCall(t));break}case`tool-result`:{let t=e;if(t.preliminary===!0){t.providerExecuted!==!0&&await emitActionPartial(createRuntimeToolResultFromStepResult(t));break}if(t.providerExecuted===!0){await collectProviderToolCall({input:`input`in t?t.input:void 0,toolCallId:t.toolCallId,toolName:t.toolName}),await c.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(t));break}if(m.has(e.toolCallId)){if(isInlineAuthorizationToolResult(t))break;h.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(t)),v.add(e.toolCallId));break}if(await c.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(t)){v.add(e.toolCallId),b.push(t);break}await emitActionResult(createRuntimeToolResultFromStepResult(t)),v.add(e.toolCallId);break}case`tool-error`:{let t=e;t.providerExecuted===!0?(await collectProviderToolCall(t),await c.flush(),await emitActionResult(createRuntimeToolResultFromToolError(t))):h.has(t.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(t)),v.add(t.toolCallId),x.push(createToolResultMessagePartFromToolError(t)));break}case`finish-step`:f=normalizeAssistantStepFinishReason(e.finishReason),await c.flush();break;case`error`:p=normalizeModelStreamError(e.error);break;case`abort`:throw new DOMException(e.reason??`The model stream was aborted.`,`AbortError`);default:break}if(await c.flush(),p!==void 0)throw p;return u.trim().length>0&&await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),f!==`tool-calls`&&hasEmptyDeliverySentinel(d)?await a(createMessageCompletedEvent({finishReason:f,message:null,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})):d.trim().length>0&&await a(createMessageCompletedEvent({finishReason:f,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{emittedActionCallIds:h,handledInlineToolResultCallIds:v,invalidInputToolCallIds:y,inlineAuthorizationResults:b,trailingInlineToolResultParts:x}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,normalizeAssistantStepFinishReason,setHarnessEmissionState};
1
+ import{createActionPartialEvent,createActionResultEvent,createActionsRequestedEvent,createMessageAppendedEvent,createMessageCompletedEvent,createMessageReceivedEvent,createReasoningAppendedEvent,createReasoningCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent}from"#protocol/message.js";import{createRuntimeActionRequestFromToolCall}from"#harness/runtime-actions.js";import{hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError,createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{createInvalidToolCallInputError,isInvalidToolCall,resolveProviderToolCallRequest}from"#harness/tool-call-input-errors.js";import{createProviderStreamActionBatch}from"#harness/stream-actions.js";import{normalizeModelStreamError}from"#harness/model-call-error.js";import{createOrderedStreamEmitter}from"#harness/ordered-stream-emitter.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{isInlineAuthorizationToolResult}from"#harness/inline-tool-authorization.js";import{getHarnessEmissionState,isHarnessBetweenTurns,setHarnessEmissionState}from"#harness/emission-state.js";async function emitTurnPreamble(e,t,n,r){let i=`turn_${n.sequence}`;return n.sessionStarted||await e(createSessionStartedEvent({runtime:r})),await e(createTurnStartedEvent({sequence:n.sequence,turnId:i})),t.message!==void 0&&await e(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:i})),{sessionStarted:!0,sequence:n.sequence,stepIndex:0,turnId:i}}async function emitStepStarted(e,t,n,r){await e(createStepStartedEvent({modelId:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}),r)}async function emitStepAndTurnFailed(e,t,n){await e(createStepFailedEvent({...n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),await e(createTurnFailedEvent({...n,sequence:t.sequence,turnId:t.turnId}))}async function emitFailedStep(e,t,n){await emitStepAndTurnFailed(e,t,n),await e(createSessionFailedEvent(n))}async function emitRecoverableFailedTurn(e,t,n){return await emitStepAndTurnFailed(e,t,n),await e(createSessionWaitingEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function advanceStep(e){return{...e,stepIndex:e.stepIndex+1}}async function emitTurnEpilogue(e,t,n){return await e(createTurnCompletedEvent({sequence:t.sequence,turnId:t.turnId})),n===`conversation`?await e(createSessionWaitingEvent()):await e(createSessionCompletedEvent()),{sessionStarted:t.sessionStarted,sequence:t.sequence+1,stepIndex:0,turnId:``}}function normalizeAssistantStepFinishReason(e){switch(e){case`content-filter`:case`error`:case`length`:case`stop`:case`tool-calls`:return e;default:return`other`}}async function emitStreamContent(e,t,n,r){let i=createOrderedStreamEmitter(e),a=createProviderStreamActionBatch({emitFn:i.emit,state:t});try{return await consumeStreamContent(i.emit,t,interruptStreamOnFailure(n,i.failureSignal),a,r)}finally{try{await a.cancel()}finally{await i.closeAndDrain()}}}async function consumeStreamContent(a,o,s,c,l){let u=``,d=``,f=`stop`,p,m=new Set,h=new Set,g=new Set,_=new Set,v=new Set,y=new Set,b=[],x=[],flushCurrentMessage=async()=>{d.length!==0&&(await a(createMessageCompletedEvent({finishReason:`tool-calls`,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),d=``)},emitActionRequest=async e=>{h.has(e.callId)||(d.trim().length>0&&await flushCurrentMessage(),h.add(e.callId),await a(createActionsRequestedEvent({actions:[e],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},collectProviderToolCall=async e=>{if(_.has(e.toolCallId)||(_.add(e.toolCallId),h.has(e.toolCallId)))return;h.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage();let t=resolveProviderToolCallRequest(e);if(t.toolError!==void 0){y.add(e.toolCallId),await emitActionResult(createRuntimeToolResultFromToolError(t.toolError)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(t.toolError));return}c.observe(t.request)},emitActionResult=async e=>{g.has(e.callId)||(g.add(e.callId),await a(createActionResultEvent({result:e,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})))},emitActionPartial=async t=>{await a(createActionPartialEvent({result:t,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}))},emitToolCall=async e=>{if(isInvalidToolCall(e)){y.add(e.toolCallId);return}if(!(l===void 0||l.excludedActionToolNames.has(e.toolName)))try{await emitActionRequest(createRuntimeActionRequestFromToolCall({toolCall:e,tools:l.tools}))}catch(t){if(t instanceof TypeError){let n=createInvalidToolCallInputError({error:t,toolCall:e});y.add(e.toolCallId),d.trim().length>0&&await flushCurrentMessage(),await emitActionResult(createRuntimeToolResultFromToolError(n)),v.add(e.toolCallId),x.push(createToolResultMessagePartFromToolError(n));return}throw t}};for await(let e of s)if(p===void 0)switch(e.type){case`reasoning-delta`:await c.flush(),u+=e.text,await a(createReasoningAppendedEvent({reasoningDelta:e.text,reasoningSoFar:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`text-delta`:await c.flush(),u.trim().length>0&&(await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),u=``),d+=e.text,await a(createMessageAppendedEvent({messageDelta:e.text,messageSoFar:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));break;case`tool-call`:{let t=e;m.add(t.toolCallId),t.providerExecuted===!0?await collectProviderToolCall(t):(await c.flush(),await emitToolCall(t));break}case`tool-result`:{let t=e;if(t.preliminary===!0){t.providerExecuted!==!0&&await emitActionPartial(createRuntimeToolResultFromStepResult(t));break}if(t.providerExecuted===!0){await collectProviderToolCall({input:`input`in t?t.input:void 0,toolCallId:t.toolCallId,toolName:t.toolName}),await c.flush(),await emitActionResult(createRuntimeToolResultFromStepResult(t));break}if(m.has(e.toolCallId)){if(isInlineAuthorizationToolResult(t))break;h.has(e.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromStepResult(t)),v.add(e.toolCallId));break}if(await c.flush(),await flushCurrentMessage(),isInlineAuthorizationToolResult(t)){v.add(e.toolCallId),b.push(t);break}await emitActionResult(createRuntimeToolResultFromStepResult(t)),v.add(e.toolCallId);break}case`tool-error`:{let t=e;t.providerExecuted===!0?(await collectProviderToolCall(t),await c.flush(),await emitActionResult(createRuntimeToolResultFromToolError(t))):h.has(t.toolCallId)&&(await emitActionResult(createRuntimeToolResultFromToolError(t)),v.add(t.toolCallId),x.push(createToolResultMessagePartFromToolError(t)));break}case`finish-step`:f=normalizeAssistantStepFinishReason(e.finishReason),await c.flush();break;case`error`:p=normalizeModelStreamError(e.error);break;case`abort`:throw new DOMException(e.reason??`The model stream was aborted.`,`AbortError`);default:break}if(await c.flush(),p!==void 0)throw p;return u.trim().length>0&&await a(createReasoningCompletedEvent({reasoning:u,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),f!==`tool-calls`&&hasEmptyDeliverySentinel(d)?await a(createMessageCompletedEvent({finishReason:f,message:null,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})):d.trim().length>0&&await a(createMessageCompletedEvent({finishReason:f,message:d,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{emittedActionCallIds:h,handledInlineToolResultCallIds:v,invalidInputToolCallIds:y,inlineAuthorizationResults:b,trailingInlineToolResultParts:x}}export{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,isHarnessBetweenTurns,normalizeAssistantStepFinishReason,setHarnessEmissionState};
@@ -0,0 +1,13 @@
1
+ import type { InputRequest, InputResponse } from "#runtime/input/types.js";
2
+ import type { PendingInputBatch } from "#harness/pending-input-batches.js";
3
+ import type { InputDomainResolverInput, ResolvedInputActionBatch, ResolvePendingInputResult } from "#harness/hitl/pending-input-resolution.js";
4
+ import type { HarnessSession } from "#harness/types.js";
5
+ export type RejectedActionBatch = ResolvedInputActionBatch;
6
+ export declare function hasAnsweredApprovalBatch(batches: readonly PendingInputBatch[], responses: readonly InputResponse[]): boolean;
7
+ export declare function resolveApprovalInputBatches(input: InputDomainResolverInput & {
8
+ readonly approvalBatches: readonly PendingInputBatch[];
9
+ readonly questionBatches: readonly PendingInputBatch[];
10
+ readonly resolveApprovalKey?: (request: InputRequest) => string | undefined;
11
+ }): ResolvePendingInputResult;
12
+ /** Returns tool approval keys recorded during this session. */
13
+ export declare function getApprovedTools(session: HarnessSession): ReadonlySet<string>;
@@ -0,0 +1 @@
1
+ import{isApprovalRequest}from"#harness/input-request-class.js";import{queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.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`,TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function hasAnsweredApprovalBatch(t,n){let r=new Set(n.map(e=>e.requestId));return t.some(t=>t.requests.every(t=>!isApprovalRequest(t)||r.has(t.requestId)))}function resolveApprovalInputBatches(r){let s=new Set(r.responses.map(e=>e.requestId)),c=new Set(r.approvalBatches.filter(t=>t.requests.every(t=>!isApprovalRequest(t)||s.has(t.requestId)))),l=new Set(findAnsweredQuestionBatches(r.questionBatches,r.responses)),u=r.batches.filter(e=>c.has(e)||l.has(e)),d=u.findIndex(t=>t.requests.some(t=>isApprovalRequest(t)));d>=0&&(u=u.slice(0,d+1));let f=r.batches.filter(e=>!u.includes(e)),p=responsesForBatches(r.responses,f);if(u.length===0){if(r.resolvedStepInput?.message===void 0)return{outcome:`unresolved`,messages:[...r.baseHistory],session:queueDeferredStepInput(r.session,compactStepInput(r.resolvedStepInput))};let e=p.length===0?r.session:queueDeferredStepInput(r.session,{inputResponses:p});return{consumedMessage:r.resolvedStepInput.messageConsumed,outcome:`continue`,messages:[...r.baseHistory],session:e}}let m=u.find(t=>t.requests.some(t=>isApprovalRequest(t))),h=resolveQuestionBatches({batches:u.filter(e=>e!==m),messages:[...r.baseHistory],responses:r.responses}),g=m===void 0?{messages:h,session:r.session}:resolveApprovalBatch({batch:m,messages:h,resolveApprovalKey:r.resolveApprovalKey,responses:r.responses,session:r.session});return finishResolvedInput({deferTurnInput:m!==void 0||r.deferTurnInput,leftoverResponses:p,messages:g.messages,rejectedActions:g.rejectedActions,resolvedStepInput:r.resolvedStepInput,session:removePendingInputBatches(g.session,u)})}function getApprovedTools(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 i=buildRejectedActionBatch(e.batch,e.responses);return{messages:e.messages,rejectedActions:i===void 0?void 0:[i],session:t}}function recordApprovedTools(t){let n=new Set(t.responses.filter(e=>e.optionId===`approve`).map(e=>e.requestId)),r=t.pendingBatch.requests.filter(t=>isApprovalRequest(t)&&n.has(t.requestId)).map(e=>t.resolveApprovalKey?.(e)??e.action.toolName);if(r.length===0)return t.session;let i={...t.session.state};return i[APPROVED_TOOLS_KEY]=[...new Set([...getApprovedTools(t.session),...r])],{...t.session,state:i}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`cancel`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}function buildRejectedActionBatch(t,n){if(t.event===void 0)return;let r=new Map(n.map(e=>[e.requestId,e])),i=[];for(let n of t.requests){if(!isApprovalRequest(n))continue;let{approved:t,reason:a,status:o}=resolveApprovalOutcome(r.get(n.requestId));t||i.push({callId:n.action.callId,isError:!0,kind:`tool-result`,output:{approval:{requestId:n.requestId,status:o},code:`TOOL_EXECUTION_DENIED`,message:a??TOOL_EXECUTION_DENIED_MESSAGE,tool:{result:`not_run`}},toolName:n.action.toolName})}return i.length>0?{event:t.event,results:i}: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};
@@ -0,0 +1,51 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { RuntimeToolResultActionResult } from "#runtime/actions/types.js";
3
+ import type { InputResponse } from "#runtime/input/types.js";
4
+ import type { PendingInputBatch, PendingInputBatchEvent } from "#harness/pending-input-batches.js";
5
+ import type { HarnessSession, StepInput } from "#harness/types.js";
6
+ export type ToolResponsePart = Extract<ModelMessage, {
7
+ role: "tool";
8
+ }>["content"][number];
9
+ /** Action results from one resolved batch, attributed to their originating turn. */
10
+ export interface ResolvedInputActionBatch {
11
+ readonly event: PendingInputBatchEvent;
12
+ readonly results: readonly RuntimeToolResultActionResult[];
13
+ }
14
+ export type ResolvedStepInput = StepInput & {
15
+ readonly messageConsumed?: boolean;
16
+ };
17
+ export type InputDomainResolverInput = {
18
+ readonly baseHistory: ModelMessage[];
19
+ readonly batches: readonly PendingInputBatch[];
20
+ readonly deferTurnInput: boolean;
21
+ readonly resolvedStepInput: ResolvedStepInput | undefined;
22
+ readonly responses: readonly InputResponse[];
23
+ readonly session: HarnessSession;
24
+ };
25
+ export type ResolvePendingInputResult = {
26
+ readonly consumedMessage?: boolean;
27
+ readonly deferredContext?: boolean;
28
+ readonly deferredMessage?: boolean;
29
+ /** Present when a session-limit continuation prompt was resolved. */
30
+ readonly limitContinuation?: {
31
+ readonly granted: boolean;
32
+ };
33
+ readonly outcome: "resolved" | "continue" | "unresolved";
34
+ readonly messages: ModelMessage[];
35
+ readonly rejectedActions?: readonly ResolvedInputActionBatch[];
36
+ readonly session: HarnessSession;
37
+ };
38
+ export declare function responsesForBatches(responses: readonly InputResponse[], batches: readonly PendingInputBatch[]): readonly InputResponse[];
39
+ export declare function appendResolvedBatchTranscript(messages: ModelMessage[], batch: PendingInputBatch, toolParts: readonly ToolResponsePart[]): void;
40
+ export declare function finishResolvedInput(input: {
41
+ readonly deferTurnInput: boolean;
42
+ readonly leftoverResponses: readonly InputResponse[];
43
+ readonly limitContinuation?: {
44
+ readonly granted: boolean;
45
+ };
46
+ readonly messages: ModelMessage[];
47
+ readonly rejectedActions?: readonly ResolvedInputActionBatch[];
48
+ readonly resolvedStepInput: ResolvedStepInput | undefined;
49
+ readonly session: HarnessSession;
50
+ }): ResolvePendingInputResult;
51
+ export declare function compactStepInput(input: ResolvedStepInput | undefined): ResolvedStepInput;
@@ -0,0 +1 @@
1
+ import{queueDeferredStepInput}from"#harness/pending-input-batches.js";function responsesForBatches(e,t){return e.filter(e=>t.some(t=>t.requests.some(t=>t.requestId===e.requestId)))}function appendResolvedBatchTranscript(e,t,n){e.push(...t.responseMessages),n.length>0&&e.push({content:[...n],role:`tool`})}function finishResolvedInput(t){let n={};return t.leftoverResponses.length>0&&(n.inputResponses=t.leftoverResponses),t.deferTurnInput&&((t.resolvedStepInput?.context?.length??0)>0&&(n.context=t.resolvedStepInput?.context),t.resolvedStepInput?.message!==void 0&&(n.message=t.resolvedStepInput.message)),Object.keys(n).length>0?{consumedMessage:t.resolvedStepInput?.messageConsumed,deferredContext:n.context!==void 0||void 0,deferredMessage:n.message!==void 0||void 0,limitContinuation:t.limitContinuation,outcome:`resolved`,messages:t.messages,rejectedActions:t.rejectedActions,session:queueDeferredStepInput(t.session,n)}:{consumedMessage:t.resolvedStepInput?.messageConsumed,limitContinuation:t.limitContinuation,outcome:`resolved`,messages:t.messages,rejectedActions:t.rejectedActions,session:t.session}}function compactStepInput(e){if(e===void 0)return{};let t={};return(e.context?.length??0)>0&&(t.context=e.context),(e.inputResponses?.length??0)>0&&(t.inputResponses=e.inputResponses),e.message!==void 0&&(t.message=e.message),e.messageConsumed===!0&&(t.messageConsumed=!0),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),t}export{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches};
@@ -0,0 +1,15 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { InputRequest, InputResponse } from "#runtime/input/types.js";
3
+ import type { PendingInputBatch } from "#harness/pending-input-batches.js";
4
+ import type { InputDomainResolverInput, ResolvePendingInputResult, ToolResponsePart } from "#harness/hitl/pending-input-resolution.js";
5
+ export type QuestionInputRequest = InputRequest & {
6
+ readonly kind: "question";
7
+ };
8
+ export declare function resolveQuestionOnlyInputBatches(input: InputDomainResolverInput): ResolvePendingInputResult;
9
+ export declare function findAnsweredQuestionBatches(batches: readonly PendingInputBatch[], responses: readonly InputResponse[]): PendingInputBatch[];
10
+ export declare function resolveQuestionBatches(input: {
11
+ readonly batches: readonly PendingInputBatch[];
12
+ readonly messages: ModelMessage[];
13
+ readonly responses: readonly InputResponse[];
14
+ }): ModelMessage[];
15
+ export declare function buildQuestionToolResponsePart(request: QuestionInputRequest, response: InputResponse | undefined): ToolResponsePart;
@@ -0,0 +1 @@
1
+ import{queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches}from"#harness/hitl/pending-input-resolution.js";function resolveQuestionOnlyInputBatches(n){let o=findAnsweredQuestionBatches(n.batches,n.responses),s=n.batches.filter(e=>!o.includes(e)),c=responsesForBatches(n.responses,s);if(o.length===0){if(n.resolvedStepInput?.message===void 0)return{outcome:`unresolved`,messages:[...n.baseHistory],session:queueDeferredStepInput(n.session,compactStepInput(n.resolvedStepInput))};let i=n.batches.length===1?n.batches[0]:void 0;if(i===void 0){let t=c.length===0?n.session:queueDeferredStepInput(n.session,{inputResponses:c});return{consumedMessage:n.resolvedStepInput.messageConsumed,outcome:`continue`,messages:[...n.baseHistory],session:t}}let a=resolveQuestionBatches({batches:[i],messages:[...n.baseHistory],responses:[]});return{consumedMessage:n.resolvedStepInput.messageConsumed,outcome:`resolved`,messages:a,session:removePendingInputBatches(n.session,[i])}}let l=resolveQuestionBatches({batches:o,messages:[...n.baseHistory],responses:n.responses});return finishResolvedInput({deferTurnInput:n.deferTurnInput,leftoverResponses:c,messages:l,resolvedStepInput:n.resolvedStepInput,session:removePendingInputBatches(n.session,o)})}function findAnsweredQuestionBatches(e,t){let n=new Set(t.map(e=>e.requestId));return e.filter(e=>e.requests.some(e=>n.has(e.requestId)))}function resolveQuestionBatches(e){let t=new Map(e.responses.map(e=>[e.requestId,e]));for(let r of e.batches){let i=r.requests.map(e=>buildQuestionToolResponsePart(e,t.get(e.requestId)));appendResolvedBatchTranscript(e.messages,r,i)}return e.messages}function buildQuestionToolResponsePart(e,t){return{output:{type:`json`,value:t===void 0?{status:`ignored`}:{optionId:t.optionId,text:t.text,status:`answered`}},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}}export{buildQuestionToolResponsePart,findAnsweredQuestionBatches,resolveQuestionBatches,resolveQuestionOnlyInputBatches};
@@ -0,0 +1,10 @@
1
+ import type { PendingInputBatch } from "#harness/pending-input-batches.js";
2
+ import type { InputDomainResolverInput, ResolvePendingInputResult } from "#harness/hitl/pending-input-resolution.js";
3
+ import type { HarnessSession } from "#harness/types.js";
4
+ /** Returns whether this is a valid session-limit batch and rejects mixed ownership. */
5
+ export declare function isSessionLimitInputBatch(batch: PendingInputBatch): boolean;
6
+ export declare function resolveSessionLimitInput(input: InputDomainResolverInput & {
7
+ readonly pendingBatch: PendingInputBatch;
8
+ }): ResolvePendingInputResult;
9
+ /** Drops only harness-authored session-limit prompts from a parked session. */
10
+ export declare function clearPendingSessionLimitPrompt(session: HarnessSession): HarnessSession;
@@ -0,0 +1 @@
1
+ import{isSessionLimitContinuationRequest,resolveSessionLimitContinuation}from"#harness/session-limit-continuation.js";import{getPendingInputBatches,queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches}from"#harness/hitl/pending-input-resolution.js";function isSessionLimitInputBatch(e){let t=e.requests.some(e=>e.kind===`session-limit`);if(t&&e.requests.some(e=>e.kind!==`session-limit`))throw TypeError(`Session-limit pending input batches must contain only session-limit requests.`);return t}function resolveSessionLimitInput(n){let i=new Set(n.responses.map(e=>e.requestId));if(!(n.pendingBatch.requests.some(e=>i.has(e.requestId))&&n.pendingBatch.requests.every(e=>i.has(e.requestId))))return{deferredMessage:!0,outcome:`unresolved`,messages:[...n.baseHistory],session:queueDeferredStepInput(n.session,compactStepInput(n.resolvedStepInput))};let a=n.batches.filter(e=>e!==n.pendingBatch),o=responsesForBatches(n.responses,a),s=a.some(t=>t.requests.some(t=>isSessionLimitContinuationRequest(t))),c=[...n.baseHistory];appendResolvedBatchTranscript(c,n.pendingBatch,[]);let l=removePendingInputBatches(n.session,[n.pendingBatch]),u=resolveSessionLimitContinuation({requests:n.pendingBatch.requests,responses:n.responses});return finishResolvedInput({deferTurnInput:n.deferTurnInput||s,leftoverResponses:o,limitContinuation:u,messages:c,resolvedStepInput:n.resolvedStepInput,session:l})}function clearPendingSessionLimitPrompt(t){let r=getPendingInputBatches(t.state).filter(t=>t.requests.length>0&&t.requests.every(t=>isSessionLimitContinuationRequest(t)));return r.length===0?t:removePendingInputBatches(t,r)}export{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput};
@@ -1,120 +1,33 @@
1
1
  import type { ModelMessage } from "ai";
2
- import type { RuntimeToolCallActionRequest, RuntimeToolResultActionResult } from "#runtime/actions/types.js";
2
+ import type { RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
3
3
  import type { InputRequest } from "#runtime/input/types.js";
4
- import type { HarnessSession, SessionStateMap, StepInput } from "#harness/types.js";
5
- /**
6
- * Stream-emit coordinates carried so a parked batch's resolution can attribute
7
- * its events to the turn and step that requested the input.
8
- */
9
- interface PendingInputBatchEvent {
10
- readonly sequence: number;
11
- readonly stepIndex: number;
12
- readonly turnId: string;
13
- }
14
- /**
15
- * Denied tool-call approvals from one resolved batch, ready for the caller to
16
- * emit as `rejected` `action.result` events against the originating turn.
17
- */
18
- export interface RejectedActionBatch {
19
- readonly event: PendingInputBatchEvent;
20
- readonly results: readonly RuntimeToolResultActionResult[];
21
- }
22
- /**
23
- * Returns true when the step input carries user-facing turn input.
24
- */
4
+ import { getApprovedTools } from "#harness/hitl/approval-input-requests.js";
5
+ import type { RejectedActionBatch } from "#harness/hitl/approval-input-requests.js";
6
+ import type { ResolvePendingInputResult } from "#harness/hitl/pending-input-resolution.js";
7
+ import { clearPendingSessionLimitPrompt } from "#harness/hitl/session-limit-input-requests.js";
8
+ import type { HarnessSession, StepInput } from "#harness/types.js";
9
+ export { getApprovedTools, clearPendingSessionLimitPrompt };
10
+ export type { RejectedActionBatch };
11
+ export { appendPendingInputBatch, consumeDeferredStepInput, getPendingInputRequestIds, hasDeferredStepInput, hasPendingInputBatch, } from "#harness/pending-input-batches.js";
12
+ /** Returns true when the step input carries user-facing turn input. */
25
13
  export declare function hasStepInput(input?: StepInput): boolean;
26
- /**
27
- * Merges any queued follow-up input into the current step input and clears it
28
- * from session state.
29
- *
30
- * Used when the harness has to process a pending tool-approval response first
31
- * and defer the user's new message to the next internal model step.
32
- */
33
- export declare function consumeDeferredStepInput(input: {
34
- readonly input?: StepInput;
35
- readonly session: HarnessSession;
36
- }): {
37
- readonly input?: StepInput;
38
- readonly session: HarnessSession;
39
- };
40
- /**
41
- * Returns true when the session carries queued follow-up input for the next
42
- * internal harness step.
43
- */
44
- export declare function hasDeferredStepInput(session: HarnessSession): boolean;
14
+ /** Returns true when any pending batch still contains a tool approval. */
15
+ export declare function hasPendingApprovalBatch(session: HarnessSession): boolean;
45
16
  /**
46
17
  * Resolves pending input at the start of a harness step.
47
18
  *
48
- * Each pending request is either `"required"` or `"dismissable"` — see
49
- * {@link classifyInputRequest}. While a required request is unanswered,
50
- * follow-up input is deferred instead of dismissing and recreating the
51
- * request; {@link consumeDeferredStepInput} replays it on the subsequent
52
- * step. Tool approval responses additionally resolve in isolation because
53
- * AI SDK cannot process an approval response and a new user message in the
54
- * same request.
19
+ * Ordered batches remain independently answerable. Session-limit prompts own
20
+ * resolution while open; approval batches preserve AI SDK's tail-message
21
+ * requirement; question-only batches retain dismiss-and-continue behavior.
55
22
  */
56
23
  export declare function resolvePendingInput(input: {
24
+ readonly deferMessagesWhileApprovalsPending?: boolean;
57
25
  readonly history?: readonly ModelMessage[];
58
26
  readonly resolveApprovalKey?: (request: InputRequest) => string | undefined;
59
27
  readonly session: HarnessSession;
60
28
  readonly stepInput?: StepInput;
61
29
  }): ResolvePendingInputResult;
62
- /**
63
- * Drops a pending session-limit continuation prompt from a parked session.
64
- *
65
- * A cancelled turn settles with the step's input snapshot, which can
66
- * resurrect a continuation prompt the user already answered — the decline
67
- * that cancelled the turn consumed the answer inside the discarded turn
68
- * state. Left in place, the stale prompt would queue every follow-up
69
- * message behind an answer that will never come. Harness-authored prompts
70
- * are deterministically re-raised by the pre-model gate, so dropping is
71
- * always safe; model-anchored batches (tool approvals, questions) are kept
72
- * because their tool calls still require resolution.
73
- */
74
- export declare function clearPendingSessionLimitPrompt(session: HarnessSession): HarnessSession;
75
- type ResolvePendingInputResult = {
76
- readonly consumedMessage?: boolean;
77
- readonly deferredContext?: boolean;
78
- readonly deferredMessage?: boolean;
79
- /**
80
- * Present when the resolved batch answered a session-limit continuation
81
- * prompt. The tool loop grants a fresh token budget window or terminates
82
- * the session based on `granted`.
83
- */
84
- readonly limitContinuation?: {
85
- readonly granted: boolean;
86
- };
87
- readonly outcome: "resolved" | "continue" | "unresolved";
88
- readonly messages: ModelMessage[];
89
- readonly rejectedActions?: RejectedActionBatch;
90
- readonly session: HarnessSession;
91
- };
92
- /**
93
- * Returns true when the session is parked on a pending HITL batch
94
- * (tool approvals or `ask_question` prompts).
95
- */
96
- export declare function hasPendingInputBatch(state: SessionStateMap | undefined): boolean;
97
- /**
98
- * Returns the request IDs in the currently pending HITL batch.
99
- */
100
- export declare function getPendingInputRequestIds(state: SessionStateMap | undefined): ReadonlySet<string>;
101
- /**
102
- * Stores one pending HITL batch on the session until the user responds.
103
- */
104
- export declare function setPendingInputBatch(input: {
105
- readonly event?: PendingInputBatchEvent;
106
- readonly requests: readonly InputRequest[];
107
- readonly responseMessages: readonly ModelMessage[];
108
- readonly session: HarnessSession;
109
- }): HarnessSession;
110
- /**
111
- * Returns the set of tool names that have been approved at least once
112
- * during this session.
113
- */
114
- export declare function getApprovedTools(session: HarnessSession): ReadonlySet<string>;
115
- /**
116
- * Creates a runtime tool-call action shape from an AI SDK tool call.
117
- */
30
+ /** Creates a runtime tool-call action shape from an AI SDK tool call. */
118
31
  export declare function createRuntimeToolCallActionFromToolCall(input: {
119
32
  readonly toolCall: {
120
33
  readonly input: unknown;
@@ -122,4 +35,3 @@ export declare function createRuntimeToolCallActionFromToolCall(input: {
122
35
  readonly toolName: string;
123
36
  };
124
37
  }): RuntimeToolCallActionRequest;
125
- export {};
@@ -1 +1 @@
1
- import{resolveTextToResponses}from"#channel/resolve-text.js";import{coalesceTurnInputs}from"#harness/messages.js";import{resolveToolCallInputObject}from"#harness/runtime-actions.js";import{isSessionLimitContinuationRequest,resolveSessionLimitContinuation}from"#harness/session-limit-continuation.js";import{classifyInputRequest,isApprovalRequest}from"#harness/input-request-class.js";const PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,APPROVED_TOOLS_KEY=`eve.runtime.hitl.approvedTools`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`,TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function consumeDeferredStepInput(e){let n=getDeferredStepInput(e.session);if(n===void 0)return e;let r=clearDeferredStepInput(e.session);return e.input===void 0?{input:n,session:r}:{input:coalesceTurnInputs(n,e.input),session:r}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function resolvePendingInput(e){let{stepInput:t}=e,n=e.session,r=[...e.history??n.history],a=getPendingInputBatch(n.state);if(a===void 0)return{outcome:`continue`,messages:r,session:n};let o=resolveTextMessageInput(a,t),s=o?.inputResponses??[],c=a.requests.some(e=>isApprovalRequest(e));if(s.length===0&&o?.message===void 0)return{outcome:`unresolved`,messages:r,session:n};if(hasUnansweredRequiredRequest({pendingBatch:a,responses:s}))return n=queueDeferredStepInput(n,compactStepInput(o)),{deferredMessage:!0,outcome:`unresolved`,messages:r,session:n};if(s.length===0&&o?.message!==void 0){let e=buildToolResponseParts(a,[]),t=[...r,...a.responseMessages];e.length>0&&t.push({content:e,role:`tool`});let i=buildRejectedActionBatch(a,[]);return n=clearPendingInputBatch(n),{consumedMessage:o?.messageConsumed,outcome:`resolved`,messages:t,rejectedActions:i,session:n}}let l=resolveSessionLimitContinuation({requests:a.requests,responses:s});n=recordApprovedTools({pendingBatch:a,resolveApprovalKey:e.resolveApprovalKey,responses:s,session:n});let u=buildToolResponseParts(a,s),d=[...r,...a.responseMessages];u.length>0&&d.push({content:u,role:`tool`});let f=buildRejectedActionBatch(a,s);if(n=clearPendingInputBatch(n),c){let e={};if((o?.context?.length??0)>0&&(e.context=o?.context),o?.message!==void 0&&(e.message=o.message),e.context!==void 0||e.message!==void 0)return n=queueDeferredStepInput(n,e),{consumedMessage:o?.messageConsumed,deferredContext:e.context!==void 0||void 0,deferredMessage:e.message!==void 0||void 0,limitContinuation:l,outcome:`resolved`,messages:d,rejectedActions:f,session:n}}return{consumedMessage:o?.messageConsumed,limitContinuation:l,outcome:`resolved`,messages:d,rejectedActions:f,session:n}}function resolveTextMessageInput(t,n){if(typeof n?.message!=`string`||(n.inputResponses?.length??0)>0)return n;let r=resolveTextToResponses(n.message,t.requests);return r.length===0?n:compactStepInput({...n,inputResponses:r,messageConsumed:!0,message:void 0})}function compactStepInput(e){if(e===void 0)return{};let t={};return(e.context?.length??0)>0&&(t.context=e.context),(e.inputResponses?.length??0)>0&&(t.inputResponses=e.inputResponses),e.message!==void 0&&(t.message=e.message),e.messageConsumed===!0&&(t.messageConsumed=!0),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),t}function clearPendingSessionLimitPrompt(e){let t=getPendingInputBatch(e.state);return t===void 0||t.requests.length===0||!t.requests.every(e=>isSessionLimitContinuationRequest(e))?e:clearPendingInputBatch(e)}function hasUnansweredRequiredRequest(e){let t=new Set(e.responses.map(e=>e.requestId));return e.pendingBatch.requests.some(e=>classifyInputRequest(e)===`required`&&!t.has(e.requestId))}function hasPendingInputBatch(e){return getPendingInputBatch(e)!==void 0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatch(e)?.requests.map(e=>e.requestId))}function getPendingInputBatch(e){let t=e?.[PENDING_INPUT_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.requests)||!Array.isArray(n.responseMessages)))return n}function setPendingInputBatch(e){let t={...e.session.state};return t[PENDING_INPUT_BATCH_KEY]={event:e.event,requests:[...e.requests],responseMessages:[...e.responseMessages]},{...e.session,state:t}}function clearPendingInputBatch(e){if(e.state?.[PENDING_INPUT_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_INPUT_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(e,n){let r=getDeferredStepInput(e),i=r===void 0?n:coalesceTurnInputs(r,n),a={...e.state};return a[DEFERRED_STEP_INPUT_KEY]=i,{...e,state:a}}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}}function getApprovedTools(e){let t=e.state?.[APPROVED_TOOLS_KEY];return Array.isArray(t)?new Set(t):new Set}function recordApprovedTools(e){let t=new Set(e.responses.filter(e=>e.optionId===`approve`).map(e=>e.requestId)),n=e.pendingBatch.requests.filter(e=>t.has(e.requestId)).map(t=>e.resolveApprovalKey?.(t)??t.action.toolName);if(n.length===0)return e.session;let r=getApprovedTools(e.session),i=[...new Set([...r,...n])],a={...e.session.state};return a[APPROVED_TOOLS_KEY]=i,{...e.session,state:a}}function resolveApprovalOutcome(e){return e===void 0?{approved:!1,reason:`Ignored because the user continued without responding.`,status:`ignored`}:e.optionId===`approve`?{approved:!0,reason:void 0,status:`approved`}:e.optionId===`cancel`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}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 buildToolResponseParts(e,t){let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests)r.push(...buildToolResponsePartsForRequest(t,n.get(t.requestId)));return r}function buildToolResponsePartsForRequest(e,t){if(isSessionLimitContinuationRequest(e))return[];if(isApprovalRequest(e)){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}return[{output:{type:`json`,value:t===void 0?{status:`ignored`}:{optionId:t.optionId,text:t.text,status:`answered`}},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}]}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{clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,hasStepInput,resolvePendingInput,setPendingInputBatch};
1
+ import{resolveTextToResponses}from"#channel/resolve-text.js";import{resolveToolCallInputObject}from"#harness/runtime-actions.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{compactStepInput}from"#harness/hitl/pending-input-resolution.js";import{resolveQuestionOnlyInputBatches}from"#harness/hitl/question-input-requests.js";import{getApprovedTools,hasAnsweredApprovalBatch,resolveApprovalInputBatches}from"#harness/hitl/approval-input-requests.js";import{clearPendingSessionLimitPrompt,isSessionLimitInputBatch,resolveSessionLimitInput}from"#harness/hitl/session-limit-input-requests.js";function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}function hasPendingApprovalBatch(e){return getPendingInputBatches(e.state).some(e=>e.requests.some(e=>isApprovalRequest(e)))}function resolvePendingInput(e){let t=[...e.history??e.session.history],n=getPendingInputBatches(e.session.state);if(n.length===0)return{outcome:`continue`,messages:t,session:e.session};let r=routePendingInput(n),i=hasTailApprovalResponse(t),a=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,o=a===void 0?e.stepInput:resolveTextMessageInput(a,e.stepInput),s=canonicalizeInputResponses(o?.inputResponses??[]);if(r.kind===`approval`&&e.deferMessagesWhileApprovalsPending===!0&&o?.message!==void 0&&!hasAnsweredApprovalBatch(r.approvalBatches,s))return{deferredMessage:!0,outcome:`unresolved`,messages:t,session:queueDeferredStepInput(e.session,compactStepInput(o))};if(s.length===0&&o?.message===void 0){let n=compactStepInput(o);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let c={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:o,responses:s,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...c,pendingBatch:r.batch});case`approval`:return resolveApprovalInputBatches({...c,approvalBatches:r.approvalBatches,questionBatches:r.questionBatches,resolveApprovalKey:e.resolveApprovalKey});case`question`:return resolveQuestionOnlyInputBatches(c)}}function routePendingInput(e){let t=e.map(e=>({batch:e,domain:classifyPendingInputBatch(e)})),n=t.find(({domain:e})=>e===`session-limit`)?.batch;if(n!==void 0)return{batch:n,kind:`session-limit`};let r=t.filter(({domain:e})=>e===`approval`).map(({batch:e})=>e);if(r.length>0){let t=new Set(r);return{approvalBatches:r,kind:`approval`,questionBatches:e.filter(e=>!t.has(e))}}return{kind:`question`}}function classifyPendingInputBatch(e){for(let t of e.requests)switch(t.kind){case`question`:case`session-limit`:case`tool-approval`:break;default:{let e=t.kind;throw TypeError(`Unhandled pending input request kind: ${String(e)}`)}}return isSessionLimitInputBatch(e)?`session-limit`:e.requests.some(e=>isApprovalRequest(e))?`approval`:`question`}function canonicalizeInputResponses(e){let t=new Map;for(let n of e)t.set(n.requestId,n);return[...t.values()]}function hasTailApprovalResponse(e){let t=e.at(-1);return t?.role===`tool`&&t.content.some(e=>e.type===`tool-approval-response`)}function resolveTextMessageInput(t,n){if(typeof n?.message!=`string`)return n;let r=new Set(t.requests.map(e=>e.requestId));if(n.inputResponses?.some(e=>r.has(e.requestId)))return n;let i=resolveTextToResponses(n.message,t.requests);return i.length===0?n:compactStepInput({...n,inputResponses:[...n.inputResponses??[],...i],messageConsumed:!0,message:void 0})}function createRuntimeToolCallActionFromToolCall(e){return{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}export{appendPendingInputBatch,clearPendingSessionLimitPrompt,consumeDeferredStepInput,createRuntimeToolCallActionFromToolCall,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasPendingInputBatch,hasStepInput,resolvePendingInput};
@@ -0,0 +1,77 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { InputRequest } from "#runtime/input/types.js";
3
+ import type { HarnessSession, SessionStateMap, StepInput } from "#harness/types.js";
4
+ /**
5
+ * Stream-emit coordinates carried so a parked batch's resolution can attribute
6
+ * its events to the turn and step that requested the input.
7
+ */
8
+ export interface PendingInputBatchEvent {
9
+ readonly sequence: number;
10
+ readonly stepIndex: number;
11
+ readonly turnId: string;
12
+ }
13
+ /**
14
+ * Serializable pending input batch stored on the session state: one parked
15
+ * assistant turn's requests plus its withheld model output.
16
+ */
17
+ export interface PendingInputBatch {
18
+ readonly event?: PendingInputBatchEvent;
19
+ readonly requests: readonly InputRequest[];
20
+ readonly responseMessages: readonly ModelMessage[];
21
+ }
22
+ /**
23
+ * Returns true when the session holds at least one pending HITL batch
24
+ * (tool approvals or `ask_question` prompts).
25
+ */
26
+ export declare function hasPendingInputBatch(state: SessionStateMap | undefined): boolean;
27
+ /**
28
+ * Returns the request IDs across every pending HITL batch.
29
+ */
30
+ export declare function getPendingInputRequestIds(state: SessionStateMap | undefined): ReadonlySet<string>;
31
+ /**
32
+ * Reads the ordered pending batches. Sessions parked before the collection
33
+ * shape carry the legacy singleton key; it reads as a one-element list and
34
+ * is rewritten to the list shape on the next batch write.
35
+ */
36
+ export declare function getPendingInputBatches(state: SessionStateMap | undefined): readonly PendingInputBatch[];
37
+ /**
38
+ * Removes the given batches (matched by identity from a prior
39
+ * {@link getPendingInputBatches} read) and keeps every other batch open.
40
+ *
41
+ * Removal is the only exported way to shrink the collection: a wholesale
42
+ * setter would reintroduce the overwrite hazard the collection exists to
43
+ * prevent — a writer clobbering batches it never resolved.
44
+ */
45
+ export declare function removePendingInputBatches(session: HarnessSession, batches: readonly PendingInputBatch[]): HarnessSession;
46
+ /**
47
+ * Appends one pending HITL batch for a parked assistant turn. Earlier
48
+ * batches stay open and independently answerable.
49
+ */
50
+ export declare function appendPendingInputBatch(input: {
51
+ readonly event?: PendingInputBatchEvent;
52
+ readonly requests: readonly InputRequest[];
53
+ readonly responseMessages: readonly ModelMessage[];
54
+ readonly session: HarnessSession;
55
+ }): HarnessSession;
56
+ /**
57
+ * Merges any queued follow-up input into the current step input and clears it
58
+ * from session state. When `preferCurrentInput` is set, fresh input is returned
59
+ * alone and the queued input remains deferred.
60
+ *
61
+ * Used when the harness has to process a pending tool-approval response first
62
+ * and defer the user's new message to the next internal model step.
63
+ */
64
+ export declare function consumeDeferredStepInput(input: {
65
+ readonly input?: StepInput;
66
+ readonly preferCurrentInput?: boolean;
67
+ readonly session: HarnessSession;
68
+ }): {
69
+ readonly input?: StepInput;
70
+ readonly session: HarnessSession;
71
+ };
72
+ /**
73
+ * Returns true when the session carries queued follow-up input for the next
74
+ * internal harness step.
75
+ */
76
+ export declare function hasDeferredStepInput(session: HarnessSession): boolean;
77
+ export declare function queueDeferredStepInput(session: HarnessSession, input: StepInput): HarnessSession;
@@ -0,0 +1 @@
1
+ import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(!(!Array.isArray(t.requests)||!Array.isArray(t.responseMessages)))return t}function getPendingInputBatches(e){let r=e?.[PENDING_INPUT_BATCHES_KEY];if(Array.isArray(r)){let e=r.map(e=>coercePendingInputBatch(e)).filter(e=>e!==void 0);return assertUniqueRequestIds(e),e}let i=coercePendingInputBatch(e?.[LEGACY_PENDING_INPUT_BATCH_KEY]),a=i===void 0?[]:[i];return assertUniqueRequestIds(a),a}function assertUniqueRequestIds(e){let t=new Set;for(let n of e)for(let e of n.requests){if(t.has(e.requestId))throw TypeError(`Internal pending input invariant violated: requestId must be unique across all pending batches: ${JSON.stringify(e.requestId)}.`);t.add(e.requestId)}}function removePendingInputBatches(e,t){let n=new Set(t);return setPendingInputBatches(e,getPendingInputBatches(e.state).filter(e=>!n.has(e)))}function setPendingInputBatches(e,r){assertUniqueRequestIds(r);let i={...e.state};return delete i[LEGACY_PENDING_INPUT_BATCH_KEY],r.length===0?delete i[PENDING_INPUT_BATCHES_KEY]:i[PENDING_INPUT_BATCHES_KEY]=r.map(e=>({event:e.event,requests:[...e.requests],responseMessages:[...e.responseMessages]})),{...e,state:Object.keys(i).length>0?i:void 0}}function appendPendingInputBatch(e){return setPendingInputBatches(e.session,[...getPendingInputBatches(e.session.state),{event:e.event,requests:e.requests,responseMessages:e.responseMessages}])}function consumeDeferredStepInput(t){let n=getDeferredStepInput(t.session);if(n===void 0)return t;if(t.preferCurrentInput===!0&&t.input!==void 0)return{input:t.input,session:t.session};let r=clearDeferredStepInput(t.session);return t.input===void 0?{input:n,session:r}:{input:coalesceTurnInputs(n,t.input),session:r}}function hasDeferredStepInput(e){return getDeferredStepInput(e)!==void 0}function getDeferredStepInput(e){return e.state?.[DEFERRED_STEP_INPUT_KEY]}function queueDeferredStepInput(t,n){let i=getDeferredStepInput(t),a=i===void 0?n:coalesceTurnInputs(i,n),o={...t.state};return o[DEFERRED_STEP_INPUT_KEY]=a,{...t,state:o}}function clearDeferredStepInput(e){if(e.state?.[DEFERRED_STEP_INPUT_KEY]===void 0)return e;let t={...e.state};return delete t[DEFERRED_STEP_INPUT_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}export{appendPendingInputBatch,consumeDeferredStepInput,getPendingInputBatches,getPendingInputRequestIds,hasDeferredStepInput,hasPendingInputBatch,queueDeferredStepInput,removePendingInputBatches};
@@ -3,9 +3,15 @@ import type { HarnessSession, SessionStateMap } from "#harness/types.js";
3
3
  import type { InputRequestKind } from "#runtime/input/types.js";
4
4
  /** Routing and control metadata for one descendant-owned input request. */
5
5
  export interface ProxyInputRequest {
6
+ /** Batch semantics are optional so sessions written before this field remain routable. */
7
+ readonly batch?: ProxyInputRequestBatch;
6
8
  readonly childContinuationToken: string;
7
9
  readonly kind: InputRequestKind;
8
10
  }
11
+ export interface ProxyInputRequestBatch {
12
+ readonly approvalRequestIds: readonly string[];
13
+ readonly requestIds: readonly string[];
14
+ }
9
15
  /**
10
16
  * Returns the proxy-routing map as a fresh `Map`. Never returns a live
11
17
  * reference so accidental mutation cannot corrupt session state.
@@ -17,9 +23,9 @@ export declare function getProxyInputRequests(state: SessionStateMap | undefined
17
23
  */
18
24
  export declare function hasProxyInputRequests(state: SessionStateMap | undefined): boolean;
19
25
  /**
20
- * Replaces prior entries for `forChildContinuationToken` with the
21
- * provided ones. A child raising a fresh batch overwrites its prior
22
- * batch — the parent never keeps stale request metadata.
26
+ * Merges the provided routes into the parent session by request ID. Existing
27
+ * routes with different IDs stay independently answerable; re-recording the
28
+ * same request ID replaces only that route, making durable retries idempotent.
23
29
  */
24
30
  export declare function upsertProxyInputRequests(input: {
25
31
  readonly entries: readonly (readonly [requestId: string, route: ProxyInputRequest])[];
@@ -31,6 +37,10 @@ export declare function upsertProxyInputRequests(input: {
31
37
  * child subagent finishes so stale clicks no longer route to it.
32
38
  */
33
39
  export declare function clearProxyInputRequestsForChild(session: HarnessSession, childContinuationToken: string): HarnessSession;
40
+ /** Removes only the request IDs whose responses were successfully forwarded. */
41
+ export declare function retireProxyInputRequests<T extends {
42
+ readonly state?: SessionStateMap;
43
+ }>(session: T, requestIds: readonly string[]): T;
34
44
  /**
35
45
  * Removes every proxy entry. Called when a cancelled turn orphans its
36
46
  * descendants so stale HITL responses no longer route to them.
@@ -1 +1 @@
1
- const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={};for(let[n,r]of Object.entries(readMap(e.session.state)))r.childContinuationToken!==e.forChildContinuationToken&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;return writeMap(e.session,t)}function clearProxyInputRequestsForChild(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(a.childContinuationToken===t){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e){return e.event.requests.map(t=>[t.requestId,{childContinuationToken:e.childContinuationToken,kind:t.kind}])}function readMap(t){let n=t?.[PROXY_INPUT_REQUESTS_KEY];if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){let n=parseProxyInputRequest(t);n!==void 0&&(r[e]=n)}return r}function writeMap(t,n){let r={...t.state};return Object.keys(n).length===0?(delete r[PROXY_INPUT_REQUESTS_KEY],{...t,state:Object.keys(r).length>0?r:void 0}):(r[PROXY_INPUT_REQUESTS_KEY]=n,{...t,state:r})}function parseProxyInputRequest(e){if(!(typeof e!=`object`||!e||Array.isArray(e))&&!(!(`childContinuationToken`in e)||!(`kind`in e))&&!(typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind)))return{childContinuationToken:e.childContinuationToken,kind:e.kind}}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,getProxyInputRequests,hasProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequests};
1
+ const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){let t={...readMap(e.session.state)};for(let[n,r]of e.entries)t[n]=r;return writeMap(e.session,t)}function clearProxyInputRequestsForChild(e,t){let n=readMap(e.state),r={},i=!1;for(let[e,a]of Object.entries(n)){if(a.childContinuationToken===t){i=!0;continue}r[e]=a}return i?writeMap(e,r):e}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function clearAllProxyInputRequests(e){return hasProxyInputRequests(e.state)?writeMap(e,{}):e}function toProxyInputRequestEntries(e){let t={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)};return e.event.requests.map(n=>[n.requestId,{batch:t,childContinuationToken:e.childContinuationToken,kind:n.kind}])}function readMap(t){let n=t?.[PROXY_INPUT_REQUESTS_KEY];if(typeof n!=`object`||!n||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n)){let n=parseProxyInputRequest(t,e);n!==void 0&&(r[e]=n)}return r}function writeMap(t,n){let r={...t.state};return Object.keys(n).length===0?(delete r[PROXY_INPUT_REQUESTS_KEY],{...t,state:Object.keys(r).length>0?r:void 0}):(r[PROXY_INPUT_REQUESTS_KEY]=n,{...t,state:r})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n={childContinuationToken:e.childContinuationToken,kind:e.kind},r=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0;return r===void 0||!r.requestIds.includes(t)?n:{...n,batch:r}}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearAllProxyInputRequests,clearProxyInputRequestsForChild,getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequests};
@@ -1 +1 @@
1
- import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{setPendingInputBatch}from"#harness/input-requests.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";import{SessionLimitDeclinedError}from"#harness/turn-cancellation.js";import{bumpSessionRuntimeTokenLimits,getSessionTokenLimitViolation,getSessionTokenUsage}from"#harness/turn-tag-state.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:bumpSessionRuntimeTokenLimits(e.session)};if(!(e.config.mode===`conversation`||e.session.continuationToken!==``)){let t=getSessionTokenLimitViolation(e.session);return{result:t===null?{next:{done:!0,output:``},session:e.session}:await failSessionTokenLimit({...e,violation:t}),session:e.session}}throw new SessionLimitDeclinedError}async function enforceSessionTokenLimit(e){let t=getSessionTokenLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return t.limit>0&&n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionTokenLimit({...e,emit:n,violation:t}):failSessionTokenLimit({...e,violation:t})}async function parkOnSessionTokenLimit(t){let a=createSessionLimitContinuationRequest({sessionId:t.session.sessionId,violation:t.violation}),o=t.emissionState,s=setPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:[a],responseMessages:[],session:{...t.session,history:[...t.messages]}});return await t.emit(createInputRequestedEvent({requests:[a],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.config.mode===`conversation`&&(o=await emitTurnEpilogue(t.emit,o,t.config.mode)),{next:null,session:setHarnessEmissionState(s,o)}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let n=getSessionTokenUsage(e.session),r=formatSessionTokenLimitMessage(e.violation.kind),i={inputTokens:n.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:n.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:i,message:r,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`||void 0,output:e.config.mode===`task`?r:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionTokenLimit};
1
+ import{createInputRequestedEvent}from"#protocol/message.js";import{emitFailedStep,emitTurnEpilogue,setHarnessEmissionState}from"#harness/emission.js";import{appendPendingInputBatch}from"#harness/input-requests.js";import{createSessionLimitContinuationRequest}from"#harness/session-limit-continuation.js";import{SessionLimitDeclinedError}from"#harness/turn-cancellation.js";import{bumpSessionRuntimeTokenLimits,getSessionTokenLimitViolation,getSessionTokenUsage}from"#harness/turn-tag-state.js";async function applySessionLimitContinuation(e){if(e.limitContinuation===void 0)return{result:null,session:e.session};if(e.limitContinuation.granted)return{result:null,session:bumpSessionRuntimeTokenLimits(e.session)};if(!(e.config.mode===`conversation`||e.session.continuationToken!==``)){let t=getSessionTokenLimitViolation(e.session);return{result:t===null?{next:{done:!0,output:``},session:e.session}:await failSessionTokenLimit({...e,violation:t}),session:e.session}}throw new SessionLimitDeclinedError}async function enforceSessionTokenLimit(e){let t=getSessionTokenLimitViolation(e.session);if(t===null)return null;let{emit:n}=e;return t.limit>0&&n!==void 0&&(e.config.mode===`conversation`||e.config.capabilities?.requestInput===!0)?parkOnSessionTokenLimit({...e,emit:n,violation:t}):failSessionTokenLimit({...e,violation:t})}async function parkOnSessionTokenLimit(t){let a=createSessionLimitContinuationRequest({sessionId:t.session.sessionId,violation:t.violation}),o=t.emissionState,s=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:[a],responseMessages:[],session:{...t.session,history:[...t.messages]}});return await t.emit(createInputRequestedEvent({requests:[a],sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.config.mode===`conversation`&&(o=await emitTurnEpilogue(t.emit,o,t.config.mode)),{next:null,session:setHarnessEmissionState(s,o)}}function formatSessionTokenLimitMessage(e){return`The session reached its configured ${e} token limit.`}async function failSessionTokenLimit(e){let n=getSessionTokenUsage(e.session),r=formatSessionTokenLimitMessage(e.violation.kind),i={inputTokens:n.inputTokens,kind:e.violation.kind,limit:e.violation.limit,outputTokens:n.outputTokens,usedTokens:e.violation.usedTokens};return e.emit&&await emitFailedStep(e.emit,e.emissionState,{code:`SESSION_TOKEN_LIMIT_REACHED`,details:i,message:r,sessionId:e.session.sessionId}),{next:{done:!0,isError:e.config.mode===`task`||void 0,output:e.config.mode===`task`?r:``},session:e.session}}export{applySessionLimitContinuation,enforceSessionTokenLimit};
@@ -1,7 +1,7 @@
1
1
  import type { PrepareStepFunction, StepResult, ToolSet } from "ai";
2
2
  import type { HarnessEmissionState } from "#harness/emission.js";
3
3
  import { type AnthropicCacheMarker, type PromptCachePath } from "#harness/prompt-cache.js";
4
- import type { HarnessEmitFn, HarnessSession, ToolLoopHarnessConfig } from "#harness/types.js";
4
+ import { type HarnessEmitFn, type HarnessSession, type ToolLoopHarnessConfig } from "#harness/types.js";
5
5
  /**
6
6
  * The subset of `StepResult` that the harness reads after a step completes.
7
7
  *