eve 0.71.3 → 0.72.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/CHANGELOG.md +37 -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/mock-model.js +1 -1
  69. package/dist/src/evals/types.d.ts +8 -8
  70. package/dist/src/execution/cancel-descendant-turns-step.d.ts +1 -0
  71. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  72. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  73. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  74. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  75. package/dist/src/execution/durable-session-read.d.ts +5 -0
  76. package/dist/src/execution/durable-session-read.js +1 -0
  77. package/dist/src/execution/durable-session-store.d.ts +4 -10
  78. package/dist/src/execution/durable-session-store.js +1 -1
  79. package/dist/src/execution/dynamic-connections.d.ts +3 -3
  80. package/dist/src/execution/dynamic-connections.js +1 -1
  81. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  82. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  83. package/dist/src/execution/legacy-session/snapshot.d.ts +3 -0
  84. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  85. package/dist/src/execution/model-call-batching.js +1 -1
  86. package/dist/src/execution/node-step.d.ts +2 -0
  87. package/dist/src/execution/node-step.js +1 -1
  88. package/dist/src/execution/proxied-deliver-step.js +1 -1
  89. package/dist/src/execution/publish-session-events.d.ts +7 -2
  90. package/dist/src/execution/publish-session-events.js +1 -1
  91. package/dist/src/execution/session/active-turn.js +1 -1
  92. package/dist/src/execution/session/answer-caller.js +1 -1
  93. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  94. package/dist/src/execution/session/finalization.js +1 -1
  95. package/dist/src/execution/session/handoff-steps.d.ts +3 -1
  96. package/dist/src/execution/session/handoff-steps.js +1 -1
  97. package/dist/src/execution/session/handoff.d.ts +1 -1
  98. package/dist/src/execution/session/handoff.js +1 -1
  99. package/dist/src/execution/session/pending-turn-state.d.ts +8 -3
  100. package/dist/src/execution/session/pending-turn-state.js +1 -1
  101. package/dist/src/execution/session/task-tool-tracing-step.d.ts +5 -0
  102. package/dist/src/execution/session/task-tool-tracing-step.js +1 -0
  103. package/dist/src/execution/session/turn-step-result.js +1 -1
  104. package/dist/src/execution/session/turn-step.js +1 -1
  105. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  106. package/dist/src/execution/session/turn.d.ts +1 -0
  107. package/dist/src/execution/session/turn.js +1 -1
  108. package/dist/src/execution/settle-cancelled-turn-step.d.ts +4 -6
  109. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  110. package/dist/src/execution/tasks/start.d.ts +3 -3
  111. package/dist/src/execution/tasks/start.js +1 -1
  112. package/dist/src/execution/tasks/steps.d.ts +1 -1
  113. package/dist/src/execution/tasks/steps.js +1 -1
  114. package/dist/src/execution/terminal-session-completion-step.d.ts +5 -1
  115. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  116. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  117. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  118. package/dist/src/execution/tools/connection-tools.js +2 -2
  119. package/dist/src/execution/tools/workflow/harness-definition.js +1 -1
  120. package/dist/src/execution/tools/workflow/step.js +1 -1
  121. package/dist/src/execution/tools/workflow/withdraw-step.d.ts +7 -9
  122. package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
  123. package/dist/src/execution/workflow-trace-context.d.ts +2 -2
  124. package/dist/src/harness/authorization.d.ts +4 -2
  125. package/dist/src/harness/authorization.js +1 -1
  126. package/dist/src/harness/{compaction.js → compaction/engine.js} +1 -1
  127. package/dist/src/harness/compaction/step.d.ts +46 -0
  128. package/dist/src/harness/compaction/step.js +1 -0
  129. package/dist/src/harness/coordination.d.ts +32 -68
  130. package/dist/src/harness/coordination.js +1 -1
  131. package/dist/src/harness/current-messages.d.ts +1 -3
  132. package/dist/src/harness/current-messages.js +1 -1
  133. package/dist/src/harness/emission.d.ts +4 -52
  134. package/dist/src/harness/emission.js +1 -1
  135. package/dist/src/harness/execute-tool.d.ts +1 -0
  136. package/dist/src/harness/final-output.d.ts +5 -0
  137. package/dist/src/harness/final-output.js +1 -1
  138. package/dist/src/harness/hitl/approvals.d.ts +115 -0
  139. package/dist/src/harness/hitl/approvals.js +1 -0
  140. package/dist/src/harness/hitl/approved-call-callers.d.ts +14 -0
  141. package/dist/src/harness/hitl/approved-call-callers.js +1 -0
  142. package/dist/src/harness/hitl/approved-calls.d.ts +37 -0
  143. package/dist/src/harness/hitl/approved-calls.js +1 -0
  144. package/dist/src/harness/hitl/budget.d.ts +21 -0
  145. package/dist/src/harness/hitl/budget.js +1 -0
  146. package/dist/src/harness/{approval-candidates.d.ts → hitl/candidates.d.ts} +9 -18
  147. package/dist/src/harness/hitl/candidates.js +1 -0
  148. package/dist/src/harness/hitl/coordinator.js +1 -0
  149. package/dist/src/harness/hitl/delivery.d.ts +37 -0
  150. package/dist/src/harness/hitl/delivery.js +1 -0
  151. package/dist/src/harness/hitl/index.d.ts +49 -0
  152. package/dist/src/harness/hitl/index.js +1 -0
  153. package/dist/src/harness/hitl/intake.d.ts +67 -0
  154. package/dist/src/harness/hitl/intake.js +1 -0
  155. package/dist/src/harness/{stale-input-responses.d.ts → hitl/stale-responses.d.ts} +5 -3
  156. package/dist/src/harness/hitl/stale-responses.js +3 -0
  157. package/dist/src/harness/inline-tool-authorization.d.ts +4 -0
  158. package/dist/src/harness/inline-tool-authorization.js +1 -1
  159. package/dist/src/harness/input-extraction.d.ts +1 -10
  160. package/dist/src/harness/input-extraction.js +1 -1
  161. package/dist/src/harness/input-request-resolution.d.ts +1 -5
  162. package/dist/src/harness/input-request-resolution.js +1 -1
  163. package/dist/src/harness/model-call/call.d.ts +78 -0
  164. package/dist/src/harness/model-call/call.js +1 -0
  165. package/dist/src/harness/{model-call-error.d.ts → model-call/errors.d.ts} +1 -1
  166. package/dist/src/harness/model-call/failure.d.ts +52 -0
  167. package/dist/src/harness/model-call/failure.js +1 -0
  168. package/dist/src/harness/model-call/model.d.ts +18 -0
  169. package/dist/src/harness/model-call/model.js +1 -0
  170. package/dist/src/harness/model-call/recovery.d.ts +52 -0
  171. package/dist/src/harness/model-call/recovery.js +1 -0
  172. package/dist/src/harness/model-call/request.d.ts +30 -0
  173. package/dist/src/harness/model-call/request.js +3 -0
  174. package/dist/src/harness/model-call/response.d.ts +39 -0
  175. package/dist/src/harness/model-call/response.js +1 -0
  176. package/dist/src/harness/model-call/retry.d.ts +11 -0
  177. package/dist/src/harness/model-call/retry.js +1 -0
  178. package/dist/src/harness/model-call/run.d.ts +38 -0
  179. package/dist/src/harness/model-call/run.js +1 -0
  180. package/dist/src/harness/model-call/tools.d.ts +48 -0
  181. package/dist/src/harness/model-call/tools.js +1 -0
  182. package/dist/src/harness/model-call/usage.d.ts +23 -0
  183. package/dist/src/harness/model-call/usage.js +1 -0
  184. package/dist/src/harness/nested-actions.d.ts +2 -2
  185. package/dist/src/harness/provider-tools.d.ts +2 -2
  186. package/dist/src/harness/provider-tools.js +1 -1
  187. package/dist/src/harness/proxy-input-requests.d.ts +4 -12
  188. package/dist/src/harness/proxy-input-requests.js +1 -1
  189. package/dist/src/harness/session-machine/commit.d.ts +28 -0
  190. package/dist/src/harness/session-machine/commit.js +1 -0
  191. package/dist/src/harness/session-machine/current.d.ts +29 -0
  192. package/dist/src/harness/session-machine/current.js +1 -0
  193. package/dist/src/harness/session-machine/events.d.ts +6 -0
  194. package/dist/src/harness/session-machine/events.js +1 -0
  195. package/dist/src/harness/session-machine/resolver-events.d.ts +12 -0
  196. package/dist/src/harness/session-machine/resolver-events.js +1 -0
  197. package/dist/src/harness/session-machine/state.d.ts +47 -0
  198. package/dist/src/harness/session-machine/state.js +1 -0
  199. package/dist/src/harness/session-machine/transitions.d.ts +188 -0
  200. package/dist/src/harness/session-machine/transitions.js +1 -0
  201. package/dist/src/harness/session-machine/view.d.ts +58 -0
  202. package/dist/src/harness/session-machine/view.js +1 -0
  203. package/dist/src/harness/step/after-model.d.ts +7 -0
  204. package/dist/src/harness/step/after-model.js +1 -0
  205. package/dist/src/harness/step/context.d.ts +59 -0
  206. package/dist/src/harness/step/context.js +1 -0
  207. package/dist/src/harness/step/intake.d.ts +34 -0
  208. package/dist/src/harness/step/intake.js +1 -0
  209. package/dist/src/harness/step/prompt.d.ts +37 -0
  210. package/dist/src/harness/step/prompt.js +1 -0
  211. package/dist/src/harness/step-hooks.d.ts +8 -13
  212. package/dist/src/harness/step-hooks.js +1 -1
  213. package/dist/src/harness/tool-loop.d.ts +7 -22
  214. package/dist/src/harness/tool-loop.js +1 -3
  215. package/dist/src/harness/tools.d.ts +13 -0
  216. package/dist/src/harness/tools.js +1 -1
  217. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  218. package/dist/src/harness/types.d.ts +6 -0
  219. package/dist/src/instrumentation/ai-sdk-hook-bridge.d.ts +1 -1
  220. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  221. package/dist/src/instrumentation/content.js +1 -1
  222. package/dist/src/instrumentation/dispatch.js +1 -1
  223. package/dist/src/instrumentation/lifecycle.d.ts +28 -56
  224. package/dist/src/instrumentation/native-events.d.ts +2 -1
  225. package/dist/src/instrumentation/native-events.js +1 -1
  226. package/dist/src/instrumentation/provider.d.ts +1 -1
  227. package/dist/src/instrumentation/runtime-context.d.ts +2 -3
  228. package/dist/src/instrumentation/runtime-context.js +1 -1
  229. package/dist/src/instrumentation/runtime.d.ts +11 -1
  230. package/dist/src/instrumentation/runtime.js +1 -1
  231. package/dist/src/instrumentation/state.d.ts +6 -1
  232. package/dist/src/instrumentation/state.js +1 -1
  233. package/dist/src/internal/application/package.js +1 -1
  234. package/dist/src/internal/attachments/limited-read.d.ts +16 -0
  235. package/dist/src/internal/attachments/limited-read.js +1 -0
  236. package/dist/src/internal/authored-definition/schema-backed.d.ts +2 -1
  237. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  238. package/dist/src/internal/mcp/published-tools.d.ts +13 -0
  239. package/dist/src/internal/mcp/published-tools.js +1 -0
  240. package/dist/src/internal/mcp/request-trace-context.d.ts +12 -0
  241. package/dist/src/internal/mcp/request-trace-context.js +1 -0
  242. package/dist/src/internal/mcp/streamable-http-server.d.ts +7 -3
  243. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  244. package/dist/src/internal/model-auth/transport.d.ts +3 -3
  245. package/dist/src/internal/model-auth/transport.js +1 -1
  246. package/dist/src/models/auto.d.ts +5 -5
  247. package/dist/src/models/auto.js +2 -2
  248. package/dist/src/protocol/message.d.ts +7 -0
  249. package/dist/src/protocol/message.js +1 -1
  250. package/dist/src/protocol/session-projection.d.ts +159 -0
  251. package/dist/src/protocol/session-projection.js +1 -0
  252. package/dist/src/public/ai/index.d.ts +1 -1
  253. package/dist/src/public/ai/index.js +1 -1
  254. package/dist/src/public/channels/chat-sdk/attachment-refs.d.ts +15 -0
  255. package/dist/src/public/channels/chat-sdk/attachment-refs.js +1 -0
  256. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  257. package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +11 -5
  258. package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -1
  259. package/dist/src/public/channels/discord/attachments.d.ts +15 -0
  260. package/dist/src/public/channels/discord/attachments.js +1 -0
  261. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  262. package/dist/src/public/channels/discord/inbound.d.ts +13 -0
  263. package/dist/src/public/channels/discord/inbound.js +1 -1
  264. package/dist/src/public/channels/linear/inbound-uploads.d.ts +21 -0
  265. package/dist/src/public/channels/linear/inbound-uploads.js +1 -0
  266. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  267. package/dist/src/public/channels/linq/inboundContent.d.ts +7 -1
  268. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  269. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  270. package/dist/src/public/channels/mcp.d.ts +17 -2
  271. package/dist/src/public/channels/mcp.js +1 -1
  272. package/dist/src/public/channels/photon/attachments.d.ts +21 -0
  273. package/dist/src/public/channels/photon/attachments.js +1 -0
  274. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  275. package/dist/src/public/channels/slack/attachments.d.ts +3 -1
  276. package/dist/src/public/channels/slack/attachments.js +1 -1
  277. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  278. package/dist/src/public/channels/teams/attachments.d.ts +4 -4
  279. package/dist/src/public/channels/teams/attachments.js +1 -1
  280. package/dist/src/public/channels/telegram/attachments.js +1 -1
  281. package/dist/src/public/channels/twilio/api.d.ts +7 -0
  282. package/dist/src/public/channels/twilio/api.js +1 -1
  283. package/dist/src/public/channels/twilio/inbound.d.ts +7 -0
  284. package/dist/src/public/channels/twilio/inbound.js +2 -2
  285. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  286. package/dist/src/public/definitions/connections/mcp.d.ts +1 -1
  287. package/dist/src/public/definitions/connections/openapi.d.ts +1 -1
  288. package/dist/src/react/index.d.ts +1 -0
  289. package/dist/src/react/index.js +1 -1
  290. package/dist/src/runtime/agent/mock-model-adapter.js +2 -2
  291. package/dist/src/runtime/connections/mcp-client.d.ts +18 -1
  292. package/dist/src/runtime/connections/mcp-client.js +1 -1
  293. package/dist/src/runtime/resolve-tool.js +1 -1
  294. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -0
  295. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  296. package/dist/src/setup/cli/prompt-ui.d.ts +3 -0
  297. package/dist/src/setup/cli/prompt-ui.js +3 -1
  298. package/dist/src/setup/cli/select-component.d.ts +1 -0
  299. package/dist/src/setup/cli/select-component.js +1 -1
  300. package/dist/src/setup/flows/ensure-vercel-project.d.ts +2 -0
  301. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  302. package/dist/src/setup/integrations/discord/api.js +1 -1
  303. package/dist/src/setup/integrations/web/auth-options.d.ts +4 -0
  304. package/dist/src/setup/integrations/web/auth-options.js +1 -0
  305. package/dist/src/setup/integrations/web/auth-scaffold.d.ts +7 -0
  306. package/dist/src/setup/integrations/web/auth-scaffold.js +1 -0
  307. package/dist/src/setup/integrations/web/provision-auth.d.ts +3 -0
  308. package/dist/src/setup/integrations/web/provision-auth.js +1 -0
  309. package/dist/src/setup/integrations/web/setup.d.ts +11 -6
  310. package/dist/src/setup/integrations/web/setup.js +3 -3
  311. package/dist/src/setup/prompter.d.ts +2 -0
  312. package/dist/src/setup/prompter.js +1 -1
  313. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  314. package/dist/src/setup/scaffold/create/project.js +2 -2
  315. package/dist/src/setup/scaffold/create/web-template.d.ts +1 -1
  316. package/dist/src/setup/scaffold/create/web-template.js +1 -0
  317. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  318. package/dist/src/setup/vercel-project-api.d.ts +9 -0
  319. package/dist/src/setup/vercel-project-api.js +1 -1
  320. package/dist/src/setup/vercel-project.d.ts +4 -2
  321. package/dist/src/setup/vercel-project.js +0 -0
  322. package/dist/src/shared/web-search.d.ts +1 -1
  323. package/dist/src/subagents/adapter.js +1 -1
  324. package/dist/src/subagents/event-proxy-step.js +1 -1
  325. package/dist/src/subagents/hitl-proxy.d.ts +4 -28
  326. package/dist/src/subagents/hitl-proxy.js +1 -1
  327. package/dist/src/svelte/index.d.ts +2 -0
  328. package/dist/src/svelte/index.js +39 -2
  329. package/dist/src/svelte/use-eve-agent.js +1 -1
  330. package/dist/src/tools/approval/policies.d.ts +5 -5
  331. package/dist/src/tools/approval/policies.js +1 -1
  332. package/dist/src/tools/framework/agent.js +1 -1
  333. package/dist/src/tools/provided/agent-router.js +1 -1
  334. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  335. package/dist/src/tools/provided/ask-question.js +2 -2
  336. package/dist/src/tools/provided/bash.js +1 -1
  337. package/dist/src/tools/provided/framework-tool.d.ts +3 -0
  338. package/dist/src/tools/provided/framework-tool.js +1 -0
  339. package/dist/src/tools/provided/glob.js +2 -2
  340. package/dist/src/tools/provided/grep.js +2 -2
  341. package/dist/src/tools/provided/load-skill.js +1 -1
  342. package/dist/src/tools/provided/no-reply.js +1 -1
  343. package/dist/src/tools/provided/read-file.js +2 -2
  344. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  345. package/dist/src/tools/provided/sleep.js +1 -1
  346. package/dist/src/tools/provided/task-cancel.js +1 -1
  347. package/dist/src/tools/provided/task-wait.js +1 -1
  348. package/dist/src/tools/provided/web-fetch.js +2 -2
  349. package/dist/src/tools/provided/web-search.js +1 -1
  350. package/dist/src/tools/provided/workflow.js +1 -1
  351. package/dist/src/tools/provided/write-file.js +2 -2
  352. package/dist/src/tracing/agent-approval-instrumentation.d.ts +2 -2
  353. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  354. package/dist/src/tracing/agent-otel-provider.js +2 -2
  355. package/dist/src/tracing/agent-otel-usage.d.ts +1 -1
  356. package/dist/src/tracing/agent-otel-usage.js +1 -1
  357. package/dist/src/tracing/agent-span-contract.d.ts +0 -1
  358. package/dist/src/tracing/agent-span-contract.js +1 -1
  359. package/dist/src/tracing/agent-tool-instrumentation.d.ts +16 -6
  360. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  361. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  362. package/dist/src/tracing/agent-trace-state.d.ts +7 -3
  363. package/dist/src/tracing/invoke-tool-span.js +1 -1
  364. package/dist/src/tracing/local-trace-analysis.js +1 -1
  365. package/dist/src/vue/index.d.ts +2 -0
  366. package/dist/src/vue/index.js +39 -2
  367. package/dist/src/vue/use-eve-agent.js +1 -1
  368. package/docs/agent-config.md +2 -2
  369. package/docs/channels/chat-sdk.mdx +3 -1
  370. package/docs/channels/custom.mdx +2 -0
  371. package/docs/channels/discord.mdx +5 -4
  372. package/docs/channels/eve.mdx +65 -0
  373. package/docs/channels/linear.mdx +1 -1
  374. package/docs/channels/linq.mdx +2 -0
  375. package/docs/channels/mcp.mdx +39 -1
  376. package/docs/channels/photon.mdx +5 -0
  377. package/docs/channels/teams.mdx +4 -7
  378. package/docs/channels/twilio.mdx +1 -1
  379. package/docs/concepts/built-in-tools.md +14 -2
  380. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  381. package/docs/connections/mcp.mdx +11 -0
  382. package/docs/connections/overview.mdx +2 -2
  383. package/docs/dynamic-configuration/meta.json +1 -1
  384. package/docs/evals/judge.mdx +16 -16
  385. package/docs/evals/overview.mdx +1 -1
  386. package/docs/guides/{evaluate.md → decide.md} +35 -35
  387. package/docs/guides/dynamic-capabilities.md +1 -1
  388. package/docs/guides/frontend/overview.mdx +3 -1
  389. package/docs/guides/hooks.md +1 -1
  390. package/docs/guides/instrumentation/instrumentation.mdx +23 -22
  391. package/docs/guides/instrumentation/otel.mdx +13 -2
  392. package/docs/reference/cli.md +3 -3
  393. package/docs/reference/typescript-api.md +4 -2
  394. package/docs/tools/human-in-the-loop.md +6 -4
  395. package/docs/tools/workflows.mdx +4 -4
  396. package/package.json +11 -11
  397. package/dist/src/ai/evaluate.d.ts +0 -7
  398. package/dist/src/ai/evaluate.js +0 -1
  399. package/dist/src/client/message-task-parts.d.ts +0 -8
  400. package/dist/src/client/message-task-parts.js +0 -1
  401. package/dist/src/compiled/_chunks/workflow/dist-C3ZE62yI.js +0 -25
  402. package/dist/src/compiled/_chunks/workflow/experimental-evaluation-Dm32egEG.js +0 -5
  403. package/dist/src/harness/active-turn-id.d.ts +0 -11
  404. package/dist/src/harness/active-turn-id.js +0 -1
  405. package/dist/src/harness/approval-candidates.js +0 -1
  406. package/dist/src/harness/approval-delivery-coordinator.js +0 -1
  407. package/dist/src/harness/approved-call-callers.d.ts +0 -11
  408. package/dist/src/harness/approved-call-callers.js +0 -1
  409. package/dist/src/harness/cancelled-turn-emission.d.ts +0 -12
  410. package/dist/src/harness/cancelled-turn-emission.js +0 -1
  411. package/dist/src/harness/emission-state.d.ts +0 -36
  412. package/dist/src/harness/emission-state.js +0 -1
  413. package/dist/src/harness/held-requests.d.ts +0 -18
  414. package/dist/src/harness/held-requests.js +0 -1
  415. package/dist/src/harness/hitl/approval-input-requests.d.ts +0 -27
  416. package/dist/src/harness/hitl/approval-input-requests.js +0 -1
  417. package/dist/src/harness/hitl/pending-input-resolution.d.ts +0 -54
  418. package/dist/src/harness/hitl/pending-input-resolution.js +0 -1
  419. package/dist/src/harness/hitl/session-limit-input-requests.d.ts +0 -12
  420. package/dist/src/harness/hitl/session-limit-input-requests.js +0 -1
  421. package/dist/src/harness/input-requests.d.ts +0 -37
  422. package/dist/src/harness/input-requests.js +0 -1
  423. package/dist/src/harness/pending-input-batches.d.ts +0 -81
  424. package/dist/src/harness/pending-input-batches.js +0 -1
  425. package/dist/src/harness/session-limit-enforcement.d.ts +0 -45
  426. package/dist/src/harness/session-limit-enforcement.js +0 -1
  427. package/dist/src/harness/stale-input-responses.js +0 -3
  428. package/dist/src/harness/workflow-dispatch.d.ts +0 -30
  429. package/dist/src/harness/workflow-dispatch.js +0 -1
  430. package/dist/src/public/channels/linear/inbound-images.d.ts +0 -19
  431. package/dist/src/public/channels/linear/inbound-images.js +0 -1
  432. package/dist/src/tracing/agent-action-instrumentation.d.ts +0 -26
  433. package/dist/src/tracing/agent-action-instrumentation.js +0 -1
  434. /package/dist/src/harness/{compaction.d.ts → compaction/engine.d.ts} +0 -0
  435. /package/dist/src/harness/{compaction-prompt.d.ts → compaction/prompt.d.ts} +0 -0
  436. /package/dist/src/harness/{compaction-prompt.js → compaction/prompt.js} +0 -0
  437. /package/dist/src/harness/{session-limit-continuation.d.ts → hitl/budget-request.d.ts} +0 -0
  438. /package/dist/src/harness/{session-limit-continuation.js → hitl/budget-request.js} +0 -0
  439. /package/dist/src/harness/{approval-delivery-coordinator.d.ts → hitl/coordinator.d.ts} +0 -0
  440. /package/dist/src/harness/{model-call-error.js → model-call/errors.js} +0 -0
