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 @@
1
+ import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{getInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{createInstrumentationSetupContext}from"#harness/instrumentation-setup-context.js";import{DEVELOPMENT_WORKER_APP_ROOT_ENV}from"#internal/workflow/development-world-protocol.js";import{agentRuns,localTraces}from"#public/instrumentation/otel.js";import{installInstrumentationRuntime}from"#tracing/install-instrumentation-runtime.js";import{collectOtelPipeline}from"#tracing/otel-declaration.js";import{isInstrumentationDisabled,isInstrumentationProvider}from"#public/instrumentation/provider.js";const INSTRUMENTATION_PROVIDERS_GLOBAL_KEY=Symbol.for(`eve.harness-instrumentation-providers`),globalContainer=globalThis;function providerRegistry(){let e=globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY];if(e!==void 0)return e;let t=new Map;return globalContainer[INSTRUMENTATION_PROVIDERS_GLOBAL_KEY]=t,t}function seedInstrumentationProviders(){let e=providerRegistry();process.env.VERCEL_ENV===`production`&&e.set(`agent-runs`,agentRuns()),process.env[DEVELOPMENT_WORKER_APP_ROOT_ENV]!==void 0&&e.set(`local`,localTraces())}async function registerInstrumentationProvider(e){if(isInstrumentationDisabled(e.value)){providerRegistry().delete(e.slot);return}if(!isInstrumentationProvider(e.value))throw Error(`The default export of "instrumentation/${e.slot}" is not an instrumentation provider. Return the result of \`defineInstrumentation\` or \`disableInstrumentation\` from it.`);providerRegistry().set(e.slot,e.value),await e.value.setup?.(createInstrumentationSetupContext(e.agentName))}function getInstrumentationProviders(){return[...providerRegistry()].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({provider:t,slot:e}))}function finalizeInstrumentationProviders(t){let n=getInstrumentationProviders();return installInstrumentationRuntime({collected:collectOtelPipeline(n.map(e=>e.provider)),frameworkVersion:resolveInstalledPackageInfo().version,providers:n.map(toProviderDefinition),serviceName:t.serviceName})}async function shutdownInstrumentationProviders(){await getInstrumentationRuntime()?.shutdown()}function toProviderDefinition(e){return{capture:e.provider.capture,events:e.provider.events,flush:e.provider.flush,name:e.slot,shutdown:e.provider.shutdown,stateNamespace:`authored:${e.slot}`}}export{finalizeInstrumentationProviders,getInstrumentationProviders,registerInstrumentationProvider,seedInstrumentationProviders,shutdownInstrumentationProviders};
@@ -1,9 +1,12 @@
1
1
  import type { InstrumentationContextRunner, InstrumentationHooks } from "#harness/instrumentation-lifecycle.js";
2
+ import type { OtelHarnessSettings } from "#tracing/otel-declaration.js";
2
3
  /** Process-wide runtime consumed by every harness execution surface. */
3
4
  export interface InstrumentationRuntime {
4
5
  readonly forceFlush: () => Promise<void>;
5
6
  readonly hooks: InstrumentationHooks;
7
+ otelSettings: OtelHarnessSettings | undefined;
6
8
  readonly runInContext: InstrumentationContextRunner;
9
+ readonly shutdown: () => Promise<void>;
7
10
  }
8
11
  /** Instrumentation capabilities consumed inside one harness execution. */
9
12
  export type HarnessInstrumentation = Pick<InstrumentationRuntime, "hooks" | "runInContext">;
@@ -1 +1 @@
1
- const INSTRUMENTATION_RUNTIME_KEY=Symbol.for(`eve.instrumentation-runtime`),globalRuntime=globalThis;function registerInstrumentationRuntime(e){let t=globalRuntime[INSTRUMENTATION_RUNTIME_KEY];return t===void 0?(globalRuntime[INSTRUMENTATION_RUNTIME_KEY]=e,e):t}function getInstrumentationRuntime(){return globalRuntime[INSTRUMENTATION_RUNTIME_KEY]}export{getInstrumentationRuntime,registerInstrumentationRuntime};
1
+ const INSTRUMENTATION_RUNTIME_KEY=Symbol.for(`eve.instrumentation-runtime`),globalRuntime=globalThis;function registerInstrumentationRuntime(e){let t=globalRuntime[INSTRUMENTATION_RUNTIME_KEY];return t===void 0?(globalRuntime[INSTRUMENTATION_RUNTIME_KEY]=e,e):(t.otelSettings=e.otelSettings,t)}function getInstrumentationRuntime(){return globalRuntime[INSTRUMENTATION_RUNTIME_KEY]}export{getInstrumentationRuntime,registerInstrumentationRuntime};
@@ -0,0 +1,12 @@
1
+ import type { ProviderSetupContext } from "#public/instrumentation/provider.js";
2
+ /**
3
+ * Builds the context handed to an authored `setup` at server startup.
4
+ *
5
+ * Shared by both layouts so the two cannot drift: a divergent context type
6
+ * would leave `defineInstrumentation`'s union without a contextual signature
7
+ * for `setup`, silently making every authored `setup(context)` parameter an
8
+ * implicit `any`.
9
+ *
10
+ * @internal — not part of the public API.
11
+ */
12
+ export declare function createInstrumentationSetupContext(agentName: string): ProviderSetupContext;
@@ -0,0 +1 @@
1
+ import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{isEveDevEnvironment,resolveEveEvaluationRunId}from"#internal/application/dev-environment.js";function createInstrumentationSetupContext(e){let t=resolveEveEvaluationRunId();return{agentName:e,environment:resolveInstrumentationEnvironment(),evaluation:t===void 0?void 0:{runId:t},frameworkVersion:resolveInstalledPackageInfo().version}}function resolveInstrumentationEnvironment(){return isEveDevEnvironment()||process.env.VERCEL_ENV===`development`?`development`:process.env.VERCEL_ENV===`preview`?`preview`:`production`}export{createInstrumentationSetupContext};
@@ -0,0 +1,59 @@
1
+ import { type JsonValue } from "#shared/json.js";
2
+ import type { InstrumentationAttemptScope } from "#harness/instrumentation-lifecycle.js";
3
+ export interface InstrumentationStateOwner {
4
+ readonly attemptId?: string;
5
+ readonly sessionId?: string;
6
+ readonly turnId?: string;
7
+ }
8
+ /**
9
+ * Keeps provider state from an interrupted step's context changes.
10
+ *
11
+ * A cancelled step's context writes are discarded wholesale. Provider state has
12
+ * to be an exception for the same reason eve's own trace state is: the
13
+ * cancellation epilogue still publishes `turn.cancelled`, and a provider that
14
+ * staged something at the start of the operation being cancelled needs it there
15
+ * to close cleanly. Without this, the terminal arrives with an empty slot and
16
+ * whatever the provider opened is never closed.
17
+ */
18
+ export declare function preserveSerializedInstrumentationState(original: Record<string, unknown>, interrupted: Record<string, unknown>): Record<string, unknown>;
19
+ /** One provider's view of its own state for one operation. */
20
+ export interface InstrumentationStateSlot {
21
+ get(): JsonValue | undefined;
22
+ /** Stages a value; `undefined` releases the slot. */
23
+ set(value: JsonValue | undefined): void;
24
+ }
25
+ export interface InstrumentationStateLease extends InstrumentationStateSlot {
26
+ /** Makes later reads empty and writes no-ops. */
27
+ revoke(): void;
28
+ }
29
+ /**
30
+ * Scopes state to one provider and one operation.
31
+ *
32
+ * Two providers handling the same event get separate slots, and the same
33
+ * provider gets a separate slot per operation, so neither can read or clobber
34
+ * the other's.
35
+ */
36
+ export declare function instrumentationStateSlot(provider: string, idempotencyKey: string, owner?: InstrumentationStateOwner): InstrumentationStateLease;
37
+ /** Persists that a provider's start handler timed out for this operation. */
38
+ export declare function abandonInstrumentationState(provider: string, idempotencyKey: string, owner?: InstrumentationStateOwner): void;
39
+ export declare function isInstrumentationStateAbandoned(provider: string, idempotencyKey: string): boolean;
40
+ /** Releases one operation across namespaces, including providers no longer registered. */
41
+ export declare function releaseAllInstrumentationState(idempotencyKey: string): void;
42
+ /** Releases attempt-owned children across namespaces when their terminals are omitted. */
43
+ export declare function releaseAllInstrumentationAttemptState(attemptId: string): void;
44
+ export declare function releaseAllInstrumentationTurnState(sessionId: string, turnId?: string): void;
45
+ /** Remembers where a durable runtime action originated. */
46
+ export declare function rememberInstrumentationActionScope(idempotencyKey: string, scope: InstrumentationAttemptScope): void;
47
+ /** Remembers where a durable input request originated. */
48
+ export declare function rememberInstrumentationInputScope(idempotencyKey: string, scope: InstrumentationAttemptScope): void;
49
+ /** Reads and releases one durable input request's originating scope. */
50
+ export declare function takeInstrumentationInputScope(idempotencyKey: string): InstrumentationAttemptScope | undefined;
51
+ export interface InstrumentationActionCorrelation {
52
+ readonly idempotencyKey: string;
53
+ readonly scope: InstrumentationAttemptScope;
54
+ }
55
+ export declare function findInstrumentationActionScopeForCall(sessionId: string, callId: string): InstrumentationActionCorrelation | undefined;
56
+ /** Reads and releases one durable runtime action's originating scope. */
57
+ export declare function takeInstrumentationActionScopeForCall(sessionId: string, callId: string): InstrumentationActionCorrelation | undefined;
58
+ /** Takes every still-open action owned by one session or turn. */
59
+ export declare function takeInstrumentationActionScopes(sessionId: string, turnId?: string): readonly InstrumentationActionCorrelation[];
@@ -0,0 +1 @@
1
+ import{ActiveChannelDeliveriesKey}from"#context/keys.js";import{parseJsonValue}from"#shared/json.js";import{contextStorage,loadContext}from"#context/container.js";import{ContextKey}from"#context/key.js";const InstrumentationStateKey=new ContextKey(`eve.harness.instrumentationState`,{codec:{deserialize:deserializeState,serialize:e=>e}}),InstrumentationActionScopeKey=new ContextKey(`eve.harness.instrumentationActionScopes`,{codec:{deserialize:deserializeScopes,serialize:e=>e}}),InstrumentationInputScopeKey=new ContextKey(`eve.harness.instrumentationInputScopes`,{codec:{deserialize:deserializeScopes,serialize:e=>e}});function preserveSerializedInstrumentationState(t,n){let r=t;for(let t of[InstrumentationStateKey,InstrumentationActionScopeKey,InstrumentationInputScopeKey,ActiveChannelDeliveriesKey]){let e=n[t.name];e!==void 0&&(r={...r,[t.name]:e})}return r}function instrumentationStateSlot(e,r,i={}){let o=stateKey(e,r),s=!0;return{get:()=>{if(!s)return;let e=contextStorage.getStore()?.get(InstrumentationStateKey)?.[o]?.value;return e===void 0?void 0:cloneAndFreezeJson(e)},revoke:()=>{s=!1},set:e=>{if(!s)return;let n=e===void 0?void 0:cloneAndFreezeJson(parseJsonValue(e));writeInstrumentationState(e=>{if(n===void 0)return writeSlot(e,o,void 0);let t=e[o],r={value:n};return t?.abandoned===!0&&(r.abandoned=!0),assignOwner(r,i),writeSlot(e,o,r)})}}}function abandonInstrumentationState(e,t,n={}){let r=stateKey(e,t);writeInstrumentationState(e=>{let t=e[r],i={attemptId:n.attemptId??t?.attemptId,sessionId:n.sessionId??t?.sessionId,turnId:n.turnId??t?.turnId},a={abandoned:!0};return assignOwner(a,i),t?.value!==void 0&&(a.value=t.value),writeSlot(e,r,a)})}function isInstrumentationStateAbandoned(e,t){return contextStorage.getStore()?.get(InstrumentationStateKey)?.[stateKey(e,t)]?.abandoned===!0}function releaseAllInstrumentationState(e){let t=`\0${e}`;releaseMatchingInstrumentationState(e=>e.endsWith(t))}function releaseAllInstrumentationAttemptState(e){releaseMatchingInstrumentationState((t,n)=>n.attemptId===e)}function releaseAllInstrumentationTurnState(e,t){releaseMatchingInstrumentationState((n,r)=>r.sessionId===e&&(t===void 0||r.turnId===t))}function releaseMatchingInstrumentationState(e){let t=contextStorage.getStore()?.get(InstrumentationStateKey);t===void 0||!Object.entries(t).some(([t,n])=>e(t,n))||writeInstrumentationState(t=>{let n={...t};for(let[r,i]of Object.entries(t))e(r,i)&&delete n[r];return n})}function rememberInstrumentationActionScope(e,t){writeContextKey(InstrumentationActionScopeKey,n=>({...n,[e]:t}))}function rememberInstrumentationInputScope(e,t){writeContextKey(InstrumentationInputScopeKey,n=>({...n,[e]:t}))}function takeInstrumentationInputScope(e){let t=contextStorage.getStore()?.get(InstrumentationInputScopeKey)?.[e];if(t!==void 0)return writeContextKey(InstrumentationInputScopeKey,t=>{let n={...t};return delete n[e],n}),t}function findInstrumentationActionScopeForCall(e,t){let r=contextStorage.getStore()?.get(InstrumentationActionScopeKey);if(r!==void 0)for(let n of Object.values(r)){let i=`action:${e}:${n.turnId}:${t}`,a=r[i];if(a!==void 0)return{idempotencyKey:i,scope:a}}}function takeInstrumentationActionScopeForCall(e,t){let n=findInstrumentationActionScopeForCall(e,t);if(n!==void 0)return writeContextKey(InstrumentationActionScopeKey,e=>{let t={...e};return delete t[n.idempotencyKey],t}),n}function takeInstrumentationActionScopes(e,t){let r=contextStorage.getStore()?.get(InstrumentationActionScopeKey);if(r===void 0)return[];let i=Object.entries(r).filter(([,n])=>n.sessionId===e&&(t===void 0||n.turnId===t)).map(([e,t])=>({idempotencyKey:e,scope:t}));if(i.length===0)return[];let a=new Set(i.map(e=>e.idempotencyKey));return writeContextKey(InstrumentationActionScopeKey,e=>{let t={...e};for(let e of a)delete t[e];return t}),i}function writeSlot(e,t,n){if(n===void 0){let n={...e};return delete n[t],n}return{...e,[t]:n}}function writeInstrumentationState(e){writeContextKey(InstrumentationStateKey,e)}function assignOwner(e,t){t.attemptId!==void 0&&(e.attemptId=t.attemptId),t.sessionId!==void 0&&(e.sessionId=t.sessionId),t.turnId!==void 0&&(e.turnId=t.turnId)}function writeContextKey(e,t){contextStorage.getStore()!==void 0&&loadContext().set(e,e=>t(e??{}))}function stateKey(e,t){return`${e}\0${t}`}function deserializeState(e){if(typeof e!=`object`||!e||Array.isArray(e))return{};let t={};for(let[n,r]of Object.entries(e)){if(typeof r!=`object`||!r||Array.isArray(r))continue;let e=r,i=typeof e.attemptId==`string`?e.attemptId:void 0,a=typeof e.sessionId==`string`?e.sessionId:void 0,o=typeof e.turnId==`string`?e.turnId:void 0,s={};e.abandoned===!0&&(s.abandoned=!0),i!==void 0&&(s.attemptId=i),a!==void 0&&(s.sessionId=a),o!==void 0&&(s.turnId=o),e.value!==void 0&&(s.value=cloneAndFreezeJson(e.value)),t[n]=s}return t}function cloneAndFreezeJson(e){if(Array.isArray(e))return Object.freeze(e.map(e=>cloneAndFreezeJson(e)));if(typeof e!=`object`||!e)return e;let t={};for(let[n,r]of Object.entries(e))t[n]=cloneAndFreezeJson(r);return Object.freeze(t)}function deserializeScopes(e){return typeof e!=`object`||!e||Array.isArray(e)?{}:e}export{abandonInstrumentationState,findInstrumentationActionScopeForCall,instrumentationStateSlot,isInstrumentationStateAbandoned,preserveSerializedInstrumentationState,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,rememberInstrumentationActionScope,rememberInstrumentationInputScope,takeInstrumentationActionScopeForCall,takeInstrumentationActionScopes,takeInstrumentationInputScope};
@@ -1,5 +1,5 @@
1
1
  import type { ModelMessage, UserContent } from "ai";
