eve 0.71.3 → 0.72.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 (436) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +22 -6
  3. package/dist/src/acp/adapter.js +1 -1
  4. package/dist/src/ai/decide.d.ts +7 -0
  5. package/dist/src/ai/decide.js +1 -0
  6. package/dist/src/chunks/{use-eve-agent-CFCaYnrI.js → use-eve-agent-C1GYGCtb.js} +698 -388
  7. package/dist/src/chunks/{use-eve-agent-DcDhXNv1.js → use-eve-agent-hZJ7CB8t.js} +698 -388
  8. package/dist/src/cli/commands/integration-setup.js +1 -1
  9. package/dist/src/cli/commands/registry.js +1 -1
  10. package/dist/src/cli/commands/trace-detail.d.ts +1 -1
  11. package/dist/src/cli/commands/trace-detail.js +1 -1
  12. package/dist/src/cli/dev/tui/runner.js +1 -1
  13. package/dist/src/cli/dev/tui/setup-flow.d.ts +1 -0
  14. package/dist/src/cli/dev/tui/setup-panel.d.ts +1 -0
  15. package/dist/src/cli/dev/tui/setup-panel.js +2 -1
  16. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +2 -2
  17. package/dist/src/cli/dev/tui/traces/trace-conversation.js +2 -2
  18. package/dist/src/cli/dev/tui/transcript-parts.d.ts +2 -1
  19. package/dist/src/cli/dev/tui/transcript-parts.js +1 -1
  20. package/dist/src/cli/dev/tui/transcript.js +1 -1
  21. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  22. package/dist/src/client/conversation-projection.d.ts +4 -0
  23. package/dist/src/client/conversation-projection.js +1 -0
  24. package/dist/src/client/conversation-reducer.js +1 -1
  25. package/dist/src/client/conversation-state.d.ts +5 -26
  26. package/dist/src/client/conversation-state.js +1 -1
  27. package/dist/src/client/index.d.ts +1 -0
  28. package/dist/src/client/index.js +1 -1
  29. package/dist/src/client/message-action-parts.d.ts +1 -11
  30. package/dist/src/client/message-action-parts.js +1 -1
  31. package/dist/src/client/message-reducer.d.ts +3 -1
  32. package/dist/src/client/message-reducer.js +1 -1
  33. package/dist/src/client/session-utils.js +1 -1
  34. package/dist/src/client/session.js +1 -1
  35. package/dist/src/client/tool-call-state.d.ts +23 -0
  36. package/dist/src/client/tool-call-state.js +1 -0
  37. package/dist/src/client/tool-part-state.d.ts +7 -0
  38. package/dist/src/client/tool-part-state.js +1 -0
  39. package/dist/src/compiled/.vendor-stamp.json +10 -10
  40. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +1453 -1358
  41. package/dist/src/compiled/@ai-sdk/anthropic/index.js +1 -2
  42. package/dist/src/compiled/@ai-sdk/code-mode/index.d.ts +172 -163
  43. package/dist/src/compiled/@ai-sdk/code-mode/index.js +15 -20
  44. package/dist/src/compiled/@ai-sdk/google/index.d.ts +772 -733
  45. package/dist/src/compiled/@ai-sdk/google/index.js +6 -8
  46. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +887 -790
  47. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  48. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +1722 -1691
  49. package/dist/src/compiled/@ai-sdk/openai/index.js +3 -14
  50. package/dist/src/compiled/@ai-sdk/otel/index.d.ts +216 -159
  51. package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
  52. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +7542 -7271
  53. package/dist/src/compiled/@ai-sdk/provider/index.js +1 -3
  54. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +1799 -1600
  55. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  56. package/dist/src/compiled/_chunks/workflow/dist-DXLdlucM.js +15 -0
  57. package/dist/src/compiled/_chunks/workflow/experimental-decision-BrfWf6-n.js +3 -0
  58. package/dist/src/compiler/extension-compatibility.d.ts +36 -20
  59. package/dist/src/compiler/extension-compatibility.js +1 -1
  60. package/dist/src/compiler/manifest.js +1 -1
  61. package/dist/src/context/build-dynamic-tools.js +1 -1
  62. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  63. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -0
  64. package/dist/src/context/providers/session.js +1 -1
  65. package/dist/src/evals/define-eval.d.ts +1 -1
  66. package/dist/src/evals/judge.d.ts +1 -1
  67. package/dist/src/evals/judge.js +2 -2
  68. package/dist/src/evals/types.d.ts +8 -8
  69. package/dist/src/execution/cancel-descendant-turns-step.d.ts +1 -0
  70. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  71. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  72. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  73. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  74. package/dist/src/execution/durable-session-read.d.ts +5 -0
  75. package/dist/src/execution/durable-session-read.js +1 -0
  76. package/dist/src/execution/durable-session-store.d.ts +4 -10
  77. package/dist/src/execution/durable-session-store.js +1 -1
  78. package/dist/src/execution/dynamic-connections.d.ts +3 -3
  79. package/dist/src/execution/dynamic-connections.js +1 -1
  80. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  81. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  82. package/dist/src/execution/legacy-session/snapshot.d.ts +3 -0
  83. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  84. package/dist/src/execution/model-call-batching.js +1 -1
  85. package/dist/src/execution/node-step.d.ts +2 -0
  86. package/dist/src/execution/node-step.js +1 -1
  87. package/dist/src/execution/proxied-deliver-step.js +1 -1
  88. package/dist/src/execution/publish-session-events.d.ts +7 -2
  89. package/dist/src/execution/publish-session-events.js +1 -1
  90. package/dist/src/execution/session/active-turn.js +1 -1
  91. package/dist/src/execution/session/answer-caller.js +1 -1
  92. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  93. package/dist/src/execution/session/finalization.js +1 -1
  94. package/dist/src/execution/session/handoff-steps.d.ts +3 -1
  95. package/dist/src/execution/session/handoff-steps.js +1 -1
  96. package/dist/src/execution/session/handoff.d.ts +1 -1
  97. package/dist/src/execution/session/handoff.js +1 -1
  98. package/dist/src/execution/session/pending-turn-state.d.ts +8 -3
  99. package/dist/src/execution/session/pending-turn-state.js +1 -1
  100. package/dist/src/execution/session/task-tool-tracing-step.d.ts +5 -0
  101. package/dist/src/execution/session/task-tool-tracing-step.js +1 -0
  102. package/dist/src/execution/session/turn-step-result.js +1 -1
  103. package/dist/src/execution/session/turn-step.js +1 -1
  104. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  105. package/dist/src/execution/session/turn.d.ts +1 -0
  106. package/dist/src/execution/session/turn.js +1 -1
  107. package/dist/src/execution/settle-cancelled-turn-step.d.ts +4 -6
  108. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  109. package/dist/src/execution/tasks/start.d.ts +3 -3
  110. package/dist/src/execution/tasks/start.js +1 -1
  111. package/dist/src/execution/tasks/steps.d.ts +1 -1
  112. package/dist/src/execution/tasks/steps.js +1 -1
  113. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -1
  114. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  115. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  116. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  117. package/dist/src/execution/tools/connection-tools.js +1 -1
  118. package/dist/src/execution/tools/workflow/harness-definition.js +1 -1
  119. package/dist/src/execution/tools/workflow/step.js +1 -1
  120. package/dist/src/execution/tools/workflow/withdraw-step.d.ts +7 -9
  121. package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
  122. package/dist/src/execution/workflow-trace-context.d.ts +2 -2
  123. package/dist/src/harness/authorization.d.ts +4 -2
  124. package/dist/src/harness/authorization.js +1 -1
  125. package/dist/src/harness/{compaction.js → compaction/engine.js} +1 -1
  126. package/dist/src/harness/compaction/step.d.ts +46 -0
  127. package/dist/src/harness/compaction/step.js +1 -0
  128. package/dist/src/harness/coordination.d.ts +32 -68
  129. package/dist/src/harness/coordination.js +1 -1
  130. package/dist/src/harness/current-messages.d.ts +1 -3
  131. package/dist/src/harness/current-messages.js +1 -1
  132. package/dist/src/harness/emission.d.ts +4 -52
  133. package/dist/src/harness/emission.js +1 -1
  134. package/dist/src/harness/execute-tool.d.ts +1 -0
  135. package/dist/src/harness/final-output.d.ts +5 -0
  136. package/dist/src/harness/final-output.js +1 -1
  137. package/dist/src/harness/hitl/approvals.d.ts +115 -0
  138. package/dist/src/harness/hitl/approvals.js +1 -0
  139. package/dist/src/harness/hitl/approved-call-callers.d.ts +14 -0
  140. package/dist/src/harness/hitl/approved-call-callers.js +1 -0
  141. package/dist/src/harness/hitl/approved-calls.d.ts +37 -0
  142. package/dist/src/harness/hitl/approved-calls.js +1 -0
  143. package/dist/src/harness/hitl/budget.d.ts +21 -0
  144. package/dist/src/harness/hitl/budget.js +1 -0
  145. package/dist/src/harness/{approval-candidates.d.ts → hitl/candidates.d.ts} +9 -18
  146. package/dist/src/harness/hitl/candidates.js +1 -0
  147. package/dist/src/harness/hitl/coordinator.js +1 -0
  148. package/dist/src/harness/hitl/delivery.d.ts +37 -0
  149. package/dist/src/harness/hitl/delivery.js +1 -0
  150. package/dist/src/harness/hitl/index.d.ts +49 -0
  151. package/dist/src/harness/hitl/index.js +1 -0
  152. package/dist/src/harness/hitl/intake.d.ts +67 -0
  153. package/dist/src/harness/hitl/intake.js +1 -0
  154. package/dist/src/harness/{stale-input-responses.d.ts → hitl/stale-responses.d.ts} +5 -3
  155. package/dist/src/harness/hitl/stale-responses.js +3 -0
  156. package/dist/src/harness/inline-tool-authorization.d.ts +4 -0
  157. package/dist/src/harness/inline-tool-authorization.js +1 -1
  158. package/dist/src/harness/input-extraction.d.ts +1 -10
  159. package/dist/src/harness/input-extraction.js +1 -1
  160. package/dist/src/harness/input-request-resolution.d.ts +1 -5
  161. package/dist/src/harness/input-request-resolution.js +1 -1
  162. package/dist/src/harness/model-call/call.d.ts +78 -0
  163. package/dist/src/harness/model-call/call.js +1 -0
  164. package/dist/src/harness/{model-call-error.d.ts → model-call/errors.d.ts} +1 -1
  165. package/dist/src/harness/model-call/failure.d.ts +52 -0
  166. package/dist/src/harness/model-call/failure.js +1 -0
  167. package/dist/src/harness/model-call/model.d.ts +18 -0
  168. package/dist/src/harness/model-call/model.js +1 -0
  169. package/dist/src/harness/model-call/recovery.d.ts +52 -0
  170. package/dist/src/harness/model-call/recovery.js +1 -0
  171. package/dist/src/harness/model-call/request.d.ts +30 -0
  172. package/dist/src/harness/model-call/request.js +3 -0
  173. package/dist/src/harness/model-call/response.d.ts +39 -0
  174. package/dist/src/harness/model-call/response.js +1 -0
  175. package/dist/src/harness/model-call/retry.d.ts +11 -0
  176. package/dist/src/harness/model-call/retry.js +1 -0
  177. package/dist/src/harness/model-call/run.d.ts +38 -0
  178. package/dist/src/harness/model-call/run.js +1 -0
  179. package/dist/src/harness/model-call/tools.d.ts +48 -0
  180. package/dist/src/harness/model-call/tools.js +1 -0
  181. package/dist/src/harness/model-call/usage.d.ts +23 -0
  182. package/dist/src/harness/model-call/usage.js +1 -0
  183. package/dist/src/harness/nested-actions.d.ts +2 -2
  184. package/dist/src/harness/provider-tools.d.ts +2 -2
  185. package/dist/src/harness/provider-tools.js +1 -1
  186. package/dist/src/harness/proxy-input-requests.d.ts +4 -12
  187. package/dist/src/harness/proxy-input-requests.js +1 -1
  188. package/dist/src/harness/session-machine/commit.d.ts +28 -0
  189. package/dist/src/harness/session-machine/commit.js +1 -0
  190. package/dist/src/harness/session-machine/current.d.ts +29 -0
  191. package/dist/src/harness/session-machine/current.js +1 -0
  192. package/dist/src/harness/session-machine/events.d.ts +6 -0
  193. package/dist/src/harness/session-machine/events.js +1 -0
  194. package/dist/src/harness/session-machine/resolver-events.d.ts +12 -0
  195. package/dist/src/harness/session-machine/resolver-events.js +1 -0
  196. package/dist/src/harness/session-machine/state.d.ts +47 -0
  197. package/dist/src/harness/session-machine/state.js +1 -0
  198. package/dist/src/harness/session-machine/transitions.d.ts +188 -0
  199. package/dist/src/harness/session-machine/transitions.js +1 -0
  200. package/dist/src/harness/session-machine/view.d.ts +58 -0
  201. package/dist/src/harness/session-machine/view.js +1 -0
  202. package/dist/src/harness/step/after-model.d.ts +7 -0
  203. package/dist/src/harness/step/after-model.js +1 -0
  204. package/dist/src/harness/step/context.d.ts +59 -0
  205. package/dist/src/harness/step/context.js +1 -0
  206. package/dist/src/harness/step/intake.d.ts +34 -0
  207. package/dist/src/harness/step/intake.js +1 -0
  208. package/dist/src/harness/step/prompt.d.ts +37 -0
  209. package/dist/src/harness/step/prompt.js +1 -0
  210. package/dist/src/harness/step-hooks.d.ts +8 -13
  211. package/dist/src/harness/step-hooks.js +1 -1
  212. package/dist/src/harness/tool-loop.d.ts +7 -22
  213. package/dist/src/harness/tool-loop.js +1 -3
  214. package/dist/src/harness/tools.d.ts +13 -0
  215. package/dist/src/harness/tools.js +1 -1
  216. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  217. package/dist/src/harness/types.d.ts +6 -0
  218. package/dist/src/instrumentation/ai-sdk-hook-bridge.d.ts +1 -1
  219. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  220. package/dist/src/instrumentation/content.js +1 -1
  221. package/dist/src/instrumentation/dispatch.js +1 -1
  222. package/dist/src/instrumentation/lifecycle.d.ts +28 -56
  223. package/dist/src/instrumentation/native-events.d.ts +2 -1
  224. package/dist/src/instrumentation/native-events.js +1 -1
  225. package/dist/src/instrumentation/provider.d.ts +1 -1
  226. package/dist/src/instrumentation/runtime-context.d.ts +2 -3
  227. package/dist/src/instrumentation/runtime-context.js +1 -1
  228. package/dist/src/instrumentation/runtime.d.ts +11 -1
  229. package/dist/src/instrumentation/runtime.js +1 -1
  230. package/dist/src/instrumentation/state.d.ts +6 -1
  231. package/dist/src/instrumentation/state.js +1 -1
  232. package/dist/src/internal/application/package.js +1 -1
  233. package/dist/src/internal/attachments/limited-read.d.ts +16 -0
  234. package/dist/src/internal/attachments/limited-read.js +1 -0
  235. package/dist/src/internal/authored-definition/schema-backed.d.ts +2 -1
  236. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  237. package/dist/src/internal/mcp/published-tools.d.ts +13 -0
  238. package/dist/src/internal/mcp/published-tools.js +1 -0
  239. package/dist/src/internal/mcp/request-trace-context.d.ts +12 -0
  240. package/dist/src/internal/mcp/request-trace-context.js +1 -0
  241. package/dist/src/internal/mcp/streamable-http-server.d.ts +7 -3
  242. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  243. package/dist/src/internal/model-auth/transport.d.ts +3 -3
  244. package/dist/src/internal/model-auth/transport.js +1 -1
  245. package/dist/src/models/auto.d.ts +5 -5
  246. package/dist/src/models/auto.js +2 -2
  247. package/dist/src/protocol/message.d.ts +7 -0
  248. package/dist/src/protocol/message.js +1 -1
  249. package/dist/src/protocol/session-projection.d.ts +159 -0
  250. package/dist/src/protocol/session-projection.js +1 -0
  251. package/dist/src/public/ai/index.d.ts +1 -1
  252. package/dist/src/public/ai/index.js +1 -1
  253. package/dist/src/public/channels/chat-sdk/attachment-refs.d.ts +15 -0
  254. package/dist/src/public/channels/chat-sdk/attachment-refs.js +1 -0
  255. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  256. package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +11 -5
  257. package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -1
  258. package/dist/src/public/channels/discord/attachments.d.ts +15 -0
  259. package/dist/src/public/channels/discord/attachments.js +1 -0
  260. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  261. package/dist/src/public/channels/discord/inbound.d.ts +13 -0
  262. package/dist/src/public/channels/discord/inbound.js +1 -1
  263. package/dist/src/public/channels/linear/inbound-uploads.d.ts +21 -0
  264. package/dist/src/public/channels/linear/inbound-uploads.js +1 -0
  265. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  266. package/dist/src/public/channels/linq/inboundContent.d.ts +7 -1
  267. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  268. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  269. package/dist/src/public/channels/mcp.d.ts +17 -2
  270. package/dist/src/public/channels/mcp.js +1 -1
  271. package/dist/src/public/channels/photon/attachments.d.ts +21 -0
  272. package/dist/src/public/channels/photon/attachments.js +1 -0
  273. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  274. package/dist/src/public/channels/slack/attachments.d.ts +3 -1
  275. package/dist/src/public/channels/slack/attachments.js +1 -1
  276. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  277. package/dist/src/public/channels/teams/attachments.d.ts +4 -4
  278. package/dist/src/public/channels/teams/attachments.js +1 -1
  279. package/dist/src/public/channels/telegram/attachments.js +1 -1
  280. package/dist/src/public/channels/twilio/api.d.ts +7 -0
  281. package/dist/src/public/channels/twilio/api.js +1 -1
  282. package/dist/src/public/channels/twilio/inbound.d.ts +7 -0
  283. package/dist/src/public/channels/twilio/inbound.js +2 -2
  284. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  285. package/dist/src/public/definitions/connections/mcp.d.ts +1 -1
  286. package/dist/src/public/definitions/connections/openapi.d.ts +1 -1
  287. package/dist/src/react/index.d.ts +1 -0
  288. package/dist/src/react/index.js +1 -1
  289. package/dist/src/runtime/agent/mock-model-adapter.js +2 -2
  290. package/dist/src/runtime/resolve-tool.js +1 -1
  291. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -0
  292. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  293. package/dist/src/setup/cli/prompt-ui.d.ts +3 -0
  294. package/dist/src/setup/cli/prompt-ui.js +3 -1
  295. package/dist/src/setup/cli/select-component.d.ts +1 -0
  296. package/dist/src/setup/cli/select-component.js +1 -1
  297. package/dist/src/setup/flows/ensure-vercel-project.d.ts +2 -0
  298. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  299. package/dist/src/setup/integrations/discord/api.js +1 -1
  300. package/dist/src/setup/integrations/web/auth-options.d.ts +4 -0
  301. package/dist/src/setup/integrations/web/auth-options.js +1 -0
  302. package/dist/src/setup/integrations/web/auth-scaffold.d.ts +7 -0
  303. package/dist/src/setup/integrations/web/auth-scaffold.js +1 -0
  304. package/dist/src/setup/integrations/web/provision-auth.d.ts +3 -0
  305. package/dist/src/setup/integrations/web/provision-auth.js +1 -0
  306. package/dist/src/setup/integrations/web/setup.d.ts +11 -6
  307. package/dist/src/setup/integrations/web/setup.js +3 -3
  308. package/dist/src/setup/prompter.d.ts +2 -0
  309. package/dist/src/setup/prompter.js +1 -1
  310. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  311. package/dist/src/setup/scaffold/create/project.js +2 -2
  312. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  313. package/dist/src/setup/scaffold/create/web-template.js +1 -0
  314. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  315. package/dist/src/setup/vercel-project-api.d.ts +9 -0
  316. package/dist/src/setup/vercel-project-api.js +1 -1
  317. package/dist/src/setup/vercel-project.d.ts +4 -2
  318. package/dist/src/setup/vercel-project.js +0 -0
  319. package/dist/src/shared/web-search.d.ts +1 -1
  320. package/dist/src/subagents/adapter.js +1 -1
  321. package/dist/src/subagents/event-proxy-step.js +1 -1
  322. package/dist/src/subagents/hitl-proxy.d.ts +4 -28
  323. package/dist/src/subagents/hitl-proxy.js +1 -1
  324. package/dist/src/svelte/index.d.ts +2 -0
  325. package/dist/src/svelte/index.js +39 -2
  326. package/dist/src/svelte/use-eve-agent.js +1 -1
  327. package/dist/src/tools/approval/policies.d.ts +5 -5
  328. package/dist/src/tools/approval/policies.js +1 -1
  329. package/dist/src/tools/framework/agent.js +1 -1
  330. package/dist/src/tools/provided/agent-router.js +1 -1
  331. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  332. package/dist/src/tools/provided/ask-question.js +2 -2
  333. package/dist/src/tools/provided/bash.js +1 -1
  334. package/dist/src/tools/provided/framework-tool.d.ts +3 -0
  335. package/dist/src/tools/provided/framework-tool.js +1 -0
  336. package/dist/src/tools/provided/glob.js +2 -2
  337. package/dist/src/tools/provided/grep.js +2 -2
  338. package/dist/src/tools/provided/load-skill.js +1 -1
  339. package/dist/src/tools/provided/no-reply.js +1 -1
  340. package/dist/src/tools/provided/read-file.js +2 -2
  341. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  342. package/dist/src/tools/provided/sleep.js +1 -1
  343. package/dist/src/tools/provided/task-cancel.js +1 -1
  344. package/dist/src/tools/provided/task-wait.js +1 -1
  345. package/dist/src/tools/provided/web-fetch.js +2 -2
  346. package/dist/src/tools/provided/web-search.js +1 -1
  347. package/dist/src/tools/provided/workflow.js +1 -1
  348. package/dist/src/tools/provided/write-file.js +2 -2
  349. package/dist/src/tracing/agent-approval-instrumentation.d.ts +2 -2
  350. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  351. package/dist/src/tracing/agent-otel-provider.js +2 -2
  352. package/dist/src/tracing/agent-otel-usage.d.ts +1 -1
  353. package/dist/src/tracing/agent-otel-usage.js +1 -1
  354. package/dist/src/tracing/agent-span-contract.d.ts +0 -1
  355. package/dist/src/tracing/agent-span-contract.js +1 -1
  356. package/dist/src/tracing/agent-tool-instrumentation.d.ts +16 -6
  357. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  358. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  359. package/dist/src/tracing/agent-trace-state.d.ts +7 -3
  360. package/dist/src/tracing/invoke-tool-span.js +1 -1
  361. package/dist/src/tracing/local-trace-analysis.js +1 -1
  362. package/dist/src/vue/index.d.ts +2 -0
  363. package/dist/src/vue/index.js +39 -2
  364. package/dist/src/vue/use-eve-agent.js +1 -1
  365. package/docs/agent-config.md +2 -2
  366. package/docs/channels/chat-sdk.mdx +3 -1
  367. package/docs/channels/custom.mdx +2 -0
  368. package/docs/channels/discord.mdx +5 -4
  369. package/docs/channels/eve.mdx +65 -0
  370. package/docs/channels/linear.mdx +1 -1
  371. package/docs/channels/linq.mdx +2 -0
  372. package/docs/channels/mcp.mdx +39 -1
  373. package/docs/channels/photon.mdx +5 -0
  374. package/docs/channels/teams.mdx +4 -7
  375. package/docs/channels/twilio.mdx +1 -1
  376. package/docs/concepts/built-in-tools.md +12 -0
  377. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  378. package/docs/connections/overview.mdx +1 -1
  379. package/docs/dynamic-configuration/meta.json +1 -1
  380. package/docs/evals/judge.mdx +16 -16
  381. package/docs/evals/overview.mdx +1 -1
  382. package/docs/guides/{evaluate.md → decide.md} +35 -35
  383. package/docs/guides/dynamic-capabilities.md +1 -1
  384. package/docs/guides/frontend/overview.mdx +3 -1
  385. package/docs/guides/hooks.md +1 -1
  386. package/docs/guides/instrumentation/instrumentation.mdx +23 -22
  387. package/docs/guides/instrumentation/otel.mdx +13 -2
  388. package/docs/reference/cli.md +3 -3
  389. package/docs/reference/typescript-api.md +4 -2
  390. package/docs/tools/human-in-the-loop.md +6 -4
  391. package/docs/tools/workflows.mdx +4 -4
  392. package/package.json +11 -11
  393. package/dist/src/ai/evaluate.d.ts +0 -7
  394. package/dist/src/ai/evaluate.js +0 -1
  395. package/dist/src/client/message-task-parts.d.ts +0 -8
  396. package/dist/src/client/message-task-parts.js +0 -1
  397. package/dist/src/compiled/_chunks/workflow/dist-C3ZE62yI.js +0 -25
  398. package/dist/src/compiled/_chunks/workflow/experimental-evaluation-Dm32egEG.js +0 -5
  399. package/dist/src/harness/active-turn-id.d.ts +0 -11
  400. package/dist/src/harness/active-turn-id.js +0 -1
  401. package/dist/src/harness/approval-candidates.js +0 -1
  402. package/dist/src/harness/approval-delivery-coordinator.js +0 -1
  403. package/dist/src/harness/approved-call-callers.d.ts +0 -11
  404. package/dist/src/harness/approved-call-callers.js +0 -1
  405. package/dist/src/harness/cancelled-turn-emission.d.ts +0 -12
  406. package/dist/src/harness/cancelled-turn-emission.js +0 -1
  407. package/dist/src/harness/emission-state.d.ts +0 -36
  408. package/dist/src/harness/emission-state.js +0 -1
  409. package/dist/src/harness/held-requests.d.ts +0 -18
  410. package/dist/src/harness/held-requests.js +0 -1
  411. package/dist/src/harness/hitl/approval-input-requests.d.ts +0 -27
  412. package/dist/src/harness/hitl/approval-input-requests.js +0 -1
  413. package/dist/src/harness/hitl/pending-input-resolution.d.ts +0 -54
  414. package/dist/src/harness/hitl/pending-input-resolution.js +0 -1
  415. package/dist/src/harness/hitl/session-limit-input-requests.d.ts +0 -12
  416. package/dist/src/harness/hitl/session-limit-input-requests.js +0 -1
  417. package/dist/src/harness/input-requests.d.ts +0 -37
  418. package/dist/src/harness/input-requests.js +0 -1
  419. package/dist/src/harness/pending-input-batches.d.ts +0 -81
  420. package/dist/src/harness/pending-input-batches.js +0 -1
  421. package/dist/src/harness/session-limit-enforcement.d.ts +0 -45
  422. package/dist/src/harness/session-limit-enforcement.js +0 -1
  423. package/dist/src/harness/stale-input-responses.js +0 -3
  424. package/dist/src/harness/workflow-dispatch.d.ts +0 -30
  425. package/dist/src/harness/workflow-dispatch.js +0 -1
  426. package/dist/src/public/channels/linear/inbound-images.d.ts +0 -19
  427. package/dist/src/public/channels/linear/inbound-images.js +0 -1
  428. package/dist/src/tracing/agent-action-instrumentation.d.ts +0 -26
  429. package/dist/src/tracing/agent-action-instrumentation.js +0 -1
  430. /package/dist/src/harness/{compaction.d.ts → compaction/engine.d.ts} +0 -0
  431. /package/dist/src/harness/{compaction-prompt.d.ts → compaction/prompt.d.ts} +0 -0
  432. /package/dist/src/harness/{compaction-prompt.js → compaction/prompt.js} +0 -0
  433. /package/dist/src/harness/{session-limit-continuation.d.ts → hitl/budget-request.d.ts} +0 -0
  434. /package/dist/src/harness/{session-limit-continuation.js → hitl/budget-request.js} +0 -0
  435. /package/dist/src/harness/{approval-delivery-coordinator.d.ts → hitl/coordinator.d.ts} +0 -0
  436. /package/dist/src/harness/{model-call-error.js → model-call/errors.js} +0 -0
