eve 0.33.2 → 0.34.0

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 (228) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/dist/src/channel/channel-address.d.ts +3 -6
  3. package/dist/src/channel/channel-address.js +1 -1
  4. package/dist/src/channel/channel-operations.d.ts +2 -3
  5. package/dist/src/channel/delivery-metadata.d.ts +9 -0
  6. package/dist/src/channel/delivery-metadata.js +1 -0
  7. package/dist/src/channel/routes.d.ts +1 -0
  8. package/dist/src/channel/session.d.ts +3 -4
  9. package/dist/src/channel/session.js +1 -1
  10. package/dist/src/channel/types.d.ts +20 -3
  11. package/dist/src/chunks/{use-eve-agent-B-Hky2f4.js → use-eve-agent-BNdcle_M.js} +33 -0
  12. package/dist/src/chunks/{use-eve-agent-3oBnxzhV.js → use-eve-agent-FJkEMXYk.js} +33 -0
  13. package/dist/src/cli/dev/tui/traces/trace-conversation.js +1 -1
  14. package/dist/src/client/message-reducer.js +1 -1
  15. package/dist/src/compiled/.vendor-stamp.json +1 -1
  16. package/dist/src/compiled/@opentelemetry/api/index.d.ts +32 -3
  17. package/dist/src/compiled/@vercel/otel/index.d.ts +45 -2
  18. package/dist/src/compiler/extension-compatibility.d.ts +12 -12
  19. package/dist/src/compiler/extension-compatibility.js +1 -1
  20. package/dist/src/compiler/manifest.js +1 -1
  21. package/dist/src/compiler/normalize-agent-config.js +1 -1
  22. package/dist/src/context/build-dynamic-tools.d.ts +7 -0
  23. package/dist/src/context/build-dynamic-tools.js +1 -1
  24. package/dist/src/context/dynamic-tool-lifecycle.d.ts +7 -0
  25. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  26. package/dist/src/context/keys.d.ts +13 -1
  27. package/dist/src/context/keys.js +1 -1
  28. package/dist/src/discover/filesystem.d.ts +1 -1
  29. package/dist/src/discover/filesystem.js +1 -1
  30. package/dist/src/evals/cli/eval.js +2 -2
  31. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  32. package/dist/src/execution/dispatch-runtime-actions-step.d.ts +1 -5
  33. package/dist/src/execution/dispatch-runtime-actions-step.js +1 -1
  34. package/dist/src/execution/dispatch-turn-step.d.ts +5 -0
  35. package/dist/src/execution/dispatch-turn-step.js +1 -0
  36. package/dist/src/execution/durable-session-migrations/turn-workflow.d.ts +1 -0
  37. package/dist/src/execution/node-step.js +1 -1
  38. package/dist/src/execution/parked-delivery-wait.d.ts +1 -1
  39. package/dist/src/execution/parked-delivery-wait.js +1 -1
  40. package/dist/src/execution/remote-agent-dispatch.d.ts +2 -1
  41. package/dist/src/execution/remote-agent-dispatch.js +1 -1
  42. package/dist/src/execution/route-child-delivery.d.ts +3 -4
  43. package/dist/src/execution/route-child-delivery.js +1 -1
  44. package/dist/src/execution/route-proxied-deliver-step.d.ts +34 -0
  45. package/dist/src/execution/route-proxied-deliver-step.js +1 -0
  46. package/dist/src/execution/runtime-context.js +1 -1
  47. package/dist/src/execution/session-command-inbox.d.ts +2 -2
  48. package/dist/src/execution/session-command-wire.js +1 -1
  49. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  50. package/dist/src/execution/subagent-adapter.js +1 -1
  51. package/dist/src/execution/subagent-event-proxy-step.js +1 -1
  52. package/dist/src/execution/tool-auth.d.ts +9 -0
  53. package/dist/src/execution/tool-auth.js +1 -1
  54. package/dist/src/execution/turn-control-receiver.js +1 -1
  55. package/dist/src/execution/turn-dispatch.js +1 -1
  56. package/dist/src/execution/turn-workflow.js +1 -1
  57. package/dist/src/execution/workflow-entry.js +1 -1
  58. package/dist/src/execution/workflow-runtime.js +1 -1
  59. package/dist/src/execution/workflow-steps.d.ts +1 -27
  60. package/dist/src/execution/workflow-steps.js +1 -1
  61. package/dist/src/harness/ai-sdk-hook-bridge.js +1 -1
  62. package/dist/src/harness/ai-sdk-telemetry.d.ts +19 -0
  63. package/dist/src/harness/ai-sdk-telemetry.js +1 -0
  64. package/dist/src/harness/approval-candidates.d.ts +109 -0
  65. package/dist/src/harness/approval-candidates.js +1 -0
  66. package/dist/src/harness/approval-delivery-coordinator.d.ts +39 -0
  67. package/dist/src/harness/approval-delivery-coordinator.js +1 -0
  68. package/dist/src/harness/authorization.d.ts +1 -0
  69. package/dist/src/harness/authorization.js +1 -1
  70. package/dist/src/harness/channel-delivery-instrumentation.d.ts +25 -0
  71. package/dist/src/harness/channel-delivery-instrumentation.js +1 -0
  72. package/dist/src/harness/execute-tool.d.ts +1 -0
  73. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  74. package/dist/src/harness/hitl/pending-input-resolution.d.ts +3 -0
  75. package/dist/src/harness/hitl/pending-input-resolution.js +1 -1
  76. package/dist/src/harness/hitl/question-input-requests.js +1 -1
  77. package/dist/src/harness/hitl/session-limit-input-requests.js +1 -1
  78. package/dist/src/harness/input-extraction.js +1 -1
  79. package/dist/src/harness/input-request-resolution.d.ts +22 -0
  80. package/dist/src/harness/input-request-resolution.js +1 -0
  81. package/dist/src/harness/input-requests.d.ts +1 -0
  82. package/dist/src/harness/input-requests.js +1 -1
  83. package/dist/src/harness/instrumentation-config.d.ts +9 -4
  84. package/dist/src/harness/instrumentation-config.js +1 -1
  85. package/dist/src/harness/instrumentation-content.d.ts +5 -0
  86. package/dist/src/harness/instrumentation-content.js +1 -0
  87. package/dist/src/harness/instrumentation-dispatch.d.ts +2 -0
  88. package/dist/src/harness/instrumentation-dispatch.js +1 -0
  89. package/dist/src/harness/instrumentation-lifecycle.d.ts +388 -65
  90. package/dist/src/harness/instrumentation-lifecycle.js +1 -1
  91. package/dist/src/harness/instrumentation-native-events.d.ts +10 -1
  92. package/dist/src/harness/instrumentation-native-events.js +1 -1
  93. package/dist/src/harness/instrumentation-providers.d.ts +50 -0
  94. package/dist/src/harness/instrumentation-providers.js +1 -0
  95. package/dist/src/harness/instrumentation-runtime.d.ts +3 -0
  96. package/dist/src/harness/instrumentation-runtime.js +1 -1
  97. package/dist/src/harness/instrumentation-setup-context.d.ts +12 -0
  98. package/dist/src/harness/instrumentation-setup-context.js +1 -0
  99. package/dist/src/harness/instrumentation-state.d.ts +59 -0
  100. package/dist/src/harness/instrumentation-state.js +1 -0
  101. package/dist/src/harness/messages.d.ts +2 -1
  102. package/dist/src/harness/messages.js +1 -1
  103. package/dist/src/harness/pending-input-batches.d.ts +2 -0
  104. package/dist/src/harness/pending-input-batches.js +1 -1
  105. package/dist/src/harness/runtime-action-settlement-state.d.ts +3 -0
  106. package/dist/src/harness/runtime-action-settlement-state.js +1 -0
  107. package/dist/src/harness/runtime-actions.js +1 -1
  108. package/dist/src/harness/stale-input-responses.js +1 -1
  109. package/dist/src/harness/tool-call-action.d.ts +9 -0
  110. package/dist/src/harness/tool-call-action.js +1 -0
  111. package/dist/src/harness/tool-loop.js +2 -2
  112. package/dist/src/harness/tools.js +1 -1
  113. package/dist/src/harness/types.d.ts +15 -1
  114. package/dist/src/internal/application/compiled-artifacts.d.ts +13 -4
  115. package/dist/src/internal/application/compiled-artifacts.js +5 -4
  116. package/dist/src/internal/application/dev-environment.d.ts +12 -0
  117. package/dist/src/internal/application/dev-environment.js +1 -1
  118. package/dist/src/internal/application/package.js +1 -1
  119. package/dist/src/internal/authored-definition/approval.d.ts +3 -0
  120. package/dist/src/internal/authored-definition/approval.js +1 -0
  121. package/dist/src/internal/authored-definition/connection.js +1 -1
  122. package/dist/src/internal/authored-definition/core.js +1 -1
  123. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  124. package/dist/src/internal/instrumentation-layout.d.ts +28 -0
  125. package/dist/src/internal/instrumentation-layout.js +1 -0
  126. package/dist/src/internal/materialized-authored-modules.d.ts +13 -2
  127. package/dist/src/internal/materialized-authored-modules.js +1 -1
  128. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  129. package/dist/src/internal/nitro/host/dev-host-fingerprint.js +1 -1
  130. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.d.ts +5 -1
  131. package/dist/src/internal/nitro/host/local-tracing-runtime-plugin.js +1 -1
  132. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  133. package/dist/src/internal/nitro/routes/channel-request-instrumentation.d.ts +2 -3
  134. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  135. package/dist/src/packages/eve-catalog/src/index.js +1 -1
  136. package/dist/src/protocol/message.d.ts +36 -1
  137. package/dist/src/protocol/message.js +1 -1
  138. package/dist/src/protocol/traceparent.d.ts +10 -0
  139. package/dist/src/protocol/traceparent.js +1 -0
  140. package/dist/src/public/channels/eve.js +1 -1
  141. package/dist/src/public/channels/github/defaults.d.ts +1 -0
  142. package/dist/src/public/channels/github/defaults.js +5 -2
  143. package/dist/src/public/channels/github/dispatch.js +1 -1
  144. package/dist/src/public/channels/github/githubChannel.d.ts +3 -3
  145. package/dist/src/public/channels/github/githubChannel.js +1 -1
  146. package/dist/src/public/channels/github/inbound.d.ts +0 -3
  147. package/dist/src/public/channels/github/inbound.js +1 -1
  148. package/dist/src/public/channels/slack/defaults.js +3 -3
  149. package/dist/src/public/channels/slack/interactions.js +1 -1
  150. package/dist/src/public/channels/slack/slackChannel.d.ts +11 -3
  151. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  152. package/dist/src/public/definitions/approval.d.ts +57 -16
  153. package/dist/src/public/definitions/approval.js +1 -1
  154. package/dist/src/public/definitions/channel.d.ts +2 -2
  155. package/dist/src/public/definitions/channel.js +1 -1
  156. package/dist/src/public/definitions/hook.d.ts +4 -2
  157. package/dist/src/public/instrumentation/index.d.ts +32 -17
  158. package/dist/src/public/instrumentation/index.js +1 -1
  159. package/dist/src/public/instrumentation/otel.d.ts +31 -0
  160. package/dist/src/public/instrumentation/otel.js +1 -0
  161. package/dist/src/public/instrumentation/provider.d.ts +117 -0
  162. package/dist/src/public/instrumentation/provider.js +1 -0
  163. package/dist/src/public/tools/approval/approval-helpers.d.ts +4 -4
  164. package/dist/src/public/tools/index.d.ts +1 -1
  165. package/dist/src/runtime/actions/results.d.ts +3 -3
  166. package/dist/src/runtime/attributes/emit.js +1 -1
  167. package/dist/src/runtime/connections/principal.d.ts +3 -0
  168. package/dist/src/runtime/connections/principal.js +1 -1
  169. package/dist/src/runtime/connections/scoped-authorization.d.ts +3 -5
  170. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  171. package/dist/src/runtime/connections/types.d.ts +5 -0
  172. package/dist/src/runtime/resolve-agent.js +1 -1
  173. package/dist/src/runtime/resolve-tool.js +1 -1
  174. package/dist/src/setup/index.d.ts +1 -0
  175. package/dist/src/setup/index.js +1 -1
  176. package/dist/src/setup/scaffold/create/project.js +1 -1
  177. package/dist/src/setup/scaffold/version-tokens.js +1 -1
  178. package/dist/src/setup/verified-remote-agent.d.ts +30 -0
  179. package/dist/src/setup/verified-remote-agent.js +1 -0
  180. package/dist/src/shared/agent-definition.d.ts +9 -0
  181. package/dist/src/shared/channel-definition.d.ts +3 -1
  182. package/dist/src/svelte/index.js +1 -1
  183. package/dist/src/svelte/use-eve-agent.js +1 -1
  184. package/dist/src/tracing/agent-action-instrumentation.d.ts +31 -0
  185. package/dist/src/tracing/agent-action-instrumentation.js +1 -0
  186. package/dist/src/tracing/agent-approval-instrumentation.d.ts +13 -0
  187. package/dist/src/tracing/agent-approval-instrumentation.js +1 -0
  188. package/dist/src/tracing/agent-channel-delivery-instrumentation.d.ts +13 -0
  189. package/dist/src/tracing/agent-channel-delivery-instrumentation.js +1 -0
  190. package/dist/src/tracing/agent-otel-content.d.ts +6 -0
  191. package/dist/src/tracing/agent-otel-content.js +2 -2
  192. package/dist/src/tracing/agent-otel-provider.d.ts +7 -7
  193. package/dist/src/tracing/agent-otel-provider.js +2 -2
  194. package/dist/src/tracing/agent-otel-usage.d.ts +4 -0
  195. package/dist/src/tracing/agent-otel-usage.js +1 -0
  196. package/dist/src/tracing/agent-span-id-generator.d.ts +2 -0
  197. package/dist/src/tracing/agent-span-id-generator.js +1 -1
  198. package/dist/src/tracing/agent-tool-instrumentation.d.ts +28 -0
  199. package/dist/src/tracing/agent-tool-instrumentation.js +1 -0
  200. package/dist/src/tracing/agent-trace-context-store.d.ts +8 -1
  201. package/dist/src/tracing/agent-trace-context-store.js +1 -1
  202. package/dist/src/tracing/agent-trace-span-processor.d.ts +0 -1
  203. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  204. package/dist/src/tracing/agent-trace-state.d.ts +33 -3
  205. package/dist/src/tracing/agent-trace-state.js +1 -1
  206. package/dist/src/tracing/batch-span-processor.d.ts +20 -0
  207. package/dist/src/tracing/batch-span-processor.js +1 -0
  208. package/dist/src/tracing/content-attributes.d.ts +28 -0
  209. package/dist/src/tracing/content-attributes.js +1 -0
  210. package/dist/src/tracing/content-span-processor.d.ts +19 -0
  211. package/dist/src/tracing/content-span-processor.js +1 -0
  212. package/dist/src/tracing/install-instrumentation-runtime.d.ts +19 -0
  213. package/dist/src/tracing/install-instrumentation-runtime.js +1 -0
  214. package/dist/src/tracing/local-instrumentation-runtime.js +1 -1
  215. package/dist/src/tracing/local-traces.d.ts +56 -0
  216. package/dist/src/tracing/local-traces.js +1 -0
  217. package/dist/src/tracing/otel-declaration.d.ts +150 -0
  218. package/dist/src/tracing/otel-declaration.js +1 -0
  219. package/dist/src/tracing/otel-registration.d.ts +21 -0
  220. package/dist/src/tracing/otel-registration.js +1 -0
  221. package/dist/src/tracing/vercel-runtime-span-exporter.d.ts +5 -0
  222. package/dist/src/tracing/vercel-runtime-span-exporter.js +1 -0
  223. package/dist/src/vue/index.js +1 -1
  224. package/dist/src/vue/use-eve-agent.js +1 -1
  225. package/docs/guides/instrumentation.md +22 -0
  226. package/package.json +7 -1
  227. package/dist/src/harness/otel-integration.d.ts +0 -12
  228. package/dist/src/harness/otel-integration.js +0 -1