2
- import type { DeliverPayload, SessionAuthContext, TurnCaller } from "#channel/types.js";
2
+ import type { ChannelDeliveryMetadataEntry, DeliverPayload, SessionAuthContext, TurnCaller } from "#channel/types.js";
3
3
  import type { StepInput } from "#harness/types.js";
4
4
  /**
5
5
  * Merges two {@link StepInput} values into one.
@@ -40,6 +40,7 @@ export declare function appendUserContent(input: {
40
40
  interface DeliverLike {
41
41
  readonly auth?: SessionAuthContext | null;
42
42
  readonly caller?: TurnCaller;
43
+ readonly deliveryMetadata?: readonly ChannelDeliveryMetadataEntry[];
43
44
  readonly kind: "deliver";
44
45
  readonly payloads: readonly DeliverPayload[];
45
46
  }
@@ -1 +1 @@
1
- function coalesceTurnInputs(e,t){let n=coalesceInputResponses({a:e.inputResponses,b:t.inputResponses}),r=coalesceMessage({a:e.message,b:t.message}),i=coalesceContext({a:e.context,b:t.context}),a=t.outputSchema??e.outputSchema,o={};return n!==void 0&&(o.inputResponses=n),r!==void 0&&(o.message=r),i!==void 0&&(o.context=i),a!==void 0&&(o.outputSchema=a),o}function normalizeUserContent(e){if(e===void 0)return;if(typeof e==`string`)return e.trim().length>0?e:void 0;let t=e.filter(e=>e.type!==`text`||e.text.trim().length>0);if(t.length!==0)return t.length===e.length?e:t}function resolveAssistantStepText(e,t){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n?.role!==`assistant`)continue;let r=extractMessageText(n);if(r.trim().length>0)return r}return t!==void 0&&t.trim().length>0?t:null}function extractMessageText(e){return typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.flatMap(e=>typeof e==`string`?[e]:`type`in e&&e.type===`text`&&typeof e.text==`string`?[e.text]:[]).join(``):``}function coalesceInputResponses(e){let t=e.a??[],n=e.b??[];if(!(t.length===0&&n.length===0))return[...t,...n]}function coalesceContext(e){let t=e.a??[],n=e.b??[];if(!(t.length===0&&n.length===0))return[...t,...n]}function coalesceMessage(e){let t=normalizeUserContent(e.a),n=normalizeUserContent(e.b);return t===void 0?n:n===void 0?t:appendUserContent({appended:n,existing:t})}function appendUserContent(e){return typeof e.existing==`string`&&typeof e.appended==`string`?`${e.existing}\n\n${e.appended}`:[...toUserContentArray(e.existing),...toUserContentArray(e.appended)]}function toUserContentArray(e){return typeof e==`string`?e.length>0?[{type:`text`,text:e}]:[]:Array.isArray(e)?[...e]:[]}function coalesceDeliveries(e){let[t,...n]=e;if(t===void 0)throw Error(`Cannot coalesce an empty delivery batch.`);let r=t.auth,i=t.caller,a=[...t.payloads];for(let e of n){if(e.auth!==void 0&&(r=e.auth),e.caller!==void 0){if(i!==void 0)throw Error(`Cannot coalesce deliveries from different turns.`);i=e.caller}a.push(...e.payloads)}return{...t,auth:r,caller:i,payloads:a}}export{appendUserContent,coalesceDeliveries,coalesceTurnInputs,normalizeUserContent,resolveAssistantStepText};
1
+ function coalesceTurnInputs(e,t){let n=coalesceInputResponses({a:e.inputResponses,b:t.inputResponses}),r=coalesceMessage({a:e.message,b:t.message}),i=coalesceContext({a:e.context,b:t.context}),a=t.outputSchema??e.outputSchema,o={};return n!==void 0&&(o.inputResponses=n),r!==void 0&&(o.message=r),i!==void 0&&(o.context=i),a!==void 0&&(o.outputSchema=a),o}function normalizeUserContent(e){if(e===void 0)return;if(typeof e==`string`)return e.trim().length>0?e:void 0;let t=e.filter(e=>e.type!==`text`||e.text.trim().length>0);if(t.length!==0)return t.length===e.length?e:t}function resolveAssistantStepText(e,t){for(let t=e.length-1;t>=0;--t){let n=e[t];if(n?.role!==`assistant`)continue;let r=extractMessageText(n);if(r.trim().length>0)return r}return t!==void 0&&t.trim().length>0?t:null}function extractMessageText(e){return typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.flatMap(e=>typeof e==`string`?[e]:`type`in e&&e.type===`text`&&typeof e.text==`string`?[e.text]:[]).join(``):``}function coalesceInputResponses(e){let t=e.a??[],n=e.b??[];if(!(t.length===0&&n.length===0))return[...t,...n]}function coalesceContext(e){let t=e.a??[],n=e.b??[];if(!(t.length===0&&n.length===0))return[...t,...n]}function coalesceMessage(e){let t=normalizeUserContent(e.a),n=normalizeUserContent(e.b);return t===void 0?n:n===void 0?t:appendUserContent({appended:n,existing:t})}function appendUserContent(e){return typeof e.existing==`string`&&typeof e.appended==`string`?`${e.existing}\n\n${e.appended}`:[...toUserContentArray(e.existing),...toUserContentArray(e.appended)]}function toUserContentArray(e){return typeof e==`string`?e.length>0?[{type:`text`,text:e}]:[]:Array.isArray(e)?[...e]:[]}function coalesceDeliveries(e){let[t,...n]=e;if(t===void 0)throw Error(`Cannot coalesce an empty delivery batch.`);let r=t.auth,i=t.caller,a=[...t.payloads],o=[...t.deliveryMetadata??[]];for(let e of n){let t=a.length;if(e.auth!==void 0&&(r=e.auth),e.caller!==void 0){if(i!==void 0)throw Error(`Cannot coalesce deliveries from different turns.`);i=e.caller}a.push(...e.payloads),o.push(...(e.deliveryMetadata??[]).map(e=>({...e,payloadIndex:e.payloadIndex+t})))}return{...t,auth:r,caller:i,deliveryMetadata:o.length===0?void 0:o,payloads:a}}export{appendUserContent,coalesceDeliveries,coalesceTurnInputs,normalizeUserContent,resolveAssistantStepText};
@@ -17,6 +17,7 @@ export interface PendingInputBatchEvent {
17
17
  export interface PendingInputBatch {
18
18
  readonly event?: PendingInputBatchEvent;
19
19
  readonly requests: readonly InputRequest[];
20
+ readonly responseAuthRequiredRequestIds?: readonly string[];
20
21
  readonly responseMessages: readonly ModelMessage[];
21
22
  }
22
23
  /**
@@ -50,6 +51,7 @@ export declare function removePendingInputBatches(session: HarnessSession, batch
50
51
  export declare function appendPendingInputBatch(input: {
51
52
  readonly event?: PendingInputBatchEvent;
52
53
  readonly requests: readonly InputRequest[];
54
+ readonly responseAuthRequiredRequestIds?: readonly string[];
53
55
  readonly responseMessages: readonly ModelMessage[];
54
56
  readonly session: HarnessSession;
55
57
  }): HarnessSession;
@@ -1 +1 @@
1
- import{coalesceTurnInputs}from"#harness/messages.js";const PENDING_INPUT_BATCHES_KEY=`eve.runtime.pendingInputBatches`,LEGACY_PENDING_INPUT_BATCH_KEY=`eve.runtime.pendingInputBatch`,DEFERRED_STEP_INPUT_KEY=`eve.runtime.deferredStepInput`;function hasPendingInputBatch(e){return getPendingInputBatches(e).length>0}function getPendingInputRequestIds(e){return new Set(getPendingInputBatches(e).flatMap(e=>e.requests.map(e=>e.requestId)))}function coercePendingInputBatch(e){if(typeof e!=`object`||!e)return;let t=e;if(!(!Array.isArray(t.requests)||!Array.isArray(t.responseMessages)))return t}function getPendingInputBatches(e){let 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};
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,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,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,responseAuthRequiredRequestIds:e.responseAuthRequiredRequestIds,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};
@@ -0,0 +1,3 @@
1
+ import { ContextKey } from "#context/key.js";
2
+ /** Per-call acceptance times ferried through one internal turn step. */
3
+ export declare const RuntimeActionSettlementTimesKey: ContextKey<Readonly<Record<string, number>>>;
@@ -0,0 +1 @@
1
+ import{ContextKey}from"#context/key.js";const RuntimeActionSettlementTimesKey=new ContextKey(`eve.harness.runtimeActionSettlementTimes`);export{RuntimeActionSettlementTimesKey};
@@ -1 +1 @@
1
- import{createActionResultEvent}from"#protocol/message.js";import{parseJsonObject}from"#shared/json.js";import{settleAgentTurn}from"#harness/handles/transitions.js";import{clearProxyInputRequestsForChild}from"#harness/proxy-input-requests.js";import{findRunningAgentHandle,isResultBoundToRunningHandle}from"#harness/handles/query.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";import{accumulateSessionUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";const PENDING_RUNTIME_ACTION_BATCH_KEY=`eve.runtime.pendingActionBatch`;function readSubagentResultOutcome(e){return e.origin===`child`?e.outcome:void 0}function getPendingRuntimeActionBatch(e){let t=e?.[PENDING_RUNTIME_ACTION_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.actions)||!Array.isArray(n.responseMessages)||typeof n.event!=`object`||n.event===null))return n}function hasPendingRuntimeActionBatch(e){return getPendingRuntimeActionBatch(e)!==void 0}function clearPendingRuntimeActionBatch(e){if(e.state?.[PENDING_RUNTIME_ACTION_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_RUNTIME_ACTION_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function setPendingRuntimeActionBatch(e){let t={...e.session.state};return t[PENDING_RUNTIME_ACTION_BATCH_KEY]={actions:[...e.actions],event:e.event,responseMessages:[...e.responseMessages]},{...e.session,state:t}}function resolveReadyRuntimeActionResults(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t!==void 0)return resolveRuntimeActionResultsForBatch({batch:t,results:e.results,state:e.session.state})}function resolveRuntimeActionResultsForBatch(e){return resolveRuntimeActionResultsForKeys({pendingKeys:e.batch.actions.map(e=>getRuntimeActionRequestKey(e)),results:e.results.filter(t=>isResultBoundToRunningHandle(e.state,t))})}async function resolvePendingRuntimeActions(t){let i=getPendingRuntimeActionBatch(t.session.state);if(i===void 0)return{messages:[...t.session.history],outcome:`continue`,session:t.session};let a=resolveReadyRuntimeActionResults({results:t.stepInput?.runtimeActionResults??[],session:t.session});if(a===void 0)return{messages:[...t.session.history],outcome:`unresolved`,session:t.session};if(t.emit!==void 0)for(let n of a)n.kind===`subagent-result`&&n.isError!==!0&&await t.emit({data:{callId:n.callId,output:typeof n.output==`string`?n.output:JSON.stringify(n.output),subagentName:n.subagentName},type:`subagent.completed`}),await t.emit(createActionResultEvent({result:n,sequence:i.event.sequence,stepIndex:i.event.stepIndex,turnId:i.event.turnId}));let o=t.session;for(let e of a){if(e.kind!==`subagent-result`||e.origin!==`child`)continue;let t=findRunningAgentHandle(o.state,{callId:e.callId});if(t===void 0)continue;let i=readSubagentResultOutcome(e);if(i===void 0)continue;i.kind===`terminal`&&`continuationToken`in t.address&&(o=clearProxyInputRequestsForChild(o,t.address.continuationToken));let a=settleAgentTurn(o,{operationId:t.operation.id,outcome:i});a.kind===`settled`&&(o=a.session)}let s={...o.state};delete s[PENDING_RUNTIME_ACTION_BATCH_KEY],o={...o,state:Object.keys(s).length>0?s:void 0};for(let e of a){if(e.kind!==`subagent-result`)continue;let t=readSubagentResultOutcome(e);t!==void 0&&(o=setTurnUsageState(o,accumulateSessionUsage({previous:getTurnUsageState(o.state),usage:t.usageDelta})))}let c=a.map(e=>{switch(e.kind){case`load-skill-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:`load_skill`,type:`tool-result`};case`subagent-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.subagentName,type:`tool-result`};case`tool-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.toolName,type:`tool-result`}}throw Error(`Unsupported runtime action result kind "${String(e)}".`)}),l=[...o.history,...i.responseMessages];return c.length>0&&l.push({content:c,role:`tool`}),{messages:l,outcome:`resolved`,session:o}}function createRuntimeActionRequestFromToolCall(e){let t=e.tools.get(e.toolCall.toolName);return t?.runtimeAction?.kind===`subagent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`subagent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,subagentName:t.runtimeAction.subagentName}:t?.runtimeAction?.kind===`remote-agent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`remote-agent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,remoteAgentName:t.runtimeAction.remoteAgentName??t.name}:{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null||typeof e==`string`&&e.trim()===``)return{};try{return parseJsonObject(typeof e==`string`?parseJsonStringInput(e):e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}function parseJsonStringInput(e){return JSON.parse(e)}function toToolResultOutput(e){return typeof e.output==`string`?e.isError===!0?{type:`error-text`,value:e.output}:{type:`text`,value:e.output}:e.isError===!0?{type:`error-json`,value:toMutableJsonValue(e.output)}:{type:`json`,value:toMutableJsonValue(e.output)}}function toMutableJsonValue(e){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(Array.isArray(e))return e.map(e=>toMutableJsonValue(e));let t={};for(let[n,r]of Object.entries(e))t[n]=toMutableJsonValue(r);return t}export{clearPendingRuntimeActionBatch,createRuntimeActionRequestFromToolCall,getPendingRuntimeActionBatch,hasPendingRuntimeActionBatch,resolvePendingRuntimeActions,resolveToolCallInputObject,setPendingRuntimeActionBatch};
1
+ import{createActionResultEvent}from"#protocol/message.js";import{parseJsonObject}from"#shared/json.js";import{settleAgentTurn}from"#harness/handles/transitions.js";import{clearProxyInputRequestsForChild}from"#harness/proxy-input-requests.js";import{findRunningAgentHandle,isResultBoundToRunningHandle}from"#harness/handles/query.js";import{getRuntimeActionRequestKey}from"#runtime/actions/keys.js";import{resolveRuntimeActionResultsForKeys}from"#runtime/actions/results.js";import{accumulateSessionUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";const PENDING_RUNTIME_ACTION_BATCH_KEY=`eve.runtime.pendingActionBatch`;function readSubagentResultOutcome(e){return e.origin===`child`?e.outcome:void 0}function getPendingRuntimeActionBatch(e){let t=e?.[PENDING_RUNTIME_ACTION_BATCH_KEY];if(typeof t!=`object`||!t)return;let n=t;if(!(!Array.isArray(n.actions)||!Array.isArray(n.responseMessages)||typeof n.event!=`object`||n.event===null))return n}function hasPendingRuntimeActionBatch(e){return getPendingRuntimeActionBatch(e)!==void 0}function clearPendingRuntimeActionBatch(e){if(e.state?.[PENDING_RUNTIME_ACTION_BATCH_KEY]===void 0)return e;let t={...e.state};return delete t[PENDING_RUNTIME_ACTION_BATCH_KEY],{...e,state:Object.keys(t).length>0?t:void 0}}function setPendingRuntimeActionBatch(e){let t={...e.session.state};return t[PENDING_RUNTIME_ACTION_BATCH_KEY]={actions:[...e.actions],event:e.event,responseMessages:[...e.responseMessages]},{...e.session,state:t}}function resolveReadyRuntimeActionResults(e){let t=getPendingRuntimeActionBatch(e.session.state);if(t!==void 0)return resolveRuntimeActionResultsForBatch({batch:t,results:e.results,state:e.session.state})}function resolveRuntimeActionResultsForBatch(e){return resolveRuntimeActionResultsForKeys({pendingKeys:e.batch.actions.map(e=>getRuntimeActionRequestKey(e)),results:e.results.filter(t=>isResultBoundToRunningHandle(e.state,t))})}async function resolvePendingRuntimeActions(t){let i=getPendingRuntimeActionBatch(t.session.state);if(i===void 0)return{messages:[...t.session.history],outcome:`continue`,session:t.session};let a=resolveReadyRuntimeActionResults({results:t.stepInput?.runtimeActionResults??[],session:t.session});if(a===void 0)return{messages:[...t.session.history],outcome:`unresolved`,session:t.session};if(t.emit!==void 0)for(let n of a)n.kind===`subagent-result`&&n.isError!==!0&&await t.emit({data:{callId:n.callId,output:typeof n.output==`string`?n.output:JSON.stringify(n.output),subagentName:n.subagentName},type:`subagent.completed`}),await t.emit(createActionResultEvent({result:n,sequence:i.event.sequence,stepIndex:i.event.stepIndex,turnId:i.event.turnId}));let o=t.session;for(let e of a){if(e.kind!==`subagent-result`||e.origin!==`child`)continue;let t=findRunningAgentHandle(o.state,{callId:e.callId});if(t===void 0)continue;let i=readSubagentResultOutcome(e);if(i===void 0)continue;i.kind===`terminal`&&`continuationToken`in t.address&&(o=clearProxyInputRequestsForChild(o,t.address.continuationToken));let a=settleAgentTurn(o,{operationId:t.operation.id,outcome:i});a.kind===`settled`&&(o=a.session)}let s={...o.state};delete s[PENDING_RUNTIME_ACTION_BATCH_KEY],o={...o,state:Object.keys(s).length>0?s:void 0};for(let e of a){if(e.kind!==`subagent-result`)continue;let t=readSubagentResultOutcome(e);t!==void 0&&(o=setTurnUsageState(o,accumulateSessionUsage({previous:getTurnUsageState(o.state),usage:t.usageDelta})))}let c=a.map(e=>{switch(e.kind){case`load-skill-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:`load_skill`,type:`tool-result`};case`subagent-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.subagentName,type:`tool-result`};case`tool-result`:return{output:toToolResultOutput(e),toolCallId:e.callId,toolName:e.toolName,type:`tool-result`}}throw Error(`Unsupported runtime action result kind "${String(e)}".`)}),l=[...o.history,...i.responseMessages];return c.length>0&&l.push({content:c,role:`tool`}),{messages:l,outcome:`resolved`,session:o}}function createRuntimeActionRequestFromToolCall(e){let t=e.tools.get(e.toolCall.toolName);return t?.frameworkAction===`load-skill`?{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`load-skill`}:t?.runtimeAction?.kind===`subagent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`subagent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,subagentName:t.runtimeAction.subagentName}:t?.runtimeAction?.kind===`remote-agent-call`?{callId:e.toolCall.toolCallId,description:t.description,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`remote-agent-call`,name:t.name,nodeId:t.runtimeAction.nodeId,remoteAgentName:t.runtimeAction.remoteAgentName??t.name}:{callId:e.toolCall.toolCallId,input:resolveToolCallInputObject(e.toolCall.input,{callId:e.toolCall.toolCallId,toolName:e.toolCall.toolName}),kind:`tool-call`,toolName:e.toolCall.toolName}}function resolveToolCallInputObject(e,n){if(e==null||typeof e==`string`&&e.trim()===``)return{};try{return parseJsonObject(typeof e==`string`?parseJsonStringInput(e):e)}catch(e){let t=e instanceof Error?e.message:String(e);throw TypeError(`Failed to parse tool-call arguments for "${n.toolName}" (${n.callId}): ${t}`,{cause:e})}}function parseJsonStringInput(e){return JSON.parse(e)}function toToolResultOutput(e){return typeof e.output==`string`?e.isError===!0?{type:`error-text`,value:e.output}:{type:`text`,value:e.output}:e.isError===!0?{type:`error-json`,value:toMutableJsonValue(e.output)}:{type:`json`,value:toMutableJsonValue(e.output)}}function toMutableJsonValue(e){if(e===null||typeof e==`string`||typeof e==`number`||typeof e==`boolean`)return e;if(Array.isArray(e))return e.map(e=>toMutableJsonValue(e));let t={};for(let[n,r]of Object.entries(e))t[n]=toMutableJsonValue(r);return t}export{clearPendingRuntimeActionBatch,createRuntimeActionRequestFromToolCall,getPendingRuntimeActionBatch,hasPendingRuntimeActionBatch,resolvePendingRuntimeActions,resolveToolCallInputObject,setPendingRuntimeActionBatch};
@@ -1,3 +1,3 @@
1
- import{appendUserContent,normalizeUserContent}from"#harness/messages.js";import{isSessionLimitContinuationRequestId}from"#harness/session-limit-continuation.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{extractHistoricalInputRequests}from"#harness/input-extraction.js";function dropStaleSessionLimitContinuationResponses(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return e.stepInput;let r=t.filter(t=>e.pendingRequestIds.has(t.requestId)||!isSessionLimitContinuationRequestId(t.requestId));if(r.length===t.length)return e.stepInput;let{inputResponses:i,...a}=e.stepInput;return r.length===0?a:{...a,inputResponses:r}}function convertStaleResponsesToUserMessage(e){let t=e.stepInput?.inputResponses;if(e.stepInput===void 0||t===void 0||t.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let n=[],r=[];for(let i of t)e.pendingRequestIds.has(i.requestId)?n.push(i):r.push(i);if(r.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let a=extractHistoricalInputRequests({history:e.history,requestIds:new Set(r.map(e=>e.requestId))}),o=appendOptionalUserContent(e.stepInput.message,formatModelMessage(r,a)),s=appendOptionalUserContent(e.stepInput.message,formatDisplayMessage(r,a)),{inputResponses:c,...l}=e.stepInput,u={...l,message:o};return n.length>0&&(u.inputResponses=n),{displayMessage:s,kind:`converted`,stepInput:u}}function formatModelMessage(e,t){let n=e.map(e=>{let n=t.get(e.requestId),i=n?.options?.find(t=>t.id===e.optionId),a={};if(e.optionId!==void 0&&(a.optionId=e.optionId),i!==void 0){let e={id:i.id,label:i.label};i.description!==void 0&&(e.description=i.description),a.selectedOption=e}e.text!==void 0&&(a.text=e.text);let o={requestId:e.requestId,response:a};return n!==void 0&&(o.prompt=n.prompt,o.requestType=isApprovalRequest(n)?`approval`:`question`),o});return[`The user submitted the following response to an earlier interactive prompt.`,`Treat it as new input at the current point in the conversation and decide whether it is still relevant.${e.some(e=>{let n=t.get(e.requestId);return n===void 0||isApprovalRequest(n)})?` This does not authorize an earlier action; request approval again if that action is still needed.`:``}`,JSON.stringify(n,null,2)].join(`
1
+ import{appendUserContent,normalizeUserContent}from"#harness/messages.js";import{isSessionLimitContinuationRequestId}from"#harness/session-limit-continuation.js";import{isApprovalRequest}from"#harness/input-request-class.js";import{extractHistoricalInputRequests}from"#harness/input-extraction.js";function dropStaleSessionLimitContinuationResponses(e){if(e.stepInput===void 0)return;let t=e.stepInput.inputResponses??[],r=e.stepInput.attributedInputResponses??[],keep=t=>e.pendingRequestIds.has(t)||!isSessionLimitContinuationRequestId(t),i=t.filter(e=>keep(e.requestId)),a=r.filter(({response:e})=>keep(e.requestId));if(i.length===t.length&&a.length===r.length)return e.stepInput;let{attributedInputResponses:o,inputResponses:s,...c}=e.stepInput,l=c;return i.length>0&&(l.inputResponses=i),a.length>0&&(l.attributedInputResponses=a),l}function convertStaleResponsesToUserMessage(e){if(e.stepInput===void 0)return{kind:`unchanged`};let t=e.stepInput.inputResponses??[],n=e.stepInput.attributedInputResponses??[];if(t.length===0&&n.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let r=[],a=[],o=[];for(let n of t)(e.pendingRequestIds.has(n.requestId)?r:o).push(n);for(let t of n)e.pendingRequestIds.has(t.response.requestId)?a.push(t):o.push(t.response);if(o.length===0)return{kind:`unchanged`,stepInput:e.stepInput};let s=extractHistoricalInputRequests({history:e.history,requestIds:new Set(o.map(e=>e.requestId))}),c=appendOptionalUserContent(e.stepInput.message,formatModelMessage(o,s)),l=appendOptionalUserContent(e.stepInput.message,formatDisplayMessage(o,s)),{attributedInputResponses:u,inputResponses:d,...f}=e.stepInput,p={...f,message:c};return r.length>0&&(p.inputResponses=r),a.length>0&&(p.attributedInputResponses=a),{displayMessage:l,kind:`converted`,stepInput:p}}function formatModelMessage(e,t){let n=e.map(e=>{let n=t.get(e.requestId),i=n?.options?.find(t=>t.id===e.optionId),a={};if(e.optionId!==void 0&&(a.optionId=e.optionId),i!==void 0){let e={id:i.id,label:i.label};i.description!==void 0&&(e.description=i.description),a.selectedOption=e}e.text!==void 0&&(a.text=e.text);let o={requestId:e.requestId,response:a};return n!==void 0&&(o.prompt=n.prompt,o.requestType=isApprovalRequest(n)?`approval`:`question`),o});return[`The user submitted the following response to an earlier interactive prompt.`,`Treat it as new input at the current point in the conversation and decide whether it is still relevant.${e.some(e=>{let n=t.get(e.requestId);return n===void 0||isApprovalRequest(n)})?` This does not authorize an earlier action; request approval again if that action is still needed.`:``}`,JSON.stringify(n,null,2)].join(`
2
2
  `)}function formatDisplayMessage(e,t){return e.map(e=>e.text!==void 0&&e.text.length>0?e.text:t.get(e.requestId)?.options?.find(t=>t.id===e.optionId)?.label??e.optionId??`Response to an earlier interactive prompt`).join(`
3
3
  `)}function appendOptionalUserContent(n,r){let i=normalizeUserContent(n);return i===void 0?r:appendUserContent({appended:r,existing:i})}export{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses};
@@ -0,0 +1,9 @@
1
+ import type { RuntimeToolCallActionRequest } from "#runtime/actions/types.js";
2
+ /** Creates a runtime tool-call action shape from an AI SDK tool call. */
3
+ export declare function createRuntimeToolCallActionFromToolCall(input: {
4
+ readonly toolCall: {
5
+ readonly input: unknown;
6
+ readonly toolCallId: string;
7
+ readonly toolName: string;
8
+ };
9
+ }): RuntimeToolCallActionRequest;
@@ -0,0 +1 @@
1
+ import{resolveToolCallInputObject}from"#harness/runtime-actions.js";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{createRuntimeToolCallActionFromToolCall};
@@ -1,3 +1,3 @@
1
- import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ParentSessionKey,ParentTraceContextKey,SessionCallbackKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createResultCompletedEvent,createSessionWaitingEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{getAgentHandleStore}from"#harness/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{createInstrumentationHandleEvent}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{getSupersededAuthorizationChallenges,isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{requireSessionModelReference}from"#harness/types.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{resolveAgentsAnnouncement}from"#harness/handles/prompt.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{resolveParentLineage}from"#harness/parent-lineage.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{createOtelIntegration,ensureOtelIntegration}from"#harness/otel-integration.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:e===void 0?[r]:[r,createOtelIntegration()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
1
+ import{createErrorId,createLogger,formatError,logError,recordErrorOnSpan}from"#internal/logging.js";import{isScheduleAppAuth}from"#channel/schedule-auth.js";import{AuthKey,ChannelInstrumentationKey,ParentSessionKey,ParentTraceContextKey,SessionCallbackKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{toErrorMessage}from"#shared/errors.js";import{createActionResultEvent,createApprovalCandidateEvent,createApprovalSettledEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createCompactionCompletedEvent,createCompactionRequestedEvent,createContextClearedEvent,createInputRequestedEvent,createMessageCompletedEvent,createResultCompletedEvent,createSessionWaitingEvent,createStepStartedEvent}from"#protocol/message.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{contextStorage}from"#context/container.js";import{ChannelKey}from"#runtime/sessions/runtime-context-keys.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{ToolLoopAgent,isStepCount}from"ai";import{getAgentHandleStore}from"#harness/handles/store.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{normalizeUserContent,resolveAssistantStepText}from"#harness/messages.js";import{createRuntimeActionRequestFromToolCall,resolvePendingRuntimeActions,setPendingRuntimeActionBatch}from"#harness/runtime-actions.js";import{activeTurnId}from"#harness/active-turn-id.js";import{clearPendingWorkflowInterrupt,getPendingWorkflowInterrupt,setPendingWorkflowInterrupt}from"#harness/workflow-interrupt-state.js";import{getWorkflowRuntimeActionInterrupts,isWorkflowRuntimeActionInterrupt}from"#harness/workflow-runtime-action-state.js";import{getActiveDynamicModelSelection,isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{getInstrumentationRuntime}from"#harness/instrumentation-runtime.js";import{appendPendingInputBatch,consumeDeferredStepInput,getApprovedTools,getPendingInputRequestIds,hasDeferredStepInput,hasPendingApprovalBatch,hasStepInput,resolvePendingInput}from"#harness/input-requests.js";import{createInstrumentationHandleEvent,publishInputResolutions}from"#harness/instrumentation-native-events.js";import{context,trace}from"#compiled/@opentelemetry/api/index.js";import{getSupersededAuthorizationChallenges,isAuthorizationSignal,setPendingAuthorization}from"#harness/authorization.js";import{throwIfTurnAborted}from"#harness/turn-cancellation.js";import{buildDynamicInstructionMessages}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getWorkflowContinuationSecurity,readWorkflowContinuationSecurity}from"#harness/workflow-continuation-security.js";import{buildWorkflowHostTools,resolveWorkflowSandboxBridgeRequestLimit}from"#harness/workflow-sandbox.js";import{attemptIdempotencyKey}from"#harness/instrumentation-lifecycle.js";import{getApprovalAuditState,markApprovalCandidateHistoryEventEmitted,markApprovalCandidatePendingEventEmitted,markApprovalSettlementEventEmitted}from"#harness/approval-candidates.js";import{queueDeferredStepInput}from"#harness/pending-input-batches.js";import{CONDITIONAL_DELIVERY_INSTRUCTION,EMPTY_DELIVERY_SENTINEL,hasEmptyDeliverySentinel}from"#shared/empty-delivery.js";import{createToolResultMessagePartFromToolError}from"#harness/action-result-helpers.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{extractQuestionInputRequests,extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{requireSessionModelReference}from"#harness/types.js";import{buildDynamicTools,buildResponseAuthorizationTools}from"#context/build-dynamic-tools.js";import{resolveAgentsAnnouncement}from"#harness/handles/prompt.js";import{hydrateSandboxAttachments,stageAttachmentsToSandbox}from"#harness/attachment-staging.js";import{createWorkflowLifecycle}from"#harness/workflow-lifecycle.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{applySessionLimitContinuation,enforceSessionTokenLimit}from"#harness/session-limit-enforcement.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{coordinateApprovalDelivery,shouldPrepareApprovalPolicyTools}from"#harness/approval-delivery-coordinator.js";import{buildTelemetryRuntimeContext}from"#harness/instrumentation-runtime-context.js";import{createAiSdkHookBridge}from"#harness/ai-sdk-hook-bridge.js";import{resolveParentLineage}from"#harness/parent-lineage.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{getInstrumentationConfig}from"#harness/instrumentation-config.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{ensureOtelIntegration,getRegisteredTelemetryIntegrations}from"#harness/ai-sdk-telemetry.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{continueWorkflowSandboxInterrupt,getWorkflowSandboxInterrupt,unwrapWorkflowSandboxResult}from"#shared/workflow-sandbox.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#runtime/framework-tools/final-output.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version,log=createLogger(`harness.tool-loop`);function logToolExecutionError(e){e.toolOutput.type===`tool-error`&&logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}function enrichTelemetry(e,t,n,r){if(e===void 0&&r===void 0)return;let i={};for(let e of Object.keys(n??{}))i[e]=!0;return{functionId:e?.functionId??t,includeRuntimeContext:i,integrations:r===void 0?void 0:[r,...getRegisteredTelemetryIntegrations()],isEnabled:!0,recordInputs:e?.recordInputs??!0,recordOutputs:e?.recordOutputs??!0}}function mergeSystemInstructions(e){if(e.length===0)return;if(e.length===1)return{...e[0]};let t;for(let n of e)n.providerOptions!==void 0&&(t={...t,...n.providerOptions});let n={role:`system`,content:e.map(e=>e.content).join(`
2
2
 
3
- `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({isRemote:!0,traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(t){let n=t.handleEvent,u=getInstrumentationConfig();u!==void 0&&ensureOtelIntegration();let p=u===void 0?void 0:trace.getTracer(`eve`),m=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(p&&hasStepInput(t)){let t=u?.functionId??m,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=p.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(p,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(p,h,g){let v=p;g&&(v=setTurnTraceState(v,g.spanContext()));let y=getHarnessEmissionState(v.state),S=contextStorage.getStore(),E=S?.get(ParentSessionKey),j=E!==void 0||S?.get(SessionCallbackKey)!==void 0,M=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,handleEvent:n,hooks:t.instrumentation?.hooks,parentLineage:resolveParentLineage(E,S?.get(ChannelKey)),parentTraceContext:S?.get(ParentTraceContextKey),rootSessionId:E?.rootSessionId,sessionId:v.sessionId,turnId:activeTurnId(y)}),failModelSelection=async(n,r)=>{if(throwIfTurnAborted(t.abortSignal),g&&recordErrorOnSpan(g,n),!M)throw n;let a=createErrorId(),o=toErrorMessage(n);return log.error(`model selection failed terminally`,{error:n,errorId:a,sessionId:v.sessionId,turnId:r.turnId}),await emitFailedStep(M,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:a},message:o,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:v}};if(t.clearOnly===!0)return v={...v,compaction:{recentWindowSize:v.compaction.recentWindowSize,threshold:v.compaction.threshold,thresholdPercent:v.compaction.thresholdPercent},history:[]},await M?.(createContextClearedEvent({sequence:y.sequence,sessionId:v.sessionId,turnId:activeTurnId(y)})),await M?.(createSessionWaitingEvent()),{next:null,session:v};if(t.compactOnly===!0){if(v.history.length>0)try{let e=await resolveActiveRuntimeModel({config:t,ctx:contextStorage.getStore(),session:v});v=e.session;let n=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:{...y,turnId:activeTurnId(y)},force:!0,messages:[...v.history],model:e.model,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0});v={...n.session,compaction:{recentWindowSize:n.session.compaction.recentWindowSize,threshold:n.session.compaction.threshold,thresholdPercent:n.session.compaction.thresholdPercent},history:n.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:v.sessionId})}return await M?.(createSessionWaitingEvent()),{next:null,session:v}}let N=consumeDeferredStepInput({input:h,preferCurrentInput:t.mode!==`conversation`&&h!==void 0&&hasPendingApprovalBatch(v),session:v});v=N.session;let P=await resolvePendingRuntimeActions({emit:M,session:v,stepInput:N.input});if(P.outcome===`unresolved`)return{next:null,session:P.session};v=P.session;let ne=getPendingInputRequestIds(v.state),F=convertStaleResponsesToUserMessage({history:P.messages,pendingRequestIds:ne,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:ne,stepInput:N.input})}),I=F.stepInput,L=F.kind===`converted`?{...I,message:F.displayMessage}:I,R=resolvePendingInput({deferMessagesWhileApprovalsPending:t.mode!==`conversation`,history:P.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:v,stepInput:I});if(R.outcome===`unresolved`){if(M&&t.mode===`conversation`&&R.deferredMessage===!0&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}return y=await emitTurnEpilogue(M,y,t.mode),{next:null,session:setHarnessEmissionState(R.session,y)}}return{next:null,session:R.session}}if(M&&R.rejectedActions)for(let e of R.rejectedActions)for(let t of e.results)await M(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(M&&hasStepInput(h)){try{y=await emitTurnPreamble(M,L??{},y,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:y.sequence,stepIndex:0,turnId:`turn_${y.sequence}`})}v=setHarnessEmissionState(v,y),g&&g.setAttribute(`eve.turn.id`,y.turnId)}v=R.session;let z=R.messages,B=await applySessionLimitContinuation({config:t,emit:M,emissionState:y,limitContinuation:R.limitContinuation,session:v});if(B.result!==null)return B.result;if(v=B.session,t.persistentSubagentSessions===!0){let e=resolveAgentsAnnouncement({messages:z,store:getAgentHandleStore(v.state)});e!==void 0&&z.push({content:e,role:`user`})}if(I?.context!==void 0&&R.deferredContext!==!0)for(let e of I.context)z.push({content:e,role:`user`});let re=normalizeUserContent(I?.message);if(re!==void 0&&!R.deferredMessage&&!R.consumedMessage){let e=await stageAttachmentsToSandbox(re);z.push({content:e,role:`user`})}let V=S,H;try{V!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:V,event:{data:{sequence:y.sequence,stepIndex:y.stepIndex,turnId:y.turnId},type:`step.started`},messages:z}),H=await resolveActiveRuntimeModel({config:t,ctx:V,session:v})}catch(e){return failModelSelection(e,y)}v=H.session;let U=H.model;M&&await emitStepStarted(M,y,requireSessionModelReference(v).id,z);let W=detectPromptCachePath(U),G=W.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,ie=buildGatewayAttributionHeaders(U,t.runtimeIdentity);({messages:z,session:v}=await maybeCompact({abortSignal:t.abortSignal,emit:M,emissionState:y,messages:z,model:U,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:v,telemetry:enrichTelemetry(u,m)??void 0}));let K=getApprovedTools(v),q=v.outputSchema===void 0&&V!==void 0&&isScheduleAppAuth(V.get(AuthKey))&&V.get(ParentSessionKey)===void 0,ae=await hydrateSandboxAttachments(z),J=[],Y=[];for(let e of ae)e.role===`system`?J.push(e):Y.push(e);if(V!==void 0){J.push(...buildDynamicInstructionMessages(V));let e=V.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&J.push({role:`system`,content:e})}q&&J.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let X=Y,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=v.agent.system?[{role:`system`,content:v.agent.system}]:[],r=J.length>0||t.length>0?[...t,...n,...J]:void 0,i=r!==void 0&&G?applySystemCacheBreakpoint(r,G):r,a=i===void 0?v.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:u,emissionState:y,environment,modelInput:{instructions:a,messages:X},session:v})}},oe=t.tools,runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...X,{role:`user`,content:e.trailingUserNote}]:X,o=buildHarnessToolsWithDynamicSubagents(t.tools,V),s=getAdvertisedTools({session:v,tools:o});oe=s;let c=await buildToolSetWithProviderTools({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(v),tools:s,webSearchProvider:t.webSearchProvider});if(V!==void 0){let n=getAdvertisedTools({session:v,tools:buildDynamicTools(V)}),r=buildToolSetFromDefinitions({approvedTools:K,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){if(s.get(e)?.runtimeAction!==void 0)throw Error(`Dynamic tool "${e}" collides with a runtime-visible subagent.`);c[e]=t}}v.outputSchema!==void 0&&(c[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(v.outputSchema));let l=M===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:M,emissionState:y,tools:e}),d=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:c,session:v,tools:s,workflow:d});v=f.session;let p=f.modelTools,h=G?applyLastToolCacheBreakpoint(p,G):p,g=t.instrumentation?.hooks,_=activeTurnId(y),b=g===void 0?void 0:{attemptId:`${v.sessionId}:${_}:${y.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:u?.functionId??m,rootSessionId:E?.rootSessionId??v.sessionId,sessionId:v.sessionId,stepIndex:y.stepIndex,turnId:_},S=b===void 0||g===void 0?void 0:createAiSdkHookBridge(b,g,t.instrumentation?.runInContext),C=buildStepHooks({cachePath:W,emit:M,emissionState:y,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:G,session:v}),w=new ToolLoopAgent({headers:ie,instructions:n,model:U,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:C.onStepFinish,prepareStep:C.prepareStep,reasoning:v.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(u,m,i,S),toolApproval:buildToolApproval(p),tools:h}),executeModelCall=async()=>{if(M){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await w.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(M,y,r.fullStream,{excludedActionToolNames:n,tools:s});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([C.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(M,y,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:o,tools:s});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await w.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await C.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return b!==void 0&&await g?.publish({scope:b,type:`attempt.completed`}),e}catch(e){return b!==void 0&&await g?.publish({error:e,scope:b,type:`attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},se=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:se++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:v.sessionId,turnId:y.turnId},t.abortSignal),ce=prepareModelCallInput(),le=await continuePendingWorkflowInterrupt({childResults:I?.runtimeActionResults,config:t,emit:M,emissionState:y,runStep,session:v,tools:buildHarnessToolsWithDynamicSubagents(t.tools,V)});if(le!==null)return le;let ue=await enforceSessionTokenLimit({config:t,emit:M,emissionState:y,messages:z,session:v});if(ue!==null)return ue;let Z;try{Z=await runOneModelCall({preparedInput:ce,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:q,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:v.sessionId,turnId:y.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(g&&recordErrorOnSpan(g,n),!M)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:v.sessionId,turnId:y.turnId}),y=await emitRecoverableFailedTurn(M,y,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:v.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(v,y)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),l=c===null?extractUpstreamRejectionMessage(n):null,u=c?.message??l?.message??toErrorMessage(n),f=c?.hint===void 0?u:`${u} ${c.hint}`,p=extractModelCallErrorDetails(n),m=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:l}),h=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||l!==null,sessionId:v.sessionId,turnId:y.turnId});if(o===`terminal`)return c===null?log.error(l?.message??`model call failed terminally`,h):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:v.sessionId,turnId:y.turnId}),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:t.mode===`task`||j?{done:!0,isError:!0,output:f}:{done:!0,output:``},session:v};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(l?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,h),n;return log.error(l?.message??`model call failed; failing the task run`,h),await emitFailedStep(M,y,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:v.sessionId}),{next:{done:!0,isError:!0,output:f},session:v}}log.error(l?.message??`model call failed — parking session for retry by the user`,h),y=await emitRecoverableFailedTurn(M,y,{code:`MODEL_CALL_FAILED`,continuationToken:v.continuationToken,details:m,message:u});let _={isError:!0,output:f};return{next:null,session:setHarnessEmissionState(v,y),settledTurn:_}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(v.state),turnId:y.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});v=setTurnUsageState(v,Q);let $;try{$=formatLanguageModelGatewayId(U)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:M,emissionState:y,promptMessages:z,result:Z,runStep,session:v,runtimeActionTools:oe})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:r,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),h=l?null:c,g=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&g.add(e.toolCallId);let _=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:g}),y=_.messages,b={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},x=t.workflow===!0?readWorkflowContinuationSecurity(b):void 0;if(x!==void 0){let e=await getWorkflowSandboxInterrupt(i,x);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:b,emissionState:o,interrupt:e,promptMessages:r,responseMessages:y})}}let S=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),C=new Set(S.map(e=>e.action.callId)),w=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...C])}),T=[...S,...w],D=getAdvertisedTools({session:b,tools:e.runtimeActionTools}),O=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>e.runtimeActionTools.get(t.toolName)?.runtimeAction!==void 0).filter(e=>D.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:b.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:D}));if(O.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:O,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:y,session:{...b,history:[...r]}}),o)};if(T.length>0){let e=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:T,responseMessages:y,session:{...b,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:T,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),e=setHarnessEmissionState(e,o))),{next:hasDeferredStepInput(e)?a:null,session:e}}let k=findAuthorizationSignalFromToolResults(i.toolResults);if(k){let{challenges:e}=k;if(n){for(let t of getSupersededAuthorizationChallenges(b.state,e))await n(createAuthorizationCompletedEvent({authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode))}return{next:null,session:setHarnessEmissionState({...b,history:[...r],state:setPendingAuthorization(b.state,{challenges:e})},o)}}let ee=y,te=[...r,...ee],A={...b,history:te};return!(A.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(ee.at(-1)?.role===`tool`||_.outcomeEndsResponse||hasDeferredStepInput(A))?(n&&(o=advanceStep(o),A=setHarnessEmissionState(A,o)),{next:a,session:A}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:A.outputSchema,session:A,stepOutput:h})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(e.force!==!0&&!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal,e.force===!0),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{appendMissingToolResultMessages,createToolLoopHarness};
3
+ `)};return t!==void 0&&(n.providerOptions=t),n}function buildGatewayAttributionHeaders(e,t){let n=resolveProviderHeaders(e);if(n===void 0)return;let r=t?.agentName??t?.agentId,i=process.env.VERCEL_PROJECT_PRODUCTION_URL||process.env.VERCEL_URL,a=i?`https://${i}`:void 0,o={...n};return r&&(o[`x-title`]=r),a&&(o[`http-referer`]=a),o}async function resolveActiveRuntimeModel(e){if(e.ctx===void 0){let t=e.session.agent.modelReference;if(t===void 0)throw Error(`Dynamic model selection is unavailable outside an eve runtime context.`);return{model:await e.config.resolveModel(t),session:e.session}}let t=getActiveDynamicModelSelection(e.ctx);if(t===null){let t=e.session.agent.modelReference;if(e.session.agent.dynamicModel===!0||t===void 0)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);return{model:await e.config.resolveModel(t),session:e.session}}return{model:t.model===void 0?await e.config.resolveModel(t.reference):t.model,session:updateSessionModelReference(e.session,t.reference)}}function updateSessionModelReference(e,t){return{...e,agent:{...e.agent,modelReference:t},compaction:updateCompactionThresholdForModelReference({compaction:e.compaction,modelReference:t})}}function updateCompactionThresholdForModelReference(e){return e.modelReference.contextWindowTokens===void 0?e.compaction:{...e.compaction,threshold:Math.max(1,Math.floor(e.modelReference.contextWindowTokens*(e.compaction.thresholdPercent??.9)))}}const TURN_TRACE_STATE_KEY=`eve.harness.turnTrace`;function getTurnTraceState(e){return e.state?.[TURN_TRACE_STATE_KEY]}function setTurnTraceState(e,t){let n={traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags};return{...e,state:{...e.state,[TURN_TRACE_STATE_KEY]:n}}}function resolveStepOtelContext(e,t,n){if(t)return trace.setSpan(context.active(),t);if(e){let e=getTurnTraceState(n);if(e){let t=trace.wrapSpanContext({isRemote:!0,traceId:e.traceId,spanId:e.spanId,traceFlags:e.traceFlags});return trace.setSpan(context.active(),t)}}}function buildHarnessToolsWithDynamicSubagents(e,t){let n=new Map(e);if(t===void 0)return n;for(let e of buildDynamicSubagentTools(t)){if(n.has(e.name))throw Error(`Dynamic subagent "${e.name}" collides with another runtime-visible tool name.`);n.set(e.name,e)}return n}function createToolLoopHarness(t){let n=t.handleEvent,d=getInstrumentationRuntime()?.otelSettings,g=getInstrumentationConfig();d!==void 0&&ensureOtelIntegration();let v=d===void 0?void 0:trace.getTracer(`eve`),y=t.runtimeIdentity?.agentName;async function runStep(e,t){let n;if(v&&hasStepInput(t)){let t=d?.functionId??y,r={"eve.version":eveVersion,"eve.environment":environment,"eve.session.id":e.sessionId};t&&(r[`ai.telemetry.functionId`]=t),n=v.startSpan(`ai.eve.turn`,{attributes:r})}let r=resolveStepOtelContext(v,n,e),executeStep=()=>executeStepBody(e,t,n);try{return r?await context.with(r,executeStep):await executeStep()}finally{n?.end()}}async function executeStepBody(v,x,C){let T=v;C&&(T=setTurnTraceState(T,C.spanContext()));let E=getHarnessEmissionState(T.state),O=contextStorage.getStore(),k=O?.get(ParentSessionKey),A=k!==void 0||O?.get(SessionCallbackKey)!==void 0,ae,j=createInstrumentationHandleEvent({agentName:t.runtimeIdentity?.agentName,channelKind:O?.get(ChannelInstrumentationKey)?.kind,getAttemptScope:()=>ae,handleEvent:n,hooks:t.instrumentation?.hooks,parentLineage:resolveParentLineage(k,O?.get(ChannelKey)),parentTraceContext:O?.get(ParentTraceContextKey),rootSessionId:k?.rootSessionId,sessionId:T.sessionId,turnId:activeTurnId(E)}),failModelSelection=async(n,r)=>{if(throwIfTurnAborted(t.abortSignal),C&&recordErrorOnSpan(C,n),!j)throw n;let a=createErrorId(),o=toErrorMessage(n);return log.error(`model selection failed terminally`,{error:n,errorId:a,sessionId:T.sessionId,turnId:r.turnId}),await emitFailedStep(j,r,{code:`MODEL_SELECTION_FAILED`,details:{errorId:a},message:o,sessionId:T.sessionId}),{next:t.mode===`task`||A?{done:!0,isError:!0,output:o}:{done:!0,output:``},session:T}};if(t.clearOnly===!0)return T={...T,compaction:{recentWindowSize:T.compaction.recentWindowSize,threshold:T.compaction.threshold,thresholdPercent:T.compaction.thresholdPercent},history:[]},await j?.(createContextClearedEvent({sequence:E.sequence,sessionId:T.sessionId,turnId:activeTurnId(E)})),await j?.(createSessionWaitingEvent()),{next:null,session:T};if(t.compactOnly===!0){if(T.history.length>0)try{let e=await resolveActiveRuntimeModel({config:t,ctx:contextStorage.getStore(),session:T});T=e.session;let n=await maybeCompact({abortSignal:t.abortSignal,emit:j,emissionState:{...E,turnId:activeTurnId(E)},force:!0,messages:[...T.history],model:e.model,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:T,telemetry:enrichTelemetry(d,y)??void 0});T={...n.session,compaction:{recentWindowSize:n.session.compaction.recentWindowSize,threshold:n.session.compaction.threshold,thresholdPercent:n.session.compaction.thresholdPercent},history:n.messages}}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:T.sessionId})}return await j?.(createSessionWaitingEvent()),{next:null,session:T}}let M=consumeDeferredStepInput({input:x,preferCurrentInput:t.mode!==`conversation`&&x!==void 0&&hasPendingApprovalBatch(T),session:T});T=M.session;let N=await resolvePendingRuntimeActions({emit:j,session:T,stepInput:M.input});if(N.outcome===`unresolved`)return{next:null,session:N.session};T=N.session;let P=getPendingInputRequestIds(T.state),F=convertStaleResponsesToUserMessage({history:N.messages,pendingRequestIds:P,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:P,stepInput:M.input})}),I=F.stepInput,L=F.kind===`converted`?{...I,message:F.displayMessage}:I,R=contextStorage.getStore();R!==void 0&&t.resolveStepDynamicTools!==void 0&&shouldPrepareApprovalPolicyTools({session:T,stepInput:I})&&await t.resolveStepDynamicTools({ctx:R,event:createStepStartedEvent({modelId:T.agent.modelReference?.id??`dynamic`,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId}),messages:N.messages});let z=await coordinateApprovalDelivery({session:T,stepInput:I,tools:buildResponseAuthorizationTools({authoredTools:t.tools,context:R})});if(T=z.session,j){for(let e of z.feedback)await j(createMessageCompletedEvent({message:e,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId}));let e=getApprovalAuditState(T.state);for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await j(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId})),T={...T,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:T.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await j(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId})),T={...T,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:T.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await j(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId})),T={...T,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:T.state})}}if(z.kind===`park`)return{next:null,session:T};if(z.kind===`continue-coordination`)return{next:runStep,session:z.stepInput===void 0?T:queueDeferredStepInput(T,z.stepInput)};if(z.challenges.length>0){if(j)for(let e of z.challenges)await j(createAuthorizationRequiredEvent({authorization:e.challenge,candidateId:e.candidateId,description:e.challenge.instructions??`Authorization required for ${e.name}`,name:e.name,sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId,webhookUrl:e.hookUrl}));let e=z.stepInput===void 0?T:queueDeferredStepInput(T,z.stepInput);return{next:null,session:{...e,state:setPendingAuthorization(e.state,{challenges:z.challenges})}}}let B=resolvePendingInput({deferMessagesWhileApprovalsPending:t.mode!==`conversation`,history:N.messages,resolveApprovalKey:resolveApprovalKeyFromTools(t.tools),session:T,stepInput:z.stepInput});if(B.outcome===`unresolved`){if(j&&t.mode===`conversation`&&B.deferredMessage===!0&&hasStepInput(x)){try{E=await emitTurnPreamble(j,L??{},E,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:E.sequence,stepIndex:0,turnId:`turn_${E.sequence}`})}return E=await emitTurnEpilogue(j,E,t.mode),{next:null,session:setHarnessEmissionState(B.session,E)}}return{next:null,session:B.session}}if(t.instrumentation?.hooks!==void 0&&B.resolvedInputs!==void 0)for(let e of B.resolvedInputs)await publishInputResolutions({batch:e,hooks:t.instrumentation.hooks,sessionId:T.sessionId});if(j&&B.rejectedActions)for(let e of B.rejectedActions)for(let t of e.results)await j(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(j&&hasStepInput(x)){try{E=await emitTurnPreamble(j,L??{},E,t.runtimeIdentity)}catch(e){if(!isDynamicModelSelectionError(e))throw e;return failModelSelection(e,{sessionStarted:!0,sequence:E.sequence,stepIndex:0,turnId:`turn_${E.sequence}`})}T=setHarnessEmissionState(T,E),C&&C.setAttribute(`eve.turn.id`,E.turnId)}T=B.session;let V=B.messages,H=await applySessionLimitContinuation({config:t,emit:j,emissionState:E,limitContinuation:B.limitContinuation,session:T});if(H.result!==null)return H.result;if(T=H.session,t.persistentSubagentSessions===!0){let e=resolveAgentsAnnouncement({messages:V,store:getAgentHandleStore(T.state)});e!==void 0&&V.push({content:e,role:`user`})}if(I?.context!==void 0&&B.deferredContext!==!0)for(let e of I.context)V.push({content:e,role:`user`});let oe=normalizeUserContent(I?.message);if(oe!==void 0&&!B.deferredMessage&&!B.consumedMessage){let e=await stageAttachmentsToSandbox(oe);V.push({content:e,role:`user`})}let U=O,W;try{U!==void 0&&t.dispatchDynamicModelEvent!==void 0&&await t.dispatchDynamicModelEvent({ctx:U,event:{data:{sequence:E.sequence,stepIndex:E.stepIndex,turnId:E.turnId},type:`step.started`},messages:V}),W=await resolveActiveRuntimeModel({config:t,ctx:U,session:T})}catch(e){return failModelSelection(e,E)}T=W.session;let G=W.model;j&&await emitStepStarted(j,E,requireSessionModelReference(T).id,V);let K=detectPromptCachePath(G),q=K.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,se=buildGatewayAttributionHeaders(G,t.runtimeIdentity);({messages:V,session:T}=await maybeCompact({abortSignal:t.abortSignal,emit:j,emissionState:E,messages:V,model:G,onCompaction:t.onCompaction,resolveModel:t.resolveModel,runtimeIdentity:t.runtimeIdentity,session:T,telemetry:enrichTelemetry(d,y)??void 0}));let ce=getApprovedTools(T),le=T.outputSchema===void 0&&U!==void 0&&isScheduleAppAuth(U.get(AuthKey))&&U.get(ParentSessionKey)===void 0,ue=await hydrateSandboxAttachments(V),J=[],de=[];for(let e of ue)e.role===`system`?J.push(e):de.push(e);if(U!==void 0){J.push(...buildDynamicInstructionMessages(U));let e=U.get(PendingSkillAnnouncementKey);e!==void 0&&e.length>0&&J.push({role:`system`,content:e})}le&&J.push({role:`system`,content:CONDITIONAL_DELIVERY_INSTRUCTION});let Y=de,prepareModelCallInput=e=>{let t=e?[{role:`system`,content:e}]:[],n=T.agent.system?[{role:`system`,content:T.agent.system}]:[],r=J.length>0||t.length>0?[...t,...n,...J]:void 0,i=r!==void 0&&q?applySystemCacheBreakpoint(r,q):r,a=i===void 0?T.agent.system??void 0:mergeSystemInstructions(i);return{instructions:a,telemetryRuntimeContext:buildTelemetryRuntimeContext({eveVersion,authored:g,emissionState:E,environment,modelInput:{instructions:a,messages:Y},session:T})}},fe=t.tools,runSingleModelCall=async e=>{let{instructions:n,telemetryRuntimeContext:i={}}=e.preparedInput??prepareModelCallInput(e.extraSystemNote);e.retryReason&&(i[`eve.retry.reason`]=e.retryReason);let a=e.trailingUserNote?[...Y,{role:`user`,content:e.trailingUserNote}]:Y,o=buildHarnessToolsWithDynamicSubagents(t.tools,U),s=getAdvertisedTools({session:T,tools:o});fe=s;let c=await buildToolSetWithProviderTools({approvedTools:ce,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,modelReference:requireSessionModelReference(T),tools:s,webSearchProvider:t.webSearchProvider});if(U!==void 0){let n=getAdvertisedTools({session:T,tools:buildDynamicTools(U)}),r=buildToolSetFromDefinitions({approvedTools:ce,capabilities:t.capabilities,disabledProviderTools:e.disabledProviderTools,tools:n});for(let[e,t]of Object.entries(r)){if(s.get(e)?.runtimeAction!==void 0)throw Error(`Dynamic tool "${e}" collides with a runtime-visible subagent.`);c[e]=t}}T.outputSchema!==void 0&&(c[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(T.outputSchema));let l=j===void 0?void 0:({tools:e})=>createWorkflowLifecycle({emit:j,emissionState:E,tools:e}),u=t.workflow===!0?{lifecycle:l,maxSubagents:t.workflowMaxSubagents}:void 0,f=await getAdvertisedTools({modelTools:c,session:T,tools:s,workflow:u});T=f.session;let p=f.modelTools,m=q?applyLastToolCacheBreakpoint(p,q):p,h=t.instrumentation?.hooks,g=activeTurnId(E),_=h===void 0?void 0:{attemptId:`${T.sessionId}:${g}:${E.stepIndex}:${e.attemptIndex}`,attemptIndex:e.attemptIndex,functionId:d?.functionId??y,rootSessionId:k?.rootSessionId??T.sessionId,sessionId:T.sessionId,stepIndex:E.stepIndex,turnId:g};ae=_;let v=_===void 0||h===void 0?void 0:createAiSdkHookBridge(_,h,t.instrumentation?.runInContext),b=buildStepHooks({cachePath:K,emit:j,emissionState:E,emitStepStarted:e.suppressStepStartedEmission!==!0,marker:q,session:T}),x=new ToolLoopAgent({headers:se,instructions:n,model:G,onToolExecutionEnd:logToolExecutionError,onError(e){summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepFinish:b.onStepFinish,prepareStep:b.prepareStep,reasoning:T.agent.reasoning,runtimeContext:i,stopWhen:isStepCount(1),telemetry:enrichTelemetry(d,y,i,v),toolApproval:buildToolApproval(p),tools:m}),executeModelCall=async()=>{if(j){let e=[...t.tools].filter(([e,t])=>t.runtimeAction!==void 0&&s.get(e)===void 0).map(([e])=>e),n=new Set([ASK_QUESTION_TOOL_NAME,FINAL_OUTPUT_TOOL_NAME,...e]),r=await x.stream({abortSignal:t.abortSignal,messages:a}),{emittedActionCallIds:i,handledInlineToolResultCallIds:o,invalidInputToolCallIds:c,inlineAuthorizationResults:l,trailingInlineToolResultParts:u}=await emitStreamContent(j,E,r.fullStream,{excludedActionToolNames:n,tools:s});throwIfTurnAborted(t.abortSignal);let[d,f]=await Promise.all([b.stepResult,r.responseMessages]);if(isEmptyModelResponse(d)&&extractToolResultCallIds(f).size===0&&l.length===0&&u.length===0)throw new EmptyModelResponseError;await emitStepActions(j,E,d,{emittedActionCallIds:i,excludedActionCallIds:c,excludedActionToolNames:n,handledInlineToolResultCallIds:o,tools:s});let p=d.toolResults,m=new Map(p.map(e=>[e.toolCallId,e]));for(let e of l)m.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:c,responseMessages:appendMissingToolResultMessages({append:u,responseMessages:f}),stepResult:d,toolResults:[...m.values()]})}let e=await x.generate({abortSignal:t.abortSignal,messages:a});throwIfTurnAborted(t.abortSignal);let n=await b.stepResult;if(isEmptyModelResponse(n)&&extractToolResultCallIds(e.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:e.responseMessages,stepResult:n})};try{let e=await executeModelCall();return _!==void 0&&await h?.publish({idempotencyKey:attemptIdempotencyKey(_),scope:_,type:`step.attempt.completed`}),e}catch(e){return _!==void 0&&await h?.publish({error:e,idempotencyKey:attemptIdempotencyKey(_),scope:_,type:`step.attempt.failed`}),rethrowNoOutputAsEmptyResponse(e)}},pe=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:pe++,preparedInput:t===1?e.preparedInput:void 0,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:T.sessionId,turnId:E.turnId},t.abortSignal),me=prepareModelCallInput(),X=await continuePendingWorkflowInterrupt({childResults:I?.runtimeActionResults,config:t,emit:j,emissionState:E,runStep,session:T,tools:buildHarnessToolsWithDynamicSubagents(t.tools,U)});if(X!==null)return X;let he=await enforceSessionTokenLimit({config:t,emit:j,emissionState:E,messages:V,session:T});if(he!==null)return he;let Z;try{Z=await runOneModelCall({preparedInput:me,suppressStepStartedEmission:!0})}catch(n){throwIfTurnAborted(t.abortSignal);let r=await runModelCallRecoveryPipeline({error:n,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:T.sessionId,turnId:E.turnId}),e=>attemptEmptyResponseRecovery({emptyDeliveryEnabled:le,error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:T.sessionId,turnId:E.turnId})]});if(throwIfTurnAborted(t.abortSignal),r.outcome===`recovered`)Z=r.result;else{let n=r.error;if(C&&recordErrorOnSpan(C,n),!j)throw n;let a=extractWorkflowStreamWriteErrorDetails(n);if(a!==null){let t=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...a,errorId:t,error:n,sessionId:T.sessionId,turnId:E.turnId}),E=await emitRecoverableFailedTurn(j,E,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:T.continuationToken,details:{...a,errorId:t},message:toErrorMessage(n)}),{next:null,session:setHarnessEmissionState(T,E)}}let o=classifyModelCallError(n),s=createErrorId(),c=summarizeKnownError(n),l=c===null?extractUpstreamRejectionMessage(n):null,u=c?.message??l?.message??toErrorMessage(n),d=c?.hint===void 0?u:`${u} ${c.hint}`,p=extractModelCallErrorDetails(n),m=buildModelCallFailureDetails({catalogSummary:c,error:n,errorId:s,modelCallDetails:p,upstreamRejection:l}),h=buildModelCallFailureLogFields({error:n,errorId:s,modelCallDetails:p,recognized:c!==null||l!==null,sessionId:T.sessionId,turnId:E.turnId});if(o===`terminal`)return c===null?log.error(l?.message??`model call failed terminally`,h):log.error(`${c.name}: ${c.message}`,{errorId:s,hint:c.hint,sessionId:T.sessionId,turnId:E.turnId}),await emitFailedStep(j,E,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:T.sessionId}),{next:t.mode===`task`||A?{done:!0,isError:!0,output:d}:{done:!0,output:``},session:T};if(t.mode===`task`){if(o===`recoverable`&&!(n instanceof EmptyModelResponseError))throw log.warn(l?.message??`model call failed recoverably in task mode — rethrowing for durable step retry`,h),n;return log.error(l?.message??`model call failed; failing the task run`,h),await emitFailedStep(j,E,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:T.sessionId}),{next:{done:!0,isError:!0,output:d},session:T}}log.error(l?.message??`model call failed — parking session for retry by the user`,h),E=await emitRecoverableFailedTurn(j,E,{code:`MODEL_CALL_FAILED`,continuationToken:T.continuationToken,details:m,message:u});let g={isError:!0,output:d};return{next:null,session:setHarnessEmissionState(T,E),settledTurn:g}}}let Q=accumulateTurnUsage({previous:getTurnUsageState(T.state),turnId:E.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Z.providerMetadata),usage:Z.usage})});T=setTurnUsageState(T,Q);let $;try{$=formatLanguageModelGatewayId(G)}catch{$=void 0}return await setEveAttributes({"$eve.model":$,"$eve.input_tokens":Q.inputTokens,"$eve.output_tokens":Q.outputTokens,"$eve.cache_read_tokens":Q.cacheReadTokens,"$eve.cache_write_tokens":Q.cacheWriteTokens,"$eve.cost_usd":Q.sawCost?Q.costUsd:void 0,"$eve.tool_count":t.tools.size}),handleStepResult({config:t,emit:j,emissionState:E,promptMessages:V,result:Z,runStep,session:T,runtimeActionTools:fe})}return runStep}function extractTokenUsageDelta(e){let t=e.usage;if(!(t===void 0&&e.costUsd===void 0))return{cacheReadTokens:t?.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:t?.inputTokenDetails?.cacheWriteTokens,costUsd:e.costUsd,inputTokens:t?.inputTokens,outputTokens:t?.outputTokens}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}function buildModelCallFailureDetails(e){let{catalogSummary:t,error:r,errorId:i,modelCallDetails:a,upstreamRejection:o}=e;if(t!==null){let e={errorId:i,message:t.message,name:t.name,semanticErrorId:t.id,...a};return t.hint!==void 0&&(e.hint=t.hint),e}return o===null?{...formatError(r,i),...a}:{errorId:i,message:toErrorMessage(r),name:o.name,...a}}function buildModelCallFailureLogFields(e){let t={errorId:e.errorId,sessionId:e.sessionId,turnId:e.turnId};return e.recognized?{...t,details:e.modelCallDetails}:{...t,error:e.error}}async function runModelCallRecoveryPipeline(e){let t=e.error,n;for(let r of e.stages){let e=await r({error:t,retryCallOptions:n});if(e.outcome===`recovered`)return e;e.outcome===`failed`&&(t=e.error,n=e.retryCallOptions)}return{outcome:`failed`,error:t}}function withAccumulatedResponseMessages(e){let{stepResult:t}=e;return{content:t.content,finishReason:t.finishReason,...e.invalidInputToolCallIds===void 0?{}:{invalidInputToolCallIds:e.invalidInputToolCallIds},providerMetadata:t.providerMetadata,response:{...t.response,messages:[...e.responseMessages]},text:t.text,toolCalls:t.toolCalls,toolResults:e.toolResults===void 0?t.toolResults:[...e.toolResults],usage:t.usage}}function appendMissingToolResultMessages(e){let t=extractToolResultCallIds(e.responseMessages),n=e.append.filter(e=>!t.has(e.toolCallId));return[...e.responseMessages,...n.length>0?[{role:`tool`,content:[...n]}]:[]]}function getInvalidToolCallInputErrors(e){let t=[];for(let n of e.toolCalls){if(n.toolName===FINAL_OUTPUT_TOOL_NAME)continue;let e=getInvalidToolCallInputError({toolCall:n});e!==void 0&&t.push(e)}return t}function extractToolResultCallIds(e){let t=new Set;for(let n of e)if(Array.isArray(n.content))for(let e of n.content)typeof e==`object`&&e&&e.type===`tool-result`&&t.add(e.toolCallId);return t}async function attemptUnsupportedProviderToolRecovery(e){let t=extractUnsupportedProviderToolTypes(e.error);if(t.length===0)return{outcome:`skipped`};let n=[];for(let e of t){let t=resolveFrameworkToolFromUpstreamType(e);t!==null&&!n.includes(t)&&n.push(t)}if(n.length===0)return{outcome:`skipped`};log.warn(`disabling unsupported provider tool(s); retrying step once`,{disabled:n,sessionId:e.sessionId,turnId:e.turnId,upstreamTypes:t});let r={disabledProviderTools:new Set(n),extraSystemNote:buildDisabledToolNote(n)};try{return{outcome:`recovered`,result:await e.runOneModelCall({...r,suppressStepStartedEmission:!0})}}catch(e){return{outcome:`failed`,error:e,retryCallOptions:r}}}function buildDisabledToolNote(e){let t=e.join(`, `);return`The following ${e.length===1?`tool is`:`tools are`} not available with the current model and has been removed: ${t}. Proceed using the remaining tools or your training knowledge.`}function isEmptyModelResponse(e){return e.toolCalls.length===0&&e.toolResults.length===0&&resolveAssistantStepText(e.response.messages,e.text)===null}function rethrowNoOutputAsEmptyResponse(e){throw isNoOutputGeneratedError(e)?new EmptyModelResponseError({cause:e}):e}const EMPTY_RESPONSE_NUDGE=`Your previous reply was empty and was not delivered. Answer now from the tool results above; do not re-run tools or mention this notice.`;function buildEmptyResponseNudge(e){return e?`${EMPTY_RESPONSE_NUDGE} If the current task explicitly requires conditional delivery and there is nothing to report, reply with exactly ${EMPTY_DELIVERY_SENTINEL}.`:EMPTY_RESPONSE_NUDGE}async function attemptEmptyResponseRecovery(e){if(!(e.error instanceof EmptyModelResponseError))return{outcome:`skipped`};log.warn(`empty model response; reissuing the model call once`,{sessionId:e.sessionId,turnId:e.turnId});try{return{outcome:`recovered`,result:await e.runOneModelCall({...e.retryCallOptions,retryReason:`empty-response`,suppressStepStartedEmission:!0,trailingUserNote:buildEmptyResponseNudge(e.emptyDeliveryEnabled)})}}catch(t){return{outcome:`failed`,error:t,retryCallOptions:e.retryCallOptions}}}async function handleStepResult(e){let{config:t,emit:n,promptMessages:r,result:i,runStep:a}=e,{emissionState:o,session:s}=e,c=resolveAssistantStepText(i.response.messages,i.text),l=i.finishReason!==`tool-calls`&&i.toolCalls.length===0&&hasEmptyDeliverySentinel(c),u=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),d=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...u.map(e=>e.toolCallId)]),f=l?[]:appendMissingToolResultMessages({append:u.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),p=l?null:c,m=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&m.add(e.toolCallId);let h=normalizeProviderToolHistory({messages:f,providerExecutedOutcomeIds:m}),v=h.messages,y={...s,compaction:createNextCompactionConfig(s.compaction,r,i)},b=t.workflow===!0?readWorkflowContinuationSecurity(y):void 0;if(b!==void 0){let e=await getWorkflowSandboxInterrupt(i,b);if(e!==void 0){if(!isWorkflowRuntimeActionInterrupt(e))throw Error(`Unsupported Workflow interrupt kind "${e.payload.kind}".`);return parkOnWorkflowInterrupt({baseSession:y,emissionState:o,interrupt:e,promptMessages:r,responseMessages:v})}}let S=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:d}),C=new Set(S.map(e=>e.action.callId)),ee=extractQuestionInputRequests({toolCalls:i.toolCalls,excludedCallIds:new Set([...d,...C])}),w=[...S,...ee],te=getAdvertisedTools({session:y,tools:e.runtimeActionTools}),T=(i.toolCalls??[]).filter(e=>!d.has(e.toolCallId)).filter(t=>e.runtimeActionTools.get(t.toolName)?.runtimeAction!==void 0).filter(e=>te.get(e.toolName)?.runtimeAction===void 0?(log.warn(`runtime action tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:y.sessionId,toolName:e.toolName}),!1):!0).map(e=>createRuntimeActionRequestFromToolCall({toolCall:e,tools:te}));if(T.length>0)return{next:null,session:setHarnessEmissionState(setPendingRuntimeActionBatch({actions:T,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:v,session:{...y,history:[...r]}}),advanceStep(o))};if(w.length>0){let e=buildResponseAuthorizationTools({authoredTools:t.tools,context:contextStorage.getStore()}),i=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:w,responseAuthRequiredRequestIds:S.filter(t=>{let n=e.get(t.action.toolName)?.approval;return n!==void 0&&typeof n!=`function`&&n.response!==void 0}).map(e=>e.requestId),responseMessages:v,session:{...y,history:[...r]}});return n&&(await n(createInputRequestedEvent({requests:w,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode),i=setHarnessEmissionState(i,o))),{next:hasDeferredStepInput(i)?a:null,session:i}}let ne=findAuthorizationSignalFromToolResults(i.toolResults);if(ne){let{challenges:e}=ne;if(n){for(let t of getSupersededAuthorizationChallenges(y.state,e))await n(createAuthorizationCompletedEvent({authorization:t.challenge,name:t.name,outcome:`failed`,reason:`Superseded by a newer authorization attempt.`,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));for(let t of e)await n(createAuthorizationRequiredEvent({authorization:t.challenge,name:t.name,description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));t.mode===`conversation`&&(o=await emitTurnEpilogue(n,o,t.mode))}return{next:null,session:setHarnessEmissionState({...y,history:[...r],state:setPendingAuthorization(y.state,{challenges:e})},o)}}let re=v,ie=[...r,...re],D={...y,history:ie};return!(D.outputSchema!==void 0&&extractFinalOutput(i)!==void 0)&&(re.at(-1)?.role===`tool`||h.outcomeEndsResponse||hasDeferredStepInput(D))?(n&&(o=advanceStep(o),D=setHarnessEmissionState(D,o)),{next:a,session:D}):t.mode===`task`?finishTaskTurn({emissionState:o,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:p}):finishConversationTurn({emissionState:o,emit:n,history:r,result:i,schema:D.outputSchema,session:D,stepOutput:p})}const OUTPUT_SCHEMA_NOT_FULFILLED={code:`OUTPUT_SCHEMA_NOT_FULFILLED`,message:`The agent could not produce a result matching the requested schema.`};function extractFinalOutput(e){return(e.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME&&!isInvalidToolCall(e))?.input}function persistStructuredAssistantTurn(e,t,n){return{...e,history:[...t,{content:JSON.stringify(n),role:`assistant`}],outputSchema:void 0}}async function emitStructuredResult(e,t,n,r){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r)}async function finishTaskTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:a??``},session:s};let c=extractFinalOutput(r);return c===void 0?(t&&await emitFailedStep(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,sessionId:s.sessionId}),{next:{done:!0,isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message},session:s}):(s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`task`),s=setHarnessEmissionState(s,o)),{next:{done:!0,output:c},session:s})}async function finishConversationTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(i===void 0)return t&&(o=await emitTurnEpilogue(t,o,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken}),s=setHarnessEmissionState(s,o));let e={isError:!0,output:OUTPUT_SCHEMA_NOT_FULFILLED.message};return{next:null,session:s,settledTurn:e}}return s=persistStructuredAssistantTurn(s,n,c),t&&(o=await emitStructuredResult(t,o,c,`conversation`),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}async function continuePendingWorkflowInterrupt(e){let t=getPendingWorkflowInterrupt(e.session.state);if(t===void 0)return null;let n=t.interrupt;if(!isWorkflowRuntimeActionInterrupt(n))throw Error(`Unsupported Workflow interrupt kind "${n.payload.kind}".`);let i=e.emit===void 0?void 0:createWorkflowLifecycle({emit:e.emit,emissionState:e.emissionState,skipReplayed:!0,tools:e.tools}),a=getWorkflowContinuationSecurity(e.session),o;try{let t=buildWorkflowHostTools({tools:e.tools}),r=e.childResults??[],s=n,c=0;for(;;){o=await continueWorkflowSandboxInterrupt({bridgeRequestLimit:resolveWorkflowSandboxBridgeRequestLimit(e.config.workflowMaxSubagents),continuationSecurity:a,interrupt:s,lifecycle:i,resolution:r[c]?.output,tools:t});let n=await unwrapWorkflowSandboxResult(o,a);if(n.status!==`interrupted`||!isWorkflowRuntimeActionInterrupt(n.interrupt)||c+1>=r.length)break;let l=getWorkflowRuntimeActionInterrupts(n.interrupt)[0];if(l===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);c++,s=l}}catch(e){logError(log,`Workflow interrupt continuation failed`,e),o={error:`workflow_continuation_failed`,message:toErrorMessage(e),retryable:!1}}let s=await unwrapWorkflowSandboxResult(o,a),c=s.status===`interrupted`?s.interrupt:s.output,l=replaceWorkflowToolResult([...e.session.history,...t.responseMessages],n.outerToolCallId,c),u=clearPendingWorkflowInterrupt({...e.session,history:l});if(s.status===`interrupted`){if(!isWorkflowRuntimeActionInterrupt(s.interrupt))throw Error(`Unsupported Workflow interrupt kind "${s.interrupt.payload.kind}".`);let t=e.session.history.length,n=l.slice(0,t),r=l.slice(t);return u={...u,history:n},parkOnWorkflowInterrupt({baseSession:u,emissionState:e.emissionState,interrupt:s.interrupt,promptMessages:n,responseMessages:r})}return{next:e.runStep,session:u}}function replaceWorkflowToolResult(e,t,n){if(t===void 0)return[...e];let r=typeof n==`string`?{type:`text`,value:n}:{type:`json`,value:n};return e.map(e=>{if(e.role!==`tool`)return e;let n=e.content.map(e=>e.type!==`tool-result`||e.toolCallId!==t?e:{...e,output:r});return{...e,content:n}})}function parkOnWorkflowInterrupt(e){let t=getWorkflowRuntimeActionInterrupts(e.interrupt)[0];if(t===void 0)throw Error(`Workflow continuation contains no pending runtime-action interrupt.`);let n={...e.baseSession,history:[...e.promptMessages]};return{next:null,session:setHarnessEmissionState(setPendingWorkflowInterrupt({interrupt:t,responseMessages:e.responseMessages,session:n}),e.emissionState)}}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t.length),r}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session;if(e.force!==!0&&!shouldCompact(r,i.compaction))return{messages:r,session:i};let a=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel});if(t&&await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId,usageInputTokens:getInputTokenCount(r,i.compaction)})),r=await compactMessages(r,a.model,i.compaction,a.providerOptions,e.telemetry,buildGatewayAttributionHeaders(a.model,e.runtimeIdentity),e.abortSignal,e.force===!0),e.onCompaction)for(let t of e.onCompaction())r.push(t);return t&&await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(a.model),sequence:n.sequence,sessionId:i.sessionId,turnId:n.turnId})),{messages:r,session:i}}function resolveApprovalKeyFromTools(e){return t=>{let n=e.get(t.action.toolName);if(n?.approvalKey!==void 0)return n.approvalKey(t.action.input)}}async function runModelCallWithRetries(e,t,n){for(let r=1;;r++){throwIfTurnAborted(n);try{return await e(r)}catch(e){if(throwIfTurnAborted(n),r===3||classifyModelCallError(e)!==`retry`)throw e;let i=500*2**(r-1)+Math.floor(Math.random()*250);log.warn(`model call failed transiently — retrying`,{attempt:r,delayMs:i,sessionId:t.sessionId,turnId:t.turnId,error:e}),await new Promise(e=>setTimeout(e,i))}}}function findAuthorizationSignalFromToolResults(e){let t=contextStorage.getStore();if(t!==void 0)for(let n of e??[]){let e=readToolInterrupt(t,n.toolCallId);if(e!==void 0&&isAuthorizationSignal(e))return e}for(let t of e??[])if(isAuthorizationSignal(t.output))return t.output}export{appendMissingToolResultMessages,createToolLoopHarness};
@@ -1 +1 @@
1
- import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{tool}from"ai";import{authorizationPendingModelText,isAuthorizationPendingModelOutput,isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{WEB_SEARCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-search.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";import{normalizeToolJsonOutput,normalizeToolModelOutput}from"#harness/tool-model-output.js";const toolApprovals=new WeakMap;function buildToolSet(e){let t={},n=e.capabilities?.requestInput===!0,o=e.disabledProviderTools;for(let s of e.tools.values()){if(s.name===ASK_QUESTION_TOOL_NAME&&!n||o?.has(s.name))continue;let c=s.toModelOutput,l=buildApprovalFn(s,e),u=tool({description:s.description,execute:wrapToolExecute(s),inputSchema:s.inputSchema,outputSchema:s.outputSchema,...s.execute===void 0?c===void 0?{}:{toModelOutput:async({output:e,toolCallId:t})=>normalizeToolModelOutput({output:await c(e),toolCallId:t,toolName:s.name})}:{toModelOutput:async({output:e,toolCallId:t})=>isAuthorizationPendingModelOutput(e)?{type:`text`,value:authorizationPendingModelText(e.connections)}:c===void 0?typeof e==`string`?{type:`text`,value:e}:normalizeToolModelOutput({output:{type:`json`,value:e??null},toolCallId:t,toolName:s.name}):normalizeToolModelOutput({output:await c(e),toolCallId:t,toolName:s.name})}});t[s.name]=u,s.approval!==void 0&&toolApprovals.set(u,l)}return t}function buildToolSetFromDefinitions(e){let t=new Map;for(let n of e.tools)t.has(n.name)||t.set(n.name,n);return buildToolSet({approvedTools:e.approvedTools,capabilities:e.capabilities,disabledProviderTools:e.disabledProviderTools,tools:t})}function wrapToolExecute(e){let t=e.execute;if(t!==void 0)return(n,r)=>{let i;try{i=t(n,r)}catch(e){return Promise.reject(e)}return isAsyncIterable(i)?normalizeToolExecuteIterable(i,e.name,r):Promise.resolve(i).then(t=>normalizeToolExecuteOutput(t,e.name,r))}}async function*normalizeToolExecuteIterable(e,t,n){for await(let r of e)yield normalizeToolExecuteOutput(r,t,n)}function normalizeToolExecuteOutput(e,n,r){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),r.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:r.toolCallId,toolName:n})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet({approvedTools:e.approvedTools,capabilities:e.capabilities,disabledProviderTools:t,tools:e.tools})};if(!t?.has(WEB_SEARCH_TOOL_DEFINITION.name)){let t=e.tools.get(WEB_SEARCH_TOOL_DEFINITION.name);if(t!==void 0&&t.execute===void 0){let t=resolveWebSearchBackend(e.modelReference,e.webSearchProvider);t===null?delete n[WEB_SEARCH_TOOL_DEFINITION.name]:n[WEB_SEARCH_TOOL_DEFINITION.name]=await resolveWebSearchProviderTool(t)}}return n}function buildApprovalFn(t,r){return async(i,a)=>{if(t.approval===void 0)return;let o=isObject(i)?i:void 0,s=await t.approval({...buildCallbackContext(),approvedTools:r.approvedTools??new Set,callId:a,toolInput:o,toolName:t.name});return typeof s==`boolean`?s?`user-approval`:`not-applicable`:s}}function buildToolApproval(e){return async({toolCall:t})=>{let n=e[t.toolName];return n===void 0?void 0:await toolApprovals.get(n)?.(t.input,t.toolCallId)}}export{buildToolApproval,buildToolSet,buildToolSetFromDefinitions,buildToolSetWithProviderTools,wrapToolExecute};
1
+ import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{resolveApprovalPolicy}from"#public/definitions/approval.js";import{tool}from"ai";import{authorizationPendingModelText,isAuthorizationPendingModelOutput,isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{ASK_QUESTION_TOOL_NAME}from"#runtime/framework-tools/ask-question.js";import{WEB_SEARCH_TOOL_DEFINITION}from"#runtime/framework-tools/web-search.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";import{normalizeToolJsonOutput,normalizeToolModelOutput}from"#harness/tool-model-output.js";const toolApprovals=new WeakMap;function buildToolSet(e){let t={},n=e.capabilities?.requestInput===!0,r=e.disabledProviderTools;for(let s of e.tools.values()){if(s.name===ASK_QUESTION_TOOL_NAME&&!n||r?.has(s.name))continue;let c=s.toModelOutput,l=buildApprovalFn(s,e),u=tool({description:s.description,execute:wrapToolExecute(s),inputSchema:s.inputSchema,outputSchema:s.outputSchema,...s.execute===void 0?c===void 0?{}:{toModelOutput:async({output:e,toolCallId:t})=>normalizeToolModelOutput({output:await c(e),toolCallId:t,toolName:s.name})}:{toModelOutput:async({output:e,toolCallId:t})=>isAuthorizationPendingModelOutput(e)?{type:`text`,value:authorizationPendingModelText(e.connections)}:c===void 0?typeof e==`string`?{type:`text`,value:e}:normalizeToolModelOutput({output:{type:`json`,value:e??null},toolCallId:t,toolName:s.name}):normalizeToolModelOutput({output:await c(e),toolCallId:t,toolName:s.name})}});t[s.name]=u,s.approval!==void 0&&toolApprovals.set(u,l)}return t}function buildToolSetFromDefinitions(e){let t=new Map;for(let n of e.tools)t.has(n.name)||t.set(n.name,n);return buildToolSet({approvedTools:e.approvedTools,capabilities:e.capabilities,disabledProviderTools:e.disabledProviderTools,tools:t})}function wrapToolExecute(e){let t=e.execute;if(t!==void 0)return(n,r)=>{let i;try{i=t(n,r)}catch(e){return Promise.reject(e)}return isAsyncIterable(i)?normalizeToolExecuteIterable(i,e.name,r):Promise.resolve(i).then(t=>normalizeToolExecuteOutput(t,e.name,r))}}async function*normalizeToolExecuteIterable(e,t,n){for await(let r of e)yield normalizeToolExecuteOutput(r,t,n)}function normalizeToolExecuteOutput(e,n,r){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),r.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:r.toolCallId,toolName:n})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet({approvedTools:e.approvedTools,capabilities:e.capabilities,disabledProviderTools:t,tools:e.tools})};if(!t?.has(WEB_SEARCH_TOOL_DEFINITION.name)){let t=e.tools.get(WEB_SEARCH_TOOL_DEFINITION.name);if(t!==void 0&&t.execute===void 0){let t=resolveWebSearchBackend(e.modelReference,e.webSearchProvider);t===null?delete n[WEB_SEARCH_TOOL_DEFINITION.name]:n[WEB_SEARCH_TOOL_DEFINITION.name]=await resolveWebSearchProviderTool(t)}}return n}function buildApprovalFn(t,i){return async(a,o)=>{if(t.approval===void 0)return;let s=isObject(a)?a:void 0,c=await resolveApprovalPolicy(t.approval)({...buildCallbackContext(),approvedTools:i.approvedTools??new Set,callId:o,toolInput:s,toolName:t.name});return typeof c==`boolean`?c?`user-approval`:`not-applicable`:c}}function buildToolApproval(e){return async({toolCall:t})=>{let n=e[t.toolName];return n===void 0?void 0:await toolApprovals.get(n)?.(t.input,t.toolCallId)}}export{buildToolApproval,buildToolSet,buildToolSetFromDefinitions,buildToolSetWithProviderTools,wrapToolExecute};
@@ -1,5 +1,5 @@
1
1
  import type { LanguageModel, ModelMessage, UserContent } from "ai";
2
- import type { SessionCapabilities } from "#channel/types.js";
2
+ import type { SessionAuthContext, SessionCapabilities } from "#channel/types.js";
3
3
  import type { AlsContext } from "#context/container.js";
4
4
  import type { UnstampedMessageStreamEvent, RuntimeIdentity } from "#protocol/message.js";
5
5
  import type { RunMode } from "#shared/run-mode.js";
@@ -120,9 +120,17 @@ export interface SessionLimits {
120
120
  * channels. The harness resolves any pending input batch at the start of
121
121
  * `runStep` before the model call.
122
122
  */
123
+ export interface AttributedInputResponse {
124
+ readonly auth: SessionAuthContext | null;
125
+ readonly response: InputResponse;
126
+ }
123
127
  export interface StepInput {
128
+ /** Internal responder-bound input produced at the delivery boundary. */
129
+ readonly attributedInputResponses?: readonly AttributedInputResponse[];
124
130
  readonly inputResponses?: readonly InputResponse[];
125
131
  readonly message?: string | UserContent;
132
+ /** Internal actor attribution for `message`. */
133
+ readonly messageAuth?: SessionAuthContext | null;
126
134
  /**
127
135
  * Context strings from the channel delivery. Each entry is appended
128
136
  * as a `role: "user"` message to `session.history` before the
@@ -275,6 +283,12 @@ export interface ToolLoopHarnessConfig {
275
283
  * listing appended after runtime-action batches resolve.
276
284
  */
277
285
  readonly persistentSubagentSessions?: boolean;
286
+ /** Resolves step-scoped dynamic tools once for approval policy and model work. */
287
+ readonly resolveStepDynamicTools?: (input: {
288
+ readonly ctx: AlsContext;
289
+ readonly event: UnstampedMessageStreamEvent;
290
+ readonly messages: readonly ModelMessage[];
291
+ }) => Promise<void>;
278
292
  readonly dispatchDynamicModelEvent?: (input: {
279
293
  readonly ctx: AlsContext;
280
294
  readonly event: UnstampedMessageStreamEvent;
@@ -2,6 +2,12 @@ import type { CompileMetadata } from "#compiler/artifacts.js";
2
2
  import type { CompileAgentResult } from "#compiler/compile-agent.js";
3
3
  import type { AgentWorkflowWorldDefinition } from "#shared/agent-definition.js";
4
4
  export type BuiltInWorkflowWorldTarget = "local" | "vercel";
5
+ export type GeneratedInstrumentationLayout = {
6
+ readonly kind: "file";
7
+ } | {
8
+ readonly kind: "directory";
9
+ readonly slots: readonly string[];
10
+ };
5
11
  /**
6
12
  * Paths to the generated compiled-artifacts files shared by Nitro and the
7
13
  * vendored workflow bundles for one application.
@@ -15,15 +21,18 @@ export interface GeneratedCompiledArtifactsFiles {
15
21
  /** Nitro plugin that installs the selected vendored Workflow world. */
16
22
  workflowWorldPluginPath: string;
17
23
  /**
18
- * Optional Nitro plugin that imports the authored instrumentation module
24
+ * Optional Nitro plugin that imports the authored instrumentation modules
19
25
  * from the application when present.
20
26
  */
21
27
  instrumentationPluginPath?: string;
28
+ /** Layout identity used by dev plugin selection and structural fingerprinting. */
29
+ instrumentationLayout?: GeneratedInstrumentationLayout;
22
30
  /**
23
- * Absolute path to the authored instrumentation module when present.
24
- * Nitro uses this to preserve the module's side effects during bundling.
31
+ * Absolute paths to the authored instrumentation modules when present — one
32
+ * for the file layout, one per provider in the directory layout. Nitro uses these
33
+ * to preserve each module's side effects during bundling.
25
34
  */
26
- instrumentationSourcePath?: string;
35
+ instrumentationSourcePaths?: readonly string[];
27
36
  }
28
37
  /**
29
38
  * Writes the generated compiled-artifacts bootstrap module.