@@ -0,0 +1,48 @@
1
+ import type { ToolSet } from "ai";
2
+ import type { HarnessToolDefinition } from "#harness/execute-tool.js";
3
+ import type { GenerationSteering } from "#harness/generation-steering.js";
4
+ import { type AnthropicCacheMarker } from "#harness/prompt-cache.js";
5
+ import type { Step } from "#harness/step/context.js";
6
+ import { type HarnessToolMap } from "#harness/types.js";
7
+ /** The tools one model call offers, and the views of them the step reads afterwards. */
8
+ export interface ModelTools {
9
+ /** What the AI SDK receives. */
10
+ readonly effectiveTools: ToolSet;
11
+ readonly modelTools: ToolSet;
12
+ /** Every tool the model can call, by name, for presenting its calls. */
13
+ readonly presentationTools: HarnessToolMap;
14
+ /** The advertised harness tools; they decide which calls defer to the runtime. */
15
+ readonly coordinationTools: HarnessToolMap;
16
+ /** Tools that can end the turn, with their `endsTurn` option. */
17
+ readonly endsTurnTools: EndsTurnTools;
18
+ }
19
+ /**
20
+ * Assembles the tools one model call offers: authored and dynamic subagent tools, task tools,
21
+ * provider tools, dynamic tools (which override a same-named authored tool), and `final_output`
22
+ * when the turn asks for a structured result.
23
+ */
24
+ export declare function prepareModelTools(step: Step, input: {
25
+ readonly approvedTools: ReadonlySet<string>;
26
+ readonly model: import("ai").LanguageModel;
27
+ readonly disabledProviderTools?: ReadonlySet<string>;
28
+ readonly generation: GenerationSteering;
29
+ readonly marker: AnthropicCacheMarker | undefined;
30
+ }): Promise<ModelTools>;
31
+ /**
32
+ * Wired as the agent's `onToolExecutionEnd`. On the `tool-error` branch
33
+ * the `error` is still the original throwable (stack/cause intact),
34
+ * unlike the message-only `tool-error` part the model later sees.
35
+ */
36
+ export declare function logToolExecutionError(event: {
37
+ readonly toolCall: {
38
+ readonly toolName: string;
39
+ readonly toolCallId: string;
40
+ };
41
+ readonly toolOutput: {
42
+ readonly type: string;
43
+ readonly error?: unknown;
44
+ };
45
+ }): void;
46
+ /** Appended to the model-facing description of every tool with `endsTurn: true`. */
47
+ export declare const 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.";
48
+ export type EndsTurnTools = ReadonlyMap<string, NonNullable<HarnessToolDefinition["endsTurn"]>>;
@@ -0,0 +1 @@
1
+ import{createLogger,logError}from"#internal/logging.js";import{toModelSchema}from"#tools/schema.js";import{resolveModelProvider}from"#internal/gateway.js";import{buildDynamicSubagentTools}from"#context/dynamic-subagent-lifecycle.js";import{isTurnCancellation}from"#harness/turn-cancellation.js";import{requireSessionModelReference}from"#harness/types.js";import{withTaskTools}from"#execution/tasks/model-step.js";import{buildToolSetFromDefinitions,buildToolSetWithProviderTools}from"#harness/tools.js";import{buildDynamicTools}from"#context/build-dynamic-tools.js";import{FINAL_OUTPUT_TOOL_NAME,buildFinalOutputTool}from"#harness/final-output.js";import{applyLastToolCacheBreakpoint}from"#harness/prompt-cache.js";import{getAdvertisedTools}from"#harness/advertised-tools.js";const log=createLogger(`harness.tool-loop`);async function prepareModelTools(e,t){let{ctx:n}=e,{approvedTools:r,disabledProviderTools:i,marker:a}=t,o=withTaskTools(getAdvertisedTools({session:e.session,tools:buildHarnessToolsWithDynamicSubagents(e.config.tools,n)})),s=await buildToolSetWithProviderTools({approvedTools:r,disabledProviderTools:i,modelProvider:resolveModelProvider(t.model),modelReference:requireSessionModelReference(e.session),tools:o}),c=new Map(o);if(n!==void 0){let t=getAdvertisedTools({session:e.session,tools:buildDynamicTools(n)}),a=buildToolSetFromDefinitions({approvedTools:r,disabledProviderTools:i,tools:t});for(let[e,t]of Object.entries(a)){if(o.get(e)?.workflowId!==void 0)throw Error(`Dynamic tool "${e}" collides with a coordination-visible deferred tool.`);s[e]=t}let l=new Set;for(let e of t)l.has(e.name)||(l.add(e.name),c.set(e.name,e))}e.session.outputSchema!==void 0&&(s[FINAL_OUTPUT_TOOL_NAME]=buildFinalOutputTool(e.session.outputSchema));let l=await getAdvertisedTools({modelTools:s,session:e.session,tools:o});e.session=l.session;let{modelTools:u}=l,d=new Map;if(!e.hasDelegatedCaller&&e.session.outputSchema===void 0)for(let[e,t]of Object.entries(u)){let n=c.get(e)?.endsTurn;t.type!==`provider`&&n!==void 0&&n!==!1&&(d.set(e,n),n===!0&&(t.description=`${t.description??``}\n\n${ENDS_TURN_TOOL_NOTE}`.trimStart()))}let f=a?applyLastToolCacheBreakpoint(u,a):u;for(let e of Object.values(f)){e.inputSchema=toModelSchema(e.inputSchema,`input`),e.outputSchema!==void 0&&(e.outputSchema=toModelSchema(e.outputSchema,`output`));let n=e.execute;n!==void 0&&(e.execute=(...e)=>(t.generation.protectToolExecution(),n(...e)))}return e.frameworkToolNames=new Set([...c].filter(([,e])=>e.frameworkTool===!0).map(([e])=>e)),{coordinationTools:o,effectiveTools:f,endsTurnTools:d,modelTools:u,presentationTools:c}}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 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}const 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.`;export{ENDS_TURN_TOOL_NOTE,logToolExecutionError,prepareModelTools};
@@ -0,0 +1,23 @@
1
+ import type { LanguageModel, ProviderMetadata } from "ai";
2
+ import type { HarnessStepResult } from "#harness/step-hooks.js";
3
+ import { type TokenUsageDelta } from "#harness/turn-tag-state.js";
4
+ import type { Step } from "#harness/step/context.js";
5
+ /**
6
+ * The model's gateway id, or `undefined` for a model without a string `provider`, such as a
7
+ * test double, so a missing field never throws into the tool loop.
8
+ */
9
+ export declare function gatewayModelId(model: LanguageModel): string | undefined;
10
+ export declare function extractTokenUsageDelta(input: {
11
+ readonly costUsd: number | undefined;
12
+ readonly usage: HarnessStepResult["usage"] | undefined;
13
+ }): TokenUsageDelta | undefined;
14
+ export declare function extractGatewayCostUsd(providerMetadata: ProviderMetadata | undefined): number | undefined;
15
+ /**
16
+ * Tags the turn's workflow run with the model and the turn's running token totals. Each model
17
+ * step is its own workflow step and attributes are last-write-wins, so the running total, kept in
18
+ * session state, is what reaches the dashboard. Best-effort: tagging never breaks the loop.
19
+ */
20
+ export declare function recordModelUsage(step: Step, input: {
21
+ readonly model: LanguageModel;
22
+ readonly result: HarnessStepResult;
23
+ }): Promise<void>;
@@ -0,0 +1 @@
1
+ import{formatLanguageModelGatewayId}from"#internal/runtime-model.js";import{accumulateTurnUsage,getTurnUsageState,setTurnUsageState}from"#harness/turn-tag-state.js";import{setEveAttributes}from"#runtime/attributes/emit.js";function gatewayModelId(e){try{return formatLanguageModelGatewayId(e)}catch{return}}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}async function recordModelUsage(e,t){let n=accumulateTurnUsage({previous:getTurnUsageState(e.session.state),turnId:e.position().turnId,usage:extractTokenUsageDelta({costUsd:extractGatewayCostUsd(t.result.providerMetadata),usage:t.result.usage})});e.session=setTurnUsageState(e.session,n),await setEveAttributes({"$eve.model":gatewayModelId(t.model),"$eve.input_tokens":n.inputTokens,"$eve.output_tokens":n.outputTokens,"$eve.cache_read_tokens":n.cacheReadTokens,"$eve.cache_write_tokens":n.cacheWriteTokens,"$eve.cost_usd":n.sawCost?n.costUsd:void 0,"$eve.tool_count":e.config.tools.size})}export{extractGatewayCostUsd,extractTokenUsageDelta,gatewayModelId,recordModelUsage};
@@ -1,4 +1,4 @@
1
- import type { HarnessEmissionState } from "#harness/emission-state.js";
1
+ import type { TurnPosition } from "#harness/session-machine/view.js";
2
2
  import type { HarnessEmitFn } from "#harness/types.js";
3
3
  import type { JsonObject } from "#shared/json.js";
4
4
  /**
@@ -20,4 +20,4 @@ export declare function reportNestedToolAction(parentCallId: string, action: Nes
20
20
  * `actions.requested` and `action.result` pair. Call ids derive from the
21
21
  * parent's, so a re-run step reports the same ids.
22
22
  */
23
- export declare function emitNestedToolActions(emitFn: HarnessEmitFn, state: Pick<HarnessEmissionState, "sequence" | "stepIndex" | "turnId">, parentCallId: string): Promise<void>;
23
+ export declare function emitNestedToolActions(emitFn: HarnessEmitFn, state: Pick<TurnPosition, "sequence" | "stepIndex" | "turnId">, parentCallId: string): Promise<void>;
@@ -5,7 +5,7 @@ import type { WebSearchProvider } from "#shared/web-search.js";
5
5
  /**
6
6
  * The provider backend resolved for one web search tool invocation.
7
7
  */
8
- type WebSearchBackend = "anthropic" | "exa" | "google" | "openai" | "parallel";
8
+ type WebSearchBackend = "anthropic" | "exa" | "google" | "openai" | "parallel" | "browserbase";
9
9
  /**
10
10
  * Returns the framework tool name that produced an upstream provider tool
11
11
  * `type`, or `null` when the type is not one we know how to remove.
@@ -19,7 +19,7 @@ export declare function resolveFrameworkToolFromUpstreamType(type: string): stri
19
19
  * Returns the output schema for the provider-managed web search tool that
20
20
  * will be injected for `backend`.
21
21
  */
22
- export declare function resolveWebSearchOutputSchema(backend: WebSearchBackend): JsonObject;
22
+ export declare function resolveWebSearchOutputSchema(backend: Exclude<WebSearchBackend, "browserbase">): JsonObject;
23
23
  /**
24
24
  * Determines the web search backend for a model reference.
25
25
  *
@@ -1 +1 @@
1
- import{jsonSchema}from"ai";import{WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA,WEB_SEARCH_EXA_OUTPUT_SCHEMA,WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA,WEB_SEARCH_OPENAI_OUTPUT_SCHEMA,WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA,WEB_SEARCH_TOOL_NAME}from"#harness/provider-tool-schemas.js";const UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME={web_search_20250305:WEB_SEARCH_TOOL_NAME};function resolveFrameworkToolFromUpstreamType(e){return UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME[e]??null}function resolveWebSearchOutputSchema(e){switch(e){case`anthropic`:return WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA;case`exa`:return WEB_SEARCH_EXA_OUTPUT_SCHEMA;case`google`:return WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA;case`openai`:return WEB_SEARCH_OPENAI_OUTPUT_SCHEMA;case`parallel`:return WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA}}function resolveWebSearchBackend(e,t=`exa`,n){let r=n?.split(`.`)[0]??(e.source===void 0?`gateway`:e.id.split(`/`)[0]??``);return r===`gateway`?t:r===`openai`||r.startsWith(`openai.`)?`openai`:r===`anthropic`||r.startsWith(`anthropic.`)?`anthropic`:r===`google`||r.startsWith(`google.`)?`google`:null}async function resolveWebSearchProviderTool(e){switch(e){case`openai`:{let{openai:t}=await import(`#compiled/@ai-sdk/openai/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch({}),e)}case`anthropic`:{let{anthropic:t}=await import(`#compiled/@ai-sdk/anthropic/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch_20250305(),e)}case`google`:{let{google:t}=await import(`#compiled/@ai-sdk/google/index.js`);return attachWebSearchOutputSchema(t.tools.googleSearch({}),e)}case`exa`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.exaSearch({contents:{highlights:{maxCharacters:1e3}},numResults:10}),e)}case`parallel`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.parallelSearch(),e)}}}function attachWebSearchOutputSchema(e,t){return{...e,outputSchema:jsonSchema(resolveWebSearchOutputSchema(t))}}export{resolveFrameworkToolFromUpstreamType,resolveWebSearchBackend,resolveWebSearchOutputSchema,resolveWebSearchProviderTool};
1
+ import{jsonSchema}from"ai";import{WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA,WEB_SEARCH_EXA_OUTPUT_SCHEMA,WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA,WEB_SEARCH_OPENAI_OUTPUT_SCHEMA,WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA,WEB_SEARCH_TOOL_NAME}from"#harness/provider-tool-schemas.js";const UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME={web_search_20250305:WEB_SEARCH_TOOL_NAME};function resolveFrameworkToolFromUpstreamType(e){return UPSTREAM_TOOL_TYPE_TO_FRAMEWORK_NAME[e]??null}function resolveWebSearchOutputSchema(e){switch(e){case`anthropic`:return WEB_SEARCH_ANTHROPIC_OUTPUT_SCHEMA;case`exa`:return WEB_SEARCH_EXA_OUTPUT_SCHEMA;case`google`:return WEB_SEARCH_GOOGLE_OUTPUT_SCHEMA;case`openai`:return WEB_SEARCH_OPENAI_OUTPUT_SCHEMA;case`parallel`:return WEB_SEARCH_PARALLEL_OUTPUT_SCHEMA}}function resolveWebSearchBackend(e,t=`exa`,n){let r=n?.split(`.`)[0]??(e.source===void 0?`gateway`:e.id.split(`/`)[0]??``);return r===`gateway`?t:r===`openai`||r.startsWith(`openai.`)?`openai`:r===`anthropic`||r.startsWith(`anthropic.`)?`anthropic`:r===`google`||r.startsWith(`google.`)?`google`:null}async function resolveWebSearchProviderTool(e){switch(e){case`browserbase`:{let{gateway:e}=await import(`ai`);return e.tools.browserbaseSearch()}case`openai`:{let{openai:t}=await import(`#compiled/@ai-sdk/openai/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch({}),e)}case`anthropic`:{let{anthropic:t}=await import(`#compiled/@ai-sdk/anthropic/index.js`);return attachWebSearchOutputSchema(t.tools.webSearch_20250305(),e)}case`google`:{let{google:t}=await import(`#compiled/@ai-sdk/google/index.js`);return attachWebSearchOutputSchema(t.tools.googleSearch({}),e)}case`exa`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.exaSearch({contents:{highlights:{maxCharacters:1e3}},numResults:10}),e)}case`parallel`:{let{gateway:t}=await import(`ai`);return attachWebSearchOutputSchema(t.tools.parallelSearch(),e)}}}function attachWebSearchOutputSchema(e,t){return{...e,outputSchema:jsonSchema(resolveWebSearchOutputSchema(t))}}export{resolveFrameworkToolFromUpstreamType,resolveWebSearchBackend,resolveWebSearchOutputSchema,resolveWebSearchProviderTool};
@@ -1,10 +1,9 @@
1
1
  import type { SubagentInputRequestHookPayload } from "#channel/types.js";
2
- import type { PendingInputBatchEvent } from "#harness/pending-input-batches.js";
2
+ import type { StepCoordinates as PendingInputBatchEvent } from "#harness/session-machine/view.js";
3
3
  import type { HarnessSessionBase, SessionStateMap } from "#harness/types.js";
4
4
  import { type InputOption, type InputRequestKind } from "#shared/input.js";
5
5
  import { type SessionInboxAddress } from "#execution/session-inbox/address.js";
6
6
  import type { RemoteAgentBinding } from "#eve-channel/support.js";
7
- import { type InputResolvedStreamEvent } from "#protocol/message.js";
8
7
  /**
9
8
  * Marks a request as a workflow tool run's `ctx.ask()` question, rather than a
10
9
  * child session's. Its answer goes to the run's control hook, which carries
@@ -79,17 +78,10 @@ export declare function upsertProxyInputRequestState(input: {
79
78
  readonly forChildContinuationToken: string;
80
79
  readonly state: SessionStateMap | undefined;
81
80
  }): SessionStateMap | undefined;
82
- /**
83
- * Retires the requests `select` picks, which nobody can answer anymore, and
84
- * returns the `input.resolved` events that report them `cancelled` so
85
- * channels stop offering them. Publish the events as relayed.
86
- */
87
- export declare function withdrawProxyInputRequests<T extends {
81
+ /** Removes every proxy route the predicate selects. */
82
+ export declare function clearProxyInputRequestsWhere<T extends {
88
83
  readonly state?: SessionStateMap;
89
- }>(session: T, select: (requestId: string, route: ProxyInputRequest) => boolean): {
90
- readonly events: readonly InputResolvedStreamEvent[];
91
- readonly session: T;
92
- };
84
+ }>(session: T, select: (route: ProxyInputRequest, requestId: string) => boolean): T;
93
85
  /** Removes only the request IDs whose responses were successfully forwarded. */
94
86
  export declare function retireProxyInputRequests<T extends {
95
87
  readonly state?: SessionStateMap;
@@ -1 +1 @@
1
- import{isSessionInboxAddress}from"#execution/session-inbox/address.js";import{inputOptionSchema}from"#shared/input.js";import{createInputResolvedEvent}from"#protocol/message.js";const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){return{...e.session,state:upsertProxyInputRequestState({entries:e.entries,forChildContinuationToken:e.forChildContinuationToken,inputSource:e.inputSource,state:e.session.state})}}function upsertProxyInputRequestState(e){let t={};for(let[n,r]of Object.entries(readMap(e.state)))(r.childContinuationToken!==e.forChildContinuationToken||r.inputSource!==e.inputSource)&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;let n={...e.state};return Object.keys(t).length===0?delete n[PROXY_INPUT_REQUESTS_KEY]:n[PROXY_INPUT_REQUESTS_KEY]=t,Object.keys(n).length>0?n:void 0}function withdrawProxyInputRequests(e,t){let n=[],r=[];for(let[i,a]of Object.entries(readMap(e.state)))t(i,a)&&(n.push(i),r.push(createInputResolvedEvent({resolutions:[{kind:a.kind,outcome:`cancelled`,requestId:i}],...a.event})));return{events:r,session:retireProxyInputRequests(e,n)}}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function toProxyInputRequestEntries(e){let t={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)},n={sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId};return e.event.requests.map(r=>{let i={batch:t,childContinuationToken:e.childContinuationToken,...e.inputSource!==void 0&&{inputSource:e.inputSource},...e.remote!==void 0&&{remote:e.remote},event:n,kind:r.kind};return r.kind===`question`&&(i.question={...r.allowFreeform!==void 0&&{allowFreeform:r.allowFreeform},...r.options!==void 0&&{options:[...r.options]}}),e.childSessionInbox?.sessionId===e.childSessionId&&(i.childSessionInbox=e.childSessionInbox),[r.requestId,i]})}function readMap(e){let t=e?.[PROXY_INPUT_REQUESTS_KEY];if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=parseProxyInputRequest(r,e);t!==void 0&&(n[e]=t)}return n}function writeMap(e,t){let n={...e.state};return Object.keys(t).length===0?(delete n[PROXY_INPUT_REQUESTS_KEY],{...e,state:Object.keys(n).length>0?n:void 0}):(n[PROXY_INPUT_REQUESTS_KEY]=t,{...e,state:n})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n=`remote`in e?parseRemoteAgentBinding(e.remote):void 0;if(`remote`in e&&n===void 0)return;let r=`inputSource`in e?e.inputSource:void 0;if(r!==void 0&&(typeof r!=`string`||r.length===0))return;let i=`event`in e?parseInputRequestEvent(e.event):void 0;if(i===void 0)return;let a=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0,o=`workflowAsk`in e?parseWorkflowAskRoute(e.workflowAsk):void 0;if(`workflowAsk`in e&&o===void 0)return;let s=`runId`in e?e.runId:void 0;if(s!==void 0&&(typeof s!=`string`||s.length===0))return;let c=`question`in e?parseProxyInputQuestion(e.question):void 0;if(`question`in e&&c===void 0)return;let l=`childSessionInbox`in e?e.childSessionInbox:void 0;if(l!==void 0&&!isSessionInboxAddress(l))return;let u={childContinuationToken:e.childContinuationToken,event:i,kind:e.kind};return typeof r==`string`&&(u.inputSource=r),n!==void 0&&(u.remote=n),o!==void 0&&(u.workflowAsk=o),typeof s==`string`&&(u.runId=s),l!==void 0&&(u.childSessionInbox=l),a!==void 0&&a.requestIds.includes(t)&&(u.batch=a),c!==void 0&&(u.question=c),u}function parseInputRequestEvent(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=Reflect.get(e,`sequence`),n=Reflect.get(e,`stepIndex`),r=Reflect.get(e,`turnId`);if(typeof t==`number`&&typeof n==`number`&&typeof r==`string`)return{sequence:t,stepIndex:n,turnId:r}}function parseWorkflowAskRoute(e){if(typeof e!=`object`||!e)return;let t=Reflect.get(e,`control`);if(typeof t!=`string`||t.length===0)return;let n=parseProxyInputQuestion(Reflect.get(e,`question`));if(n!==void 0)return{control:t,question:n}}function parseRemoteAgentBinding(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=Reflect.get(e,`name`),n=Reflect.get(e,`url`),r=Reflect.get(e,`resolverId`),i=Reflect.get(e,`forwardPrincipal`),a=Reflect.get(e,`sessionId`);if(typeof t==`string`&&t&&typeof n==`string`&&n&&typeof a==`string`&&a&&(r===void 0||typeof r==`string`&&r)&&(i===void 0||typeof i==`boolean`))return{name:t,url:n,sessionId:a,...r!==void 0&&{resolverId:r},...i!==void 0&&{forwardPrincipal:i}}}function parseProxyInputQuestion(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t={},n=Reflect.get(e,`allowFreeform`);if(n!==void 0){if(typeof n!=`boolean`)return;t.allowFreeform=n}let r=Reflect.get(e,`options`);if(r!==void 0){let e=inputOptionSchema.array().safeParse(r);if(!e.success)return;t.options=e.data}return t}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequestState,upsertProxyInputRequests,withdrawProxyInputRequests};
1
+ import{isSessionInboxAddress}from"#execution/session-inbox/address.js";import{inputOptionSchema}from"#shared/input.js";const PROXY_INPUT_REQUESTS_KEY=`eve.runtime.proxyInputRequests`,PROXY_INPUT_REQUEST_KINDS={question:!0,"session-limit":!0,"tool-approval":!0};function getProxyInputRequests(e){return new Map(Object.entries(readMap(e)))}function hasProxyInputRequests(e){for(let t of Object.keys(readMap(e)))return!0;return!1}function upsertProxyInputRequests(e){return{...e.session,state:upsertProxyInputRequestState({entries:e.entries,forChildContinuationToken:e.forChildContinuationToken,inputSource:e.inputSource,state:e.session.state})}}function upsertProxyInputRequestState(e){let t={};for(let[n,r]of Object.entries(readMap(e.state)))(r.childContinuationToken!==e.forChildContinuationToken||r.inputSource!==e.inputSource)&&(t[n]=r);for(let[n,r]of e.entries)t[n]=r;let n={...e.state};return Object.keys(t).length===0?delete n[PROXY_INPUT_REQUESTS_KEY]:n[PROXY_INPUT_REQUESTS_KEY]=t,Object.keys(n).length>0?n:void 0}function clearProxyInputRequestsWhere(e,t){return retireProxyInputRequests(e,Object.entries(readMap(e.state)).filter(([e,n])=>t(n,e)).map(([e])=>e))}function retireProxyInputRequests(e,t){let n={...readMap(e.state)},r=!1;for(let e of t)Object.hasOwn(n,e)&&(delete n[e],r=!0);return r?writeMap(e,n):e}function toProxyInputRequestEntries(e){let t={approvalRequestIds:e.event.requests.flatMap(e=>e.kind===`tool-approval`?[e.requestId]:[]),requestIds:e.event.requests.map(e=>e.requestId)},n={sequence:e.event.sequence,stepIndex:e.event.stepIndex,turnId:e.event.turnId};return e.event.requests.map(r=>{let i={batch:t,childContinuationToken:e.childContinuationToken,...e.inputSource!==void 0&&{inputSource:e.inputSource},...e.remote!==void 0&&{remote:e.remote},event:n,kind:r.kind};return r.kind===`question`&&(i.question={...r.allowFreeform!==void 0&&{allowFreeform:r.allowFreeform},...r.options!==void 0&&{options:[...r.options]}}),e.childSessionInbox?.sessionId===e.childSessionId&&(i.childSessionInbox=e.childSessionInbox),[r.requestId,i]})}function readMap(e){let t=e?.[PROXY_INPUT_REQUESTS_KEY];if(typeof t!=`object`||!t||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){let t=parseProxyInputRequest(r,e);t!==void 0&&(n[e]=t)}return n}function writeMap(e,t){let n={...e.state};return Object.keys(t).length===0?(delete n[PROXY_INPUT_REQUESTS_KEY],{...e,state:Object.keys(n).length>0?n:void 0}):(n[PROXY_INPUT_REQUESTS_KEY]=t,{...e,state:n})}function parseProxyInputRequest(e,t){if(typeof e!=`object`||!e||Array.isArray(e)||!(`childContinuationToken`in e)||!(`kind`in e)||typeof e.childContinuationToken!=`string`||!isInputRequestKind(e.kind))return;let n=`remote`in e?parseRemoteAgentBinding(e.remote):void 0;if(`remote`in e&&n===void 0)return;let r=`inputSource`in e?e.inputSource:void 0;if(r!==void 0&&(typeof r!=`string`||r.length===0))return;let i=`event`in e?parseInputRequestEvent(e.event):void 0;if(i===void 0)return;let a=`batch`in e?parseProxyInputRequestBatch(e.batch):void 0,o=`workflowAsk`in e?parseWorkflowAskRoute(e.workflowAsk):void 0;if(`workflowAsk`in e&&o===void 0)return;let s=`runId`in e?e.runId:void 0;if(s!==void 0&&(typeof s!=`string`||s.length===0))return;let c=`question`in e?parseProxyInputQuestion(e.question):void 0;if(`question`in e&&c===void 0)return;let l=`childSessionInbox`in e?e.childSessionInbox:void 0;if(l!==void 0&&!isSessionInboxAddress(l))return;let u={childContinuationToken:e.childContinuationToken,event:i,kind:e.kind};return typeof r==`string`&&(u.inputSource=r),n!==void 0&&(u.remote=n),o!==void 0&&(u.workflowAsk=o),typeof s==`string`&&(u.runId=s),l!==void 0&&(u.childSessionInbox=l),a!==void 0&&a.requestIds.includes(t)&&(u.batch=a),c!==void 0&&(u.question=c),u}function parseInputRequestEvent(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=Reflect.get(e,`sequence`),n=Reflect.get(e,`stepIndex`),r=Reflect.get(e,`turnId`);if(typeof t==`number`&&typeof n==`number`&&typeof r==`string`)return{sequence:t,stepIndex:n,turnId:r}}function parseWorkflowAskRoute(e){if(typeof e!=`object`||!e)return;let t=Reflect.get(e,`control`);if(typeof t!=`string`||t.length===0)return;let n=parseProxyInputQuestion(Reflect.get(e,`question`));if(n!==void 0)return{control:t,question:n}}function parseRemoteAgentBinding(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=Reflect.get(e,`name`),n=Reflect.get(e,`url`),r=Reflect.get(e,`resolverId`),i=Reflect.get(e,`forwardPrincipal`),a=Reflect.get(e,`sessionId`);if(typeof t==`string`&&t&&typeof n==`string`&&n&&typeof a==`string`&&a&&(r===void 0||typeof r==`string`&&r)&&(i===void 0||typeof i==`boolean`))return{name:t,url:n,sessionId:a,...r!==void 0&&{resolverId:r},...i!==void 0&&{forwardPrincipal:i}}}function parseProxyInputQuestion(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t={},n=Reflect.get(e,`allowFreeform`);if(n!==void 0){if(typeof n!=`boolean`)return;t.allowFreeform=n}let r=Reflect.get(e,`options`);if(r!==void 0){let e=inputOptionSchema.array().safeParse(r);if(!e.success)return;t.options=e.data}return t}function parseProxyInputRequestBatch(e){if(typeof e!=`object`||!e||Array.isArray(e)||!(`approvalRequestIds`in e)||!(`requestIds`in e)||!isStringArray(e.approvalRequestIds)||!isStringArray(e.requestIds))return;let t=new Set(e.requestIds);if(!(t.size!==e.requestIds.length||e.approvalRequestIds.some(e=>!t.has(e))))return{approvalRequestIds:e.approvalRequestIds,requestIds:e.requestIds}}function isStringArray(e){return Array.isArray(e)&&e.every(e=>typeof e==`string`)}function isInputRequestKind(e){return typeof e==`string`&&Object.hasOwn(PROXY_INPUT_REQUEST_KINDS,e)}export{clearProxyInputRequestsWhere,getProxyInputRequests,hasProxyInputRequests,retireProxyInputRequests,toProxyInputRequestEntries,upsertProxyInputRequestState,upsertProxyInputRequests};
@@ -0,0 +1,28 @@
1
+ import type { ModelMessage } from "ai";
2
+ import { type AuthorizationChallenge } from "#harness/authorization.js";
3
+ import type { HarnessSessionBase, SessionStateMap } from "#harness/types.js";
4
+ import type { UnstampedMessageStreamEvent } from "#protocol/message.js";
5
+ import type { SessionProjection } from "#protocol/session-projection.js";
6
+ import { type TurnState } from "./state.js";
7
+ import type { SessionView } from "./view.js";
8
+ /** What a transition returns. Nothing else changes session state. */
9
+ export interface Transition {
10
+ readonly turn: TurnState;
11
+ readonly events: readonly UnstampedMessageStreamEvent[];
12
+ /** Messages the transition commits to the end of history. */
13
+ readonly commit?: readonly ModelMessage[];
14
+ /** The transition empties history, as `clear` does. */
15
+ readonly clearsHistory?: true;
16
+ /** Every sign-in the session waits on once the transition applies; `[]` withdraws them all. */
17
+ readonly signIns?: readonly AuthorizationChallenge[];
18
+ }
19
+ /** Publishes one event; `messages` is the conversation hooks see with it. */
20
+ export type Publish = (event: UnstampedMessageStreamEvent, messages?: readonly ModelMessage[]) => Promise<void>;
21
+ export declare function sessionView(projection: SessionProjection, state: SessionStateMap | undefined): SessionView;
22
+ /**
23
+ * Publishes a transition's events, then saves what it changed. A transition that changes history
24
+ * needs a session restored with it.
25
+ */
26
+ export declare function applyTransition<T extends HarnessSessionBase>(session: T, transition: Transition, publish: Publish, messages?: readonly ModelMessage[]): Promise<T>;
27
+ /** Drops the private records whose owner the projection shows closed. */
28
+ export declare function dropClosedRecords<T extends HarnessSessionBase>(session: T, projection: SessionProjection): T;
@@ -0,0 +1 @@
1
+ import{readTurnState,writeTurnState}from"./state.js";import{validateHarnessModelMessages}from"#harness/messages.js";import{getSessionUsage}from"#harness/turn-tag-state.js";import{clearProxyInputRequestsWhere,getProxyInputRequests}from"#harness/proxy-input-requests.js";import{clearPendingAuthorization,getPendingAuthorization,setPendingAuthorization}from"#harness/authorization.js";function sessionView(e,t){return{projection:e,relayedRequestIds:new Set(getProxyInputRequests(t).keys()),signIns:getPendingAuthorization(t)?.challenges??[],turn:readTurnState(t),usage:getSessionUsage({state:t})}}const READS_HISTORY=new Set([`turn.started`,`step.started`,`turn.completed`]);async function applyTransition(e,t,n,r){for(let e of t.events)await n(e,READS_HISTORY.has(e.type)?r:void 0);let i=t.signIns===void 0?e.state:t.signIns.length===0?clearPendingAuthorization(e.state):setPendingAuthorization(clearPendingAuthorization(e.state),{challenges:t.signIns}),a=writeTurnState({...e,state:i},t.turn),o=t.commit??[];if(t.clearsHistory!==!0&&o.length===0)return a;if(!(`history`in e))throw Error(`A transition that changes history needs the session's history.`);let{history:s}=e,c=t.clearsHistory?[]:validateHarnessModelMessages([...s,...o]);return{...a,history:c}}function dropClosedRecords(e,t){return clearProxyInputRequestsWhere(e,(e,n)=>{let r=t.inputs[n];return r===void 0||r.status===`settled`})}export{applyTransition,dropClosedRecords,sessionView};
@@ -0,0 +1,29 @@
1
+ import type { ContextReader } from "#context/key.js";
2
+ import type { HarnessSessionBase, SessionStateMap } from "#harness/types.js";
3
+ import { type SessionProjection } from "#protocol/session-projection.js";
4
+ import type { MessageStreamEvent, UnstampedMessageStreamEvent } from "#protocol/message.js";
5
+ export declare function enterSessionProjection(ctx: ContextReader, state: SessionStateMap | undefined): void;
6
+ /** Enters the stored projection unless this step already did. */
7
+ export declare function ensureSessionProjection(ctx: ContextReader, state: SessionStateMap | undefined): void;
8
+ /** The projection as of the last event the current step published. */
9
+ export declare function currentProjection(ctx?: ContextReader | undefined): SessionProjection;
10
+ /** The step's live projection, or the session's stored one when no step entered it. */
11
+ export declare function projectionFor(ctx: ContextReader, state: SessionStateMap | undefined): SessionProjection;
12
+ export declare function recordPublishedEvent(ctx: ContextReader, event: MessageStreamEvent | UnstampedMessageStreamEvent): void;
13
+ export declare function saveSessionProjection<T extends HarnessSessionBase>(session: T, ctx: ContextReader): T;
14
+ /**
15
+ * The session saves the lifecycle its steps read. Calls and tasks are for the stream's readers,
16
+ * which fold them from the events, and their outputs can be large, so the checkpoint omits them.
17
+ */
18
+ export declare function saveProjection<T extends HarnessSessionBase>(session: T, projection: SessionProjection): T;
19
+ /** The projection one step reads and folds what it publishes into. */
20
+ export interface StepProjection {
21
+ read(): SessionProjection;
22
+ /** Folds an event no publish sink folded: the step runs without one. */
23
+ record(event: UnstampedMessageStreamEvent): void;
24
+ }
25
+ /**
26
+ * A step's projection: the context's live one, which the publish sink folds, or, for a step
27
+ * that runs without a context, a detached one the step folds itself.
28
+ */
29
+ export declare function stepProjection(ctx: ContextReader | undefined, state: SessionStateMap | undefined): StepProjection;
@@ -0,0 +1 @@
1
+ import{SESSION_PROJECTION_STATE_KEY,storedProjection}from"./view.js";import{foldSession,pruneSessionProjection}from"#protocol/session-projection.js";import{contextStorage}from"#context/container.js";const liveProjections=new WeakMap;function enterSessionProjection(e,t){liveProjections.set(e,{projection:storedProjection(t)})}function ensureSessionProjection(e,t){liveProjections.has(e)||enterSessionProjection(e,t)}function currentProjection(e=contextStorage.getStore()){let t=e===void 0?void 0:liveProjections.get(e);if(t===void 0)throw Error(`Session lifecycle requires an initialized projection.`);return t.projection}function projectionFor(e,t){return liveProjections.get(e)?.projection??storedProjection(t)}function recordPublishedEvent(e,t){let n=liveProjections.get(e);if(n===void 0)throw Error(`Session publication requires an initialized projection.`);let r=foldSession(n.projection,t);n.projection=t.type===`session.waiting`?pruneSessionProjection(r):r}function saveSessionProjection(e,t){return saveProjection(e,currentProjection(t))}function saveProjection(e,t){let n={...t,calls:{},tasks:{}};return{...e,state:{...e.state,[SESSION_PROJECTION_STATE_KEY]:n}}}function stepProjection(e,t){if(e!==void 0)return ensureSessionProjection(e,t),{read:()=>currentProjection(e),record:t=>recordPublishedEvent(e,t)};let n=storedProjection(t);return{read:()=>n,record(e){let t=foldSession(n,e);n=e.type===`session.waiting`?pruneSessionProjection(t):t}}}export{currentProjection,ensureSessionProjection,enterSessionProjection,projectionFor,recordPublishedEvent,saveProjection,saveSessionProjection,stepProjection};
@@ -0,0 +1,6 @@
1
+ import { type AuthorizationCompletedStreamEvent, type InputResolvedStreamEvent } from "#protocol/message.js";
2
+ import type { SessionAuthorization, SessionInput } from "#protocol/session-projection.js";
3
+ /** Reports an open request withdrawn: nobody may answer it anymore. */
4
+ export declare function inputWithdrawn(input: SessionInput): InputResolvedStreamEvent;
5
+ /** Reports an open sign-in withdrawn, as declined: its callback no longer resumes anything. */
6
+ export declare function signInWithdrawn(attempt: SessionAuthorization, reason: string): AuthorizationCompletedStreamEvent;
@@ -0,0 +1 @@
1
+ import{createAuthorizationCompletedEvent,createInputResolvedEvent}from"#protocol/message.js";function inputWithdrawn(e){return createInputResolvedEvent({resolutions:[{kind:e.request.kind,outcome:`cancelled`,requestId:e.request.requestId}],sequence:e.sequence,stepIndex:e.stepIndex,turnId:e.turnId})}function signInWithdrawn(e,t){return createAuthorizationCompletedEvent({attemptId:e.attemptId,candidateId:e.candidateId,name:e.name,outcome:`declined`,principalId:e.principalId,reason:t,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId})}export{inputWithdrawn,signInWithdrawn};
@@ -0,0 +1,12 @@
1
+ import { type RuntimeIdentity } from "#protocol/message.js";
2
+ export declare function sessionStartedForResolvers(runtime?: RuntimeIdentity): import("#protocol/message.js").SessionStartedStreamEvent;
3
+ export declare function turnStartedForResolvers(turn: {
4
+ readonly sequence: number;
5
+ readonly turnId: string;
6
+ }): import("#protocol/message.js").TurnStartedStreamEvent;
7
+ export declare function stepStartedForResolvers(step: {
8
+ readonly modelId: string;
9
+ readonly sequence: number;
10
+ readonly stepIndex: number;
11
+ readonly turnId: string;
12
+ }): import("#protocol/message.js").StepStartedStreamEvent;
@@ -0,0 +1 @@
1
+ import{createSessionStartedEvent,createStepStartedEvent,createTurnStartedEvent}from"#protocol/message.js";function sessionStartedForResolvers(e){return createSessionStartedEvent({runtime:e})}function turnStartedForResolvers(e){return createTurnStartedEvent(e)}function stepStartedForResolvers(e){return createStepStartedEvent(e)}export{sessionStartedForResolvers,stepStartedForResolvers,turnStartedForResolvers};
@@ -0,0 +1,47 @@
1
+ import type { ModelMessage } from "ai";
2
+ import type { SessionAuthContext } from "#channel/types.js";
3
+ import type { SessionStateMap, StepInput } from "#harness/types.js";
4
+ import type { RuntimeWorkflowTaskRequest } from "#shared/action-types.js";
5
+ import type { InputRequest } from "#shared/input.js";
6
+ /** The coordinates of the model step a suspended step parked from. */
7
+ export interface StepCoordinates {
8
+ readonly sequence: number;
9
+ readonly stepIndex: number;
10
+ readonly turnId: string;
11
+ }
12
+ /**
13
+ * A model step whose calls can't all settle yet: some await an approval, others the runtime.
14
+ * Its response stays out of history until every call it made has a result there, so a call
15
+ * never reaches the model without its result.
16
+ */
17
+ export interface SuspendedStep {
18
+ readonly event: StepCoordinates;
19
+ /** The withheld response. Results join it as they arrive. */
20
+ readonly messages: readonly ModelMessage[];
21
+ /** Approvals the step still waits on. */
22
+ readonly requests: readonly InputRequest[];
23
+ /**
24
+ * Calls a person approved that haven't run. They run when the turn next calls the model, after
25
+ * its step starts and its budget allows it, as calls the model makes do.
26
+ */
27
+ readonly approved?: readonly InputRequest[];
28
+ /** Workflow and agent calls the runtime runs for the step. */
29
+ readonly tasks: readonly RuntimeWorkflowTaskRequest[];
30
+ /** Who approved each task an approval started, by call id: the task runs as them. */
31
+ readonly approvers?: Readonly<Record<string, SessionAuthContext>>;
32
+ readonly responseAuthRequiredRequestIds?: readonly string[];
33
+ /** The caller whose turn parked the step; `null` when unauthenticated. */
34
+ readonly requester?: SessionAuthContext | null;
35
+ }
36
+ export interface TurnState {
37
+ /** Input that arrived before it could run: a partial answer, or input behind a policy pass. */
38
+ readonly queued?: StepInput;
39
+ readonly suspended: readonly SuspendedStep[];
40
+ /** Approval keys a `once()` approval granted for the rest of the session. */
41
+ readonly grants: readonly string[];
42
+ }
43
+ export declare const EMPTY_TURN_STATE: TurnState;
44
+ export declare function readTurnState(state: SessionStateMap | undefined): TurnState;
45
+ export declare function writeTurnState<T extends {
46
+ readonly state?: SessionStateMap;
47
+ }>(session: T, turn: TurnState): T;
@@ -0,0 +1 @@
1
+ const TURN_STATE_KEY=`eve.harness.turnState`,EMPTY_TURN_STATE={grants:[],suspended:[]};function readTurnState(e){return e?.[TURN_STATE_KEY]??EMPTY_TURN_STATE}function writeTurnState(e,t){let n={...e.state};return t.suspended.length===0&&t.queued===void 0&&t.grants.length===0?delete n[TURN_STATE_KEY]:n[TURN_STATE_KEY]=t,{...e,state:Object.keys(n).length===0?void 0:n}}export{EMPTY_TURN_STATE,readTurnState,writeTurnState};
@@ -0,0 +1,188 @@
1
+ import type { ModelMessage, UserContent } from "ai";
2
+ import type { SubagentAuthorizationEventHookPayload, SubagentInputRequestHookPayload } from "#channel/types.js";
3
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
4
+ import { type TurnWaitingOn, createSessionCompletedEvent, createSessionFailedEvent, type InputResolution, type RuntimeIdentity, type RuntimeTraceContext, type TaskCancelReason, type TaskStartedStreamEvent, type UnstampedMessageStreamEvent } from "#protocol/message.js";
5
+ import type { RuntimeActionResult } from "#shared/action-types.js";
6
+ import type { InputRequest } from "#shared/input.js";
7
+ import type { JsonObject, JsonValue } from "#shared/json.js";
8
+ import type { TokenUsage } from "#shared/token-usage.js";
9
+ import type { Transition } from "./commit.js";
10
+ import type { StepCoordinates, SuspendedStep, TurnState } from "./state.js";
11
+ import { type SessionView } from "./view.js";
12
+ type ToolResponsePart = Extract<ModelMessage, {
13
+ role: "tool";
14
+ }>["content"][number];
15
+ export type ToolResultPart = Extract<ToolResponsePart, {
16
+ type: "tool-result";
17
+ }>;
18
+ /**
19
+ * Input arrives: the session starts once, a turn opens unless one is open (steering joins it),
20
+ * and a message is received.
21
+ */
22
+ export declare function receive(view: SessionView, input: {
23
+ readonly message?: string | UserContent;
24
+ readonly runtime?: RuntimeIdentity;
25
+ readonly trace?: RuntimeTraceContext;
26
+ }): Transition;
27
+ /** The open turn calls the model. */
28
+ export declare function startStep(view: SessionView, input: {
29
+ readonly modelId: string;
30
+ }): Transition;
31
+ /**
32
+ * The open turn parks: on `"tasks"` while work it started runs, on `"input"` while a person must
33
+ * act on a sign-in, approval, or question. It resumes in the same turn.
34
+ */
35
+ export declare function hold(view: SessionView, input: {
36
+ readonly on: TurnWaitingOn;
37
+ }): Transition;
38
+ /** Nothing is left to run: the turn completes, with its structured result when it has one. */
39
+ export declare function finishTurn(view: SessionView, input?: {
40
+ readonly result?: JsonValue;
41
+ }): Transition;
42
+ /**
43
+ * The step failed. A recoverable failure parks the session for the user to retry; a terminal
44
+ * one ends it.
45
+ */
46
+ export declare function fail(view: SessionView, failure: {
47
+ readonly code: string;
48
+ readonly details?: JsonObject;
49
+ readonly message: string;
50
+ readonly terminal?: {
51
+ readonly sessionId: string;
52
+ };
53
+ }): Transition;
54
+ /** The session waits for its next delivery. */
55
+ export declare function idle(view: SessionView): Transition;
56
+ export declare function sessionCompleted(usage: TokenUsage | undefined): ReturnType<typeof createSessionCompletedEvent>;
57
+ export declare function sessionFailed(input: {
58
+ readonly code: string;
59
+ readonly details?: JsonObject;
60
+ readonly message: string;
61
+ readonly sessionId: string;
62
+ readonly usage: TokenUsage | undefined;
63
+ }): ReturnType<typeof createSessionFailedEvent>;
64
+ /** One call's result, ready for its step's transcript. */
65
+ export interface SettledCall {
66
+ readonly part: ToolResultPart;
67
+ /** A runtime result, reported at the coordinates of the step that made the call. */
68
+ readonly result?: RuntimeActionResult;
69
+ }
70
+ /**
71
+ * Results reach the steps that made their calls. A step whose every call now has a result
72
+ * commits to history, where the model reads it.
73
+ */
74
+ export declare function settle(view: SessionView, input: {
75
+ readonly results: readonly SettledCall[];
76
+ }): {
77
+ commit: ModelMessage[];
78
+ events: UnstampedMessageStreamEvent[];
79
+ turn: {
80
+ queued?: import("../types.ts").StepInput;
81
+ grants: readonly string[];
82
+ suspended: SuspendedStep[];
83
+ };
84
+ };
85
+ /**
86
+ * A model response made calls the runtime runs. The response waits in a suspended step until
87
+ * every call it made has a result, so a call never reaches the model without its result.
88
+ */
89
+ export declare function suspendStep(view: SessionView, step: Pick<SuspendedStep, "event" | "messages" | "tasks">): Transition;
90
+ /** The step without the approved calls in `callIds`, which have run or joined the runtime. */
91
+ export declare function withoutApproved(step: SuspendedStep, callIds: ReadonlySet<string>): SuspendedStep;
92
+ /** Approved calls of suspended steps that haven't run. */
93
+ export declare function approvedCalls(turn: TurnState): readonly InputRequest[];
94
+ export declare function suspend(turn: TurnState, step: SuspendedStep): TurnState;
95
+ /** The ids of the calls a step's response made, except provider-executed ones. */
96
+ export declare function stepCallIds(step: Pick<SuspendedStep, "messages">): ReadonlySet<string>;
97
+ /** Places a result right after the message that made its call. */
98
+ export declare function withResult(messages: readonly ModelMessage[], part: ToolResultPart): ModelMessage[];
99
+ /** A call started or reached a task. */
100
+ export declare function startTask(view: SessionView, task: TaskStartedStreamEvent["data"]): Transition;
101
+ export type TaskCallOutcome = {
102
+ readonly status: "completed";
103
+ readonly output?: JsonValue;
104
+ } | {
105
+ readonly status: "failed";
106
+ readonly error: string;
107
+ } | {
108
+ readonly status: "cancelled";
109
+ readonly reason?: TaskCancelReason;
110
+ };
111
+ /** A task's run settled calls: each reports its outcome, naming the task as it started. */
112
+ export declare function settleTask(view: SessionView, input: {
113
+ readonly task: {
114
+ readonly id: string;
115
+ readonly kind?: TaskStartedStreamEvent["data"]["kind"];
116
+ readonly name?: string;
117
+ };
118
+ readonly calls: readonly {
119
+ readonly callId: string;
120
+ readonly turnId: string;
121
+ }[];
122
+ readonly outcome: TaskCallOutcome;
123
+ }): Transition;
124
+ /**
125
+ * A task or workflow run ended, on its own or cancelled: nobody can answer what it relayed, so
126
+ * each request still open is withdrawn.
127
+ */
128
+ export declare function finishRun(view: SessionView, run: {
129
+ readonly taskId?: string;
130
+ readonly requestIds?: Iterable<string>;
131
+ }): Transition;
132
+ /**
133
+ * A child session or workflow run asks a question or for a sign-in. The session passes it up
134
+ * with its original coordinates, and the open turn waits on the call it serves.
135
+ * A child's fresh batch replaces its earlier one, whose open requests are withdrawn.
136
+ */
137
+ export declare function relay(view: SessionView, input: {
138
+ readonly payload: SubagentInputRequestHookPayload | SubagentAuthorizationEventHookPayload;
139
+ readonly replacedRequestIds?: Iterable<string>;
140
+ }): Transition;
141
+ /**
142
+ * Answers to relayed requests are on their way to the asker: each request resolves here.
143
+ */
144
+ export declare function receiveRelayedAnswer(input: {
145
+ readonly message: string | UserContent;
146
+ readonly sequence: number;
147
+ readonly turnId: string;
148
+ }): import("#protocol/message.js").MessageReceivedStreamEvent;
149
+ export declare function routeAnswer(view: SessionView, input: {
150
+ readonly children: readonly {
151
+ readonly event: StepCoordinates;
152
+ readonly resolutions: readonly InputResolution[];
153
+ }[];
154
+ }): Transition;
155
+ /**
156
+ * A workflow run's sign-in, reported to the session that owns the run, which relays it. Built
157
+ * where the run asks, at the coordinates of the call it serves.
158
+ */
159
+ export declare function runSignIn(from: {
160
+ readonly sequence: number;
161
+ readonly stepIndex: number;
162
+ readonly taskId?: string;
163
+ readonly turnId: string;
164
+ }, challenge: AuthorizationChallenge, outcome?: "authorized" | "failed"): import("#protocol/message.js").AuthorizationCompletedStreamEvent | import("#protocol/message.js").AuthorizationRequiredStreamEvent;
165
+ /** Sign-in callbacks arrived: each completion is reported at the coordinates of the turn that asked. */
166
+ export declare function completeSignIn(view: SessionView, input: {
167
+ readonly completions: readonly AuthorizationChallenge[];
168
+ }): Transition;
169
+ /** Requests this session asked itself and still awaits; relayed requests answer elsewhere. */
170
+ export declare function ownOpenRequestIds(view: Omit<SessionView, "turn">): ReadonlySet<string>;
171
+ /** What the model reads for a call its turn's cancellation stopped before the call settled. */
172
+ export declare const CANCELLED_CALL_RESULT = "The turn was cancelled before this call finished.";
173
+ /**
174
+ * `session.cancel()`: the open turn ends cancelled. Its requests, its sign-ins, and every
175
+ * relayed request are withdrawn, since the cancel stops the work that asked them; its unsettled
176
+ * calls are stopped. The steps it ran commit to history, each unfinished call answered as
177
+ * cancelled, so the model sees that the work started and stopped.
178
+ */
179
+ export declare function cancel(view: SessionView): Transition;
180
+ /**
181
+ * `session.clear()`: everything the cleared history asked for is withdrawn, its approvals and
182
+ * the session-limit prompt and every sign-in, and the calls awaiting them stop. Requests relayed
183
+ * from live tasks stay: clearing doesn't stop the work that asked them.
184
+ */
185
+ export declare function clear(view: SessionView, input: {
186
+ readonly sessionId: string;
187
+ }): Transition;
188
+ export {};
@@ -0,0 +1 @@
1
+ import{activeTurnId,answeredCallIds,nextStepIndex,turnPosition}from"./view.js";import{inputWithdrawn,signInWithdrawn}from"./events.js";import{openInputs,openSignIns,turnCoordinates}from"#protocol/session-projection.js";import{createActionResultEvent,createAuthorizationCompletedEvent,createAuthorizationRequiredEvent,createContextClearedEvent,createInputRequestedEvent,createInputResolvedEvent,createMessageReceivedEvent,createResultCompletedEvent,createSessionCompletedEvent,createSessionFailedEvent,createSessionStartedEvent,createSessionWaitingEvent,createStepFailedEvent,createStepStartedEvent,createTaskSettledEvent,createTaskStartedEvent,createTurnCancelledEvent,createTurnCompletedEvent,createTurnFailedEvent,createTurnStartedEvent,createTurnWaitingEvent}from"#protocol/message.js";import{authorizationEventFields}from"#harness/authorization-event-fields.js";const unchanged=(e,t)=>({events:t,turn:e.turn});function at(e){let t=turnPosition(e);return{sequence:t.sequence,stepIndex:t.stepIndex,turnId:activeTurnId(t)}}function receive(e,t){let n=turnPosition(e.projection),r=activeTurnId(n),i=[];return n.sessionStarted||i.push(createSessionStartedEvent({runtime:t.runtime,trace:t.trace})),n.turnId===``&&i.push(createTurnStartedEvent({sequence:n.sequence,trace:t.trace,turnId:r})),t.message!==void 0&&i.push(createMessageReceivedEvent({message:t.message,sequence:n.sequence,turnId:r})),unchanged(e,i)}function startStep(e,t){let{sequence:n,turnId:r}=at(e.projection);return unchanged(e,[createStepStartedEvent({modelId:t.modelId,sequence:n,stepIndex:nextStepIndex(e.projection),turnId:r})])}function hold(e,t){let{sequence:n,turnId:r}=turnPosition(e.projection);return r===``?unchanged(e,[]):unchanged(e,[createTurnWaitingEvent({on:t.on,sequence:n,turnId:r,usage:e.usage})])}function finishTurn(e,t={}){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=[];return t.result!==void 0&&a.push(createResultCompletedEvent({result:t.result,sequence:n,stepIndex:r,turnId:i})),e.projection.activeTurnId!==void 0&&a.push(createTurnCompletedEvent({sequence:n,turnId:i})),a.push(createSessionWaitingEvent(e.usage)),unchanged(e,a)}function fail(e,t){let{sequence:n,stepIndex:r,turnId:i}=at(e.projection),a=e.turn.suspended.filter(e=>(e.approved?.length??0)>0);return{commit:a.flatMap(cancelledTranscript),events:failedEvents(e,t,{sequence:n,stepIndex:r,turnId:i}),turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!a.includes(e))}}}function failedEvents(e,t,n){let{sequence:r,stepIndex:i,turnId:a}=n,{code:o,details:s,message:c}=t;return[createStepFailedEvent({code:o,details:s,message:c,sequence:r,stepIndex:i,turnId:a}),createTurnFailedEvent({code:o,details:s,message:c,sequence:r,turnId:a}),t.terminal===void 0?createSessionWaitingEvent(e.usage):createSessionFailedEvent({code:o,details:s,message:c,sessionId:t.terminal.sessionId,usage:e.usage})]}function idle(e){return unchanged(e,[createSessionWaitingEvent(e.usage)])}function sessionCompleted(e){return createSessionCompletedEvent(e)}function sessionFailed(e){return createSessionFailedEvent(e)}function settle(e,t){let n=[],r=[...e.turn.suspended];for(let{part:e,result:i}of t.results){let t=r.findIndex(t=>stepCallIds(t).has(e.toolCallId)),a=r[t];a!==void 0&&(r[t]=withoutApproved({...a,messages:withResult(a.messages,e)},new Set([e.toolCallId])),i!==void 0&&n.push(createActionResultEvent({result:i,...a.event})))}let i=r.filter(isComplete);return{commit:i.flatMap(e=>e.messages),events:n,turn:{...e.turn,suspended:r.filter(e=>!i.includes(e))}}}function suspendStep(e,t){return{events:[],turn:suspend(e.turn,{...t,requests:[]})}}function withoutApproved(e,t){if(e.approved===void 0)return e;let n=e.approved.filter(e=>!t.has(e.action.callId));if(n.length===e.approved.length)return e;let{approved:r,...i}=e;return n.length===0?i:{...i,approved:n}}function approvedCalls(e){return e.suspended.flatMap(e=>e.approved??[])}function suspend(e,t){return{...e,suspended:[...e.suspended,t]}}function stepCallIds(e){let t=new Set;for(let n of e.messages)if(n.role===`assistant`&&typeof n.content!=`string`)for(let e of n.content)e.type===`tool-call`&&e.providerExecuted!==!0&&t.add(e.toolCallId);return t}function isComplete(e){if(e.requests.length>0)return!1;let t=answeredCallIds(e.messages);return[...stepCallIds(e)].every(e=>t.has(e))}function withResult(e,t){let n=[...e],r=n.findIndex(e=>e.role===`assistant`&&Array.isArray(e.content)&&e.content.some(e=>e.type===`tool-call`&&e.toolCallId===t.toolCallId)),i=n[r+1];return r>=0&&i?.role===`tool`?n[r+1]={...i,content:[...i.content,t]}:n.splice(r>=0?r+1:n.length,0,{content:[t],role:`tool`}),n}function startTask(e,t){return unchanged(e,[createTaskStartedEvent(t)])}function settleTask(e,t){let{outcome:n,task:r}=t;return unchanged(e,t.calls.map(e=>{let t={callId:e.callId,kind:r.kind,name:r.name,taskId:r.id,turnId:e.turnId};switch(n.status){case`completed`:return createTaskSettledEvent({...t,output:n.output,status:`completed`});case`failed`:return createTaskSettledEvent({...t,error:{message:n.error},status:`failed`});case`cancelled`:return createTaskSettledEvent(n.reason===void 0?{...t,status:`cancelled`}:{...t,cancel:{reason:n.reason},status:`cancelled`})}}))}function finishRun(e,t){let n=new Set(t.requestIds);return unchanged(e,openInputs(e.projection).filter(e=>n.has(e.request.requestId)||t.taskId!==void 0&&e.taskId===t.taskId).map(inputWithdrawn))}function relay(e,t){let{payload:n}=t,r=[...finishRun(e,{requestIds:t.replacedRequestIds}).events];if(n.kind===`subagent-input-request`){let{event:e}=n;r.push(createInputRequestedEvent({callId:n.callId,requests:e.requests,sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId}))}else{let{event:t}=n;if(r.push(t),t.type!==`authorization.required`)return unchanged(e,r)}return r.push(...hold(e,{on:`input`}).events),unchanged(e,r)}function receiveRelayedAnswer(e){return createMessageReceivedEvent(e)}function routeAnswer(e,t){let n=t.children.filter(e=>e.resolutions.length>0).map(e=>createInputResolvedEvent({resolutions:e.resolutions,...e.event}));return unchanged(e,n)}function runSignIn(e,t,n){let r={...authorizationEventFields(t),sequence:e.sequence,stepIndex:e.stepIndex,taskId:e.taskId,turnId:e.turnId};return n===void 0?createAuthorizationRequiredEvent({...r,description:`Sign in to ${t.name} to continue.`,webhookUrl:t.hookUrl}):createAuthorizationCompletedEvent({...r,outcome:n})}function completeSignIn(e,t){let n=at(e.projection);return unchanged(e,t.completions.map(t=>{let r=t.attemptId===void 0?void 0:e.projection.authorizations[t.attemptId];return createAuthorizationCompletedEvent({...authorizationEventFields(t),outcome:`authorized`,sequence:r?.sequence??n.sequence,stepIndex:r?.stepIndex??n.stepIndex,turnId:r?.turnId??n.turnId})}))}function ownOpenRequestIds(e){return new Set(openInputs(e.projection).filter(t=>t.callId===void 0&&t.taskId===void 0&&!e.relayedRequestIds.has(t.request.requestId)).map(e=>e.request.requestId))}const CANCELLED_CALL_RESULT=`The turn was cancelled before this call finished.`;function cancel(e){let{projection:t}=e,n=t.activeTurnId,r=e.turn.suspended.filter(e=>n!==void 0&&e.event.turnId===n||e.tasks.some(t=>!answeredCallIds(e.messages).has(t.callId))||(e.approved?.length??0)>0),i=new Set(r.flatMap(e=>e.requests.map(e=>e.requestId))),a=[...openInputs(t).filter(t=>t.turnId===n||i.has(t.request.requestId)||e.relayedRequestIds.has(t.request.requestId)||t.request.kind===`session-limit`).map(inputWithdrawn),...openSignIns(t).filter(e=>e.turnId===n).map(e=>signInWithdrawn(e,`Cancelled.`))];if(n!==void 0){let{sequence:e}=turnCoordinates(t);a.push(createTurnCancelledEvent({sequence:e,turnId:n}))}return a.push(createSessionWaitingEvent(e.usage)),{commit:r.flatMap(cancelledTranscript),events:a,signIns:[],turn:{...e.turn,suspended:e.turn.suspended.filter(e=>!r.includes(e))}}}function cancelledTranscript(e){let t=answeredCallIds(e.messages),n=[...e.messages];for(let r of e.messages)if(r.role===`assistant`&&typeof r.content!=`string`)for(let e of r.content)e.type===`tool-call`&&e.providerExecuted!==!0&&(t.has(e.toolCallId)||(n=withResult(n,{output:{type:`text`,value:CANCELLED_CALL_RESULT},toolCallId:e.toolCallId,toolName:e.toolName,type:`tool-result`})));return n}function clear(e,t){let{projection:n}=e,{sequence:r,turnId:i}=turnCoordinates(n);return{clearsHistory:!0,events:[...openInputs(n).filter(t=>!e.relayedRequestIds.has(t.request.requestId)).map(inputWithdrawn),...openSignIns(n).map(e=>signInWithdrawn(e,`The context was cleared.`)),createContextClearedEvent({sequence:r,sessionId:t.sessionId,turnId:i}),createSessionWaitingEvent(e.usage)],turn:{grants:e.turn.grants,suspended:[]}}}export{CANCELLED_CALL_RESULT,approvedCalls,cancel,clear,completeSignIn,fail,finishRun,finishTurn,hold,idle,ownOpenRequestIds,receive,receiveRelayedAnswer,relay,routeAnswer,runSignIn,sessionCompleted,sessionFailed,settle,settleTask,startStep,startTask,stepCallIds,suspend,suspendStep,withResult,withoutApproved};
@@ -0,0 +1,58 @@
1
+ import type { SessionAuthContext } from "#channel/types.js";
2
+ import type { TokenUsage } from "#shared/token-usage.js";
3
+ import type { ModelMessage } from "ai";
4
+ import type { AuthorizationChallenge } from "#harness/authorization.js";
5
+ import { type TaskToolCall } from "#execution/tasks/calls.js";
6
+ import type { SessionStateMap, StepInput } from "#harness/types.js";
7
+ import type { RuntimeWorkflowTaskRequest } from "#shared/action-types.js";
8
+ import { type SessionProjection } from "#protocol/session-projection.js";
9
+ import { type StepCoordinates, type SuspendedStep, type TurnState } from "./state.js";
10
+ export type { StepCoordinates, SuspendedStep, TurnState } from "./state.js";
11
+ export declare const SESSION_PROJECTION_STATE_KEY = "eve.harness.sessionProjection";
12
+ /** What a transition sees. */
13
+ export interface SessionView {
14
+ readonly turn: TurnState;
15
+ readonly projection: SessionProjection;
16
+ /** Requests this session relays for a child session or a workflow run, by `requestId`. */
17
+ readonly relayedRequestIds: ReadonlySet<string>;
18
+ /** The sign-in attempts the session waits on, with what completing them needs. */
19
+ readonly signIns: readonly AuthorizationChallenge[];
20
+ /** The session's token usage so far, which its waiting and terminal events report. */
21
+ readonly usage: TokenUsage;
22
+ }
23
+ /** Reads the authoritative lifecycle facts saved alongside execution state. */
24
+ export declare function storedProjection(state: SessionStateMap | undefined): SessionProjection;
25
+ /** Coordinates the next lifecycle event carries, and whether a turn is open. */
26
+ export interface TurnPosition {
27
+ readonly sessionStarted: boolean;
28
+ readonly sequence: number;
29
+ readonly stepIndex: number;
30
+ /** The open turn's id, or `""` between turns. */
31
+ readonly turnId: string;
32
+ /** The open turn streamed assistant output, so steering can no longer restart it. */
33
+ readonly assistantOutputStarted?: boolean;
34
+ }
35
+ export declare function turnPosition(projection: SessionProjection): TurnPosition;
36
+ /** The open turn's id, or the id the next turn takes. */
37
+ export declare function activeTurnId(position: Pick<TurnPosition, "sequence" | "turnId">): string;
38
+ export declare function isBetweenTurns(projection: SessionProjection): boolean;
39
+ /** The index the open turn's next `step.started` takes. */
40
+ export declare function nextStepIndex(projection: SessionProjection): number;
41
+ /** Input the session holds until it can run. */
42
+ export declare function queuedInput(state: SessionStateMap | undefined): StepInput | undefined;
43
+ export declare function suspendedSteps(state: SessionStateMap | undefined): readonly SuspendedStep[];
44
+ /** The ids of calls that already have a result in `messages`. */
45
+ export declare function answeredCallIds(messages: readonly ModelMessage[]): ReadonlySet<string>;
46
+ /** Workflow and agent calls of `step` the runtime still runs. */
47
+ export declare function runningTasks(step: SuspendedStep): readonly RuntimeWorkflowTaskRequest[];
48
+ /** What the turn waits on the runtime for: dispatched runs and the task tool calls. */
49
+ export interface RuntimeWait {
50
+ readonly event: StepCoordinates;
51
+ readonly callIds: readonly string[];
52
+ readonly tasks: readonly RuntimeWorkflowTaskRequest[];
53
+ readonly taskToolCalls: readonly TaskToolCall[];
54
+ /** Who approved each task an approval started, by call id. */
55
+ readonly approvers: Readonly<Record<string, SessionAuthContext>>;
56
+ }
57
+ /** The calls suspended steps wait on the runtime for, or `undefined` when none do. */
58
+ export declare function runtimeWait(state: SessionStateMap | undefined): RuntimeWait | undefined;