@@ -0,0 +1,59 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { AlsContext } from "#context/container.js";
3
+ import { type HarnessModelMessage } from "#harness/messages.js";
4
+ import { type Publish, type Transition } from "#harness/session-machine/commit.js";
5
+ import type { StepProjection } from "#harness/session-machine/current.js";
6
+ import { type SessionView, type TurnPosition } from "#harness/session-machine/view.js";
7
+ import type { HarnessEmitFn, HarnessSession, StepFn, StepInput, StepResult, ToolLoopHarnessConfig } from "#harness/types.js";
8
+ import type { InstrumentationStepScope } from "#instrumentation/runtime.js";
9
+ import type { createHistoryViewPreparer } from "#shared/history-view.js";
10
+ type HistoryViewPreparer = ReturnType<typeof createHistoryViewPreparer>;
11
+ /**
12
+ * One harness step: the session it changes, and the machine it changes the session through.
13
+ * Every lifecycle change goes through `apply`, which publishes the transition's events and saves
14
+ * what it changed; `position` reads where those events left the session.
15
+ */
16
+ export interface Step {
17
+ session: HarnessSession;
18
+ frameworkToolNames: ReadonlySet<string>;
19
+ readonly config: ToolLoopHarnessConfig;
20
+ /** The step's context; direct harness tests may run without one. */
21
+ readonly ctx: AlsContext | undefined;
22
+ readonly runStep: StepFn;
23
+ readonly publish: Publish;
24
+ /** The caller's event handler. Without one, a failure throws instead of being reported. */
25
+ readonly emit: HarnessEmitFn | undefined;
26
+ readonly instrumentation: InstrumentationStepScope<HarnessSession> | undefined;
27
+ /** A child's caller or a schedule hears only the turn's real end. */
28
+ readonly hasDelegatedCaller: boolean;
29
+ view(): SessionView;
30
+ position(): TurnPosition;
31
+ apply(transition: Transition, messages?: readonly ModelMessage[]): Promise<void>;
32
+ /** History as the model and hooks see it, under `state`, the session's by default. */
33
+ projectHistory(messages: readonly ModelMessage[], state?: HarnessSession["state"]): readonly ModelMessage[];
34
+ }
35
+ export declare function createStep(input: {
36
+ readonly config: ToolLoopHarnessConfig;
37
+ readonly ctx: AlsContext | undefined;
38
+ readonly emit: HarnessEmitFn | undefined;
39
+ readonly instrumentation: InstrumentationStepScope<HarnessSession> | undefined;
40
+ readonly live: StepProjection;
41
+ readonly prepareHistory: HistoryViewPreparer;
42
+ readonly publish: Publish;
43
+ readonly runStep: StepFn;
44
+ readonly session: HarnessSession;
45
+ }): Step;
46
+ /**
47
+ * Opens the turn, or joins the open one, with the preamble its hooks prepare: memory recall and
48
+ * dynamic instructions join history ahead of the turn's input. Returns the step's result when the
49
+ * preamble failed the session.
50
+ */
51
+ export declare function openTurn(step: Step, opened: {
52
+ readonly input: readonly HarnessModelMessage[];
53
+ readonly message?: StepInput["message"];
54
+ }): Promise<StepResult | undefined>;
55
+ /** A lifecycle event failed to publish: only a dynamic model selection failure is reported. */
56
+ export declare function failBoundaryEvent(step: Step, error: unknown): Promise<StepResult>;
57
+ /** No model can serve the turn: the session fails. */
58
+ export declare function failModelSelection(step: Step, error: unknown): Promise<StepResult>;
59
+ export {};
@@ -0,0 +1 @@
1
+ import{createErrorId,createLogger}from"#internal/logging.js";import{ParentSessionKey,SessionCallbackKey}from"#context/keys.js";import{toErrorMessage}from"#shared/errors.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{drainMemoryCommit,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{applyTransition,sessionView}from"#harness/session-machine/commit.js";import{fail,receive}from"#harness/session-machine/transitions.js";import{isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";const log=createLogger(`harness.step`);function createStep(e){let{ctx:t,live:n}=e,r={session:e.session,frameworkToolNames:new Set,config:e.config,ctx:t,runStep:e.runStep,publish:e.publish,emit:e.emit,instrumentation:e.instrumentation,hasDelegatedCaller:t?.get(ParentSessionKey)!==void 0||t?.get(SessionCallbackKey)!==void 0,view:()=>sessionView(n.read(),r.session.state),position:()=>turnPosition(n.read()),async apply(t,n){r.session=await applyTransition(r.session,t,e.publish,n)},projectHistory:(t,n=r.session.state)=>e.prepareHistory(t,n).messages};return r}async function openTurn(e,t){let{config:n,ctx:r}=e;r!==void 0&&(prepareDynamicInstructionPreamble(r,e.projectHistory(e.session.history)),prepareMemoryPreamble(r,{history:e.session.history,input:[...t.input],projector:n.historyProjector,state:e.session.state}));let i;try{let r=e.position(),i=await e.instrumentation?.preparePreamble({sequence:r.sequence,sessionStarted:r.sessionStarted,traceContext:e.instrumentation?.traceContext,turnId:activeTurnId(r)});await e.apply(receive(e.view(),{message:t.message,runtime:n.runtimeIdentity,trace:i}),e.projectHistory([...e.session.history,...t.input]))}catch(e){i={error:e}}let a=r===void 0?[]:drainDynamicInstructionUserMessages(r),o=r===void 0?void 0:drainMemoryCommit(r);if(e.session={...e.session,history:validateHarnessModelMessages([...e.session.history,...o?.recalledMessages??[],...a]),state:o?.state??e.session.state},i!==void 0)return failBoundaryEvent(e,i.error);e.instrumentation?.setTurnId(e.position().turnId)}async function failBoundaryEvent(e,t){if(throwIfTurnAborted(e.config.abortSignal),isTurnCancellation(t))throw t;if(isDynamicModelSelectionError(t))return failModelSelection(e,t);throw t}async function failModelSelection(e,t){if(throwIfTurnAborted(e.config.abortSignal),e.instrumentation?.recordError(t),e.emit===void 0)throw t;let n=createErrorId(),r=toErrorMessage(t),{session:i}=e;return log.error(`model selection failed terminally`,{error:t,errorId:n,sessionId:i.sessionId,turnId:activeTurnId(e.position())}),await e.apply(fail(e.view(),{code:`MODEL_SELECTION_FAILED`,details:{errorId:n},message:r,terminal:{sessionId:i.sessionId}})),{next:e.hasDelegatedCaller?{done:!0,isError:!0,output:r}:{done:!0,output:``},session:e.session}}export{createStep,failBoundaryEvent,failModelSelection,openTurn};
@@ -0,0 +1,34 @@
1
+ import { type HarnessModelMessage, type UserModelMessage } from "#harness/messages.js";
2
+ import { getTurnClientContextState } from "#harness/turn-client-context.js";
3
+ import type { StepInput } from "#harness/types.js";
4
+ import type { Step } from "./context.js";
5
+ /**
6
+ * Settles the calls the runtime ran for parked steps. Returns `undefined` while some are still
7
+ * running: input queued behind them waits until they have. Otherwise returns the step's input
8
+ * without the results it settled, and whether the step waited on any.
9
+ */
10
+ export declare function settleRuntimeWork(step: Step, input: StepInput | undefined): Promise<{
11
+ readonly input: StepInput | undefined;
12
+ readonly waited: boolean;
13
+ } | undefined>;
14
+ /** The turn's input as the model reads it. */
15
+ export interface TurnInput {
16
+ readonly turnId: string;
17
+ /** Context the client sent for this turn, which never joins history. */
18
+ readonly clientContext: readonly string[] | undefined;
19
+ readonly storedClientContext: ReturnType<typeof getTurnClientContextState>;
20
+ readonly ephemeral: readonly UserModelMessage[];
21
+ /** The context entries and the message, in history order. */
22
+ readonly messages: readonly UserModelMessage[];
23
+ /** The input carries a user's message, which follows tool results across a boundary. */
24
+ readonly hasUserMessage: boolean;
25
+ }
26
+ /**
27
+ * Prepares the turn's input: client and context entries, and the message with its attachments
28
+ * staged to the sandbox. A message a plain-text answer consumed never reaches the model.
29
+ */
30
+ export declare function prepareTurnInput(step: Step, input: StepInput | undefined, options: {
31
+ readonly consumedMessage: boolean;
32
+ }): Promise<TurnInput>;
33
+ /** The turn's input as it follows tool results: a user message needs a boundary before it. */
34
+ export declare function followingToolResults(turn: TurnInput): HarnessModelMessage[];
@@ -0,0 +1 @@
1
+ import{readClientContext}from"#internal/client-context.js";import{TOOL_RESULT_BOUNDARY,createFrameworkUserMessage,createUserMessage,frameworkMessageKindForStepInput,normalizeUserContent}from"#harness/messages.js";import{activeTurnId,runtimeWait}from"#harness/session-machine/view.js";import{stageAttachmentsToSandbox,stageToolResultMedia}from"#harness/attachment-staging.js";import{forgetFinishedRuns,runtimeResultCalls}from"#harness/coordination.js";import{finishRun,settle}from"#harness/session-machine/transitions.js";import{resolveRuntimeActionResultsForCallIds}from"#runtime/actions/results.js";import{getTurnClientContextState}from"#harness/turn-client-context.js";async function settleRuntimeWork(e,t){let n=runtimeWait(e.session.state);if(n===void 0)return{input:t,waited:!1};let r=resolveRuntimeActionResultsForCallIds({pendingCallIds:n.callIds,results:t?.runtimeActionResults??[]});if(r===void 0)return;let i=forgetFinishedRuns(e.session,r,n.event.turnId);e.session=i.session,await e.apply(finishRun(e.view(),{requestIds:i.requestIds}));let a=await runtimeResultCalls(r,e.config.tools),o=(await stageToolResultMedia([{role:`tool`,content:a.map(({part:e})=>e)}])).flatMap(e=>e.role===`tool`?e.content.filter(e=>e.type===`tool-result`):[]);if(await e.apply(settle(e.view(),{results:a.map((e,t)=>({...e,part:o[t]}))})),t===void 0)return{input:t,waited:!0};let{runtimeActionResults:s,...c}=t;return{input:c,waited:!0}}async function prepareTurnInput(e,t,n){let r=activeTurnId(e.position()),i=getTurnClientContextState(e.session.state,r),a=readClientContext(t),o=(a??i?.messages)?.map(e=>createFrameworkUserMessage(`context.instruction`,e))??[],s=(t?.context??[]).map(e=>createFrameworkUserMessage(`context.instruction`,e)),c=frameworkMessageKindForStepInput(t),l=normalizeUserContent(t?.message),u=l!==void 0&&!n.consumedMessage?await stageAttachmentsToSandbox(l):void 0;return u!==void 0&&s.push(c===void 0?createUserMessage(`user`,u):createFrameworkUserMessage(c,u)),{clientContext:a,ephemeral:o,hasUserMessage:u!==void 0&&c===void 0,messages:s,storedClientContext:i,turnId:r}}function followingToolResults(e){return[...e.hasUserMessage?[{content:TOOL_RESULT_BOUNDARY,role:`assistant`}]:[],...e.messages]}export{followingToolResults,prepareTurnInput,settleRuntimeWork};
@@ -0,0 +1,37 @@
1
+ import { type HarnessModelMessage } from "#harness/messages.js";
2
+ import { getTurnClientContextState } from "#harness/turn-client-context.js";
3
+ import type { Step } from "./context.js";
4
+ import { type TurnInput } from "./intake.js";
5
+ type ClientContext = NonNullable<ReturnType<typeof getTurnClientContextState>>;
6
+ /**
7
+ * What the model reads this step: durable history, with the task results and notes the step
8
+ * delivers and the turn's input, and the client's context for the turn, which keeps one position
9
+ * across the turn's steps and never joins history.
10
+ */
11
+ export interface Prompt {
12
+ /** Durable messages. Compaction may rewrite them. */
13
+ messages: HarnessModelMessage[];
14
+ clientContext: ClientContext | undefined;
15
+ }
16
+ export declare function buildPrompt(step: Step, turn: TurnInput): Promise<Prompt>;
17
+ /**
18
+ * The prompt a step starts on while approved calls wait to run: history and the turn's input,
19
+ * without the task results and the client context's position a prompt settles, which wait for
20
+ * the prompt the model reads once the calls have run.
21
+ */
22
+ export declare function previewPrompt(step: Step, turn: TurnInput): Prompt;
23
+ /**
24
+ * The turn's input after `messages`, past a tool-result boundary when they end in tool results.
25
+ * The client's context takes its position here, and never joins the messages.
26
+ */
27
+ export declare function placeTurnInput(step: Step, messages: readonly HarnessModelMessage[], turn: TurnInput): HarnessModelMessage[];
28
+ /** `messages`, the prompt's by default, with the client's context at its position. */
29
+ export declare function withClientContext(prompt: Prompt, messages?: readonly HarnessModelMessage[]): HarnessModelMessage[];
30
+ /** The prompt as the model reads it: with the client's context, projected for its history view. */
31
+ export declare function projectPrompt(step: Step, prompt: Prompt): HarnessModelMessage[];
32
+ /**
33
+ * Compaction rewrote the durable messages: the client's context keeps its distance from the end,
34
+ * so it stays after the turn's input.
35
+ */
36
+ export declare function compactPrompt(step: Step, prompt: Prompt, messages: HarnessModelMessage[]): void;
37
+ export {};
@@ -0,0 +1 @@
1
+ import{followingToolResults}from"./intake.js";import{createFrameworkUserMessage,followsToolResults,normalizeModelMessages,validateHarnessModelMessages}from"#harness/messages.js";import{appendTaskContext}from"#execution/tasks/model-step.js";import{hasUnansweredToolCall}from"#harness/model-call/response.js";import{getTurnClientContextState,setTurnClientContextState}from"#harness/turn-client-context.js";async function buildPrompt(e,t){let n=validateHarnessModelMessages([...e.session.history]);if(!hasUnansweredToolCall(n)){let t=await appendTaskContext({messages:n,projectHistory:e.projectHistory,session:e.session,tools:e.config.tools});e.session=t.session,n.push(...t.messages)}let r=placeTurnInput(e,n,t);return{clientContext:getTurnClientContextState(e.session.state,t.turnId),messages:r}}function previewPrompt(e,t){let n=validateHarnessModelMessages([...e.session.history]);return{clientContext:turnClientContext(n,t),messages:withTurnInput(n,t)}}function placeTurnInput(e,t,n){let r=turnClientContext(t,n);return r!==void 0&&(e.session=setTurnClientContextState(e.session,r)),withTurnInput(t,n)}function turnClientContext(e,t){return t.clientContext===void 0?t.storedClientContext:{insertionIndex:t.storedClientContext?.insertionIndex??e.length,messages:t.clientContext,turnId:t.turnId}}function withTurnInput(e,t){return[...e,...followsToolResults(e)?followingToolResults(t):t.messages]}function withClientContext(e,t=e.messages){let{clientContext:n}=e;if(n===void 0||n.messages.length===0)return[...t];let r=Math.min(Math.max(0,n.insertionIndex),t.length);return[...t.slice(0,r),...n.messages.map(e=>createFrameworkUserMessage(`context.instruction`,e)),...t.slice(r)]}function projectPrompt(e,t){return validateHarnessModelMessages(normalizeModelMessages(e.projectHistory(withClientContext(t))))}function compactPrompt(e,t,n){let{clientContext:r}=t;if(r!==void 0){let i=Math.max(0,t.messages.length-r.insertionIndex);t.clientContext={...r,insertionIndex:Math.max(0,n.length-i)},e.session=setTurnClientContextState(e.session,t.clientContext)}t.messages=n}export{buildPrompt,compactPrompt,placeTurnInput,previewPrompt,projectPrompt,withClientContext};
@@ -1,5 +1,5 @@
1
- import type { GenerateTextOnStepStartCallback, PrepareStepFunction, ProviderMetadata, StepResult, ToolSet } from "ai";
2
- import type { HarnessEmissionState } from "#harness/emission.js";
1
+ import type { GenerateTextOnStepStartCallback, ModelMessage, PrepareStepFunction, ProviderMetadata, StepResult, ToolSet } from "ai";
2
+ import type { TurnPosition } from "#harness/session-machine/view.js";
3
3
  import { type AnthropicCacheMarker, type PromptCachePath } from "#harness/prompt-cache.js";