@@ -0,0 +1,39 @@
1
+ import { type AuthorizationChallenge } from "#harness/authorization.js";
2
+ import type { HarnessSession, HarnessToolMap, StepInput } from "#harness/types.js";
3
+ export interface ApprovalDeliveryResult {
4
+ readonly challenges: readonly AuthorizationChallenge[];
5
+ readonly feedback: readonly string[];
6
+ readonly kind: "continue" | "continue-coordination" | "authorization-required" | "park";
7
+ readonly session: HarnessSession;
8
+ readonly stepInput?: StepInput;
9
+ }
10
+ /**
11
+ * Advances approval state by one durable phase.
12
+ *
13
+ * | State | Input | Transition |
14
+ * | --- | --- | --- |
15
+ * | pending request | Approve | create responder-bound candidate |
16
+ * | pending request | Cancel | settle cancelled and stale candidates |
17
+ * | pending candidate | coordinator pass | run current authorizer |
18
+ * | pending candidate | allowed | settle approved and stale competitors |
19
+ * | pending candidate | rejected/error/expiry | append terminal history |
20
+ * | pending candidate | authorization required | persist private challenge |
21
+ * | authorization required | matching callback | re-run current authorizer |
22
+ * | settled request | any later response | no state change |
23
+ *
24
+ * Delivery ingestion returns before authorizer work so Cancel and candidate
25
+ * creation commit before long-running policy execution. Candidate results also
26
+ * commit before lifecycle events are projected by the next stack layer.
27
+ */
28
+ /** Returns whether this invocation should prepare tools for persisted policy work. */
29
+ export declare function shouldPrepareApprovalPolicyTools(input: {
30
+ readonly now?: number;
31
+ readonly session: HarnessSession;
32
+ readonly stepInput?: StepInput;
33
+ }): boolean;
34
+ export declare function coordinateApprovalDelivery(input: {
35
+ readonly now?: number;
36
+ readonly session: HarnessSession;
37
+ readonly stepInput?: StepInput;
38
+ readonly tools: HarnessToolMap;
39
+ }): Promise<ApprovalDeliveryResult>;
@@ -0,0 +1 @@
1
+ import{AuthKey,SessionKey}from"#context/keys.js";import{contextStorage}from"#context/container.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{buildApprovalResponseAuth,handleApprovalResponsePolicyError}from"#execution/tool-auth.js";import{clearPendingAuthorization,getAuthorizationResult,getPendingAuthorization,isAuthorizationSignal}from"#harness/authorization.js";import{createApprovalCandidate,expireApprovalCandidates,finishApprovalCandidate,getActiveApprovalCandidate,getApprovalAuditState,markApprovalCandidateAuthorizationRequired,settleAllowedCandidate,settleDirectApprovalResponse}from"#harness/approval-candidates.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{getPendingInputBatches}from"#harness/pending-input-batches.js";const UNAUTHENTICATED_APPROVAL_FEEDBACK=`Authentication is required to respond to this approval.`;function shouldPrepareApprovalPolicyTools(e){let t=getPendingInputBatches(e.session.state),n=[...(e.stepInput?.attributedInputResponses??[]).map(({response:e})=>e),...e.stepInput?.inputResponses??[]];if(t.some(e=>e.requests.some(e=>isApprovalRequest(e)&&n.some(t=>t.requestId===e.requestId))))return!1;let r=e.now??Date.now();return getApprovalAuditState(e.session.state).activeCandidates.some(e=>e.expiresAt>r&&(e.status===`pending`||(e.authorizationChallenges?.some(e=>getAuthorizationResult(e.name)!==void 0)??!1)))}async function coordinateApprovalDelivery(i){let a=i.now??Date.now(),l=getApprovalAuditState(i.session.state).activeCandidates.filter(e=>e.expiresAt<=a).flatMap(e=>e.authorizationChallenges?.map(e=>e.name)??[]),u=expireApprovalCandidates({now:a,state:i.session.state}),d={...i.session,state:clearPendingAuthorization(u,l)},f=getApprovalAuditState(d.state),p=getPendingInputBatches(d.state),m=new Set(p.flatMap(e=>e.requests.map(e=>e.requestId))),h=new Set(f.settlements.filter(e=>e.outcome===`allowed`&&m.has(e.requestId)).map(e=>e.requestId)),g=new Set(f.settlements.map(e=>e.requestId)),_=hasResponseForRequest(i.stepInput,g),v=_?removeConsumedResponses(i.stepInput,g):i.stepInput;if(_&&h.size===0&&!hasMeaningfulInput(v))return deliveryResult(d,v,`park`);if(p.length===0)return deliveryResult(d,v);let y=v,b=new Set(p.flatMap(e=>e.responseAuthRequiredRequestIds??[])),x=p.flatMap(e=>e.requests),S=new Map(x.map(e=>[e.requestId,e]));if(y?.message!==void 0&&(y.attributedInputResponses?.length??0)===0&&(y.inputResponses?.length??0)===0&&f.activeCandidates.length===0&&b.size>0)return deliveryResult(d,{...y,message:void 0,messageAuth:void 0},`park`,[],[`Please use the Approve or Cancel buttons to respond to this approval.`]);let C=[],w=[],T=new Set,E=!1,D=getApprovalAuditState(d.state).activeCandidates,O=[...y?.attributedInputResponses??[],...(y?.inputResponses??[]).map(e=>({auth:void 0,response:e}))];for(let{auth:i,response:o}of O){let s=S.get(o.requestId);if(s===void 0||!isApprovalRequest(s))continue;if(!b.has(o.requestId)){let r=contextStorage.getStore(),s=i===void 0?r?.get(AuthKey)??r?.get(SessionKey)?.auth.current??null:i;if(s!==null&&(o.optionId===`approve`||o.optionId===`cancel`)){let e=settleDirectApprovalResponse({actor:s,outcome:o.optionId===`approve`?`allowed`:`cancelled`,requestId:o.requestId,settledAt:a,state:d.state});d={...d,state:e.state},E||=e.changed}continue}if(T.add(o.requestId),o.optionId===`cancel`){let e=i===void 0?buildCallbackContext().session.auth.current:i;if(e===null){w.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let t=settleDirectApprovalResponse({actor:e,outcome:`cancelled`,requestId:o.requestId,settledAt:a,state:d.state});d={...d,state:t.state},E||=t.changed;continue}if(o.optionId!==`approve`)continue;let c=i===void 0?buildCallbackContext().session.auth.current:i;if(c===null){w.push(UNAUTHENTICATED_APPROVAL_FEEDBACK);continue}let l=createApprovalCandidate({candidateIdPrefix:approvalCandidateIdPrefix(s.requestId,c),createdAt:a,expiresAt:a+6e5,requestId:s.requestId,responder:c,state:d.state});d={...d,state:l.state},E||=l.changed}let k=removeConsumedResponses(y,T);if(T.size>0)return deliveryResult(d,k,E?`continue-coordination`:`continue`,[],w);if(E)return deliveryResult(d,k,`continue`,[],w);let A=new Set(getPendingAuthorization(d.state)?.challenges.map(e=>e.name)??[]);for(let e of D){if(e.status===`authorization-required`){let t=e.authorizationChallenges??[];if(!t.some(e=>getAuthorizationResult(e.name)!==void 0)){C.push(...t.filter(e=>!A.has(e.name)));continue}}let t=S.get(e.requestId);if(t===void 0||getActiveApprovalCandidate(d.state,e.candidateId)===void 0)continue;let n=await authorizeCandidate({candidateId:e.candidateId,now:a,request:t,responder:e.responder,session:d,tools:i.tools});d=n.session,E||=n.didCommit,C.push(...n.challenges),getApprovalAuditState(d.state).settlements.find(t=>t.requestId===e.requestId)?.outcome===`allowed`&&h.add(e.requestId)}let j=appendAllowedResponses(k,h);return h.size>0?deliveryResult(d,j,`continue`):E?deliveryResult(d,j,`continue-coordination`):deliveryResult(d,j,C.length>0?`authorization-required`:`continue`,C)}async function authorizeCandidate(e){let t={...e.session,state:expireApprovalCandidates({now:e.now,state:e.session.state})};if(getActiveApprovalCandidate(t.state,e.candidateId)===void 0)return{challenges:[],didCommit:!1,session:t};let n=e.tools.get(e.request.action.toolName)?.approval,o=n!==void 0&&typeof n!=`function`?n.response:void 0;if(o===void 0)return failCandidate({...e,reason:`Approval authorization is temporarily unavailable. Please try again.`,session:t});try{let n=buildCallbackContext(),a=await withAuthorizerTimeout(o({auth:buildApprovalResponseAuth({responder:e.responder,scope:e.candidateId}),request:{callId:e.request.action.callId,requestId:e.request.requestId,toolInput:e.request.action.input,toolName:e.request.action.toolName},response:{decision:`approve`},responder:e.responder,session:{id:n.session.id,initiator:n.session.auth.initiator,parent:n.session.parent,turn:n.session.turn}}));if(a.status===`rejected`)return t={...t,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:a.reason,state:t.state,status:`rejected`})},{challenges:[],didCommit:!0,session:t};if(a.status!==`allowed`)return failCandidate({...e,session:t});let s=settleAllowedCandidate({candidateId:e.candidateId,settledAt:e.now,state:t.state});return{challenges:[],didCommit:s.changed,session:{...t,state:s.state}}}catch(n){let r=await handleApprovalResponsePolicyError(n).catch(()=>void 0);if(isAuthorizationSignal(r)){let n=r.challenges.map(e=>Date.parse(e.challenge.expiresAt??``)).filter(Number.isFinite).sort((e,t)=>e-t)[0];return t={...t,state:markApprovalCandidateAuthorizationRequired({authorizationChallenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),candidateId:e.candidateId,expiresAt:n,state:t.state})},{challenges:r.challenges.map(t=>({...t,candidateId:e.candidateId})),didCommit:!0,session:t}}return failCandidate({...e,session:t})}}function failCandidate(e){let t=e.reason??`We couldn’t verify your approval. Please try again.`;return{challenges:[],didCommit:!0,session:{...e.session,state:finishApprovalCandidate({candidateId:e.candidateId,completedAt:e.now,reason:t,state:e.session.state,status:`failed`})}}}function hasResponseForRequest(e,t){return e?.attributedInputResponses?.some(({response:e})=>t.has(e.requestId))===!0||e?.inputResponses?.some(e=>t.has(e.requestId))===!0}function hasMeaningfulInput(e){return e?.message!==void 0||(e?.attributedInputResponses?.length??0)>0||(e?.inputResponses?.length??0)>0||(e?.runtimeActionResults?.length??0)>0}function appendAllowedResponses(e,t){return t.size===0?e:{...e,inputResponses:[...e?.inputResponses??[],...[...t].map(e=>({optionId:`approve`,requestId:e}))]}}function removeConsumedResponses(e,t){if(e===void 0)return;let n=(e.attributedInputResponses??[]).filter(({response:e})=>!t.has(e.requestId)),r=[...(e.inputResponses??[]).filter(e=>!t.has(e.requestId)),...n.map(({response:e})=>e)];return{...e,attributedInputResponses:void 0,inputResponses:r}}function deliveryResult(e,t,n=`continue`,r=[],i=[]){return{challenges:r,feedback:i,kind:n,session:e,stepInput:t}}function approvalCandidateIdPrefix(e,t){let n=[t.authenticator,t.issuer??``,t.principalType,t.principalId].join(`:`);return`${encodeCandidateIdPart(e)}.${encodeCandidateIdPart(n)}`}function encodeCandidateIdPart(e){return Array.from(e,e=>e.codePointAt(0).toString(36)).join(`-`)}async function withAuthorizerTimeout(e){let t;try{return await Promise.race([Promise.resolve(e),new Promise((e,n)=>{t=setTimeout(()=>n(Error(`Approval response authorizer timed out.`)),1e4)})])}finally{t!==void 0&&clearTimeout(t)}}export{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools};
@@ -39,6 +39,7 @@ declare const AUTHORIZATION_PENDING_BRAND: "__eveAuthorizationPending";
39
39
  export interface AuthorizationChallenge {
40
40
  /** Opaque identity of this exact authorization attempt. */
41
41
  readonly attemptId?: string;
42
+ readonly candidateId?: string;
42
43
  readonly name: string;
43
44
  readonly challenge: ConnectionAuthorizationChallenge;
44
45
  readonly hookUrl: string;
@@ -1 +1 @@
1
- import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{SessionIdKey}from"#context/keys.js";import{loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(!(!t||t.length===0))return e===void 0?t[0]:t.find(t=>t.name===e)}function consumeAuthorizationResult(e){let t=loadContext(),r=t.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(t=>t.name===e);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return t.delete(PendingAuthorizationResultKey),o.length>0&&t.set(PendingAuthorizationResultKey,o),a}function getHookUrl(r,i){let a=loadContext(),o=a.get(SessionIdKey),s=a.get(CallbackBaseUrlKey);return!o||!s?void 0:`${s}${createEveConnectionCallbackRoutePath(r,i,authHookToken(o))}`}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=getPendingAuthorization(e)?.challenges??[],r=getSupersededAuthorizationChallenges(e,t.challenges);return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:[...n.filter(e=>!r.includes(e)),...t.challenges]}}}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(e.attemptId??e.name));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:i}}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(!(typeof t!=`object`||!t))return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,setPendingAuthorization};
1
+ import{createEveConnectionCallbackRoutePath}from"#protocol/routes.js";import{SessionIdKey}from"#context/keys.js";import{loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";import{createUlid}from"#shared/ulid.js";const AUTHORIZATION_BRAND=`__eveAuthorization`,AUTHORIZATION_PENDING_BRAND=`__eveAuthorizationPending`;function requestAuthorization(e){return{[AUTHORIZATION_BRAND]:!0,challenges:e}}function redactSignalResume(e){return requestAuthorization(e.challenges.map(e=>({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,challenge:e.challenge,hookUrl:e.hookUrl})))}function getAuthorizationResult(e){let t=loadContext().get(PendingAuthorizationResultKey);if(!(!t||t.length===0))return e===void 0?t[0]:t.find(t=>t.name===e)}function consumeAuthorizationResult(e){let t=loadContext(),r=t.get(PendingAuthorizationResultKey);if(!r||r.length===0)return;let i=r.findIndex(t=>t.name===e);if(i===-1)return;let a=r[i],o=r.filter((e,t)=>t!==i);return t.delete(PendingAuthorizationResultKey),o.length>0&&t.set(PendingAuthorizationResultKey,o),a}function getHookUrl(r,i){let a=loadContext(),o=a.get(SessionIdKey),s=a.get(CallbackBaseUrlKey);return!o||!s?void 0:`${s}${createEveConnectionCallbackRoutePath(r,i,authHookToken(o))}`}function createAuthorizationAttempt(e){let t=createUlid(),n=getHookUrl(e,t);return n===void 0?void 0:{attemptId:t,hookUrl:n}}function isAuthorizationSignal(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_BRAND]===!0}function isAuthorizationPendingModelOutput(e){return typeof e!=`object`||!e?!1:e[AUTHORIZATION_PENDING_BRAND]===!0}function authorizationPendingAsJsonObject(e){return{[AUTHORIZATION_PENDING_BRAND]:!0,connections:[...e.connections]}}function modelFacingAuthorizationOutput(e){return authorizationPendingAsJsonObject({connections:e.challenges.map(e=>e.name)})}function authorizationPendingModelText(e){return e.length===0?`Authorization required. Waiting for the user to sign in.`:e.length===1?`Authorization required for ${e[0]}. Waiting for the user to sign in.`:`Authorization required for ${e.join(`, `)}. Waiting for the user to sign in.`}function isPendingAuthorizationToolOutput(e){return isAuthorizationPendingModelOutput(e)||isAuthorizationSignal(e)}function authHookToken(e){return`${e}:auth`}const PendingAuthorizationResultKey=new ContextKey(`eve.pendingAuthorizationResult`),CallbackBaseUrlKey=new ContextKey(`eve.callbackBaseUrl`),PENDING_AUTHORIZATION_KEY=`eve.runtime.pendingAuthorization`;function setPendingAuthorization(e,t){let n=getPendingAuthorization(e)?.challenges??[],r=getSupersededAuthorizationChallenges(e,t.challenges);return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:[...n.filter(e=>!r.includes(e)),...t.challenges]}}}function getSupersededAuthorizationChallenges(e,t){return(getPendingAuthorization(e)?.challenges??[]).filter(e=>t.some(t=>e.name===t.name&&samePrincipal(e.principal,t.principal)))}function samePrincipal(e,t){return e===void 0||t===void 0?e===t:e.type===`app`||t.type===`app`?e.type===t.type:e.id===t.id&&e.issuer===t.issuer}function clearPendingAuthorization(e,t){if(e===void 0||e[PENDING_AUTHORIZATION_KEY]===void 0)return e;if(t!==void 0){if(t.length===0)return e;let n=getPendingAuthorization(e);if(n!==void 0){let r=new Set(t),i=n.challenges.filter(e=>!r.has(e.attemptId??e.name));if(i.length>0)return{...e,[PENDING_AUTHORIZATION_KEY]:{challenges:i}}}}let n={...e};return delete n[PENDING_AUTHORIZATION_KEY],Object.keys(n).length>0?n:void 0}function getPendingAuthorization(e){if(!e)return;let t=e[PENDING_AUTHORIZATION_KEY];if(!(typeof t!=`object`||!t))return t}function hasPendingAuthorization(e){return getPendingAuthorization(e)!==void 0}export{CallbackBaseUrlKey,PendingAuthorizationResultKey,authHookToken,authorizationPendingAsJsonObject,authorizationPendingModelText,clearPendingAuthorization,consumeAuthorizationResult,createAuthorizationAttempt,getAuthorizationResult,getHookUrl,getPendingAuthorization,getSupersededAuthorizationChallenges,hasPendingAuthorization,isAuthorizationPendingModelOutput,isAuthorizationSignal,isPendingAuthorizationToolOutput,modelFacingAuthorizationOutput,redactSignalResume,requestAuthorization,setPendingAuthorization};
@@ -0,0 +1,25 @@
1
+ import type { DeliverHookPayload } from "#channel/types.js";
2
+ import type { AlsContext } from "#context/container.js";
3
+ import type { InstrumentationChannelDeliveryOutcome, InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
4
+ interface ChannelDeliveryStartInstrumentation {
5
+ readonly agentName?: string;
6
+ readonly ctx: AlsContext;
7
+ readonly delivery: DeliverHookPayload;
8
+ readonly hooks: InstrumentationHooks | undefined;
9
+ readonly rootSessionId: string;
10
+ readonly sequence: number;
11
+ readonly sessionId: string;
12
+ readonly turnId: string;
13
+ }
14
+ interface ChannelDeliveryTerminalInstrumentation {
15
+ readonly ctx: AlsContext;
16
+ readonly error?: unknown;
17
+ readonly errorCode?: string;
18
+ readonly hooks: InstrumentationHooks | undefined;
19
+ readonly includeTurn: boolean;
20
+ readonly outcome: InstrumentationChannelDeliveryOutcome;
21
+ }
22
+ export declare function instrumentChannelDelivery(input: ChannelDeliveryStartInstrumentation): Promise<void>;
23
+ export declare function instrumentChannelDelivery(input: ChannelDeliveryTerminalInstrumentation): Promise<void>;
24
+ export declare function channelDeliveryErrorCode(error: unknown): string;
25
+ export {};
@@ -0,0 +1 @@
1
+ import{ActiveChannelDeliveriesKey,ParentTraceContextKey}from"#context/keys.js";import{channelDeliveryIdempotencyKey}from"#harness/instrumentation-lifecycle.js";async function instrumentChannelDelivery(n){if(!(`delivery`in n)){let t=n.ctx.get(ActiveChannelDeliveriesKey);if(t===void 0||n.hooks===void 0)return;let r=`channel.delivery.${n.outcome}`;for(let e of t)await n.hooks.publish({agentName:e.agentName,delivery:e.delivery,error:n.error,errorCode:n.errorCode,idempotencyKey:channelDeliveryIdempotencyKey(e.sessionId,e.delivery.deliveryId),outcome:n.outcome,rootSessionId:e.rootSessionId,sequence:n.includeTurn?e.sequence:void 0,sessionId:e.sessionId,turnId:n.includeTurn?e.turnId:void 0,type:r});n.ctx.delete(ActiveChannelDeliveriesKey);return}if(n.hooks===void 0||n.delivery.deliveryMetadata===void 0)return;let r=[];for(let e of n.delivery.deliveryMetadata){let i=n.delivery.payloads[e.payloadIndex],a={channelKind:e.channelKind,channelName:e.channelName,deliveryId:e.deliveryId,requestId:e.requestId,requestTraceContext:e.requestTraceContext},o=!n.hooks.capturesContent||i===void 0?void 0:projectDeliveryInput(i),s={agentName:n.agentName,delivery:a,rootSessionId:n.rootSessionId,sequence:n.sequence,sessionId:n.sessionId,turnId:n.turnId};r.push(s),await n.hooks.publish({agentName:s.agentName,delivery:a,idempotencyKey:channelDeliveryIdempotencyKey(n.sessionId,a.deliveryId),input:o,parentTraceContext:n.ctx.get(ParentTraceContextKey),rootSessionId:n.rootSessionId,sessionId:n.sessionId,type:`channel.delivery.started`})}r.length>0&&n.ctx.set(ActiveChannelDeliveriesKey,r)}function projectDeliveryInput(e){let t={};return e.context!==void 0&&(t.context=e.context),e.message!==void 0&&(t.message=e.message),e.outputSchema!==void 0&&(t.outputSchema=e.outputSchema),e.inputResponses!==void 0&&(t.inputResponses=e.inputResponses.map(e=>{let t={};return e.optionId!==void 0&&(t.optionId=e.optionId),e.text!==void 0&&(t.text=e.text),t})),t}function channelDeliveryErrorCode(e){if(typeof e==`object`&&e&&`code`in e){let t=e.code;if(typeof t==`string`&&t.length>0)return t}return`CHANNEL_DELIVERY_FAILED`}export{channelDeliveryErrorCode,instrumentChannelDelivery};
@@ -20,6 +20,7 @@ export interface HarnessToolDefinition {
20
20
  readonly approvalKey?: (toolInput: Readonly<Record<string, unknown>>) => string;
21
21
  readonly description: string;
22
22
  readonly execute?: (input: any, options: ToolExecuteOptions) => any;
23
+ readonly frameworkAction?: "load-skill";
23
24
  readonly inputSchema: FlexibleSchema;
24
25
  readonly name: string;
25
26
  readonly approval?: Approval;
@@ -1 +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};
1
+ import{isApprovalRequest}from"#harness/input-request-class.js";import{queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{TOOL_EXECUTION_DENIED_MESSAGE,buildResolvedInputBatch,resolveApprovalOutcome}from"#harness/input-request-resolution.js";import{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches}from"#harness/hitl/pending-input-resolution.js";import{buildQuestionToolResponsePart,findAnsweredQuestionBatches,resolveQuestionBatches}from"#harness/hitl/question-input-requests.js";const APPROVED_TOOLS_KEY=`eve.runtime.hitl.approvedTools`;function hasAnsweredApprovalBatch(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 a=new Set(r.responses.map(e=>e.requestId)),o=new Set(r.approvalBatches.filter(t=>t.requests.every(t=>!isApprovalRequest(t)||a.has(t.requestId)))),l=new Set(findAnsweredQuestionBatches(r.questionBatches,r.responses)),u=r.batches.filter(e=>o.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,resolvedInputs:u.flatMap(e=>{let t=buildResolvedInputBatch(e,r.responses);return t===void 0?[]:[t]}),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 r=buildRejectedActionBatch(e.batch,e.responses);return{messages:e.messages,rejectedActions:r===void 0?void 0:[r],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 buildRejectedActionBatch(t,n){if(t.event===void 0)return;let i=new Map(n.map(e=>[e.requestId,e])),o=[];for(let n of t.requests){if(!isApprovalRequest(n))continue;let{approved:t,reason:s,status:c}=resolveApprovalOutcome(i.get(n.requestId));t||o.push({callId:n.action.callId,isError:!0,kind:`tool-result`,output:{approval:{requestId:n.requestId,status:c},code:`TOOL_EXECUTION_DENIED`,message:s??TOOL_EXECUTION_DENIED_MESSAGE,tool:{result:`not_run`}},toolName:n.action.toolName})}return o.length>0?{event:t.event,results:o}:void 0}function buildApprovalBatchToolResponseParts(e,t){let n=new Map(t.map(e=>[e.requestId,e])),r=[];for(let t of e.requests){let e=n.get(t.requestId);switch(t.kind){case`tool-approval`:r.push(...buildApprovalToolResponseParts(t,e));break;case`question`:r.push(buildQuestionToolResponsePart(t,e));break;case`session-limit`:throw TypeError(`Session-limit pending input batches must contain only session-limit requests.`);default:{let e=t.kind;throw TypeError(`Unhandled pending input request kind: ${String(e)}`)}}}return r}function buildApprovalToolResponseParts(e,t){let{approved:n,reason:r}=resolveApprovalOutcome(t),i=[{approvalId:e.requestId,approved:n,reason:r,type:`tool-approval-response`}];return n||i.push({output:{type:`execution-denied`,reason:r},toolCallId:e.action.callId,toolName:e.action.toolName,type:`tool-result`}),i}export{getApprovedTools,hasAnsweredApprovalBatch,resolveApprovalInputBatches};
@@ -1,6 +1,7 @@
1
1
  import type { ModelMessage } from "ai";
2
2
  import type { RuntimeToolResultActionResult } from "#runtime/actions/types.js";
3
3
  import type { InputResponse } from "#runtime/input/types.js";
4
+ import type { ResolvedInputBatch } from "#harness/input-request-resolution.js";
4
5
  import type { PendingInputBatch, PendingInputBatchEvent } from "#harness/pending-input-batches.js";
5
6
  import type { HarnessSession, StepInput } from "#harness/types.js";
6
7
  export type ToolResponsePart = Extract<ModelMessage, {
@@ -33,6 +34,7 @@ export type ResolvePendingInputResult = {
33
34
  readonly outcome: "resolved" | "continue" | "unresolved";
34
35
  readonly messages: ModelMessage[];
35
36
  readonly rejectedActions?: readonly ResolvedInputActionBatch[];
37
+ readonly resolvedInputs?: readonly ResolvedInputBatch[];
36
38
  readonly session: HarnessSession;
37
39
  };
38
40
  export declare function responsesForBatches(responses: readonly InputResponse[], batches: readonly PendingInputBatch[]): readonly InputResponse[];
@@ -45,6 +47,7 @@ export declare function finishResolvedInput(input: {
45
47
  };
46
48
  readonly messages: ModelMessage[];
47
49
  readonly rejectedActions?: readonly ResolvedInputActionBatch[];
50
+ readonly resolvedInputs?: readonly ResolvedInputBatch[];
48
51
  readonly resolvedStepInput: ResolvedStepInput | undefined;
49
52
  readonly session: HarnessSession;
50
53
  }): ResolvePendingInputResult;
@@ -1 +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};
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,resolvedInputs:t.resolvedInputs,session:queueDeferredStepInput(t.session,n)}:{consumedMessage:t.resolvedStepInput?.messageConsumed,limitContinuation:t.limitContinuation,outcome:`resolved`,messages:t.messages,rejectedActions:t.rejectedActions,resolvedInputs:t.resolvedInputs,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};
@@ -1 +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};
1
+ import{queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{buildResolvedInputBatch}from"#harness/input-request-resolution.js";import{appendResolvedBatchTranscript,compactStepInput,finishResolvedInput,responsesForBatches}from"#harness/hitl/pending-input-resolution.js";function resolveQuestionOnlyInputBatches(r){let s=findAnsweredQuestionBatches(r.batches,r.responses),c=r.batches.filter(e=>!s.includes(e)),l=responsesForBatches(r.responses,c);if(s.length===0){if(r.resolvedStepInput?.message===void 0)return{outcome:`unresolved`,messages:[...r.baseHistory],session:queueDeferredStepInput(r.session,compactStepInput(r.resolvedStepInput))};let a=r.batches.length===1?r.batches[0]:void 0;if(a===void 0){let t=l.length===0?r.session:queueDeferredStepInput(r.session,{inputResponses:l});return{consumedMessage:r.resolvedStepInput.messageConsumed,outcome:`continue`,messages:[...r.baseHistory],session:t}}let o=resolveQuestionBatches({batches:[a],messages:[...r.baseHistory],responses:[]});return{consumedMessage:r.resolvedStepInput.messageConsumed,outcome:`resolved`,messages:o,resolvedInputs:[buildResolvedInputBatch(a,[])].filter(e=>e!==void 0),session:removePendingInputBatches(r.session,[a])}}let u=resolveQuestionBatches({batches:s,messages:[...r.baseHistory],responses:r.responses});return finishResolvedInput({deferTurnInput:r.deferTurnInput,leftoverResponses:l,messages:u,resolvedInputs:s.flatMap(e=>{let t=buildResolvedInputBatch(e,r.responses);return t===void 0?[]:[t]}),resolvedStepInput:r.resolvedStepInput,session:removePendingInputBatches(r.session,s)})}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 n of e.batches){let i=n.requests.map(e=>buildQuestionToolResponsePart(e,t.get(e.requestId)));appendResolvedBatchTranscript(e.messages,n,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};
@@ -1 +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
+ import{isSessionLimitContinuationRequest,resolveSessionLimitContinuation}from"#harness/session-limit-continuation.js";import{getPendingInputBatches,queueDeferredStepInput,removePendingInputBatches}from"#harness/pending-input-batches.js";import{buildResolvedInputBatch}from"#harness/input-request-resolution.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,resolvedInputs:[buildResolvedInputBatch(n.pendingBatch,n.responses)].filter(e=>e!==void 0),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 +1 @@
1
- import{boolean,literal,object,string,unknown}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{createRuntimeToolCallActionFromToolCall}from"#harness/input-requests.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";const ToolCallDescriptorSchema=object({input:unknown(),toolCallId:string(),toolName:string()}),PersistedToolCallSchema=ToolCallDescriptorSchema.extend({type:literal(`tool-call`)}),ToolApprovalRequestSchema=object({approvalId:string(),isAutomatic:boolean().optional().catch(void 0),toolCall:ToolCallDescriptorSchema.optional().catch(void 0),toolCallId:string().optional().catch(void 0),type:literal(`tool-approval-request`)});function extractQuestionInputRequests(e){return extractQuestionRequests(e)}function extractQuestionRequests(e){let t=[];for(let n of e.toolCalls){if(n.toolName!==ASK_QUESTION_TOOL_NAME||e.excludedCallIds.has(n.toolCallId))continue;let r=createRuntimeToolCallActionFromToolCall({toolCall:n}),i=r.input,s={action:r,display:`text`,kind:`question`,prompt:String(i.prompt),requestId:r.callId};i.allowFreeform!==void 0&&(s.allowFreeform=i.allowFreeform),i.options!==void 0&&(s.options=i.options,s.display=`select`),t.push(s)}return t}function extractToolApprovalInputRequests(e){return extractApprovalRequests(e)}function extractApprovalRequests(e){let t=[],n=new Map;for(let t of e.content){let e=PersistedToolCallSchema.safeParse(t);e.success&&n.set(e.data.toolCallId,e.data)}for(let r of e.content){let i=ToolApprovalRequestSchema.safeParse(r);if(!i.success)continue;let o=i.data;if(e.includedRequestIds!==void 0&&!e.includedRequestIds.has(o.approvalId)||o.isAutomatic===!0)continue;let s=o.toolCall??(o.toolCallId===void 0?void 0:n.get(o.toolCallId));s!==void 0&&(e.excludedCallIds?.has(s.toolCallId)||t.push({action:createRuntimeToolCallActionFromToolCall({toolCall:s}),allowFreeform:!1,display:`confirmation`,kind:`tool-approval`,options:[{id:`approve`,label:`Approve`},{id:`cancel`,label:`Cancel`}],prompt:`Approve tool call: ${s.toolName}`,requestId:o.approvalId}))}return t}function extractHistoricalInputRequests(e){let t=new Map;for(let n=e.history.length-1;n>=0;--n){let r=e.history[n];if(r?.role!==`assistant`||!Array.isArray(r.content))continue;let i=r.content.flatMap(t=>{let n=PersistedToolCallSchema.safeParse(t);return n.success&&e.requestIds.has(n.data.toolCallId)?[n.data]:[]}),a=[...extractQuestionRequests({excludedCallIds:new Set,toolCalls:i}),...extractApprovalRequests({content:r.content,includedRequestIds:e.requestIds})];for(let n of a)!e.requestIds.has(n.requestId)||t.has(n.requestId)||t.set(n.requestId,n);if(t.size===e.requestIds.size)break}return t}export{extractHistoricalInputRequests,extractQuestionInputRequests,extractToolApprovalInputRequests};
1
+ import{boolean,literal,object,string,unknown}from"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/schemas.js";import"../node_modules/.pnpm/zod@4.4.3/node_modules/zod/index.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{createRuntimeToolCallActionFromToolCall}from"#harness/tool-call-action.js";const ToolCallDescriptorSchema=object({input:unknown(),toolCallId:string(),toolName:string()}),PersistedToolCallSchema=ToolCallDescriptorSchema.extend({type:literal(`tool-call`)}),ToolApprovalRequestSchema=object({approvalId:string(),isAutomatic:boolean().optional().catch(void 0),toolCall:ToolCallDescriptorSchema.optional().catch(void 0),toolCallId:string().optional().catch(void 0),type:literal(`tool-approval-request`)});function extractQuestionInputRequests(e){return extractQuestionRequests(e)}function extractQuestionRequests(e){let t=[];for(let n of e.toolCalls){if(n.toolName!==ASK_QUESTION_TOOL_NAME||e.excludedCallIds.has(n.toolCallId))continue;let r=createRuntimeToolCallActionFromToolCall({toolCall:n}),i=r.input,o={action:r,display:`text`,kind:`question`,prompt:String(i.prompt),requestId:r.callId};i.allowFreeform!==void 0&&(o.allowFreeform=i.allowFreeform),i.options!==void 0&&(o.options=i.options,o.display=`select`),t.push(o)}return t}function extractToolApprovalInputRequests(e){return extractApprovalRequests(e)}function extractApprovalRequests(e){let t=[],n=new Map;for(let t of e.content){let e=PersistedToolCallSchema.safeParse(t);e.success&&n.set(e.data.toolCallId,e.data)}for(let r of e.content){let i=ToolApprovalRequestSchema.safeParse(r);if(!i.success)continue;let a=i.data;if(e.includedRequestIds!==void 0&&!e.includedRequestIds.has(a.approvalId)||a.isAutomatic===!0)continue;let o=a.toolCall??(a.toolCallId===void 0?void 0:n.get(a.toolCallId));o!==void 0&&(e.excludedCallIds?.has(o.toolCallId)||t.push({action:createRuntimeToolCallActionFromToolCall({toolCall:o}),allowFreeform:!1,display:`confirmation`,kind:`tool-approval`,options:[{id:`approve`,label:`Approve`},{id:`cancel`,label:`Cancel`}],prompt:`Approve tool call: ${o.toolName}`,requestId:a.approvalId}))}return t}function extractHistoricalInputRequests(e){let t=new Map;for(let n=e.history.length-1;n>=0;--n){let r=e.history[n];if(r?.role!==`assistant`||!Array.isArray(r.content))continue;let i=r.content.flatMap(t=>{let n=PersistedToolCallSchema.safeParse(t);return n.success&&e.requestIds.has(n.data.toolCallId)?[n.data]:[]}),a=[...extractQuestionRequests({excludedCallIds:new Set,toolCalls:i}),...extractApprovalRequests({content:r.content,includedRequestIds:e.requestIds})];for(let n of a)!e.requestIds.has(n.requestId)||t.has(n.requestId)||t.set(n.requestId,n);if(t.size===e.requestIds.size)break}return t}export{extractHistoricalInputRequests,extractQuestionInputRequests,extractToolApprovalInputRequests};
@@ -0,0 +1,22 @@
1
+ import type { PendingInputBatchEvent } from "#harness/pending-input-batches.js";
2
+ import type { InputRequest, InputResponse } from "#runtime/input/types.js";
3
+ export declare const TOOL_EXECUTION_DENIED_MESSAGE = "Tool execution was denied.";
4
+ type ApprovalTerminalStatus = "approved" | "denied" | "ignored" | "invalid";
5
+ export interface ResolvedInputBatch {
6
+ readonly event: PendingInputBatchEvent;
7
+ readonly inputs: readonly {
8
+ readonly outcome: "answered" | ApprovalTerminalStatus;
9
+ readonly request: InputRequest;
10
+ readonly response?: InputResponse;
11
+ }[];
12
+ }
13
+ export declare function buildResolvedInputBatch(batch: {
14
+ readonly event?: PendingInputBatchEvent;
15
+ readonly requests: readonly InputRequest[];
16
+ }, responses: readonly InputResponse[]): ResolvedInputBatch | undefined;
17
+ export declare function resolveApprovalOutcome(response: InputResponse | undefined): {
18
+ readonly approved: boolean;
19
+ readonly reason: string | undefined;
20
+ readonly status: ApprovalTerminalStatus;
21
+ };
22
+ export {};
@@ -0,0 +1 @@
1
+ import{isApprovalRequest}from"#harness/input-request-class.js";const TOOL_EXECUTION_DENIED_MESSAGE=`Tool execution was denied.`;function buildResolvedInputBatch(t,n){if(t.event===void 0)return;let r=new Map(n.map(e=>[e.requestId,e]));return{event:t.event,inputs:t.requests.map(t=>{let n=r.get(t.requestId);return{outcome:isApprovalRequest(t)?resolveApprovalOutcome(n).status:n===void 0?`ignored`:`answered`,request:t,response:n}})}}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`||e.optionId===`deny`?{approved:!1,reason:TOOL_EXECUTION_DENIED_MESSAGE,status:`denied`}:{approved:!1,reason:`Invalid approval response.`,status:`invalid`}}export{TOOL_EXECUTION_DENIED_MESSAGE,buildResolvedInputBatch,resolveApprovalOutcome};
@@ -8,6 +8,7 @@ import { clearPendingSessionLimitPrompt } from "#harness/hitl/session-limit-inpu
8
8
  import type { HarnessSession, StepInput } from "#harness/types.js";
9
9
  export { getApprovedTools, clearPendingSessionLimitPrompt };
10
10
  export type { RejectedActionBatch };
11
+ export type { ResolvedInputBatch } from "#harness/input-request-resolution.js";
11
12
  export { appendPendingInputBatch, consumeDeferredStepInput, getPendingInputRequestIds, hasDeferredStepInput, hasPendingInputBatch, } from "#harness/pending-input-batches.js";
12
13
  /** Returns true when the step input carries user-facing turn input. */
13
14
  export declare function hasStepInput(input?: StepInput): boolean;
@@ -1 +1 @@
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};
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),o=r.kind===`session-limit`?r.batch:n.length===1?n[0]:void 0,s=o===void 0?e.stepInput:resolveTextMessageInput(o,e.stepInput),c=canonicalizeInputResponses(s?.inputResponses??[]);if(r.kind===`approval`&&e.deferMessagesWhileApprovalsPending===!0&&s?.message!==void 0&&!hasAnsweredApprovalBatch(r.approvalBatches,c))return{deferredMessage:!0,outcome:`unresolved`,messages:t,session:queueDeferredStepInput(e.session,compactStepInput(s))};if(c.length===0&&s?.message===void 0){let n=compactStepInput(s);return{outcome:`unresolved`,messages:t,session:n.context!==void 0||n.outputSchema!==void 0?queueDeferredStepInput(e.session,n):e.session}}let l={baseHistory:t,batches:n,deferTurnInput:i,resolvedStepInput:s,responses:c,session:e.session};switch(r.kind){case`session-limit`:return resolveSessionLimitInput({...l,pendingBatch:r.batch});case`approval`:return resolveApprovalInputBatches({...l,approvalBatches:r.approvalBatches,questionBatches:r.questionBatches,resolveApprovalKey:e.resolveApprovalKey});case`question`:return resolveQuestionOnlyInputBatches(l)}}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=new Set(t.responseAuthRequiredRequestIds??[]),a=t.requests.filter(e=>!i.has(e.requestId)),o=resolveTextToResponses(n.message,a);return o.length===0?n:compactStepInput({...n,inputResponses:[...n.inputResponses??[],...o],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};
@@ -1,14 +1,19 @@
1
- import type { InstrumentationDefinition, InstrumentationSetupContext } from "#public/instrumentation/index.js";
1
+ import type { InstrumentationDefinition } from "#public/instrumentation/index.js";
2
2
  /**
3
- * Registers the authored instrumentation config and invokes its `setup`
4
- * callback with the resolved agent name.
3
+ * Registers the authored instrumentation config and awaits its `setup`
4
+ * callback.
5
5
  *
6
6
  * Called once by the generated instrumentation Nitro plugin at server
7
7
  * startup. Subsequent calls overwrite the previous value.
8
8
  *
9
+ * The store write lands before `setup` runs so a synchronous caller sees the
10
+ * config without waiting on the returned promise.
11
+ *
9
12
  * @internal — not part of the public API.
10
13
  */
11
- export declare function registerInstrumentationConfig(config: InstrumentationDefinition, context: InstrumentationSetupContext): void;
14
+ export declare function registerInstrumentationConfig(config: InstrumentationDefinition, input: {
15
+ readonly agentName: string;
16
+ }): Promise<void>;
12
17
  /**
13
18
  * Returns the registered instrumentation config, or `undefined` when no
14
19
  * `defineInstrumentation` export was provided.
@@ -1 +1 @@
1
- const INSTRUMENTATION_CONFIG_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-config`),globalContainer=globalThis;function registerInstrumentationConfig(e,t){e.setup!==void 0&&e.setup(t),globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]=e}function getInstrumentationConfig(){return globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]}export{getInstrumentationConfig,registerInstrumentationConfig};
1
+ import{registerInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{createInstrumentationHooks}from"#harness/instrumentation-lifecycle.js";import{createInstrumentationSetupContext}from"#harness/instrumentation-setup-context.js";const INSTRUMENTATION_CONFIG_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-config`),globalContainer=globalThis;async function registerInstrumentationConfig(n,r){globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]=n,registerInstrumentationRuntime({forceFlush:async()=>void 0,hooks:createInstrumentationHooks([]),otelSettings:{functionId:n.functionId,recordInputs:n.recordInputs,recordOutputs:n.recordOutputs,traceChannelRequests:n.traceChannelRequests===!0},runInContext:(e,t)=>t(),shutdown:async()=>void 0}),await n.setup?.(createInstrumentationSetupContext(r.agentName))}function getInstrumentationConfig(){return globalContainer[INSTRUMENTATION_CONFIG_GLOBAL_KEY]}export{getInstrumentationConfig,registerInstrumentationConfig};
@@ -0,0 +1,5 @@
1
+ import type { InstrumentationEvent } from "#harness/instrumentation-lifecycle.js";
2
+ /** Returns an immutable event projection with conversation content removed. */
3
+ export declare function withoutInstrumentationContent(event: InstrumentationEvent): InstrumentationEvent;
4
+ /** Provider metadata fields that describe cost/identity rather than content. */
5
+ export declare function structuralProviderMetadata(metadata: Readonly<Record<string, unknown>>): Readonly<Record<string, unknown>>;
@@ -0,0 +1 @@
1
+ function withoutInstrumentationContent(e){switch(e.type){case`channel.delivery.started`:return Object.freeze({...e,input:void 0});case`action.started`:return Object.freeze({...e,input:void 0});case`action.completed`:return Object.freeze({...e,output:Object.freeze({type:e.output.type})});case`input.requested`:return Object.freeze({...e,request:void 0});case`input.resolved`:return Object.freeze({...e,error:void 0,response:void 0});case`tool.call.started`:return Object.freeze({...e,input:void 0});case`tool.call.completed`:return Object.freeze({...e,output:Object.freeze({type:e.output.type})});case`model.call.started`:return Object.freeze({...e,input:void 0});case`model.call.completed`:return Object.freeze({...e,content:void 0});case`step.attempt.metadata`:return Object.freeze({...e,providerMetadata:structuralProviderMetadata(e.providerMetadata)});case`action.failed`:case`model.call.failed`:case`session.failed`:case`step.attempt.failed`:case`tool.call.failed`:case`turn.failed`:case`channel.delivery.failed`:return Object.freeze({...e,error:void 0});default:return e}}function structuralProviderMetadata(e){let t=e.gateway;if(typeof t!=`object`||!t||Array.isArray(t))return Object.freeze({});let n=t,r={};for(let e of[`cost`,`generationId`]){let t=n[e];(typeof t==`string`||typeof t==`number`)&&(r[e]=t)}return Object.freeze(Object.keys(r).length===0?{}:{gateway:Object.freeze(r)})}export{structuralProviderMetadata,withoutInstrumentationContent};
@@ -0,0 +1,2 @@
1
+ import type { CreateInstrumentationHooksOptions, InstrumentationHooks, InstrumentationHooksInput } from "#harness/instrumentation-lifecycle.js";
2
+ export declare function createInstrumentationDispatcher(input: InstrumentationHooksInput, options: CreateInstrumentationHooksOptions): InstrumentationHooks;
@@ -0,0 +1 @@
1
+ import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#harness/instrumentation-state.js";import{withoutInstrumentationContent}from"#harness/instrumentation-content.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=new WeakMap,a=[...r.serialBefore,...r.parallel,...r.serialAfter].some(e=>e.capture===`content`),publish=async e=>{let t=snapshotInstrumentationEvent(e,i),a=t.type===`session.completed`||t.type===`session.failed`,o=t.type===`turn.cancelled`||t.type===`turn.failed`;if(a||o){let e=takeInstrumentationActionScopes(t.sessionId,o?t.turnId:void 0),n=terminalActionFailure(t);for(let t of e)await publish({...n,idempotencyKey:t.idempotencyKey,scope:t.scope,type:`action.failed`})}let s,visibleEvent=e=>e.capture===`content`?t:(s??=withoutInstrumentationContent(t),s);try{try{for(let e of r.serialBefore)await dispatchToProvider(e,t,n,()=>visibleEvent(e));if(r.parallel.length===1){let e=r.parallel[0];await dispatchToProvider(e,t,n,()=>visibleEvent(e))}else if(r.parallel.length>1){let e=(await Promise.allSettled(r.parallel.map(e=>dispatchToProvider(e,t,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(e!==void 0)throw e.reason}}finally{for(let e of r.serialAfter)await dispatchToProvider(e,t,n,()=>visibleEvent(e))}}finally{releaseTerminalState(t)}};return{capturesContent:a,publish}}function snapshotInstrumentationEvent(e,t){return snapshotPlainValue(e,t)}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,a,o,s){let c=a.type.endsWith(`.started`)||a.type===`input.requested`,l=stateOwner(a),u=e.name,d=e.stateNamespace??u;if(isInstrumentationStateAbandoned(d,a.idempotencyKey))return;let f=e.events?.[a.type];if(f===void 0)return;let p=instrumentationStateSlot(d,a.idempotencyKey,l);try{await withTimeout(()=>f(s(),{state:p}),o,()=>{p.revoke(),c&&abandonInstrumentationState(d,a.idempotencyKey,l)})||log.warn(`instrumentation provider timed out`,{boundary:a.type,provider:u,timeoutMs:o})}catch(e){log.warn(`instrumentation provider failed`,{boundary:a.type,error:formatError(e),provider:u})}finally{p.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`action.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`tool.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};