4
4
  import { type HarnessEmitFn, type HarnessSession, type ToolLoopHarnessConfig } from "#harness/types.js";
5
5
  /**
@@ -17,16 +17,11 @@ export type HarnessStepResult = Pick<StepResult<ToolSet>, "content" | "finishRea
17
17
  interface StepHooksInput {
18
18
  readonly auth?: import("#channel/types.js").SessionAuthContext | null;
19
19
  readonly cachePath: PromptCachePath;
20
- readonly emit?: HarnessEmitFn;
21
- readonly emissionState: HarnessEmissionState;
22
20
  /**
23
- * When `false`, `onStepStart` skips the `step.started` emission.
24
- * Used by the harness recovery path to avoid emitting `step.started`
25
- * twice when retrying the same step with a degraded toolset.
26
- *
27
- * Defaults to `true`.
21
+ * Starts the model step the SDK is about to run. Omitted when the step already started, as
22
+ * it has for a retry of the same step.
28
23
  */
29
- readonly emitStepStarted?: boolean;
24
+ readonly startStep?: (messages: readonly ModelMessage[]) => Promise<void>;
30
25
  readonly marker: AnthropicCacheMarker | undefined;
31
26
  readonly session: HarnessSession;
32
27
  }
@@ -37,7 +32,7 @@ interface StepHooks {
37
32
  /**
38
33
  * `ToolLoopAgent` `onStepStart` callback.
39
34
  *
40
- * Emits the `step.started` event from the prepared step input.
35
+ * Starts the step from the prepared step input.
41
36
  */
42
37
  readonly onStepStart: GenerateTextOnStepStartCallback<ToolSet>;
43
38
  /**
@@ -61,7 +56,7 @@ interface StepHooks {
61
56
  * have been emitted before proceeding to post-step handling.
62
57
  *
63
58
  * Resolves once per hooks instance: a retried model call must rebuild
64
- * hooks via a fresh `runOneModelCall` attempt. Re-running a call against
59
+ * hooks via a fresh `ModelCaller.call` attempt. Re-running a call against
65
60
  * hooks whose `stepResult` already resolved reads the previous attempt's
66
61
  * result, not the retry's.
67
62
  *
@@ -96,7 +91,7 @@ export declare function buildStepHooks(input: StepHooksInput): StepHooks;
96
91
  * `handledInlineToolResultCallIds` contains results emitted by
97
92
  * `emitStreamContent` or sent to authorization. Skip them here.
98
93
  */
99
- export declare function emitStepActions(emitFn: HarnessEmitFn, state: HarnessEmissionState, step: HarnessStepResult, options: {
94
+ export declare function emitStepActions(emitFn: HarnessEmitFn, state: TurnPosition, step: HarnessStepResult, options: {
100
95
  readonly emittedActionCallIds?: ReadonlySet<string>;
101
96
  readonly excludedActionCallIds?: ReadonlySet<string>;
102
97
  readonly excludedActionToolNames: ReadonlySet<string>;
@@ -1 +1 @@
1
- import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{emitStepStarted}from"#harness/emission.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{createRuntimeToolResultFromMessagePart,createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError}from"#harness/action-result-helpers.js";import{emitNestedToolActions}from"#harness/nested-actions.js";import{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{applyConversationCacheControl,mergeGatewayAutoCaching}from"#harness/prompt-cache.js";import{resolveCallProviderOptions}from"#harness/provider-safety.js";import{requireSessionModelReference}from"#harness/types.js";function buildStepHooks(e){let t=e.session,n=e.emit,r;return{onStepEnd:async e=>{r(e)},onStepStart:async({messages:r})=>{n&&e.emitStepStarted!==!1&&await emitStepStarted(n,e.emissionState,requireSessionModelReference(t).id,r)},prepareStep:async({messages:n,model:r})=>{let i=n;e.cachePath.kind===`anthropic-direct`&&e.marker&&(i=applyConversationCacheControl([...n],e.marker));let a={messages:i},o=requireSessionModelReference(t),s=resolveCallProviderOptions({auth:e.auth??contextStorage.getStore()?.get(AuthKey)??null,conversationId:resolveConversationId(t.rootSessionId??t.sessionId),model:r,modelReference:o,providerOptions:o.providerOptions});return e.cachePath.kind===`gateway-auto`?a.providerOptions=mergeGatewayAutoCaching(s):s!==void 0&&(a.providerOptions=s),a},stepResult:new Promise(e=>{r=e})}}async function emitStepActions(e,t,n,r){let i=new Set(n.toolCalls.filter(isProviderExecutedToolCall).map(e=>e.toolCallId)),a=new Set([...r.excludedActionCallIds??[],...i,...extractToolApprovalInputRequests({content:n.content??[],excludedCallIds:r.excludedActionCallIds}).map(e=>e.action.callId),...n.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId)]),isExcluded=(e,t)=>a.has(e)||r.excludedActionToolNames.has(t),o=n.toolCalls.filter(e=>!isExcluded(e.toolCallId,e.toolName)&&!r.emittedActionCallIds?.has(e.toolCallId)).map(e=>createPresentedRuntimeActionRequestFromToolCall({toolCall:e,tools:r.tools}));o.length>0&&await e(createActionsRequestedEvent({actions:o.map(({action:e})=>e),presentation:collectActionPresentation(o),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));let s=r.handledInlineToolResultCallIds,c=new Map(n.toolResults.map(e=>[e.toolCallId,e.output]));for(let r of reconcileToolResults(n)){if(isExcluded(r.callId,r.toolName)||s?.has(r.callId))continue;let n=c.get(r.callId);shouldSkipAuthorizationActionResult(r.callId,n)||(await emitNestedToolActions(e,t,r.callId),await e(createActionResultEvent({result:r,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})))}await e(createStepCompletedEvent({finishReason:normalizeAssistantStepFinishReason(n.finishReason),providerMetadata:extractStepProviderMetadata(n.providerMetadata),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId,usage:extractStepUsage({costUsd:extractGatewayCostUsd(n.providerMetadata),usage:n.usage})}))}function isProviderExecutedToolCall(e){return e.providerExecuted===!0}function reconcileToolResults(e){let t=new Map;for(let n of e.toolResults)n.providerExecuted!==!0&&t.set(n.toolCallId,createRuntimeToolResultFromStepResult(n));for(let n of e.content??[])n.type===`tool-error`&&n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromToolError(n)));for(let n of extractToolResultParts(e.response.messages))n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromMessagePart(n)));return[...t.values()]}function shouldSkipAuthorizationActionResult(e,t){if(t!==void 0&&isPendingAuthorizationToolOutput(t))return!0;let n=contextStorage.getStore();if(n===void 0)return!1;let r=readToolInterrupt(n,e);return r!==void 0&&isAuthorizationSignal(r)}function extractToolResultParts(e){let t=[];for(let n of e)if(n.role===`tool`&&Array.isArray(n.content))for(let e of n.content)e.type===`tool-result`&&t.push(e);return t}function extractStepUsage(e){let t={};e.costUsd!==void 0&&(t.costUsd=e.costUsd);let n=e.usage;return n===void 0?Object.keys(t).length>0?t:void 0:(n.inputTokens!==void 0&&(t.inputTokens=n.inputTokens),n.outputTokens!==void 0&&(t.outputTokens=n.outputTokens),n.inputTokenDetails?.cacheReadTokens!==void 0&&(t.cacheReadTokens=n.inputTokenDetails.cacheReadTokens),n.inputTokenDetails?.cacheWriteTokens!==void 0&&(t.cacheWriteTokens=n.inputTokenDetails.cacheWriteTokens),Object.keys(t).length>0?t:void 0)}function extractStepProviderMetadata(e){let t=readGatewayGenerationId(e);return t===void 0?void 0:{gateway:{generationId:t}}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayGenerationId(e){let t=readGatewayMetadata(e)?.generationId;return typeof t==`string`&&t.length>0?t:void 0}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}export{buildStepHooks,emitStepActions,readGatewayGenerationId};
1
+ import{contextStorage}from"#context/container.js";import{AuthKey}from"#context/keys.js";import{createActionResultEvent,createActionsRequestedEvent,createStepCompletedEvent}from"#protocol/message.js";import{resolveConversationId}from"#shared/conversation-identity.js";import{isAuthorizationSignal,isPendingAuthorizationToolOutput}from"#harness/authorization.js";import{createRuntimeToolResultFromMessagePart,createRuntimeToolResultFromStepResult,createRuntimeToolResultFromToolError}from"#harness/action-result-helpers.js";import{emitNestedToolActions}from"#harness/nested-actions.js";import{requireSessionModelReference}from"#harness/types.js";import{resolveCallProviderOptions}from"#harness/provider-safety.js";import{isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{collectActionPresentation,createPresentedRuntimeActionRequestFromToolCall}from"#harness/action-presentation.js";import{normalizeAssistantStepFinishReason}from"#harness/finish-reason.js";import{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{readToolInterrupt}from"#harness/tool-interrupts.js";import{applyConversationCacheControl,mergeGatewayAutoCaching}from"#harness/prompt-cache.js";function buildStepHooks(e){let t=e.session,n;return{onStepEnd:async e=>{n(e)},onStepStart:async({messages:t})=>{await e.startStep?.(t)},prepareStep:async({messages:n,model:r})=>{let i=n;e.cachePath.kind===`anthropic-direct`&&e.marker&&(i=applyConversationCacheControl([...n],e.marker));let a={messages:i},o=requireSessionModelReference(t),s=resolveCallProviderOptions({auth:e.auth??contextStorage.getStore()?.get(AuthKey)??null,conversationId:resolveConversationId(t.rootSessionId??t.sessionId),model:r,modelReference:o,providerOptions:o.providerOptions});return e.cachePath.kind===`gateway-auto`?a.providerOptions=mergeGatewayAutoCaching(s):s!==void 0&&(a.providerOptions=s),a},stepResult:new Promise(e=>{n=e})}}async function emitStepActions(e,t,n,r){let i=new Set(n.toolCalls.filter(isProviderExecutedToolCall).map(e=>e.toolCallId)),a=new Set([...r.excludedActionCallIds??[],...i,...extractToolApprovalInputRequests({content:n.content??[],excludedCallIds:r.excludedActionCallIds}).map(e=>e.action.callId),...n.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId)]),isExcluded=(e,t)=>a.has(e)||r.excludedActionToolNames.has(t),o=n.toolCalls.filter(e=>!isExcluded(e.toolCallId,e.toolName)&&!r.emittedActionCallIds?.has(e.toolCallId)).map(e=>createPresentedRuntimeActionRequestFromToolCall({toolCall:e,tools:r.tools}));o.length>0&&await e(createActionsRequestedEvent({actions:o.map(({action:e})=>e),presentation:collectActionPresentation(o),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId}));let s=r.handledInlineToolResultCallIds,c=new Map(n.toolResults.map(e=>[e.toolCallId,e.output]));for(let r of reconcileToolResults(n)){if(isExcluded(r.callId,r.toolName)||s?.has(r.callId))continue;let n=c.get(r.callId);shouldSkipAuthorizationActionResult(r.callId,n)||(await emitNestedToolActions(e,t,r.callId),await e(createActionResultEvent({result:r,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})))}await e(createStepCompletedEvent({finishReason:normalizeAssistantStepFinishReason(n.finishReason),providerMetadata:extractStepProviderMetadata(n.providerMetadata),sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId,usage:extractStepUsage({costUsd:extractGatewayCostUsd(n.providerMetadata),usage:n.usage})}))}function isProviderExecutedToolCall(e){return e.providerExecuted===!0}function reconcileToolResults(e){let t=new Map;for(let n of e.toolResults)n.providerExecuted!==!0&&t.set(n.toolCallId,createRuntimeToolResultFromStepResult(n));for(let n of e.content??[])n.type===`tool-error`&&n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromToolError(n)));for(let n of extractToolResultParts(e.response.messages))n.providerExecuted!==!0&&(t.has(n.toolCallId)||t.set(n.toolCallId,createRuntimeToolResultFromMessagePart(n)));return[...t.values()]}function shouldSkipAuthorizationActionResult(e,t){if(t!==void 0&&isPendingAuthorizationToolOutput(t))return!0;let n=contextStorage.getStore();if(n===void 0)return!1;let r=readToolInterrupt(n,e);return r!==void 0&&isAuthorizationSignal(r)}function extractToolResultParts(e){let t=[];for(let n of e)if(n.role===`tool`&&Array.isArray(n.content))for(let e of n.content)e.type===`tool-result`&&t.push(e);return t}function extractStepUsage(e){let t={};e.costUsd!==void 0&&(t.costUsd=e.costUsd);let n=e.usage;return n===void 0?Object.keys(t).length>0?t:void 0:(n.inputTokens!==void 0&&(t.inputTokens=n.inputTokens),n.outputTokens!==void 0&&(t.outputTokens=n.outputTokens),n.inputTokenDetails?.cacheReadTokens!==void 0&&(t.cacheReadTokens=n.inputTokenDetails.cacheReadTokens),n.inputTokenDetails?.cacheWriteTokens!==void 0&&(t.cacheWriteTokens=n.inputTokenDetails.cacheWriteTokens),Object.keys(t).length>0?t:void 0)}function extractStepProviderMetadata(e){let t=readGatewayGenerationId(e);return t===void 0?void 0:{gateway:{generationId:t}}}function extractGatewayCostUsd(e){let t=readGatewayMetadata(e)?.cost;if(typeof t==`number`&&Number.isFinite(t))return t;if(typeof t==`string`){let e=Number(t);return Number.isFinite(e)?e:void 0}}function readGatewayGenerationId(e){let t=readGatewayMetadata(e)?.generationId;return typeof t==`string`&&t.length>0?t:void 0}function readGatewayMetadata(e){let t=e?.gateway;return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}export{buildStepHooks,emitStepActions,readGatewayGenerationId};
@@ -1,24 +1,9 @@
1
- import { type ModelMessage } from "ai";
2
- import { type HarnessStepResult } from "#harness/step-hooks.js";
3
- import { type StepFn, type ToolLoopHarnessConfig } from "#harness/types.js";
4
- export declare function createToolLoopHarness(config: ToolLoopHarnessConfig): StepFn;
5
- type ToolResponsePart = Extract<ModelMessage, {
6
- role: "tool";
7
- }>["content"][number];
8
- type ToolResultPart = Extract<ToolResponsePart, {
9
- type: "tool-result";
10
- }>;
11
- type StepResponseMessage = HarnessStepResult["response"]["messages"][number];
1
+ import type { StepFn, ToolLoopHarnessConfig } from "#harness/types.js";
12
2
  /**
13
- * Appends synthesized tool results for calls that have no result anywhere in
14
- * the step's response messages. Exported for its dedupe contract: a call
15
- * already answered — including provider-executed results the SDK keeps
16
- * inline in the assistant message — must never receive a second
17
- * `tool-result`, or the next Anthropic call rejects the history with
18
- * "each tool_use must have a single result".
3
+ * Creates the harness step: one step of a session, backed by the AI SDK's `ToolLoopAgent`.
4
+ *
5
+ * A step settles what earlier steps parked and takes its delivery's answers, opens or joins the
6
+ * turn, runs the work those answers approved, then makes one model step and acts on its response.
7
+ * Every lifecycle change goes through the session machine (`Step.apply`).
19
8
  */
20
- export declare function appendMissingToolResultMessages(input: {
21
- readonly append: readonly ToolResultPart[];
22
- readonly responseMessages: readonly StepResponseMessage[];
23
- }): StepResponseMessage[];
24
- export {};
9
+ export declare function createToolLoopHarness(config: ToolLoopHarnessConfig): StepFn;
@@ -1,3 +1 @@
1
- import{ToolLoopAgent,isStepCount}from"ai";import{readClientContext}from"#internal/client-context.js";import{createErrorId,createLogger,formatError,logError}from"#internal/logging.js";import{contextStorage}from"#context/container.js";import{AuthKey,HistoryStateKey,ParentSessionKey,ScheduleIdKey,SessionCallbackKey,StaticModelReferenceKey}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,createInputResolvedEvent,createMessageCompletedEvent,createResultCompletedEvent,createSessionWaitingEvent,createStepCompletedEvent,createStepStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{toModelSchema}from"#tools/schema.js";import{resolveModelProvider,resolveProviderHeaders}from"#internal/gateway.js";import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{TOOL_RESULT_BOUNDARY,createFrameworkUserMessage,createUserMessage,followsToolResults,frameworkMessageKindForStepInput,normalizeModelMessages,normalizeUserContent,resolveAssistantStepText,validateHarnessModelMessages}from"#harness/messages.js";import{getEffectiveModelSelection}from"#context/effective-model.js";import{drainMemoryCommit,prepareMemoryCompaction,prepareMemoryPreamble}from"#context/memory-lifecycle.js";import{canonicalizeMemoryRecords,clearMemorySessionState,shouldCanonicalizeMemory}from"#shared/memory-state.js";import{advanceStep,emitFailedStep,emitRecoverableFailedTurn,emitStepStarted,emitStreamContent,emitTurnEpilogue,emitTurnPreamble,getHarnessEmissionState,setHarnessEmissionState}from"#harness/emission.js";import{renderFinalOutputWhileWorkingError}from"#execution/tasks/render.js";import{renderPendingApprovalsInstruction,renderPendingApprovalsSnippet}from"#harness/hitl/approval-prompt.js";import{setTimeout}from"node:timers/promises";import{resolveConversationId}from"#shared/conversation-identity.js";import{accumulateTurnUsage,getSessionUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{getPendingCoordinationBatch,resolvePendingCoordination,setPendingCoordinationBatch}from"#harness/coordination.js";import{hydrateSandboxAttachments,moveToolResultFilesToUserMessages,stageAttachmentsToSandbox,stageToolResultMedia}from"#harness/attachment-staging.js";import{getPendingAnnouncements}from"#harness/announcements.js";import{activeTurnId}from"#harness/active-turn-id.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{getPendingAuthorization,getSupersededAuthorizationChallenges,setPendingAuthorization}from"#harness/authorization.js";import{isDynamicModelSelectionError}from"#context/dynamic-model-lifecycle.js";import{isTurnCancellation,throwIfTurnAborted}from"#harness/turn-cancellation.js";import{getPendingInputBatches,queueDeferredStepInput}from"#harness/pending-input-batches.js";import{answerSessionLimitFromText,appendPendingInputBatch,consumeDeferredStepInput as consumeDeferredStepInput$1,getApprovedTools,getPendingInputRequestIds,hasRunnableDeferredStepInput,hasStepInput,resolvePendingInput,selectApprovalReplayBatch}from"#harness/input-requests.js";import{buildDynamicInstructionMessages,drainDynamicInstructionUserMessages,prepareDynamicInstructionPreamble}from"#context/dynamic-instruction-lifecycle.js";import{PendingSkillAnnouncementKey}from"#context/dynamic-skill-lifecycle.js";import{setEveAttributes}from"#runtime/attributes/emit.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";import{declinedSignInEvents,withdrawHeldSignIns}from"#harness/held-requests.js";import{createToolResultMessagePartFromToolError,isToolResultError}from"#harness/action-result-helpers.js";import{summarizeKnownError}from"#harness/semantic-errors/index.js";import{getApprovalAuditState,markApprovalCandidateHistoryEventEmitted,markApprovalCandidatePendingEventEmitted,markApprovalSettlementEventEmitted}from"#harness/approval-candidates.js";import{estimateTokens}from"#harness/token-estimate.js";import{extractToolApprovalInputRequests}from"#harness/input-extraction.js";import{clearTurnClientContextState,getTurnClientContextState,setTurnClientContextState}from"#harness/turn-client-context.js";import{getInvalidToolCallInputError,isInvalidToolCall}from"#harness/tool-call-input-errors.js";import{ContentFilteredModelResponseError,EmptyModelResponseError,classifyModelCallError,extractModelCallErrorDetails,extractUnsupportedProviderToolTypes,extractUpstreamRejectionMessage,isNoOutputGeneratedError}from"#harness/model-call-error.js";import{interruptStreamOnFailure}from"#harness/interruptible-stream.js";import{resolveInlineAuthorizationInterrupt}from"#harness/inline-tool-authorization.js";import{createCurrentMessages,hasTailApprovalResponse}from"#harness/current-messages.js";import{applyLastToolCacheBreakpoint,applySystemCacheBreakpoint,detectPromptCachePath,getAnthropicCacheMarker}from"#harness/prompt-cache.js";import{resolveCallProviderOptions}from"#harness/provider-safety.js";import{requireSessionModelReference}from"#harness/types.js";import{GenerationSteering}from"#harness/generation-steering.js";import{estimateRequestEnvelope,getRequestEnvelopeTokens,setRequestEnvelopeTokens}from"#harness/request-envelope.js";import{buildDynamicTools,buildResponseAuthorizationTools}from"#context/build-dynamic-tools.js";import{compactMessages,getInputTokenCount,resolveCompactionModel,shouldCompact}from"#harness/compaction.js";import{collectDeferredCalls,dispatchApprovedWorkflowCalls}from"#harness/workflow-dispatch.js";import{applySessionLimitContinuation,enforceSessionUsageLimit}from"#harness/session-limit-enforcement.js";import{coordinateApprovalDelivery}from"#harness/approval-delivery-coordinator.js";import{convertStaleResponsesToUserMessage,dropStaleSessionLimitContinuationResponses}from"#harness/stale-input-responses.js";import{normalizeProviderToolHistory}from"#harness/provider-tool-history.js";import{appendTaskContext,isTaskTool,taskSystemMessages,withTaskTools,workingTaskIds}from"#execution/tasks/model-step.js";import{setApprovedCallCallers}from"#harness/approved-call-callers.js";import{extractWorkflowStreamWriteErrorDetails}from"#harness/workflow-stream-error.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";import{resolveFrameworkToolFromUpstreamType}from"#harness/provider-tools.js";import{buildStepHooks,emitStepActions,readGatewayGenerationId}from"#harness/step-hooks.js";import{buildToolApproval,buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#harness/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`||isTurnCancellation(e.toolOutput.error)||logError(log,`tool execution failed`,e.toolOutput.error,{toolName:e.toolCall.toolName,toolCallId:e.toolCall.toolCallId})}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
-
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 resolveEffectiveRuntimeModel(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=getEffectiveModelSelection(e.ctx);if(t===null)throw Error(`Dynamic model selection is required before model-dependent work begins. Add a matching resolver handler that returns a concrete model.`);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.modelReference===t?e:{...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)))}}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(e){e.instrumentation?.installAiSdkWarningLogger();let t=e.handleEvent;async function runStep(t,n){let executeStep=async r=>{let i=r?.session??t,a=new GenerationSteering({abortSignal:e.abortSignal,steeringSignal:e.steeringSignal,outputStarted:getHarnessEmissionState(i.state).assistantOutputStarted});try{return await executeStepBody(i,a,n,r)}finally{a.dispose()}};return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},executeStep)??executeStep()}async function executeStepBody(n,r,i,a){let o=n,s=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});s(o.history,o.state);let projectHistory=(e,t)=>s(e,t).messages,c=getHarnessEmissionState(o.state),l=contextStorage.getStore();l!==void 0&&!l.has(StaticModelReferenceKey)&&l.setVirtualContext(StaticModelReferenceKey,o.agent.dynamicModel===!0?null:o.agent.modelReference??null);let u=l?.get(ParentSessionKey),d=l?.get(SessionCallbackKey),f=u!==void 0||d!==void 0,p=f||l?.get(ScheduleIdKey)!==void 0,m,h=a?.createHandleEvent({getAttemptScope:()=>m,handleEvent:t,turnId:activeTurnId(c)})??t,g=h===void 0?void 0:async(e,t)=>{r.beforeEvent(e),await h(e,t)},failModelSelection=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),a?.recordError(t),!g)throw t;let r=createErrorId(),i=toErrorMessage(t);return log.error(`model selection failed terminally`,{error:t,errorId:r,sessionId:o.sessionId,turnId:n.turnId}),await emitFailedStep(g,n,{code:`MODEL_SELECTION_FAILED`,details:{errorId:r},message:i,sessionId:o.sessionId,usage:getSessionUsage(o)}),{next:f?{done:!0,isError:!0,output:i}:{done:!0,output:``},session:o}},failBoundaryEvent=async(t,n)=>{if(throwIfTurnAborted(e.abortSignal),isTurnCancellation(t))throw t;if(isDynamicModelSelectionError(t))return failModelSelection(t,n);throw t},preparePreambleTrace=async()=>await a?.preparePreamble({sequence:c.sequence,sessionStarted:c.sessionStarted,traceContext:a?.traceContext,turnId:activeTurnId(c)});if(e.clearOnly===!0)return o={...o,state:clearMemorySessionState(o.state)},o=replaceSessionHistory(o,[]),await g?.(createContextClearedEvent({sequence:c.sequence,sessionId:o.sessionId,turnId:activeTurnId(c)})),await g?.(createSessionWaitingEvent(getSessionUsage(o))),{next:null,session:o};if(e.compactOnly===!0){if(o.history.length>0)try{let t=contextStorage.getStore(),n=await resolveEffectiveRuntimeModel({config:e,ctx:t,session:o});o=n.session,o=(await maybeCompact({abortSignal:e.abortSignal,auth:t?.get(AuthKey)??null,emit:g,emissionState:{...c,turnId:activeTurnId(c)},force:!0,historyProjector:e.historyProjector,messages:[...o.history],model:n.model,requestEnvelopeTokens:getRequestEnvelopeTokens(o),resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:o,telemetry:a?.telemetry()})).session}catch(e){logError(log,`manual session compaction failed`,e,{sessionId:o.sessionId})}return await g?.(createSessionWaitingEvent(getSessionUsage(o))),{next:null,session:o}}let _=getPendingCoordinationBatch(o.state),v=_===void 0?consumeDeferredStepInput$1({input:answerSessionLimitFromText(o,i),session:o}):{input:i,session:o};o=v.session;let y=await resolvePendingCoordination({emit:g,session:o,stepInput:v.input,tools:e.tools}),b=y.outcome===`resolved`?{...y,messages:await stageToolResultMedia(y.messages)}:y;if(b.outcome===`unresolved`)return{next:null,session:b.session};o=b.session;let x=getPendingInputRequestIds(o.state),S=convertStaleResponsesToUserMessage({history:b.messages,pendingRequestIds:x,stepInput:dropStaleSessionLimitContinuationResponses({pendingRequestIds:x,stepInput:v.input})}),C=S.stepInput;if(i?.message!==void 0||S.kind===`converted`){let e=withdrawHeldSignIns(o.state,{completedAt:Date.now(),reason:STEERED_SIGN_IN_REASON});if(o={...o,state:e.state},e.withdrawn.length>0){if(g)for(let t of declinedSignInEvents(e.withdrawn,STEERED_SIGN_IN_REASON,c))await g(t);let t=[...new Set(e.withdrawn.map(e=>e.name))];C={...C,context:[...C?.context??[],`Sign-in to ${t.join(`, `)} was cancelled because the user sent a new message instead. Ask to sign in again only if the new message still needs it.`]}}}let w=S.kind===`converted`?{...C,message:S.displayMessage}:C,T=contextStorage.getStore(),prepareApprovalTools=async t=>(t?.event!==void 0&&await e.prepareApprovalTurn?.(t.event),T!==void 0&&await e.resolveStepDynamicTools?.({ctx:T,event:createStepStartedEvent({modelId:o.agent.modelReference?.id??`dynamic`,...t?.event??c}),messages:projectHistory(b.messages,o.state)}),buildResponseAuthorizationTools({authoredTools:e.tools,context:T})),E=getPendingAuthorization(o.state)?.challenges??[],D=await coordinateApprovalDelivery({session:o,stepInput:C,tools:e.tools,prepareTools:async e=>{let t=getPendingInputBatches(o.state).find(t=>t.requests.some(t=>t.requestId===e.requestId));return await prepareApprovalTools(t)}});if(o=D.session,g){for(let e of D.feedback)await g(createMessageCompletedEvent({message:e,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId}));let e=getApprovalAuditState(o.state);for(let t of E)e.candidateHistory.some(e=>e.candidateId===t.candidateId&&e.status===`timed-out`&&e.eventEmitted!==!0)&&await g(createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`failed`,reason:`The approval response expired. Please submit a new response.`,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId}));for(let t of e.activeCandidates.filter(e=>e.pendingEventEmitted!==!0))await g(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:`pending`,requestId:t.requestId,responderPrincipalId:t.responder.principalId,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId})),o={...o,state:markApprovalCandidatePendingEventEmitted({candidateId:t.candidateId,state:o.state})};for(let t of e.candidateHistory.filter(e=>e.eventEmitted!==!0&&e.status!==`allowed`))await g(createApprovalCandidateEvent({candidateId:t.candidateId,outcome:t.status,requestId:t.requestId,responderPrincipalId:t.responder.principalId,reason:t.reason,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId})),o={...o,state:markApprovalCandidateHistoryEventEmitted({candidateId:t.candidateId,state:o.state})};for(let t of e.settlements.filter(e=>e.eventEmitted!==!0))await g(createApprovalSettledEvent({outcome:t.outcome===`allowed`?`approved`:`cancelled`,requestId:t.requestId,responderPrincipalId:t.actor.principalId,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId})),o={...o,state:markApprovalSettlementEventEmitted({requestId:t.requestId,state:o.state})}}if(D.kind===`park`)return{next:null,session:o};if(D.kind===`continue-coordination`)return{next:runStep,session:D.stepInput===void 0?o:queueDeferredStepInput(o,D.stepInput)};if(D.challenges.length>0){if(g){for(let e of D.challenges)await g(createAuthorizationRequiredEvent({...authorizationEventFields(e),description:e.challenge.instructions??`Authorization required for ${e.name}`,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId,webhookUrl:e.hookUrl}));c=await holdTurnForRequest(g,c,o)}let e=D.stepInput===void 0?o:queueDeferredStepInput(o,D.stepInput);return{held:{kind:`request`},next:null,session:setHarnessEmissionState({...e,state:setPendingAuthorization(e.state,{challenges:D.challenges})},c)}}let O=_!==void 0&&hasTailApprovalResponse(b.messages)?_:selectApprovalReplayBatch(o,D.stepInput),k=O===void 0?e.tools:await prepareApprovalTools(O),A=resolvePendingInput({history:b.messages,resolveApprovalKey:resolveApprovalKeyFromTools(k),session:o,stepInput:D.stepInput});if(A.outcome===`unresolved`){let e=b.outcome===`resolved`?{...A.session,history:validateHarnessModelMessages(b.messages)}:A.session;return g&&(c=await holdTurnForRequest(g,c,e),e=setHarnessEmissionState(e,c)),{held:{kind:`request`},next:null,session:e}}if(A.resolvedInputs!==void 0)for(let e of A.resolvedInputs)await a?.publishInputResolutions({batch:e,sessionId:o.sessionId}),g&&await g(createInputResolvedEvent({resolutions:e.inputs.map(e=>{let t={kind:e.request.kind,outcome:e.outcome,requestId:e.request.requestId};return e.response===void 0?t:{...t,response:e.response}}),sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));if(g&&A.rejectedActions)for(let e of A.rejectedActions)for(let t of e.results)await g(createActionResultEvent({rejected:!0,result:t,sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId}));let j=activeTurnId(c),M=getTurnClientContextState(A.session.state,j),N=A.deferredContext===!0?void 0:readClientContext(C),P=(N??M?.messages)?.map(e=>createFrameworkUserMessage(`context.instruction`,e))??[],F=[];if(C?.context!==void 0&&A.deferredContext!==!0)for(let e of C.context)F.push(createFrameworkUserMessage(`context.instruction`,e));let I=frameworkMessageKindForStepInput(C),L=normalizeUserContent(C?.message),R=L!==void 0&&!A.deferredMessage&&!A.consumedMessage?await stageAttachmentsToSandbox(L):void 0;R!==void 0&&F.push(I===void 0?createUserMessage(`user`,R):createFrameworkUserMessage(I,R));let z=[],B;if(g&&(hasStepInput(C)||hasStepInput(D.stepInput))){l!==void 0&&(prepareDynamicInstructionPreamble(l,projectHistory(A.session.history,A.session.state)),prepareMemoryPreamble(l,{history:A.messages,input:[...P,...F],projector:e.historyProjector,state:A.session.state}));try{let t=await preparePreambleTrace();c=await emitTurnPreamble(g,A.deferredMessage===!0?{...w,message:void 0}:w??{},c,projectHistory([...A.messages,...P,...F],A.session.state),e.runtimeIdentity,t)}catch(e){return z=l===void 0?[]:drainDynamicInstructionUserMessages(l),B=l===void 0?void 0:drainMemoryCommit(l),o={...A.session,history:validateHarnessModelMessages([...A.session.history,...B?.recalledMessages??[],...z]),state:B?.state??A.session.state},failBoundaryEvent(e,{sessionStarted:!0,sequence:c.sequence,stepIndex:0,turnId:activeTurnId(c)})}z=l===void 0?[]:drainDynamicInstructionUserMessages(l),B=l===void 0?void 0:drainMemoryCommit(l),a?.setTurnId(c.turnId)}let ee=A.session.history.length,te=[...B?.recalledMessages??[],...z];o=setHarnessEmissionState({...A.session,history:validateHarnessModelMessages([...A.session.history,...te]),state:B?.state??A.session.state},c);let V=validateHarnessModelMessages([...A.messages.slice(0,ee),...te,...A.messages.slice(ee)]),ne=await applySessionLimitContinuation({config:e,emit:g,emissionState:c,limitContinuation:A.limitContinuation,session:o});if(ne.result!==null)return ne.result;if(o=ne.session,!hasUnansweredToolCall(V)){let t=await appendTaskContext({messages:V,projectHistory,session:o,tools:e.tools});o=t.session,V.push(...t.messages)}let H=M;N!==void 0&&(H={insertionIndex:M?.insertionIndex??V.length,messages:N,turnId:j}),H!==void 0&&(o=setTurnClientContextState(o,H));let re=R!==void 0&&I===void 0&&followsToolResults(V);V=[...V,...re?[{content:TOOL_RESULT_BOUNDARY,role:`assistant`}]:[],...F];let createModelMessages=e=>{if(H===void 0||H.messages.length===0)return[...e];let t=Math.min(Math.max(0,H.insertionIndex),e.length);return[...e.slice(0,t),...H.messages.map(e=>createFrameworkUserMessage(`context.instruction`,e)),...e.slice(t)]},U=validateHarnessModelMessages(projectHistory(createModelMessages(V),o.state)),W=l,ie;try{W!==void 0&&e.dispatchDynamicModelEvent!==void 0&&await e.dispatchDynamicModelEvent({ctx:W,event:{data:{sequence:c.sequence,stepIndex:c.stepIndex,turnId:activeTurnId(c)},type:`step.started`},messages:U}),ie=await resolveEffectiveRuntimeModel({config:e,ctx:W,session:o})}catch(e){return failModelSelection(e,c)}o=ie.session;let G=ie.model,ae=detectPromptCachePath(G),K=ae.kind===`anthropic-direct`?getAnthropicCacheMarker():void 0,oe=buildGatewayAttributionHeaders(G,e.runtimeIdentity);if(U=validateHarnessModelMessages(normalizeModelMessages(projectHistory(createModelMessages(V),o.state))),g)try{await emitStepStarted(g,c,requireSessionModelReference(o).id,U)}catch(e){return failBoundaryEvent(e,c)}let se=(A.resolvedInputs??[]).flatMap(e=>e.inputs.filter(e=>e.outcome===`approved`));if(setApprovedCallCallers(A.resolvedInputs,o.state),se.length>0){let t=buildResponseAuthorizationTools({authoredTools:e.tools,context:W});for(let{request:e}of se)if(!t.has(e.action.toolName))throw Error(`The approved tool is no longer available. Request a new tool call and approval.`)}let ce=getApprovedTools(o,resolveApprovalKeyFromTools(buildResponseAuthorizationTools({authoredTools:e.tools,context:W}))),le=e.tools,ue=new Map,createRequestMessages=()=>{let e=createCurrentMessages(V,{historyState:W?.get(HistoryStateKey),currentTurnMessages:F,projectedMessages:U});W!==void 0&&e.addSystem(buildDynamicInstructionMessages(W)),e.addSystem(taskSystemMessages(le,{finalReplyOnly:p})),e.addAnnouncements({availableSkills:W?.get(PendingSkillAnnouncementKey),keyed:getPendingAnnouncements(W)});let t=renderPendingApprovalsInstruction(getPendingInputBatches(o.state).flatMap(e=>e.requests));return t!==void 0&&e.add(t,`context.state`,{cacheFriendly:!1}),e},q=createRequestMessages(),J,finishSteeredStep=async()=>(throwIfTurnAborted(e.abortSignal),W?.set(HistoryStateKey,q.historyState),J!==void 0&&(o=setTurnUsageState(o,accumulateTurnUsage({previous:getTurnUsageState(o.state),turnId:c.turnId,usage:J}))),await h?.(createStepCompletedEvent({finishReason:`other`,sequence:c.sequence,stepIndex:c.stepIndex,turnId:c.turnId,usage:J})),{steered:!0,next:runStep,session:setHarnessEmissionState({...o,history:[...q.history]},advanceStep(c))}),Y=[],withTrailingUserNote=(e,t)=>t?[...e,createFrameworkUserMessage(`execution.retry`,t)]:[...e],prepareModelInstructions=e=>{let t=e?[{role:`system`,content:e}]:[],n=o.agent.system?[{role:`system`,content:o.agent.system}]:[],r=q.systemMessages.length>0||t.length>0?[...t,...n,...q.systemMessages]:void 0,i=r!==void 0&&K?applySystemCacheBreakpoint(r,K):r;return i===void 0?o.agent.system??void 0:mergeSystemInstructions(i)},prepareModelCallInput=e=>{let t=prepareModelInstructions(e);return{instructions:t,telemetryRuntimeContext:a?.resolveRuntimeContext({eveVersion,emissionState:c,environment,modelInput:{instructions:t,messages:Y},session:o})}},X=0,Z,throwIfCompactionFailed=()=>{if(Z!==void 0)throw Z.error},prepareModelTools=async t=>{let n=buildHarnessToolsWithDynamicSubagents(e.tools,W),i=withTaskTools(getAdvertisedTools({session:o,tools:n}));le=i;let a=await buildToolSetWithProviderTools({approvedTools:ce,disabledProviderTools:t.disabledProviderTools,modelReference:requireSessionModelReference(o),modelProvider:resolveModelProvider(G),tools:i}),s=new Map(i);if(W!==void 0){let e=getAdvertisedTools({session:o,tools:buildDynamicTools(W)}),n=buildToolSetFromDefinitions({approvedTools:ce,disabledProviderTools:t.disabledProviderTools,tools:e});for(let[e,t]of Object.entries(n)){if(i.get(e)?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);a[e]=t}let r=new Set;for(let t of e)r.has(t.name)||(r.add(t.name),s.set(t.name,t))}o.outputSchema!==void 0&&(a[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(o.outputSchema));let c=await getAdvertisedTools({modelTools:a,session:o,tools:i});o=c.session;let l=c.modelTools,u=new Map;if(!f&&o.outputSchema===void 0)for(let[e,t]of Object.entries(l)){let n=s.get(e)?.endsTurn;t.type!==`provider`&&n!==void 0&&n!==!1&&(u.set(e,n),n===!0&&(t.description=`${t.description??``}\n\n${ENDS_TURN_TOOL_NOTE}`.trimStart()))}ue=u;let d=K?applyLastToolCacheBreakpoint(l,K):l;for(let e of Object.values(d)){e.inputSchema=toModelSchema(e.inputSchema,`input`),e.outputSchema!==void 0&&(e.outputSchema=toModelSchema(e.outputSchema,`output`));let t=e.execute;t!==void 0&&(e.execute=(...e)=>(r.protectToolExecution(),t(...e)))}return{effectiveTools:d,modelTools:l,presentationTools:s}},runSingleModelCall=async t=>{let{effectiveTools:n,modelTools:i,presentationTools:s}=await prepareModelTools(t);q=createRequestMessages(),X=await estimateRequestEnvelope({history:U,instructions:prepareModelInstructions(t.extraSystemNote),messages:withTrailingUserNote(q.nonSystemMessages,t.trailingUserNote),tools:n});let l=H===void 0?void 0:Math.max(0,V.length-H.insertionIndex),u=await(async()=>{try{return await maybeCompact({abortSignal:e.abortSignal,auth:W?.get(AuthKey)??null,emit:g,emissionState:c,historyProjector:e.historyProjector,messages:[...V],model:G,promptMessages:createModelMessages(V),requestEnvelopeTokens:X,resolveModel:e.resolveModel,runtimeIdentity:e.runtimeIdentity,session:o,telemetry:a?.telemetry()})}catch(e){throw Z={error:e},e}})();o=u.session,u.compacted&&(V=u.messages,H!==void 0&&l!==void 0&&(H={...H,insertionIndex:Math.max(0,V.length-l)},o=setTurnClientContextState(o,H)),o={...o,compaction:{recentWindowSize:o.compaction.recentWindowSize,threshold:o.compaction.threshold,thresholdPercent:o.compaction.thresholdPercent}},U=validateHarnessModelMessages(normalizeModelMessages(projectHistory(createModelMessages(V),o.state))),q=createRequestMessages(),{effectiveTools:n,modelTools:i,presentationTools:s}=await prepareModelTools(t),X=await estimateRequestEnvelope({history:U,instructions:prepareModelInstructions(t.extraSystemNote),messages:withTrailingUserNote(q.nonSystemMessages,t.trailingUserNote),tools:n})),X=Math.max(0,X-(estimateTokens(q.history)-estimateTokens(V))),r.begin(),Y=await hydrateSandboxAttachments(q.nonSystemMessages),sendsToolResultFilesAsText(G)&&(Y=moveToolResultFilesToUserMessages(Y));let{instructions:d,telemetryRuntimeContext:f={}}=prepareModelCallInput(t.extraSystemNote);t.retryReason&&(f[`eve.retry.reason`]=t.retryReason);let h=withTrailingUserNote(Y,t.trailingUserNote),_=activeTurnId(c),v=a?.prepareAttempt({attemptIndex:t.attemptIndex,runtimeContext:f,stepIndex:c.stepIndex,turnId:_});m=v?.scope;let y=buildStepHooks({auth:W?.get(AuthKey)??null,cachePath:ae,emit:g,emissionState:c,emitStepStarted:t.suppressStepStartedEmission!==!0,marker:K,session:o}),b={headers:oe,instructions:d,model:G,onLanguageModelCallEnd(e){r.interrupted||(J=extractTokenUsageDelta({usage:e.usage,costUsd:extractGatewayCostUsd(e.providerMetadata)}))},onToolExecutionEnd:logToolExecutionError,onError(e){r.interrupted||summarizeKnownError(e.error)?.tags.includes(`config`)!==!0&&logError(log,`tool-loop stream error`,e.error)},onStepEnd:y.onStepEnd,onStepStart:y.onStepStart,prepareStep:y.prepareStep,reasoning:o.agent.modelReference?.reasoning??o.agent.reasoning,runtimeContext:f,stopWhen:isStepCount(1),telemetry:v?.telemetry,toolApproval:buildToolApproval(i,r.signal),tools:n},x=new ToolLoopAgent(b),executeModelCall=async()=>{if(g){let t=new Set([FINAL_OUTPUT_TOOL_NAME]),i=await x.stream({abortSignal:r.signal,messages:h}),{emittedActionCallIds:a,handledInlineToolResultCallIds:l,invalidInputToolCallIds:u,inlineAuthorizationResults:d,trailingInlineToolResultParts:f}=await emitStreamContent(g,c,interruptStreamOnFailure(i.fullStream,r.signal),{excludedActionToolNames:t,hidesHeldText:p&&workingTaskIds(o).length>0,tools:s});throwIfTurnAborted(e.abortSignal),r.check();let[m,_]=await Promise.all([y.stepResult,i.responseMessages]);if(m.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(m.providerMetadata));if(isEmptyModelResponse(m)&&extractToolResultCallIds(_).size===0&&d.length===0&&f.length===0)throw new EmptyModelResponseError;let v=answerSkippedToolCalls(m,n);await emitStepActions(g,c,v.length===0?m:withAccumulatedResponseMessages({responseMessages:appendMissingToolResultMessages({append:v,responseMessages:m.response.messages}),stepResult:m}),{emittedActionCallIds:a,excludedActionCallIds:u,excludedActionToolNames:t,handledInlineToolResultCallIds:l,tools:s});let b=m.toolResults,S=new Map(b.map(e=>[e.toolCallId,e]));for(let e of d)S.set(e.toolCallId,e);return withAccumulatedResponseMessages({invalidInputToolCallIds:u,responseMessages:appendMissingToolResultMessages({append:[...f,...v],responseMessages:_}),stepResult:m,toolResults:[...S.values()]})}let t=await x.generate({abortSignal:r.signal,messages:h});throwIfTurnAborted(e.abortSignal),r.check();let i=await y.stepResult;if(i.finishReason===`content-filter`)throw new ContentFilteredModelResponseError(readGatewayGenerationId(i.providerMetadata));if(isEmptyModelResponse(i)&&extractToolResultCallIds(t.responseMessages).size===0)throw new EmptyModelResponseError;return withAccumulatedResponseMessages({responseMessages:appendMissingToolResultMessages({append:answerSkippedToolCalls(i,n),responseMessages:t.responseMessages}),stepResult:i})};try{let e=await executeModelCall();return await v?.complete(),e}catch(e){return r.interrupted?await v?.complete():await v?.fail(e),r.check(),rethrowNoOutputAsEmptyResponse(e)}},de=0,runOneModelCall=async e=>runModelCallWithRetries(t=>runSingleModelCall({...e,attemptIndex:de++,suppressStepStartedEmission:t!==1||e.suppressStepStartedEmission}),{sessionId:o.sessionId,turnId:c.turnId,canRetry:()=>Z===void 0},r.signal),fe=dispatchApprovedWorkflowCalls({messages:V,resolvedInputs:A.resolvedInputs,session:o,tools:buildResponseAuthorizationTools({authoredTools:e.tools,context:W})});if(fe!==void 0)return{next:null,session:setHarnessEmissionState(fe,advanceStep(c))};let pe=await enforceSessionUsageLimit({config:e,emit:g,emissionState:c,messages:U,session:o});if(pe!==null)return pe;let Q;try{Q=await runOneModelCall({suppressStepStartedEmission:!0})}catch(t){if(throwIfCompactionFailed(),throwIfTurnAborted(e.abortSignal),r.interrupted)return finishSteeredStep();let n=await runModelCallRecoveryPipeline({error:t,stages:[e=>attemptUnsupportedProviderToolRecovery({error:e.error,runOneModelCall,sessionId:o.sessionId,turnId:c.turnId}),e=>attemptEmptyResponseRecovery({error:e.error,retryCallOptions:e.retryCallOptions,runOneModelCall,sessionId:o.sessionId,turnId:c.turnId})]});if(throwIfCompactionFailed(),throwIfTurnAborted(e.abortSignal),r.interrupted)return finishSteeredStep();if(n.outcome===`recovered`)Q=n.result;else{let e=n.error;if(a?.recordError(e),!g)throw e;let t=extractWorkflowStreamWriteErrorDetails(e);if(t!==null){let n=createErrorId();return log.error(`workflow stream write failed — parking session for retry by the user`,{...t,errorId:n,error:e,sessionId:o.sessionId,turnId:c.turnId}),c=await emitRecoverableFailedTurn(g,c,{code:`WORKFLOW_STREAM_WRITE_FAILED`,continuationToken:o.continuationToken,usage:getSessionUsage(o),details:{...t,errorId:n},message:toErrorMessage(e)}),{next:null,session:setHarnessEmissionState(o,c)}}let r=classifyModelCallError(e),i=createErrorId(),s=summarizeKnownError(e),l=s===null?extractUpstreamRejectionMessage(e):null,u=s?.message??l?.message??toErrorMessage(e),d=s?.hint===void 0?u:`${u} ${s.hint}`,p=extractModelCallErrorDetails(e),m=buildModelCallFailureDetails({catalogSummary:s,error:e,errorId:i,modelCallDetails:p,upstreamRejection:l}),h=buildModelCallFailureLogFields({error:e,errorId:i,modelCallDetails:p,recognized:s!==null||l!==null,sessionId:o.sessionId,turnId:c.turnId});if(r===`terminal`)return s===null?log.error(l?.message??`model call failed terminally`,h):log.error(`${s.name}: ${s.message}`,{errorId:i,hint:s.hint,sessionId:o.sessionId,turnId:c.turnId}),await emitFailedStep(g,c,{code:`MODEL_CALL_FAILED`,details:m,message:u,sessionId:o.sessionId,usage:getSessionUsage(o)}),{next:f?{done:!0,isError:!0,output:d}:{done:!0,output:``},session:o};log.error(l?.message??`model call failed — parking session for retry by the user`,h),c=await emitRecoverableFailedTurn(g,c,{code:`MODEL_CALL_FAILED`,continuationToken:o.continuationToken,usage:getSessionUsage(o),details:m,message:u});let _={isError:!0,output:d};return o={...o,outputSchema:void 0},{next:null,session:setHarnessEmissionState(o,c),settledTurn:_}}}let $=accumulateTurnUsage({previous:getTurnUsageState(o.state),turnId:c.turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(Q.providerMetadata),usage:Q.usage})});o=setTurnUsageState(o,$),J=void 0;let me;try{me=formatLanguageModelGatewayId(G)}catch{me=void 0}await setEveAttributes({"$eve.model":me,"$eve.input_tokens":$.inputTokens,"$eve.output_tokens":$.outputTokens,"$eve.cache_read_tokens":$.cacheReadTokens,"$eve.cache_write_tokens":$.cacheWriteTokens,"$eve.cost_usd":$.sawCost?$.costUsd:void 0,"$eve.tool_count":e.tools.size});let he;try{r.check(),he=await handleStepResult({config:e,emit:g,emissionState:r.outputStarted?{...c,assistantOutputStarted:!0}:c,requestEnvelopeTokens:X,durableModelPromptMessageCount:H===void 0||H.messages.length===0?Y.length:void 0,promptMessages:q.history,result:Q,runStep,session:o,coordinationTools:le,endsTurnTools:ue})}catch(t){if(throwIfTurnAborted(e.abortSignal),r.interrupted)return finishSteeredStep();throw t}return W?.set(HistoryStateKey,q.historyState),he}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:n,errorId:r,modelCallDetails:i,upstreamRejection:a}=e;if(t!==null){let e={errorId:r,message:t.message,name:t.name,semanticErrorId:t.id,...i};return t.hint!==void 0&&(e.hint=t.hint),e}return a===null?{...formatError(n,r),...i}:{errorId:r,message:toErrorMessage(n),name:a.name,...i}}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 answerSkippedToolCalls(e,t){let{finishReason:n}=e;if(n===`stop`||n===`tool-calls`)return[];let r=extractToolResultCallIds(e.response.messages),i=new Set((e.content??[]).flatMap(e=>e.type===`tool-approval-request`&&e.isAutomatic!==!0?[e.toolCall.toolCallId]:[])),a=`The tool did not run because the model response ended early (finish reason: ${n}). Call the tool again if you still need its result.`;return(e.toolCalls??[]).filter(e=>t[e.toolName]?.execute!==void 0&&e.providerExecuted!==!0&&!isInvalidToolCall(e)&&getInvalidToolCallInputError({toolCall:e})===void 0&&!r.has(e.toolCallId)&&!i.has(e.toolCallId)).map(e=>({output:{type:`error-text`,value:a},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`}))}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}function hasUnansweredToolCall(e){let t=new Set,n=new Set;for(let r of e)if(Array.isArray(r.content))for(let e of r.content)typeof e==`object`&&e&&(e.type===`tool-call`&&t.add(e.toolCallId),e.type===`tool-result`&&n.add(e.toolCallId));for(let e of t)if(!n.has(e))return!0;return!1}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}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:`Your previous reply was empty and was not delivered. Continue the current user request. Reuse completed results when they satisfy the request. If existing results are stale or insufficient, use the appropriate read tools to get fresh results. Do not repeat writes or other side effects that already completed. Do not mention this notice.`})}}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=getInvalidToolCallInputErrors({toolCalls:i.toolCalls}),u=new Set([...i.invalidInputToolCallIds??[],...i.toolCalls.filter(isInvalidToolCall).map(e=>e.toolCallId),...l.map(e=>e.toolCallId)]),d=appendMissingToolResultMessages({append:l.map(e=>createToolResultMessagePartFromToolError(e)),responseMessages:i.response.messages}),f=new Set;for(let e of[...i.content??[],...i.toolResults??[]])(e.type===`tool-result`||e.type===`tool-error`)&&e.providerExecuted===!0&&f.add(e.toolCallId);let p=normalizeProviderToolHistory({messages:d,providerExecutedOutcomeIds:f}),m=await stageToolResultMedia(p.messages),h=setRequestEnvelopeTokens({...s,compaction:createNextCompactionConfig(s.compaction,e.durableModelPromptMessageCount,i)},i.usage?.inputTokens!==void 0&&e.durableModelPromptMessageCount!==void 0?e.requestEnvelopeTokens:void 0),g=extractToolApprovalInputRequests({content:i.content??[],excludedCallIds:u}),_=g,v=renderPendingApprovalsSnippet(g),y=m.findIndex(e=>e.role!==`tool`),b=y===-1?m:m.slice(0,y),x=m.slice(b.length),S=validateHarnessModelMessages([...r,...b,...v===void 0?[]:[createFrameworkUserMessage(`context.state`,v)]]),C=getAdvertisedTools({session:h,tools:e.coordinationTools}),w=new Set([...g.map(e=>e.action.callId),...extractToolResultCallIds(m)]),T=(i.toolCalls??[]).filter(e=>!u.has(e.toolCallId)).filter(e=>!w.has(e.toolCallId)).filter(t=>isDeferredHarnessTool(e.coordinationTools.get(t.toolName))).filter(e=>isDeferredHarnessTool(C.get(e.toolName))?!0:(log.warn(`deferred tool call blocked because tool is not advertised`,{callId:e.toolCallId,sessionId:h.sessionId,toolName:e.toolName}),!1)),E=collectDeferredCalls({session:h,toolCalls:T,tools:C,turnId:o.turnId}),D=E.workflowRequests;if(T.length>0){if(_.length===0)return{next:null,session:setHarnessEmissionState(setPendingCoordinationBatch({tasks:D,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:m,session:{...E.session,history:validateHarnessModelMessages(r)}}),advanceStep(o))};let e=setPendingCoordinationBatch({tasks:D,event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},responseMessages:x,session:{...E.session,history:S}});return e=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:_,responseAuthRequiredRequestIds:responsePolicyRequestIds(t,g),responseMessages:[],session:e}),n&&await n(createInputRequestedEvent({requests:_,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),{next:null,session:setHarnessEmissionState(e,advanceStep(o))}}if(_.length>0){let e=appendPendingInputBatch({event:{sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId},requests:_,responseAuthRequiredRequestIds:responsePolicyRequestIds(t,g),responseMessages:x,session:{...h,history:S}}),r=hasRunnableDeferredStepInput(e);return n&&(await n(createInputRequestedEvent({requests:_,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId})),r||(o=await holdTurnForRequest(n,o,e),e=setHarnessEmissionState(e,o))),r?{next:a,session:e}:{held:{kind:`request`},next:null,session:e}}let O=resolveInlineAuthorizationInterrupt({messages:[...r,...m],toolResults:i.toolResults});if(O){let{challenges:e,history:t}=O;if(n){for(let t of getSupersededAuthorizationChallenges(h.state,e))await n(createAuthorizationCompletedEvent({...authorizationEventFields(t),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({...authorizationEventFields(t),description:t.challenge.instructions??`Authorization required for ${t.name}`,webhookUrl:t.hookUrl,sequence:o.sequence,stepIndex:o.stepIndex,turnId:o.turnId}));o=await holdTurnForRequest(n,o,h)}return{held:{kind:`request`},next:null,session:setHarnessEmissionState({...h,history:validateHarnessModelMessages(t),state:setPendingAuthorization(h.state,{challenges:e})},o)}}let k=m,A=validateHarnessModelMessages([...r,...k]),j={...h,history:A},M=j.outputSchema!==void 0&&extractFinalOutput(i)!==void 0,N=workingTaskIds(j),P=M&&N.length>0,F=k;P&&(F=rejectFinalOutput(k,i,N),j={...j,history:validateHarnessModelMessages([...r,...F])});let I=await stepEndsTurn(i,k,e.endsTurnTools),L=(!M||P)&&(F.at(-1)?.role===`tool`&&!I||p.outcomeEndsResponse||hasRunnableDeferredStepInput(j)),R=!L&&N.length>0;return L||R?(n&&(o=advanceStep(o),j=setHarnessEmissionState(j,o)),R?(n&&await n(createTurnWaitingEvent({on:`tasks`,sequence:o.sequence,turnId:o.turnId,usage:getSessionUsage(j)})),{held:{kind:`tasks`,taskIds:N},next:null,session:j}):{next:a,session:j}):finishTurn({emissionState:o,emit:n,history:r,result:i,schema:j.outputSchema,session:j,stepOutput:I?null:c})}async function holdTurnForRequest(e,t,n){let r=advanceStep(t);return await e(createTurnWaitingEvent({on:`input`,sequence:r.sequence,turnId:r.turnId,usage:getSessionUsage(n)})),r}const STEERED_SIGN_IN_REASON=`Cancelled because a new message arrived.`,ENDS_TURN_TOOL_NOTE=`Calling this tool ends your turn once it succeeds: do not write a reply or call other tools in the same step. If it fails, you will see the error and can continue.`;async function stepEndsTurn(e,t,n){let r=e.toolCalls??[];if(r.length===0)return!1;let i=new Map;for(let e of t)if(e.role===`tool`)for(let t of e.content)t.type===`tool-result`&&i.set(t.toolCallId,t.output);if(!r.every(e=>{let t=i.get(e.toolCallId);return n.has(e.toolName)&&t!==void 0&&!isToolResultError(t)}))return!1;let a=new Map((e.toolResults??[]).map(e=>[e.toolCallId,e.output]));for(let e of r){let t=n.get(e.toolName);if(typeof t==`function`&&!await callEndsTurn(t,a.get(e.toolCallId),e))return!1}return!0}async function callEndsTurn(e,t,n){try{return await e(t)===!0}catch(e){return log.warn(`endsTurn threw; continuing the turn`,{callId:n.toolCallId,error:e,toolName:n.toolName}),!1}}function isDeferredHarnessTool(e){return e?.workflowId!==void 0||isTaskTool(e)}function rejectFinalOutput(e,t,n){let r=(t.toolCalls??[]).find(e=>e.toolName===FINAL_OUTPUT_TOOL_NAME);if(r===void 0)return[...e];let i={output:{type:`error-text`,value:renderFinalOutputWhileWorkingError(n)},toolCallId:r.toolCallId,toolName:FINAL_OUTPUT_TOOL_NAME,type:`tool-result`};return[...e,{content:[i],role:`tool`}]}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,i){return await e(createResultCompletedEvent({result:n,sequence:t.sequence,stepIndex:t.stepIndex,turnId:t.turnId})),emitTurnEpilogue(e,t,r,i)}async function finishTurn(e){let{emit:t,history:n,result:r,schema:i,stepOutput:a}=e,{emissionState:o,session:s}=e;if(s=clearTurnClientContextState(s),i===void 0)return t&&(o=await emitTurnEpilogue(t,o,s.history,getSessionUsage(s)),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:a??``}};let c=extractFinalOutput(r);if(c===void 0){s={...s,outputSchema:void 0},t&&(o=await emitRecoverableFailedTurn(t,o,{...OUTPUT_SCHEMA_NOT_FULFILLED,continuationToken:s.continuationToken,usage:getSessionUsage(s)}),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,s.history,getSessionUsage(s)),s=setHarnessEmissionState(s,o)),{next:null,session:s,settledTurn:{output:c}}}function sendsToolResultFilesAsText(e){return typeof e!=`string`&&typeof e.provider==`string`&&e.provider.endsWith(`.chat`)}function createNextCompactionConfig(e,t,n){let r={recentWindowSize:e.recentWindowSize,threshold:e.threshold,thresholdPercent:e.thresholdPercent};return n.usage?.inputTokens!==void 0&&t!==void 0&&(r.lastKnownInputTokens=n.usage.inputTokens,r.lastKnownPromptMessageCount=t),r}function replaceSessionHistory(e,t){return contextStorage.getStore()?.delete(HistoryStateKey),{...e,history:t,compaction:{recentWindowSize:e.compaction.recentWindowSize,threshold:e.compaction.threshold,thresholdPercent:e.compaction.thresholdPercent}}}async function maybeCompact(e){let{emit:t,emissionState:n}=e,r=e.messages,i=e.session,a=e.promptMessages??r,o=validateHarnessModelMessages(e.historyProjector?.({messages:a,state:i.state})??a),s=e.force===!0||shouldCompact(o,i.compaction,e.requestEnvelopeTokens,getRequestEnvelopeTokens(i)),c=shouldCanonicalizeMemory(r);if(!s&&!c)return{compacted:!1,messages:r,session:i};let l=await resolveCompactionModel({compactionModelReference:i.agent.compactionModelReference,model:e.model,modelReference:requireSessionModelReference(i),resolveModel:e.resolveModel}),u=i.agent.compactionModelReference??requireSessionModelReference(i),d=resolveCallProviderOptions({auth:e.auth,conversationId:resolveConversationId(i.rootSessionId??i.sessionId),model:l.model,modelReference:u,providerOptions:l.providerOptions});if(t){let a=contextStorage.getStore();a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await t(createCompactionRequestedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,stepIndex:n.stepIndex,turnId:n.turnId,usageInputTokens:getInputTokenCount(o,i.compaction,e.requestEnvelopeTokens,getRequestEnvelopeTokens(i))}),o)}let f=canonicalizeMemoryRecords(r),p=validateHarnessModelMessages(e.historyProjector?.({messages:f.ordinary,state:i.state})??f.ordinary),m=e.requestEnvelopeTokens??0,h={...i.compaction,threshold:Math.max(1,i.compaction.threshold-m),lastKnownInputTokens:i.compaction.lastKnownInputTokens===void 0?void 0:Math.max(0,i.compaction.lastKnownInputTokens-Math.min(getRequestEnvelopeTokens(i)??0,m))},g=s?await compactMessages([...p],l.model,h,d,e.telemetry,buildGatewayAttributionHeaders(l.model,e.runtimeIdentity),e.abortSignal,e.force===!0,e.requestEnvelopeTokens===void 0?void 0:Math.max(0,getInputTokenCount(o,i.compaction,m,getRequestEnvelopeTokens(i))-m)):[...p];if(r=validateHarnessModelMessages([...f.memory,...g]),t){let a=contextStorage.getStore();if(a!==void 0&&prepareMemoryCompaction(a,{history:r,state:i.state}),await t(createCompactionCompletedEvent({modelId:formatLanguageModelGatewayId(l.model),sequence:n.sequence,sessionId:i.sessionId,stepIndex:n.stepIndex,turnId:n.turnId}),e.historyProjector?.({messages:r,state:i.state})??r),a!==void 0){let e=drainMemoryCommit(a);e!==void 0&&(r=validateHarnessModelMessages([...r,...e.recalledMessages]),i={...i,state:e.state})}}return{compacted:!0,messages:r,session:replaceSessionHistory(i,r)}}function responsePolicyRequestIds(e,t){let n=buildResponseAuthorizationTools({authoredTools:e.tools,context:contextStorage.getStore()});return t.filter(e=>{let t=n.get(e.action.toolName)?.approval;return t!==void 0&&typeof t!=`function`&&t.response!==void 0}).map(e=>e.requestId)}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++){n.throwIfAborted();try{return await e(r)}catch(e){if(n.throwIfAborted(),t.canRetry?.()===!1||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 setTimeout(i,void 0,{signal:n})}}}export{appendMissingToolResultMessages,createToolLoopHarness};
1
+ import{contextStorage}from"#context/container.js";import{ScheduleIdKey,StaticModelReferenceKey}from"#context/keys.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{clearMemorySessionState}from"#shared/memory-state.js";import{activeTurnId,turnPosition}from"#harness/session-machine/view.js";import{saveProjection,stepProjection}from"#harness/session-machine/current.js";import{clear}from"#harness/session-machine/transitions.js";import{createHistoryViewPreparer}from"#shared/history-view.js";import{acceptHumanInput,admitApprovedWork,discardClearedHumanInput}from"#harness/hitl/index.js";import{createStep,openTurn}from"#harness/step/context.js";import{prepareTurnInput,settleRuntimeWork}from"#harness/step/intake.js";import{compactHistory,replaceSessionHistory}from"#harness/compaction/step.js";import{GenerationSteering}from"#harness/generation-steering.js";import{runModelStep}from"#harness/model-call/run.js";import{handleStepResult}from"#harness/step/after-model.js";const environment=process.env.NODE_ENV??`unknown`,eveVersion=resolveInstalledPackageInfo().version;function createToolLoopHarness(e){e.instrumentation?.installAiSdkWarningLogger();async function runStep(t,n){let executeStep=async r=>{let i=r?.session??t,a=stepProjection(contextStorage.getStore(),i.state),o=new GenerationSteering({abortSignal:e.abortSignal,steeringSignal:e.steeringSignal,outputStarted:turnPosition(a.read()).assistantOutputStarted});try{let e=await executeStepBody(i,o,a,n,r);return{...e,session:saveProjection(e.session,a.read())}}finally{o.dispose()}};return e.instrumentation?.runStep({environment,eveVersion,hasInput:hasStepInput(n),session:t},executeStep)??executeStep()}async function executeStepBody(t,n,r,i,a){let o=createHistoryViewPreparer({previous:e.historyView,projector:e.historyProjector});o(t.history,t.state);let s=contextStorage.getStore();s!==void 0&&!s.has(StaticModelReferenceKey)&&s.setVirtualContext(StaticModelReferenceKey,t.agent.dynamicModel===!0?null:t.agent.modelReference??null);let c,l=a?.createHandleEvent({getAttemptScope:()=>c,isFrameworkTool:e=>u.frameworkToolNames.has(e),handleEvent:e.handleEvent,turnId:activeTurnId(turnPosition(r.read()))})??e.handleEvent,u=createStep({config:e,ctx:s,emit:l,instrumentation:a,live:r,prepareHistory:o,publish:async(e,t)=>{n.beforeEvent(e),l!==void 0&&await l(e,t),(l===void 0||s===void 0)&&r.record(e)},runStep,session:t});if(e.clearOnly===!0)return clearContext(u);if(e.compactOnly===!0)return compactHistory(u);let d=await settleRuntimeWork(u,i);if(d===void 0)return{next:null,session:u.session};let f=await acceptHumanInput(u,d.input,{takeQueued:!d.waited});if(f.kind===`stop`)return f.result;let p=await prepareTurnInput(u,f.input,{consumedMessage:f.consumedMessage});if(f.opensTurn){let e=await openTurn(u,{input:[...p.ephemeral,...p.messages],message:f.message});if(e!==void 0)return e}return await admitApprovedWork(u,f.approved),runModelStep(u,{approved:f.approved,onResponse:e=>handleStepResult(u,e),generation:n,hidesHeldText:u.hasDelegatedCaller||s?.get(ScheduleIdKey)!==void 0,setAttemptScope:e=>{c=e},turn:p})}return runStep}async function clearContext(e){await e.apply(clear(e.view(),{sessionId:e.session.sessionId}));let t=discardClearedHumanInput({...e.session,state:clearMemorySessionState(e.session.state)});return{next:null,session:replaceSessionHistory(t,[])}}function hasStepInput(e){return e===void 0?!1:e.message!==void 0||(e.inputResponses?.length??0)>0}export{createToolLoopHarness};
@@ -64,5 +64,18 @@ export declare function buildToolSetWithProviderTools(input: {
64
64
  readonly modelProvider?: string;
65
65
  readonly tools: HarnessToolMap;
66
66
  }): Promise<ToolSet>;
67
+ /**
68
+ * Re-runs a tool's approval policy for a call a person approved, just before eve runs it, so the
69
+ * policy can still refuse it, as when the connection it was approved against changed.
70
+ */
71
+ export declare function recheckApprovedCall(definition: HarnessToolDefinition, call: {
72
+ readonly callId: string;
73
+ readonly input: unknown;
74
+ readonly abortSignal?: AbortSignal;
75
+ readonly approvedTools?: ReadonlySet<string>;
76
+ }): Promise<{
77
+ readonly denied: boolean;
78
+ readonly reason?: string;
79
+ }>;
67
80
  /** Builds the AI SDK 7 call-level approval policy for an assembled tool set. */
68
81
  export declare function buildToolApproval(tools: ToolSet, abortSignal?: AbortSignal): ToolApprovalConfiguration<ToolSet, Record<string, unknown>>;
@@ -1 +1 @@
1
- import{tool}from"ai";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{toModelSchema}from"#tools/schema.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{toolCallModelOutput}from"#harness/tool-call-io.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{isApprovedToolCall,markApprovalRecheck}from"#harness/approval-recheck.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{iterateAsApprover,runAsApprover}from"#harness/approved-call-callers.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";const toolApprovals=new WeakMap;function buildToolSet(e){let t={},n=e.disabledProviderTools;for(let r of e.tools.values()){if(n?.has(r.name))continue;let i=r.toModelOutput,a=buildApprovalFn(r,e),o=tool({description:r.description,execute:wrapToolExecute(r),inputSchema:toModelSchema(r.inputSchema,`input`),strict:!1,outputSchema:toModelSchema(r.outputSchema,`output`),...r.execute!==void 0||i!==void 0?{toModelOutput:({output:e,toolCallId:t})=>toolCallModelOutput(r,e,t)}:{}});t[r.name]=o,r.approval!==void 0&&toolApprovals.set(o,a)}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,disabledProviderTools:e.disabledProviderTools,tools:t})}function wrapToolExecute(e){let t=e.execute;if(t!==void 0)return(n,r)=>{let i;try{i=runAsApprover(r.toolCallId,()=>t(n,r))}catch(e){return Promise.reject(e)}return isAsyncIterable(i)?normalizeToolExecuteIterable(iterateAsApprover(r.toolCallId,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,t,n){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),n.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:n.toolCallId,toolName:t})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet({approvedTools:e.approvedTools,disabledProviderTools:t,tools:e.tools})};for(let r of e.tools.values()){let i=r.behavior?.handling;if(i?.kind===`provider-tool`&&r.execute===void 0&&!t?.has(r.name)){let t=resolveWebSearchBackend(e.modelReference,i.provider,e.modelProvider);t===null?delete n[r.name]:n[r.name]=await resolveWebSearchProviderTool(t)}}return n}function buildApprovalFn(e,t){return async(n,r,i,a)=>{if(e.approval===void 0)return;let o=isObject(n)?n:void 0,s={...buildCallbackContext(),abortSignal:i??new AbortController().signal,approvedTools:t.approvedTools??new Set,callId:r,toolInput:o,toolName:e.name},c=await resolveApprovalPolicy(e.approval)(a?markApprovalRecheck(s):s);return typeof c==`boolean`?c?`user-approval`:`not-applicable`:c}}function buildToolApproval(e,t){return async({toolCall:n,messages:r})=>{let i=e[n.toolName];return i===void 0?void 0:await toolApprovals.get(i)?.(n.input,n.toolCallId,t,isApprovedToolCall(r,n.toolCallId))}}export{buildToolApproval,buildToolSet,buildToolSetFromDefinitions,buildToolSetWithProviderTools,wrapToolExecute};
1
+ import{tool}from"ai";import{isObject}from"#shared/guards.js";import{loadContext}from"#context/container.js";import{toModelSchema}from"#tools/schema.js";import{buildCallbackContext}from"#context/build-callback-context.js";import{resolveApprovalPolicy}from"#approval/definition.js";import{isAuthorizationSignal,modelFacingAuthorizationOutput}from"#harness/authorization.js";import{toolCallModelOutput}from"#harness/tool-call-io.js";import{normalizeToolJsonOutput}from"#harness/tool-model-output.js";import{isAsyncIterable}from"#shared/async-iterable.js";import{isApprovedToolCall,markApprovalRecheck}from"#harness/approval-recheck.js";import{stashToolInterrupt}from"#harness/tool-interrupts.js";import{resolveWebSearchBackend,resolveWebSearchProviderTool}from"#harness/provider-tools.js";import{iterateAsApprover,runAsApprover}from"#harness/hitl/approved-call-callers.js";const toolApprovals=new WeakMap;function buildToolSet(e){let t={},n=e.disabledProviderTools;for(let r of e.tools.values()){if(n?.has(r.name))continue;let i=r.toModelOutput,a=buildApprovalFn(r,e),o=tool({description:r.description,execute:wrapToolExecute(r),inputSchema:toModelSchema(r.inputSchema,`input`),strict:!1,outputSchema:toModelSchema(r.outputSchema,`output`),...r.execute!==void 0||i!==void 0?{toModelOutput:({output:e,toolCallId:t})=>toolCallModelOutput(r,e,t)}:{}});t[r.name]=o,r.approval!==void 0&&toolApprovals.set(o,a)}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,disabledProviderTools:e.disabledProviderTools,tools:t})}function wrapToolExecute(e){let t=e.execute;if(t!==void 0)return(n,r)=>{let i;try{i=runAsApprover(r.toolCallId,()=>t(n,r))}catch(e){return Promise.reject(e)}return isAsyncIterable(i)?normalizeToolExecuteIterable(iterateAsApprover(r.toolCallId,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,t,n){return isAuthorizationSignal(e)?(stashToolInterrupt(loadContext(),n.toolCallId,e),modelFacingAuthorizationOutput(e)):normalizeToolJsonOutput({boundary:`execute`,output:e,toolCallId:n.toolCallId,toolName:t})}async function buildToolSetWithProviderTools(e){let t=e.disabledProviderTools,n={...buildToolSet({approvedTools:e.approvedTools,disabledProviderTools:t,tools:e.tools})};for(let r of e.tools.values()){let i=r.behavior?.handling;if(i?.kind===`provider-tool`&&r.execute===void 0&&!t?.has(r.name)){let t=resolveWebSearchBackend(e.modelReference,i.provider,e.modelProvider);t===null?delete n[r.name]:n[r.name]=await resolveWebSearchProviderTool(t)}}return n}function buildApprovalFn(e,t){return async(n,r,i,a)=>{if(e.approval===void 0)return;let o=isObject(n)?n:void 0,s={...buildCallbackContext(),abortSignal:i??new AbortController().signal,approvedTools:t.approvedTools??new Set,callId:r,toolInput:o,toolName:e.name},c=await resolveApprovalPolicy(e.approval)(a?markApprovalRecheck(s):s);return typeof c==`boolean`?c?`user-approval`:`not-applicable`:c}}async function recheckApprovedCall(e,t){let n=await buildApprovalFn(e,{approvedTools:t.approvedTools})(t.input,t.callId,t.abortSignal,!0);return n===`denied`?{denied:!0}:typeof n==`object`&&n&&n.type===`denied`?{denied:!0,reason:n.reason}:{denied:!1}}function buildToolApproval(e,t){return async({toolCall:n,messages:r})=>{let i=e[n.toolName];return i===void 0?void 0:await toolApprovals.get(i)?.(n.input,n.toolCallId,t,isApprovedToolCall(r,n.toolCallId))}}export{buildToolApproval,buildToolSet,buildToolSetFromDefinitions,buildToolSetWithProviderTools,recheckApprovedCall,wrapToolExecute};
@@ -112,7 +112,7 @@ export declare function accumulateTurnUsage(input: {
112
112
  * Adds usage to session totals without touching the in-flight turn totals:
113
113
  * the delegated spend a parent counts, or a run's tally of what its
114
114
  * `ctx.agent` sessions spent. Turn tags attribute only the parent's own model
115
- * calls (child spend is attributed by the caller's durable `agent.action`
115
+ * calls (child spend is attributed by the caller's durable `execute_tool`
116
116
  * span); session totals feed the session token limits and the remaining-quota
117
117
  * budget granted to later delegations.
118
118
  */
@@ -1,3 +1,4 @@
1
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
1
2
  import type { LanguageModel, ModelMessage, UserContent } from "ai";
2
3
  import type { SessionAuthContext, SessionCapabilities } from "#channel/types.js";
3
4
  import type { AlsContext } from "#context/container.js";
@@ -264,6 +265,11 @@ export interface ToolLoopHarnessConfig {
264
265
  * Omitted in production until an instrumentation runtime opts in.
265
266
  */
266
267
  readonly instrumentation?: SessionInstrumentation;
268
+ /**
269
+ * Sign-in callbacks the step's delivery carried. Each completes before anything else runs, and
270
+ * a connection's sign-in resumes the turn that asked for it.
271
+ */
272
+ readonly signInCompletions?: readonly AuthorizationChallenge[];
267
273
  /** Restores runtime resources for the originating turn before approval work. */
268
274
  readonly prepareApprovalTurn?: (event: {
269
275
  readonly sequence: number;
@@ -1,4 +1,4 @@
1
1
  import type { Telemetry } from "ai";
2
2
  import type { InstrumentationAttemptScope, InstrumentationContextRunner, InstrumentationHooks } from "#instrumentation/lifecycle.js";
3
3
  /** Creates one provider-neutral AI SDK bridge for one actual model attempt. */
4
- export declare function createAiSdkHookBridge(scope: InstrumentationAttemptScope, hooks: InstrumentationHooks, runInContext?: InstrumentationContextRunner, runtimeContext?: Readonly<Record<string, unknown>>): Telemetry;
4
+ export declare function createAiSdkHookBridge(scope: InstrumentationAttemptScope, hooks: InstrumentationHooks, runInContext?: InstrumentationContextRunner, runtimeContext?: Readonly<Record<string, unknown>>, isFrameworkTool?: (name: string) => boolean): Telemetry;
@@ -1 +1 @@
1
- import{attemptIdempotencyKey,modelCallIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{structuralProviderMetadata}from"#instrumentation/content.js";function createAiSdkHookBridge(e,t,n=directRunInContext,r){let i={capturesInputs:t.capturesInputs??t.capturesContent,capturesOutputs:t.capturesOutputs??t.capturesContent,modelCallIndexes:new Map,modelCallStartEvents:new Map,modelKeys:new Map,runtimeContext:r!==void 0&&Object.keys(r).length>0?Object.freeze({...r}):void 0,scope:e,toolKeys:new Map},nextModelCallKey=e=>{let t=i.modelCallIndexes.get(e)??0;return i.modelCallIndexes.set(e,t+1),modelCallIdempotencyKey(i.scope,e,t)};return{onStart(e){i.operation=Object.freeze({modelId:e.modelId,operationId:e.operationId,provider:e.provider})},async onStepStart(e){i.stepNumber=e.stepNumber;let n=toStepAttemptStarted(i);n!==void 0&&await t.publish(n)},async onLanguageModelCallStart(e){let n=i.stepNumber??0,r=nextModelCallKey(n);i.modelKeys.set(e.callId,r);let a=toModelCallStarted(i,r,e);i.modelCallStartEvents.set(e.callId,{event:a,stepNumber:n}),await t.publish(a)},async executeLanguageModelCall({callId:r,execute:a}){let o=i.modelKeys.get(r);if(o===void 0){let e=i.modelCallStartEvents.get(r);if(e===void 0)return a();o=nextModelCallKey(e.stepNumber),i.modelKeys.set(r,o),await t.publish(Object.freeze({...e.event,idempotencyKey:o}))}try{return await n({idempotencyKey:o,scope:e,type:`model.call`},a)}catch(n){throw i.modelKeys.get(r)===o&&i.modelKeys.delete(r),await t.publish(Object.freeze({error:n,idempotencyKey:o,scope:e,type:`model.call.failed`})),n}},async onLanguageModelCallEnd(e){let n=i.modelKeys.get(e.callId);if(n===void 0)return;i.modelKeys.delete(e.callId),i.modelCallStartEvents.delete(e.callId);let r=toModelCallCompleted(i,n,e);await t.publish(r)},async onStepEnd(e){if(e.providerMetadata===void 0)return;let n=i.capturesOutputs?e.providerMetadata:structuralProviderMetadata(e.providerMetadata);await t.publish(Object.freeze({idempotencyKey:attemptIdempotencyKey(i.scope),providerMetadata:n,scope:i.scope,type:`step.attempt.metadata`}))},async onToolExecutionStart(e){let n=toolCallIdempotencyKey(i.scope,e.toolCall.toolCallId,i.stepNumber??0);i.toolKeys.set(e.toolCall.toolCallId,n);let r=toToolCallStarted(i,n,e);await t.publish(r)},executeTool({toolCallId:t,execute:r}){let a=i.toolKeys.get(t);return a===void 0?r():n({idempotencyKey:a,scope:e,type:`tool.call`},r)},async onToolExecutionEnd(e){let n=e.toolCall.toolCallId,r=i.toolKeys.get(n);if(r===void 0)return;i.toolKeys.delete(n);let a=toToolCallCompleted(i,r,e);await t.publish(a)},async onAbort(e){await failOpenOperations(e.reason)},async onError(e){await failOpenOperations(e.error)}};async function failOpenOperations(n){let r=[];for(let a of i.modelKeys.values())r.push(t.publish(Object.freeze({error:n,idempotencyKey:a,scope:e,type:`model.call.failed`})));for(let a of i.toolKeys.values())r.push(t.publish(Object.freeze({error:n,idempotencyKey:a,scope:e,type:`tool.call.failed`})));i.modelKeys.clear(),i.modelCallStartEvents.clear(),i.toolKeys.clear(),await Promise.all(r)}}const directRunInContext=(e,t)=>t();function toStepAttemptStarted(e){if(e.operation!==void 0&&e.stepNumber!==void 0)return Object.freeze({idempotencyKey:attemptIdempotencyKey(e.scope),operation:e.operation,runtimeContext:e.runtimeContext,scope:e.scope,type:`step.attempt.started`})}function toModelCallStarted(e,t,n){return Object.freeze({idempotencyKey:t,input:e.capturesInputs?Object.freeze({instructions:n.instructions,messages:Object.freeze([...n.messages])}):void 0,model:Object.freeze({modelId:n.modelId,provider:n.provider}),runtimeContext:e.runtimeContext,scope:e.scope,type:`model.call.started`})}function toModelCallCompleted(e,t,n){return Object.freeze({content:e.capturesOutputs?toContentParts(n.content):void 0,finishReason:n.finishReason,idempotencyKey:t,responseModelId:n.modelId,responseId:n.responseId,scope:e.scope,type:`model.call.completed`,usage:toUsage(n.usage)})}function toUsage(e){return Object.freeze({inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens}),inputTokens:e.inputTokens,outputTokens:e.outputTokens})}function toContentParts(e){let t=[];for(let n of e)switch(n.type){case`text`:case`reasoning`:t.push(Object.freeze({text:n.text,type:n.type}));break;case`tool-call`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,toolName:n.toolName,type:`tool-call`}));break;case`tool-result`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,output:n.output,toolName:n.toolName,type:`tool-result`}));break;case`tool-error`:t.push(Object.freeze({callId:n.toolCallId,error:n.error,input:n.input,toolName:n.toolName,type:`tool-error`}))}return Object.freeze(t)}function toToolCallStarted(e,t,n){return Object.freeze({callId:n.toolCall.toolCallId,idempotencyKey:t,input:e.capturesInputs?n.toolCall.input:void 0,scope:e.scope,toolName:n.toolCall.toolName,type:`tool.call.started`})}function toToolCallCompleted(e,t,n){return Object.freeze({durationMs:n.toolExecutionMs,idempotencyKey:t,output:toToolOutput(n.toolOutput,e.capturesOutputs),scope:e.scope,type:`tool.call.completed`})}function toToolOutput(e,t){return e.type===`tool-result`?Object.freeze(t?{output:e.output,type:`result`}:{type:`result`}):Object.freeze(t?{error:e.error,type:`error`}:{type:`error`})}export{createAiSdkHookBridge};
1
+ import{attemptIdempotencyKey,modelCallIdempotencyKey,toolCallIdempotencyKey}from"#instrumentation/lifecycle.js";import{structuralProviderMetadata}from"#instrumentation/content.js";function createAiSdkHookBridge(e,t,n=directRunInContext,r,i){let a={capturesInputs:t.capturesInputs??t.capturesContent,capturesOutputs:t.capturesOutputs??t.capturesContent,modelCallIndexes:new Map,modelCallStartEvents:new Map,modelKeys:new Map,runtimeContext:r!==void 0&&Object.keys(r).length>0?Object.freeze({...r}):void 0,scope:e,toolKeys:new Map,toolCalls:new Map,isFrameworkTool:i},nextModelCallKey=e=>{let t=a.modelCallIndexes.get(e)??0;return a.modelCallIndexes.set(e,t+1),modelCallIdempotencyKey(a.scope,e,t)};return{onStart(e){a.operation=Object.freeze({modelId:e.modelId,operationId:e.operationId,provider:e.provider})},async onStepStart(e){a.stepNumber=e.stepNumber;let n=toStepAttemptStarted(a);n!==void 0&&await t.publish(n)},async onLanguageModelCallStart(e){let n=a.stepNumber??0,r=nextModelCallKey(n);a.modelKeys.set(e.callId,r);let i=toModelCallStarted(a,r,e);a.modelCallStartEvents.set(e.callId,{event:i,stepNumber:n}),await t.publish(i)},async executeLanguageModelCall({callId:r,execute:i}){let o=a.modelKeys.get(r);if(o===void 0){let e=a.modelCallStartEvents.get(r);if(e===void 0)return i();o=nextModelCallKey(e.stepNumber),a.modelKeys.set(r,o),await t.publish(Object.freeze({...e.event,idempotencyKey:o}))}try{return await n({idempotencyKey:o,scope:e,type:`model.call`},i)}catch(n){throw a.modelKeys.get(r)===o&&a.modelKeys.delete(r),await t.publish(Object.freeze({error:n,idempotencyKey:o,scope:e,type:`model.call.failed`})),n}},async onLanguageModelCallEnd(e){let n=a.modelKeys.get(e.callId);if(n===void 0)return;a.modelKeys.delete(e.callId),a.modelCallStartEvents.delete(e.callId);let r=toModelCallCompleted(a,n,e);await t.publish(r)},async onStepEnd(e){if(e.providerMetadata===void 0)return;let n=a.capturesOutputs?e.providerMetadata:structuralProviderMetadata(e.providerMetadata);await t.publish(Object.freeze({idempotencyKey:attemptIdempotencyKey(a.scope),providerMetadata:n,scope:a.scope,type:`step.attempt.metadata`}))},onToolExecutionStart(e){let t=toolCallIdempotencyKey(a.scope,e.toolCall.toolCallId,a.stepNumber??0);a.toolKeys.set(e.toolCall.toolCallId,t);let n=toToolCallStarted(a,t,e);a.toolCalls.set(e.toolCall.toolCallId,n)},executeTool({toolCallId:e,execute:t}){let r=a.toolCalls.get(e);return r===void 0?t():n({...r,type:`tool.call`},t)},onToolExecutionEnd(e){let t=e.toolCall.toolCallId;a.toolKeys.get(t)!==void 0&&(a.toolKeys.delete(t),a.toolCalls.delete(t))},async onAbort(e){await failOpenOperations(e.reason)},async onError(e){await failOpenOperations(e.error)}};async function failOpenOperations(n){let r=[];for(let i of a.modelKeys.values())r.push(t.publish(Object.freeze({error:n,idempotencyKey:i,scope:e,type:`model.call.failed`})));a.modelKeys.clear(),a.modelCallStartEvents.clear(),a.toolKeys.clear(),a.toolCalls.clear(),await Promise.all(r)}}const directRunInContext=(e,t)=>t();function toStepAttemptStarted(e){if(e.operation!==void 0&&e.stepNumber!==void 0)return Object.freeze({idempotencyKey:attemptIdempotencyKey(e.scope),operation:e.operation,runtimeContext:e.runtimeContext,scope:e.scope,type:`step.attempt.started`})}function toModelCallStarted(e,t,n){return Object.freeze({idempotencyKey:t,input:e.capturesInputs?Object.freeze({instructions:n.instructions,messages:Object.freeze([...n.messages])}):void 0,model:Object.freeze({modelId:n.modelId,provider:n.provider}),runtimeContext:e.runtimeContext,scope:e.scope,type:`model.call.started`})}function toModelCallCompleted(e,t,n){return Object.freeze({content:e.capturesOutputs?toContentParts(n.content):void 0,finishReason:n.finishReason,idempotencyKey:t,responseModelId:n.modelId,responseId:n.responseId,scope:e.scope,type:`model.call.completed`,usage:toUsage(n.usage)})}function toUsage(e){return Object.freeze({inputTokenDetails:Object.freeze({cacheReadTokens:e.inputTokenDetails?.cacheReadTokens,cacheWriteTokens:e.inputTokenDetails?.cacheWriteTokens}),inputTokens:e.inputTokens,outputTokens:e.outputTokens})}function toContentParts(e){let t=[];for(let n of e)switch(n.type){case`text`:case`reasoning`:t.push(Object.freeze({text:n.text,type:n.type}));break;case`tool-call`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,toolName:n.toolName,type:`tool-call`}));break;case`tool-result`:t.push(Object.freeze({callId:n.toolCallId,input:n.input,output:n.output,toolName:n.toolName,type:`tool-result`}));break;case`tool-error`:t.push(Object.freeze({callId:n.toolCallId,error:n.error,input:n.input,toolName:n.toolName,type:`tool-error`}))}return Object.freeze(t)}function toToolCallStarted(e,t,n){return Object.freeze({callId:n.toolCall.toolCallId,frameworkTool:e.isFrameworkTool?.(n.toolCall.toolName)===!0,idempotencyKey:t,input:e.capturesInputs?n.toolCall.input:void 0,scope:e.scope,toolName:n.toolCall.toolName,startedAtMs:Date.now(),type:`tool.call.started`})}export{createAiSdkHookBridge};
@@ -1 +1 @@
1
- function withoutInstrumentationContent(e){return withInstrumentationDecision(e,{action:`record`,recordInputs:!1,recordOutputs:!1})}function withInstrumentationDecision(e,t){switch(e.type){case`session.started`:return t.recordInputs?e:Object.freeze({...e,title:void 0});case`channel.delivery.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`action.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`action.completed`:return t.recordOutputs?e:Object.freeze({...e,output:Object.freeze({type:e.output.type})});case`input.requested`:return t.recordOutputs?e:Object.freeze({...e,request:void 0});case`input.resolved`:return t.recordInputs&&t.recordOutputs?e:Object.freeze({...e,error:t.recordOutputs?e.error:void 0,response:t.recordInputs?e.response:void 0});case`tool.call.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`tool.call.completed`:return t.recordOutputs?e:Object.freeze({...e,output:Object.freeze({type:e.output.type})});case`model.call.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`model.call.completed`:return t.recordOutputs?e:Object.freeze({...e,content:void 0});case`memory.operation.completed`:return t.recordInputs?e:Object.freeze({...e,outputRecords:void 0});case`step.attempt.metadata`:return t.recordOutputs?e:Object.freeze({...e,providerMetadata:structuralProviderMetadata(e.providerMetadata)});case`action.failed`:case`model.call.failed`:case`memory.operation.failed`:case`session.failed`:case`step.attempt.failed`:case`tool.call.failed`:case`turn.failed`:case`channel.delivery.failed`:return t.recordOutputs?e:Object.freeze({...e,error:void 0});default:return e}}function structuralProviderMetadata(e){let t=e.gateway;if(typeof t!=`object`||!t||Array.isArray(t))return Object.freeze({});let n=t,r={};for(let e of[`cost`,`generationId`]){let t=n[e];(typeof t==`string`||typeof t==`number`)&&(r[e]=t)}return Object.freeze(Object.keys(r).length===0?{}:{gateway:Object.freeze(r)})}export{structuralProviderMetadata,withInstrumentationDecision,withoutInstrumentationContent};
1
+ function withoutInstrumentationContent(e){return withInstrumentationDecision(e,{action:`record`,recordInputs:!1,recordOutputs:!1})}function withInstrumentationDecision(e,t){switch(e.type){case`session.started`:return t.recordInputs?e:Object.freeze({...e,title:void 0});case`channel.delivery.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`input.requested`:return t.recordOutputs?e:Object.freeze({...e,request:void 0});case`input.resolved`:return t.recordInputs&&t.recordOutputs?e:Object.freeze({...e,error:t.recordOutputs?e.error:void 0,response:t.recordInputs?e.response:void 0});case`tool.call.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`tool.call.completed`:return t.recordOutputs?e:Object.freeze({...e,output:Object.freeze({type:e.output.type})});case`model.call.started`:return t.recordInputs?e:Object.freeze({...e,input:void 0});case`model.call.completed`:return t.recordOutputs?e:Object.freeze({...e,content:void 0});case`memory.operation.completed`:return t.recordInputs?e:Object.freeze({...e,outputRecords:void 0});case`step.attempt.metadata`:return t.recordOutputs?e:Object.freeze({...e,providerMetadata:structuralProviderMetadata(e.providerMetadata)});case`model.call.failed`:case`memory.operation.failed`:case`session.failed`:case`step.attempt.failed`:case`tool.call.failed`:case`turn.failed`:case`channel.delivery.failed`:return t.recordOutputs?e:Object.freeze({...e,error:void 0});default:return e}}function structuralProviderMetadata(e){let t=e.gateway;if(typeof t!=`object`||!t||Array.isArray(t))return Object.freeze({});let n=t,r={};for(let e of[`cost`,`generationId`]){let t=n[e];(typeof t==`string`||typeof t==`number`)&&(r[e]=t)}return Object.freeze(Object.keys(r).length===0?{}:{gateway:Object.freeze(r)})}export{structuralProviderMetadata,withInstrumentationDecision,withoutInstrumentationContent};
@@ -1 +1 @@
1
- import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#instrumentation/state.js";import{withInstrumentationDecision,withoutInstrumentationContent}from"#instrumentation/content.js";import{resolveTracePolicy}from"#shared/trace-policy.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=[...r.serialBefore,...r.parallel,...r.serialAfter],a=new Set;function forTrace(e){let t=new WeakMap,o=new Map(i.map(t=>[t,resolveTracePolicy(t.tracePolicy,e,e=>{a.has(t)||(a.add(t),log.warn(`instrumentation provider trace policy failed`,{error:formatError(e),provider:t.name}))})])),s=[...o.values()].some(e=>e.action===`record`&&e.recordInputs),c=[...o.values()].some(e=>e.action===`record`&&e.recordOutputs),l=s||c,publish=async e=>{let i=snapshotInstrumentationEvent(withInstrumentationDecision(e,{action:`record`,recordInputs:s,recordOutputs:c}),t,e),a=i.type===`session.completed`||i.type===`session.failed`,l=i.type===`turn.cancelled`||i.type===`turn.failed`;if(a||l){let e=takeInstrumentationActionScopes(i.sessionId,l?i.turnId:void 0),t=terminalActionFailure(i);for(let n of e)await publish({...t,idempotencyKey:n.idempotencyKey,scope:n.scope,type:`action.failed`})}let u=new Map,visibleEvent=e=>{let t=o.get(e);if(t===void 0||t.action===`drop`)return withoutInstrumentationContent(i);if(t.recordInputs&&t.recordOutputs)return i;let n=`${String(t.recordInputs)}:${String(t.recordOutputs)}`,r=u.get(n);return r===void 0&&(r=withInstrumentationDecision(i,t),u.set(n,r)),r},admitted=e=>o.get(e)?.action===`record`;try{try{for(let e of r.serialBefore)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e));let e=r.parallel.filter(admitted);if(e.length===1){let t=e[0];await dispatchToProvider(t,i,n,()=>visibleEvent(t))}else if(e.length>1){let t=(await Promise.allSettled(e.map(e=>dispatchToProvider(e,i,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(t!==void 0)throw t.reason}}finally{for(let e of r.serialAfter)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e))}}finally{releaseTerminalState(i)}};return{capturesContent:l,capturesInputs:s,capturesOutputs:c,forTrace,publish}}let o=!1;return{capturesContent:!1,forTrace,async publish(e){o||(o=!0,log.debug(`instrumentation event published without trace binding`,{eventType:e.type}))}}}function snapshotInstrumentationEvent(e,t,n){let r=t.get(n);if(r!==void 0)return r;let i=snapshotPlainValue(e,t);return t.set(n,i),i}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,t,n,r){let i=t.type.endsWith(`.started`)||t.type===`input.requested`,a=stateOwner(t),o=e.name,s=e.stateNamespace??o;if(isInstrumentationStateAbandoned(s,t.idempotencyKey))return;let c=e.events?.[t.type];if(c===void 0)return;let l=instrumentationStateSlot(s,t.idempotencyKey,a);try{await withTimeout(async()=>{let t=r();await c(e.projectEvent===void 0?t:await e.projectEvent(t),{state:l})},n,()=>{l.revoke(),i&&abandonInstrumentationState(s,t.idempotencyKey,a)})||log.warn(`instrumentation provider timed out`,{boundary:t.type,provider:o,timeoutMs:n})}catch(e){log.warn(`instrumentation provider failed`,{boundary:t.type,error:formatError(e),provider:o})}finally{l.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`||e.type===`memory.operation.started`||e.type===`memory.operation.completed`||e.type===`memory.operation.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`action.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`tool.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};
1
+ import{createLogger,formatError}from"#internal/logging.js";import{abandonInstrumentationState,instrumentationStateSlot,isInstrumentationStateAbandoned,releaseAllInstrumentationAttemptState,releaseAllInstrumentationState,releaseAllInstrumentationTurnState,takeInstrumentationActionScopes}from"#instrumentation/state.js";import{withInstrumentationDecision,withoutInstrumentationContent}from"#instrumentation/content.js";import{resolveTracePolicy}from"#shared/trace-policy.js";const log=createLogger(`harness.instrumentation-dispatch`);function createInstrumentationDispatcher(e,t){let n=t.handlerTimeoutMs??5e3,r=normalizeDispatchGroups(e),i=[...r.serialBefore,...r.parallel,...r.serialAfter],a=new Set;function forTrace(e){let t=new WeakMap,o=new Map(i.map(t=>[t,resolveTracePolicy(t.tracePolicy,e,e=>{a.has(t)||(a.add(t),log.warn(`instrumentation provider trace policy failed`,{error:formatError(e),provider:t.name}))})])),s=[...o.values()].some(e=>e.action===`record`&&e.recordInputs),c=[...o.values()].some(e=>e.action===`record`&&e.recordOutputs),l=s||c,publish=async e=>{let i=snapshotInstrumentationEvent(withInstrumentationDecision(e,{action:`record`,recordInputs:s,recordOutputs:c}),t,e),a=i.type===`session.completed`||i.type===`session.failed`,l=i.type===`turn.cancelled`||i.type===`turn.failed`;if(a||l){let e=takeInstrumentationActionScopes(i.sessionId,l?i.turnId:void 0),t=terminalActionFailure(i);for(let n of e)await publish({...t,idempotencyKey:n.idempotencyKey,scope:n.scope,type:`tool.call.failed`})}let u=new Map,visibleEvent=e=>{let t=o.get(e);if(t===void 0||t.action===`drop`)return withoutInstrumentationContent(i);if(t.recordInputs&&t.recordOutputs)return i;let n=`${String(t.recordInputs)}:${String(t.recordOutputs)}`,r=u.get(n);return r===void 0&&(r=withInstrumentationDecision(i,t),u.set(n,r)),r},admitted=e=>o.get(e)?.action===`record`;try{try{for(let e of r.serialBefore)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e));let e=r.parallel.filter(admitted);if(e.length===1){let t=e[0];await dispatchToProvider(t,i,n,()=>visibleEvent(t))}else if(e.length>1){let t=(await Promise.allSettled(e.map(e=>dispatchToProvider(e,i,n,()=>visibleEvent(e))))).find(e=>e.status===`rejected`);if(t!==void 0)throw t.reason}}finally{for(let e of r.serialAfter)admitted(e)&&await dispatchToProvider(e,i,n,()=>visibleEvent(e))}}finally{releaseTerminalState(i)}};return{capturesContent:l,capturesInputs:s,capturesOutputs:c,forTrace,publish}}let o=!1;return{capturesContent:!1,forTrace,async publish(e){o||(o=!0,log.debug(`instrumentation event published without trace binding`,{eventType:e.type}))}}}function snapshotInstrumentationEvent(e,t,n){let r=t.get(n);if(r!==void 0)return r;let i=snapshotPlainValue(e,t);return t.set(n,i),i}function snapshotPlainValue(e,t){if(Array.isArray(e)){let n=t.get(e);if(n!==void 0)return n;let r=[];t.set(e,r);for(let n of e)r.push(snapshotPlainValue(n,t));return Object.freeze(r)}if(typeof e!=`object`||!e)return e;let n;try{n=Object.getPrototypeOf(e)}catch{return e}if(n!==Object.prototype&&n!==null)return e;let r=t.get(e);if(r!==void 0)return r;let i={};t.set(e,i);for(let[n,r]of Object.entries(e))i[n]=snapshotPlainValue(r,t);return Object.freeze(i)}function normalizeDispatchGroups(e){if(!Array.isArray(e)){let t=e;return{parallel:t.parallel??[],serialAfter:t.serialAfter??[],serialBefore:t.serialBefore??[]}}return{parallel:[],serialAfter:[],serialBefore:e.map((e,t)=>({...e,name:e.name??`provider-${String(t)}`}))}}async function dispatchToProvider(e,t,n,r){let i=t.type.endsWith(`.started`)||t.type===`input.requested`,a=stateOwner(t),o=e.name,s=e.stateNamespace??o;if(isInstrumentationStateAbandoned(s,t.idempotencyKey))return;let c=e.events?.[t.type];if(c===void 0)return;let l=instrumentationStateSlot(s,t.idempotencyKey,a);try{await withTimeout(async()=>{let t=r();await c(e.projectEvent===void 0?t:await e.projectEvent(t),{state:l})},n,()=>{l.revoke(),i&&abandonInstrumentationState(s,t.idempotencyKey,a)})||log.warn(`instrumentation provider timed out`,{boundary:t.type,provider:o,timeoutMs:n})}catch(e){log.warn(`instrumentation provider failed`,{boundary:t.type,error:formatError(e),provider:o})}finally{l.revoke()}}async function withTimeout(e,t,n){let r;try{return await Promise.race([Promise.resolve(e()).then(()=>!0),new Promise(e=>{r=setTimeout(()=>{n(),e(!1)},t)})])}finally{clearTimeout(r)}}function stateOwner(e){return e.type===`channel.delivery.started`||e.type===`channel.delivery.cancelled`||e.type===`channel.delivery.completed`||e.type===`channel.delivery.failed`||e.type===`memory.operation.started`||e.type===`memory.operation.completed`||e.type===`memory.operation.failed`?{sessionId:e.sessionId,turnId:e.turnId}:`scope`in e?e.type.startsWith(`tool.call.`)||e.type.startsWith(`input.`)?{sessionId:e.scope.sessionId,turnId:e.scope.turnId}:e.type.startsWith(`model.call.`)||e.type.startsWith(`step.attempt.`)?{attemptId:e.scope.attemptId}:{}:{}}function releaseTerminalState(e){isTerminal(e.type)&&releaseAllInstrumentationState(e.idempotencyKey),(e.type===`step.attempt.completed`||e.type===`step.attempt.failed`)&&releaseAllInstrumentationAttemptState(e.scope.attemptId),(e.type===`session.completed`||e.type===`session.failed`)&&releaseAllInstrumentationTurnState(e.sessionId),(e.type===`turn.cancelled`||e.type===`turn.failed`)&&releaseAllInstrumentationTurnState(e.sessionId,e.turnId)}function terminalActionFailure(e){return e.type===`session.failed`||e.type===`turn.failed`?{error:e.error,outcome:`failed`}:e.type===`turn.cancelled`?{error:Error(`The action was cancelled with its turn.`),errorCode:`ACTION_CANCELLED`,outcome:`cancelled`}:{error:Error(`The session completed before the action settled.`),errorCode:`ACTION_ABANDONED`,outcome:`abandoned`}}function isTerminal(e){return e.endsWith(`.completed`)||e.endsWith(`.failed`)||e.endsWith(`.cancelled`)||e===`input.resolved`}export{createInstrumentationDispatcher};