eve 0.71.2 → 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 (470) hide show
  1. package/CHANGELOG.md +47 -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/channel/conversation-context.d.ts +4 -1
  7. package/dist/src/channel/invoke-tool.d.ts +41 -0
  8. package/dist/src/channel/invoke-tool.js +1 -0
  9. package/dist/src/channel/routes.d.ts +3 -0
  10. package/dist/src/chunks/{use-eve-agent-CFCaYnrI.js → use-eve-agent-C1GYGCtb.js} +698 -388
  11. package/dist/src/chunks/{use-eve-agent-DcDhXNv1.js → use-eve-agent-hZJ7CB8t.js} +698 -388
  12. package/dist/src/cli/commands/integration-setup.js +1 -1
  13. package/dist/src/cli/commands/registry.js +1 -1
  14. package/dist/src/cli/commands/trace-detail.d.ts +1 -1
  15. package/dist/src/cli/commands/trace-detail.js +1 -1
  16. package/dist/src/cli/dev/tui/runner.js +1 -1
  17. package/dist/src/cli/dev/tui/setup-flow.d.ts +1 -0
  18. package/dist/src/cli/dev/tui/setup-panel.d.ts +1 -0
  19. package/dist/src/cli/dev/tui/setup-panel.js +2 -1
  20. package/dist/src/cli/dev/tui/traces/trace-conversation.d.ts +2 -2
  21. package/dist/src/cli/dev/tui/traces/trace-conversation.js +2 -2
  22. package/dist/src/cli/dev/tui/transcript-parts.d.ts +2 -1
  23. package/dist/src/cli/dev/tui/transcript-parts.js +1 -1
  24. package/dist/src/cli/dev/tui/transcript.js +1 -1
  25. package/dist/src/cli/dev/tui/tui-prompter.js +1 -1
  26. package/dist/src/client/conversation-projection.d.ts +4 -0
  27. package/dist/src/client/conversation-projection.js +1 -0
  28. package/dist/src/client/conversation-reducer.js +1 -1
  29. package/dist/src/client/conversation-state.d.ts +5 -26
  30. package/dist/src/client/conversation-state.js +1 -1
  31. package/dist/src/client/index.d.ts +1 -0
  32. package/dist/src/client/index.js +1 -1
  33. package/dist/src/client/message-action-parts.d.ts +1 -11
  34. package/dist/src/client/message-action-parts.js +1 -1
  35. package/dist/src/client/message-reducer.d.ts +3 -1
  36. package/dist/src/client/message-reducer.js +1 -1
  37. package/dist/src/client/session-utils.js +1 -1
  38. package/dist/src/client/session.js +1 -1
  39. package/dist/src/client/tool-call-state.d.ts +23 -0
  40. package/dist/src/client/tool-call-state.js +1 -0
  41. package/dist/src/client/tool-part-state.d.ts +7 -0
  42. package/dist/src/client/tool-part-state.js +1 -0
  43. package/dist/src/compiled/.vendor-stamp.json +10 -10
  44. package/dist/src/compiled/@ai-sdk/anthropic/index.d.ts +1453 -1358
  45. package/dist/src/compiled/@ai-sdk/anthropic/index.js +1 -2
  46. package/dist/src/compiled/@ai-sdk/code-mode/index.d.ts +172 -163
  47. package/dist/src/compiled/@ai-sdk/code-mode/index.js +15 -20
  48. package/dist/src/compiled/@ai-sdk/google/index.d.ts +772 -733
  49. package/dist/src/compiled/@ai-sdk/google/index.js +6 -8
  50. package/dist/src/compiled/@ai-sdk/mcp/index.d.ts +887 -790
  51. package/dist/src/compiled/@ai-sdk/mcp/index.js +1 -1
  52. package/dist/src/compiled/@ai-sdk/openai/index.d.ts +1722 -1691
  53. package/dist/src/compiled/@ai-sdk/openai/index.js +3 -14
  54. package/dist/src/compiled/@ai-sdk/otel/index.d.ts +216 -159
  55. package/dist/src/compiled/@ai-sdk/otel/index.js +3 -3
  56. package/dist/src/compiled/@ai-sdk/provider/index.d.ts +7542 -7271
  57. package/dist/src/compiled/@ai-sdk/provider/index.js +1 -3
  58. package/dist/src/compiled/@ai-sdk/provider-utils/index.d.ts +1799 -1600
  59. package/dist/src/compiled/@eve/catalog/index.js +1 -1
  60. package/dist/src/compiled/_chunks/workflow/dist-DXLdlucM.js +15 -0
  61. package/dist/src/compiled/_chunks/workflow/experimental-decision-BrfWf6-n.js +3 -0
  62. package/dist/src/compiler/extension-compatibility.d.ts +36 -20
  63. package/dist/src/compiler/extension-compatibility.js +1 -1
  64. package/dist/src/compiler/manifest.js +1 -1
  65. package/dist/src/context/build-dynamic-tools.js +1 -1
  66. package/dist/src/context/caller-scope.d.ts +7 -0
  67. package/dist/src/context/caller-scope.js +1 -0
  68. package/dist/src/context/dynamic-tool-lifecycle.js +1 -1
  69. package/dist/src/context/dynamic-tool-metadata.d.ts +1 -0
  70. package/dist/src/context/providers/session.js +1 -1
  71. package/dist/src/evals/define-eval.d.ts +1 -1
  72. package/dist/src/evals/judge.d.ts +1 -1
  73. package/dist/src/evals/judge.js +2 -2
  74. package/dist/src/evals/types.d.ts +8 -8
  75. package/dist/src/execution/cancel-descendant-turns-step.d.ts +1 -0
  76. package/dist/src/execution/cancel-descendant-turns-step.js +1 -1
  77. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  78. package/dist/src/execution/coordination-dispatch-shared.d.ts +2 -1
  79. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  80. package/dist/src/execution/coordination-dispatch-step.js +1 -1
  81. package/dist/src/execution/durable-session-read.d.ts +5 -0
  82. package/dist/src/execution/durable-session-read.js +1 -0
  83. package/dist/src/execution/durable-session-store.d.ts +4 -10
  84. package/dist/src/execution/durable-session-store.js +1 -1
  85. package/dist/src/execution/dynamic-connections.d.ts +3 -3
  86. package/dist/src/execution/dynamic-connections.js +1 -1
  87. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  88. package/dist/src/execution/invoke-tool.d.ts +35 -0
  89. package/dist/src/execution/invoke-tool.js +1 -0
  90. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  91. package/dist/src/execution/legacy-session/snapshot.d.ts +3 -0
  92. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  93. package/dist/src/execution/model-call-batching.js +1 -1
  94. package/dist/src/execution/node-step.d.ts +2 -0
  95. package/dist/src/execution/node-step.js +1 -1
  96. package/dist/src/execution/proxied-deliver-step.js +1 -1
  97. package/dist/src/execution/publish-session-events.d.ts +8 -0
  98. package/dist/src/execution/publish-session-events.js +1 -1
  99. package/dist/src/execution/sandbox/active-handles.d.ts +6 -0
  100. package/dist/src/execution/sandbox/active-handles.js +1 -1
  101. package/dist/src/execution/sandbox/ensure.js +1 -1
  102. package/dist/src/execution/session/active-turn.js +1 -1
  103. package/dist/src/execution/session/answer-caller.d.ts +15 -0
  104. package/dist/src/execution/session/answer-caller.js +1 -0
  105. package/dist/src/execution/session/checkpoint-migrations.js +1 -1
  106. package/dist/src/execution/session/finalization.js +1 -1
  107. package/dist/src/execution/session/handoff-steps.d.ts +3 -1
  108. package/dist/src/execution/session/handoff-steps.js +1 -1
  109. package/dist/src/execution/session/handoff.d.ts +1 -1
  110. package/dist/src/execution/session/handoff.js +1 -1
  111. package/dist/src/execution/session/pending-turn-state.d.ts +8 -3
  112. package/dist/src/execution/session/pending-turn-state.js +1 -1
  113. package/dist/src/execution/session/task-tool-tracing-step.d.ts +5 -0
  114. package/dist/src/execution/session/task-tool-tracing-step.js +1 -0
  115. package/dist/src/execution/session/turn-step-result.js +1 -1
  116. package/dist/src/execution/session/turn-step.js +1 -1
  117. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  118. package/dist/src/execution/session/turn.d.ts +1 -0
  119. package/dist/src/execution/session/turn.js +1 -1
  120. package/dist/src/execution/settle-cancelled-turn-step.d.ts +4 -6
  121. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  122. package/dist/src/execution/tasks/start.d.ts +3 -3
  123. package/dist/src/execution/tasks/start.js +1 -1
  124. package/dist/src/execution/tasks/steps.d.ts +1 -1
  125. package/dist/src/execution/tasks/steps.js +1 -1
  126. package/dist/src/execution/terminal-session-completion-step.d.ts +7 -0
  127. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  128. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  129. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  130. package/dist/src/execution/tools/connection-tools.js +1 -1
  131. package/dist/src/execution/tools/workflow/authorization-completion.js +1 -1
  132. package/dist/src/execution/tools/workflow/harness-definition.js +1 -1
  133. package/dist/src/execution/tools/workflow/step-execution.js +1 -1
  134. package/dist/src/execution/tools/workflow/step.js +1 -1
  135. package/dist/src/execution/tools/workflow/withdraw-step.d.ts +7 -9
  136. package/dist/src/execution/tools/workflow/withdraw-step.js +1 -1
  137. package/dist/src/execution/workflow-runtime.js +1 -1
  138. package/dist/src/execution/workflow-trace-context.d.ts +2 -2
  139. package/dist/src/harness/authorization.d.ts +4 -2
  140. package/dist/src/harness/authorization.js +1 -1
  141. package/dist/src/harness/{compaction.js → compaction/engine.js} +1 -1
  142. package/dist/src/harness/compaction/step.d.ts +46 -0
  143. package/dist/src/harness/compaction/step.js +1 -0
  144. package/dist/src/harness/coordination.d.ts +32 -64
  145. package/dist/src/harness/coordination.js +1 -1
  146. package/dist/src/harness/current-messages.d.ts +1 -3
  147. package/dist/src/harness/current-messages.js +1 -1
  148. package/dist/src/harness/emission.d.ts +4 -52
  149. package/dist/src/harness/emission.js +1 -1
  150. package/dist/src/harness/execute-tool.d.ts +1 -0
  151. package/dist/src/harness/final-output.d.ts +5 -0
  152. package/dist/src/harness/final-output.js +1 -1
  153. package/dist/src/harness/hitl/approvals.d.ts +115 -0
  154. package/dist/src/harness/hitl/approvals.js +1 -0
  155. package/dist/src/harness/hitl/approved-call-callers.d.ts +14 -0
  156. package/dist/src/harness/hitl/approved-call-callers.js +1 -0
  157. package/dist/src/harness/hitl/approved-calls.d.ts +37 -0
  158. package/dist/src/harness/hitl/approved-calls.js +1 -0
  159. package/dist/src/harness/{session-limit-continuation.d.ts → hitl/budget-request.d.ts} +3 -1
  160. package/dist/src/harness/hitl/budget-request.js +1 -0
  161. package/dist/src/harness/hitl/budget.d.ts +21 -0
  162. package/dist/src/harness/hitl/budget.js +1 -0
  163. package/dist/src/harness/{approval-candidates.d.ts → hitl/candidates.d.ts} +13 -18
  164. package/dist/src/harness/hitl/candidates.js +1 -0
  165. package/dist/src/harness/hitl/coordinator.js +1 -0
  166. package/dist/src/harness/hitl/delivery.d.ts +37 -0
  167. package/dist/src/harness/hitl/delivery.js +1 -0
  168. package/dist/src/harness/hitl/index.d.ts +49 -0
  169. package/dist/src/harness/hitl/index.js +1 -0
  170. package/dist/src/harness/hitl/intake.d.ts +67 -0
  171. package/dist/src/harness/hitl/intake.js +1 -0
  172. package/dist/src/harness/{stale-input-responses.d.ts → hitl/stale-responses.d.ts} +5 -3
  173. package/dist/src/harness/hitl/stale-responses.js +3 -0
  174. package/dist/src/harness/inline-tool-authorization.d.ts +4 -0
  175. package/dist/src/harness/inline-tool-authorization.js +1 -1
  176. package/dist/src/harness/input-extraction.d.ts +1 -10
  177. package/dist/src/harness/input-extraction.js +1 -1
  178. package/dist/src/harness/input-request-resolution.d.ts +1 -5
  179. package/dist/src/harness/input-request-resolution.js +1 -1
  180. package/dist/src/harness/messages.js +1 -1
  181. package/dist/src/harness/model-call/call.d.ts +78 -0
  182. package/dist/src/harness/model-call/call.js +1 -0
  183. package/dist/src/harness/{model-call-error.d.ts → model-call/errors.d.ts} +1 -1
  184. package/dist/src/harness/model-call/failure.d.ts +52 -0
  185. package/dist/src/harness/model-call/failure.js +1 -0
  186. package/dist/src/harness/model-call/model.d.ts +18 -0
  187. package/dist/src/harness/model-call/model.js +1 -0
  188. package/dist/src/harness/model-call/recovery.d.ts +52 -0
  189. package/dist/src/harness/model-call/recovery.js +1 -0
  190. package/dist/src/harness/model-call/request.d.ts +30 -0
  191. package/dist/src/harness/model-call/request.js +3 -0
  192. package/dist/src/harness/model-call/response.d.ts +39 -0
  193. package/dist/src/harness/model-call/response.js +1 -0
  194. package/dist/src/harness/model-call/retry.d.ts +11 -0
  195. package/dist/src/harness/model-call/retry.js +1 -0
  196. package/dist/src/harness/model-call/run.d.ts +38 -0
  197. package/dist/src/harness/model-call/run.js +1 -0
  198. package/dist/src/harness/model-call/tools.d.ts +48 -0
  199. package/dist/src/harness/model-call/tools.js +1 -0
  200. package/dist/src/harness/model-call/usage.d.ts +23 -0
  201. package/dist/src/harness/model-call/usage.js +1 -0
  202. package/dist/src/harness/nested-actions.d.ts +2 -2
  203. package/dist/src/harness/provider-tools.d.ts +7 -3
  204. package/dist/src/harness/provider-tools.js +1 -1
  205. package/dist/src/harness/proxy-input-requests.d.ts +4 -12
  206. package/dist/src/harness/proxy-input-requests.js +1 -1
  207. package/dist/src/harness/session-machine/commit.d.ts +28 -0
  208. package/dist/src/harness/session-machine/commit.js +1 -0
  209. package/dist/src/harness/session-machine/current.d.ts +29 -0
  210. package/dist/src/harness/session-machine/current.js +1 -0
  211. package/dist/src/harness/session-machine/events.d.ts +6 -0
  212. package/dist/src/harness/session-machine/events.js +1 -0
  213. package/dist/src/harness/session-machine/resolver-events.d.ts +12 -0
  214. package/dist/src/harness/session-machine/resolver-events.js +1 -0
  215. package/dist/src/harness/session-machine/state.d.ts +47 -0
  216. package/dist/src/harness/session-machine/state.js +1 -0
  217. package/dist/src/harness/session-machine/transitions.d.ts +188 -0
  218. package/dist/src/harness/session-machine/transitions.js +1 -0
  219. package/dist/src/harness/session-machine/view.d.ts +58 -0
  220. package/dist/src/harness/session-machine/view.js +1 -0
  221. package/dist/src/harness/step/after-model.d.ts +7 -0
  222. package/dist/src/harness/step/after-model.js +1 -0
  223. package/dist/src/harness/step/context.d.ts +59 -0
  224. package/dist/src/harness/step/context.js +1 -0
  225. package/dist/src/harness/step/intake.d.ts +34 -0
  226. package/dist/src/harness/step/intake.js +1 -0
  227. package/dist/src/harness/step/prompt.d.ts +37 -0
  228. package/dist/src/harness/step/prompt.js +1 -0
  229. package/dist/src/harness/step-hooks.d.ts +8 -13
  230. package/dist/src/harness/step-hooks.js +1 -1
  231. package/dist/src/harness/tool-call-io.d.ts +25 -0
  232. package/dist/src/harness/tool-call-io.js +1 -0
  233. package/dist/src/harness/tool-loop.d.ts +7 -22
  234. package/dist/src/harness/tool-loop.js +1 -3
  235. package/dist/src/harness/tool-model-output.d.ts +1 -2
  236. package/dist/src/harness/tools.d.ts +14 -0
  237. package/dist/src/harness/tools.js +1 -1
  238. package/dist/src/harness/turn-tag-state.d.ts +1 -1
  239. package/dist/src/harness/types.d.ts +6 -0
  240. package/dist/src/instrumentation/ai-sdk-hook-bridge.d.ts +1 -1
  241. package/dist/src/instrumentation/ai-sdk-hook-bridge.js +1 -1
  242. package/dist/src/instrumentation/content.js +1 -1
  243. package/dist/src/instrumentation/dispatch.js +1 -1
  244. package/dist/src/instrumentation/lifecycle.d.ts +28 -52
  245. package/dist/src/instrumentation/native-events.d.ts +2 -1
  246. package/dist/src/instrumentation/native-events.js +1 -1
  247. package/dist/src/instrumentation/provider.d.ts +1 -1
  248. package/dist/src/instrumentation/runtime-context.d.ts +2 -3
  249. package/dist/src/instrumentation/runtime-context.js +1 -1
  250. package/dist/src/instrumentation/runtime.d.ts +11 -1
  251. package/dist/src/instrumentation/runtime.js +1 -1
  252. package/dist/src/instrumentation/state.d.ts +6 -1
  253. package/dist/src/instrumentation/state.js +1 -1
  254. package/dist/src/internal/application/package.js +1 -1
  255. package/dist/src/internal/attachments/limited-read.d.ts +16 -0
  256. package/dist/src/internal/attachments/limited-read.js +1 -0
  257. package/dist/src/internal/authored-definition/schema-backed.d.ts +2 -1
  258. package/dist/src/internal/authored-definition/schema-backed.js +1 -1
  259. package/dist/src/internal/gateway.d.ts +2 -0
  260. package/dist/src/internal/gateway.js +1 -1
  261. package/dist/src/internal/mcp/published-tools.d.ts +13 -0
  262. package/dist/src/internal/mcp/published-tools.js +1 -0
  263. package/dist/src/internal/mcp/request-trace-context.d.ts +12 -0
  264. package/dist/src/internal/mcp/request-trace-context.js +1 -0
  265. package/dist/src/internal/mcp/streamable-http-server.d.ts +7 -3
  266. package/dist/src/internal/mcp/streamable-http-server.js +1 -1
  267. package/dist/src/internal/model-auth/transport.d.ts +3 -3
  268. package/dist/src/internal/model-auth/transport.js +1 -1
  269. package/dist/src/internal/nitro/host/instrumentation-entry.js +2 -2
  270. package/dist/src/internal/nitro/routes/channel-dispatch.js +1 -1
  271. package/dist/src/internal/nitro/routes/channel-request-instrumentation.js +1 -1
  272. package/dist/src/internal/nitro/routes/route-invoke-tool.d.ts +24 -0
  273. package/dist/src/internal/nitro/routes/route-invoke-tool.js +1 -0
  274. package/dist/src/models/auto.d.ts +5 -5
  275. package/dist/src/models/auto.js +2 -2
  276. package/dist/src/protocol/message.d.ts +7 -0
  277. package/dist/src/protocol/message.js +1 -1
  278. package/dist/src/protocol/session-projection.d.ts +159 -0
  279. package/dist/src/protocol/session-projection.js +1 -0
  280. package/dist/src/public/ai/index.d.ts +1 -1
  281. package/dist/src/public/ai/index.js +1 -1
  282. package/dist/src/public/channels/chat-sdk/attachment-refs.d.ts +15 -0
  283. package/dist/src/public/channels/chat-sdk/attachment-refs.js +1 -0
  284. package/dist/src/public/channels/chat-sdk/chatSdkChannel.js +2 -2
  285. package/dist/src/public/channels/chat-sdk/messageToUserContent.d.ts +11 -5
  286. package/dist/src/public/channels/chat-sdk/messageToUserContent.js +1 -1
  287. package/dist/src/public/channels/discord/attachments.d.ts +15 -0
  288. package/dist/src/public/channels/discord/attachments.js +1 -0
  289. package/dist/src/public/channels/discord/discordChannel.js +1 -1
  290. package/dist/src/public/channels/discord/inbound.d.ts +13 -0
  291. package/dist/src/public/channels/discord/inbound.js +1 -1
  292. package/dist/src/public/channels/index.d.ts +1 -1
  293. package/dist/src/public/channels/linear/inbound-uploads.d.ts +21 -0
  294. package/dist/src/public/channels/linear/inbound-uploads.js +1 -0
  295. package/dist/src/public/channels/linear/linearChannel.js +1 -1
  296. package/dist/src/public/channels/linq/inboundContent.d.ts +7 -1
  297. package/dist/src/public/channels/linq/inboundContent.js +1 -1
  298. package/dist/src/public/channels/linq/linqChannel.js +1 -1
  299. package/dist/src/public/channels/mcp.d.ts +17 -2
  300. package/dist/src/public/channels/mcp.js +1 -1
  301. package/dist/src/public/channels/photon/attachments.d.ts +21 -0
  302. package/dist/src/public/channels/photon/attachments.js +1 -0
  303. package/dist/src/public/channels/photon/photonIMessageChannel.js +1 -1
  304. package/dist/src/public/channels/slack/attachments.d.ts +3 -1
  305. package/dist/src/public/channels/slack/attachments.js +1 -1
  306. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  307. package/dist/src/public/channels/teams/attachments.d.ts +4 -4
  308. package/dist/src/public/channels/teams/attachments.js +1 -1
  309. package/dist/src/public/channels/telegram/attachments.js +1 -1
  310. package/dist/src/public/channels/twilio/api.d.ts +7 -0
  311. package/dist/src/public/channels/twilio/api.js +1 -1
  312. package/dist/src/public/channels/twilio/inbound.d.ts +7 -0
  313. package/dist/src/public/channels/twilio/inbound.js +2 -2
  314. package/dist/src/public/channels/twilio/twilioChannel.js +1 -1
  315. package/dist/src/public/definitions/channel.d.ts +1 -0
  316. package/dist/src/public/definitions/connections/mcp.d.ts +1 -1
  317. package/dist/src/public/definitions/connections/openapi.d.ts +1 -1
  318. package/dist/src/public/models/openai/chatgpt/model.js +1 -1
  319. package/dist/src/react/index.d.ts +1 -0
  320. package/dist/src/react/index.js +1 -1
  321. package/dist/src/runtime/agent/mock-model-adapter.js +2 -2
  322. package/dist/src/runtime/connections/mcp-client.js +1 -1
  323. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  324. package/dist/src/runtime/resolve-tool.js +1 -1
  325. package/dist/src/setup/boxes/resolve-provisioning.d.ts +2 -0
  326. package/dist/src/setup/boxes/resolve-provisioning.js +1 -1
  327. package/dist/src/setup/cli/prompt-ui.d.ts +3 -0
  328. package/dist/src/setup/cli/prompt-ui.js +3 -1
  329. package/dist/src/setup/cli/select-component.d.ts +1 -0
  330. package/dist/src/setup/cli/select-component.js +1 -1
  331. package/dist/src/setup/flows/ensure-vercel-project.d.ts +2 -0
  332. package/dist/src/setup/flows/ensure-vercel-project.js +1 -1
  333. package/dist/src/setup/integrations/discord/api.js +1 -1
  334. package/dist/src/setup/integrations/web/auth-options.d.ts +4 -0
  335. package/dist/src/setup/integrations/web/auth-options.js +1 -0
  336. package/dist/src/setup/integrations/web/auth-scaffold.d.ts +7 -0
  337. package/dist/src/setup/integrations/web/auth-scaffold.js +1 -0
  338. package/dist/src/setup/integrations/web/provision-auth.d.ts +3 -0
  339. package/dist/src/setup/integrations/web/provision-auth.js +1 -0
  340. package/dist/src/setup/integrations/web/setup.d.ts +11 -6
  341. package/dist/src/setup/integrations/web/setup.js +3 -3
  342. package/dist/src/setup/prompter.d.ts +2 -0
  343. package/dist/src/setup/prompter.js +1 -1
  344. package/dist/src/setup/scaffold/create/add-to-project.js +1 -1
  345. package/dist/src/setup/scaffold/create/project.js +2 -2
  346. package/dist/src/setup/scaffold/create/web-template.d.ts +3 -3
  347. package/dist/src/setup/scaffold/create/web-template.js +26 -8
  348. package/dist/src/setup/scaffold/update/web-options.js +1 -1
  349. package/dist/src/setup/vercel-project-api.d.ts +9 -0
  350. package/dist/src/setup/vercel-project-api.js +1 -1
  351. package/dist/src/setup/vercel-project.d.ts +4 -2
  352. package/dist/src/setup/vercel-project.js +0 -0
  353. package/dist/src/shared/web-search.d.ts +1 -1
  354. package/dist/src/subagents/adapter.js +1 -1
  355. package/dist/src/subagents/event-proxy-step.js +1 -1
  356. package/dist/src/subagents/hitl-proxy.d.ts +4 -28
  357. package/dist/src/subagents/hitl-proxy.js +1 -1
  358. package/dist/src/svelte/index.d.ts +2 -0
  359. package/dist/src/svelte/index.js +39 -2
  360. package/dist/src/svelte/use-eve-agent.js +1 -1
  361. package/dist/src/tools/approval/policies.d.ts +5 -5
  362. package/dist/src/tools/approval/policies.js +1 -1
  363. package/dist/src/tools/framework/agent.js +1 -1
  364. package/dist/src/tools/provided/agent-router.js +1 -1
  365. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  366. package/dist/src/tools/provided/ask-question.js +2 -2
  367. package/dist/src/tools/provided/bash.js +1 -1
  368. package/dist/src/tools/provided/framework-tool.d.ts +3 -0
  369. package/dist/src/tools/provided/framework-tool.js +1 -0
  370. package/dist/src/tools/provided/glob.js +2 -2
  371. package/dist/src/tools/provided/grep.js +2 -2
  372. package/dist/src/tools/provided/load-skill.js +1 -1
  373. package/dist/src/tools/provided/no-reply.js +1 -1
  374. package/dist/src/tools/provided/read-file.js +2 -2
  375. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  376. package/dist/src/tools/provided/sleep.js +1 -1
  377. package/dist/src/tools/provided/task-cancel.js +1 -1
  378. package/dist/src/tools/provided/task-wait.js +1 -1
  379. package/dist/src/tools/provided/web-fetch.js +2 -2
  380. package/dist/src/tools/provided/web-search.js +1 -1
  381. package/dist/src/tools/provided/workflow.js +1 -1
  382. package/dist/src/tools/provided/write-file.js +2 -2
  383. package/dist/src/tracing/agent-approval-instrumentation.d.ts +2 -2
  384. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  385. package/dist/src/tracing/agent-otel-provider.js +2 -2
  386. package/dist/src/tracing/agent-otel-usage.d.ts +1 -1
  387. package/dist/src/tracing/agent-otel-usage.js +1 -1
  388. package/dist/src/tracing/agent-span-contract.d.ts +8 -1
  389. package/dist/src/tracing/agent-span-contract.js +1 -1
  390. package/dist/src/tracing/agent-tool-instrumentation.d.ts +16 -5
  391. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  392. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  393. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  394. package/dist/src/tracing/agent-trace-state.d.ts +8 -3
  395. package/dist/src/tracing/install-instrumentation-runtime.js +1 -1
  396. package/dist/src/tracing/invoke-tool-span.d.ts +61 -0
  397. package/dist/src/tracing/invoke-tool-span.js +1 -0
  398. package/dist/src/tracing/local-trace-analysis.js +1 -1
  399. package/dist/src/vue/index.d.ts +2 -0
  400. package/dist/src/vue/index.js +39 -2
  401. package/dist/src/vue/use-eve-agent.js +1 -1
  402. package/docs/agent-config.md +2 -2
  403. package/docs/channels/chat-sdk.mdx +3 -1
  404. package/docs/channels/custom.mdx +3 -0
  405. package/docs/channels/discord.mdx +5 -4
  406. package/docs/channels/eve.mdx +65 -0
  407. package/docs/channels/linear.mdx +1 -1
  408. package/docs/channels/linq.mdx +2 -0
  409. package/docs/channels/mcp.mdx +39 -1
  410. package/docs/channels/photon.mdx +5 -0
  411. package/docs/channels/teams.mdx +4 -7
  412. package/docs/channels/twilio.mdx +1 -1
  413. package/docs/concepts/built-in-tools.md +12 -0
  414. package/docs/concepts/sessions-runs-and-streaming.md +3 -3
  415. package/docs/connections/overview.mdx +1 -1
  416. package/docs/dynamic-configuration/meta.json +1 -1
  417. package/docs/evals/judge.mdx +16 -16
  418. package/docs/evals/overview.mdx +1 -1
  419. package/docs/guides/{evaluate.md → decide.md} +35 -35
  420. package/docs/guides/dynamic-capabilities.md +1 -1
  421. package/docs/guides/frontend/overview.mdx +3 -1
  422. package/docs/guides/hooks.md +1 -1
  423. package/docs/guides/instrumentation/instrumentation.mdx +23 -22
  424. package/docs/guides/instrumentation/otel.mdx +13 -2
  425. package/docs/reference/cli.md +4 -2
  426. package/docs/reference/typescript-api.md +4 -2
  427. package/docs/tools/human-in-the-loop.md +8 -4
  428. package/docs/tools/workflows.mdx +4 -4
  429. package/package.json +13 -11
  430. package/dist/src/ai/evaluate.d.ts +0 -7
  431. package/dist/src/ai/evaluate.js +0 -1
  432. package/dist/src/client/message-task-parts.d.ts +0 -8
  433. package/dist/src/client/message-task-parts.js +0 -1
  434. package/dist/src/compiled/_chunks/workflow/dist-C3ZE62yI.js +0 -25
  435. package/dist/src/compiled/_chunks/workflow/experimental-evaluation-Dm32egEG.js +0 -5
  436. package/dist/src/harness/active-turn-id.d.ts +0 -11
  437. package/dist/src/harness/active-turn-id.js +0 -1
  438. package/dist/src/harness/approval-candidates.js +0 -1
  439. package/dist/src/harness/approval-delivery-coordinator.js +0 -1
  440. package/dist/src/harness/cancelled-turn-emission.d.ts +0 -12
  441. package/dist/src/harness/cancelled-turn-emission.js +0 -1
  442. package/dist/src/harness/emission-state.d.ts +0 -26
  443. package/dist/src/harness/emission-state.js +0 -1
  444. package/dist/src/harness/held-requests.d.ts +0 -18
  445. package/dist/src/harness/held-requests.js +0 -1
  446. package/dist/src/harness/hitl/approval-input-requests.d.ts +0 -27
  447. package/dist/src/harness/hitl/approval-input-requests.js +0 -1
  448. package/dist/src/harness/hitl/pending-input-resolution.d.ts +0 -54
  449. package/dist/src/harness/hitl/pending-input-resolution.js +0 -1
  450. package/dist/src/harness/hitl/session-limit-input-requests.d.ts +0 -12
  451. package/dist/src/harness/hitl/session-limit-input-requests.js +0 -1
  452. package/dist/src/harness/input-requests.d.ts +0 -31
  453. package/dist/src/harness/input-requests.js +0 -1
  454. package/dist/src/harness/pending-input-batches.d.ts +0 -81
  455. package/dist/src/harness/pending-input-batches.js +0 -1
  456. package/dist/src/harness/session-limit-continuation.js +0 -1
  457. package/dist/src/harness/session-limit-enforcement.d.ts +0 -45
  458. package/dist/src/harness/session-limit-enforcement.js +0 -1
  459. package/dist/src/harness/stale-input-responses.js +0 -3
  460. package/dist/src/harness/workflow-dispatch.d.ts +0 -30
  461. package/dist/src/harness/workflow-dispatch.js +0 -1
  462. package/dist/src/public/channels/linear/inbound-images.d.ts +0 -19
  463. package/dist/src/public/channels/linear/inbound-images.js +0 -1
  464. package/dist/src/tracing/agent-action-instrumentation.d.ts +0 -25
  465. package/dist/src/tracing/agent-action-instrumentation.js +0 -1
  466. /package/dist/src/harness/{compaction.d.ts → compaction/engine.d.ts} +0 -0
  467. /package/dist/src/harness/{compaction-prompt.d.ts → compaction/prompt.d.ts} +0 -0
  468. /package/dist/src/harness/{compaction-prompt.js → compaction/prompt.js} +0 -0
  469. /package/dist/src/harness/{approval-delivery-coordinator.d.ts → hitl/coordinator.d.ts} +0 -0
  470. /package/dist/src/harness/{model-call-error.js → model-call/errors.js} +0 -0
@@ -682,6 +682,464 @@ function isTurnFailureEvent(event) {
682
682
  return event.type === "session.failed" || event.type === "step.failed" || event.type === "turn.failed";
683
683
  }
684
684
 
685
+ //#endregion
686
+ //#region src/protocol/session-projection.ts
687
+ function initialSessionProjection() {
688
+ return {
689
+ authorizations: {},
690
+ calls: {},
691
+ candidates: {},
692
+ inputs: {},
693
+ nextSequence: 0,
694
+ tasks: {},
695
+ turns: {}
696
+ };
697
+ }
698
+ function updateTurn(state, turnId, update) {
699
+ const turn = state.turns[turnId];
700
+ if (turn === void 0) return state;
701
+ const next = update(turn);
702
+ return next === turn ? state : {
703
+ ...state,
704
+ turns: {
705
+ ...state.turns,
706
+ [turnId]: next
707
+ }
708
+ };
709
+ }
710
+ function putTask(state, task) {
711
+ return state.tasks[task.taskId] === task ? state : {
712
+ ...state,
713
+ tasks: {
714
+ ...state.tasks,
715
+ [task.taskId]: task
716
+ }
717
+ };
718
+ }
719
+ function putTaskCall(task, call) {
720
+ return task.calls[call.callId] === call ? task : {
721
+ ...task,
722
+ calls: {
723
+ ...task.calls,
724
+ [call.callId]: call
725
+ }
726
+ };
727
+ }
728
+ function putCall(state, call) {
729
+ return state.calls[call.callId] === call ? state : {
730
+ ...state,
731
+ calls: {
732
+ ...state.calls,
733
+ [call.callId]: call
734
+ }
735
+ };
736
+ }
737
+ function updateTask(state, taskId, update) {
738
+ const task = state.tasks[taskId];
739
+ if (task === void 0) return state;
740
+ return putTask(state, update(task));
741
+ }
742
+ function updateCall(state, callId, update) {
743
+ const call = state.calls[callId];
744
+ if (call === void 0) return state;
745
+ return putCall(state, update(call));
746
+ }
747
+ const SETTLED_CALL_STATUSES = /* @__PURE__ */ new Set([
748
+ "completed",
749
+ "failed",
750
+ "rejected",
751
+ "cancelled"
752
+ ]);
753
+ function isSettledCallStatus(status) {
754
+ return SETTLED_CALL_STATUSES.has(status);
755
+ }
756
+ function settleCall(call, status, error) {
757
+ if (call.taskId !== void 0 || isSettledCallStatus(call.status)) return call;
758
+ const { requestId: _requestId, error: _error, ...rest } = call;
759
+ const settled = {
760
+ ...rest,
761
+ status
762
+ };
763
+ if (call.requestId !== void 0) settled.requestId = call.requestId;
764
+ if (error !== void 0) settled.error = error;
765
+ return settled;
766
+ }
767
+ function actionName(action) {
768
+ switch (action.kind) {
769
+ case "load-skill": return "load_skill";
770
+ case "subagent-call":
771
+ case "remote-agent-call": return action.name;
772
+ case "tool-call":
773
+ case "workflow-tool-call": return action.toolName;
774
+ }
775
+ }
776
+ function resultName(result) {
777
+ switch (result.kind) {
778
+ case "load-skill-result": return "load_skill";
779
+ case "subagent-result": return result.subagentName;
780
+ default: return result.toolName;
781
+ }
782
+ }
783
+ function callStatusAfterApproval(outcome) {
784
+ switch (outcome) {
785
+ case "approved": return "running";
786
+ case "denied": return "rejected";
787
+ case "cancelled": return "cancelled";
788
+ default: return;
789
+ }
790
+ }
791
+ const TOOL_EXECUTION_DENIED = "TOOL_EXECUTION_DENIED";
792
+ function foldSession(state, event) {
793
+ const typed = event;
794
+ switch (typed.type) {
795
+ case "session.started": return state.started ? state : {
796
+ ...state,
797
+ started: true
798
+ };
799
+ case "turn.started": {
800
+ const { sequence, turnId } = typed.data;
801
+ const turn = {
802
+ turnId,
803
+ sequence,
804
+ status: "active"
805
+ };
806
+ return {
807
+ ...state,
808
+ activeTurnId: turnId,
809
+ nextSequence: Math.max(state.nextSequence, sequence + 1),
810
+ turns: {
811
+ ...state.turns,
812
+ [turnId]: turn
813
+ }
814
+ };
815
+ }
816
+ case "step.started": return updateTurn(state, typed.data.turnId, (turn) => {
817
+ if (!turn.waiting && turn.stepIndex === typed.data.stepIndex) return turn;
818
+ const { waiting: _waiting, ...rest } = turn;
819
+ return {
820
+ ...rest,
821
+ stepIndex: typed.data.stepIndex
822
+ };
823
+ });
824
+ case "turn.waiting": return updateTurn(state, typed.data.turnId, (turn) => turn.status === "active" && !turn.waiting ? {
825
+ ...turn,
826
+ waiting: true
827
+ } : turn);
828
+ case "message.appended":
829
+ case "message.completed":
830
+ case "result.completed":
831
+ if (!(typed.type === "message.appended" ? typed.data.messageDelta.length > 0 : typed.type === "message.completed" ? (typed.data.message?.length ?? 0) > 0 : true)) return state;
832
+ return updateTurn(state, typed.data.turnId, (turn) => turn.outputStarted ? turn : {
833
+ ...turn,
834
+ outputStarted: true
835
+ });
836
+ case "turn.completed":
837
+ case "turn.cancelled":
838
+ case "turn.failed": {
839
+ const { turnId } = typed.data;
840
+ const status = typed.type === "turn.completed" ? "completed" : typed.type === "turn.failed" ? "failed" : "cancelled";
841
+ const { waiting: _waiting, ...rest } = state.turns[turnId] ?? {
842
+ turnId,
843
+ sequence: typed.data.sequence
844
+ };
845
+ return {
846
+ ...state,
847
+ activeTurnId: state.activeTurnId === turnId ? void 0 : state.activeTurnId,
848
+ turns: {
849
+ ...state.turns,
850
+ [turnId]: {
851
+ ...rest,
852
+ status
853
+ }
854
+ }
855
+ };
856
+ }
857
+ case "context.cleared": return {
858
+ ...state,
859
+ calls: Object.fromEntries(Object.entries(state.calls).filter(([, call]) => call.taskId !== void 0))
860
+ };
861
+ case "session.waiting": return state.activeTurnId === void 0 ? state : {
862
+ ...state,
863
+ activeTurnId: void 0
864
+ };
865
+ case "session.completed":
866
+ case "session.failed": {
867
+ const { activeTurnId: _activeTurnId, ...rest } = state;
868
+ return {
869
+ ...rest,
870
+ ended: true
871
+ };
872
+ }
873
+ case "actions.requested": {
874
+ let calls;
875
+ for (const action of typed.data.actions) {
876
+ if (state.calls[action.callId] !== void 0) continue;
877
+ calls ??= { ...state.calls };
878
+ calls[action.callId] = {
879
+ callId: action.callId,
880
+ name: actionName(action),
881
+ turnId: typed.data.turnId,
882
+ stepIndex: typed.data.stepIndex,
883
+ status: "running"
884
+ };
885
+ }
886
+ return calls === void 0 ? state : {
887
+ ...state,
888
+ calls
889
+ };
890
+ }
891
+ case "action.result": {
892
+ const { result, status, error } = typed.data;
893
+ const call = state.calls[result.callId];
894
+ if (call?.taskId !== void 0) return state;
895
+ const settled = status === "rejected" || error?.code === TOOL_EXECUTION_DENIED ? "rejected" : status === "failed" || result.isError === true ? "failed" : "completed";
896
+ if (call === void 0) {
897
+ const unannounced = {
898
+ callId: result.callId,
899
+ name: resultName(result),
900
+ turnId: typed.data.turnId,
901
+ stepIndex: typed.data.stepIndex,
902
+ status: settled
903
+ };
904
+ if (error !== void 0) unannounced.error = error;
905
+ return putCall(state, unannounced);
906
+ }
907
+ return updateCall(state, result.callId, (current) => settleCall(current, settled, error));
908
+ }
909
+ case "task.started": {
910
+ const { callId, kind, name, taskId, turnId } = typed.data;
911
+ const task = state.tasks[taskId] ?? {
912
+ taskId,
913
+ name,
914
+ kind,
915
+ calls: {}
916
+ };
917
+ let next = state;
918
+ if (task.calls[callId] === void 0) next = putTask(next, putTaskCall(task, {
919
+ callId,
920
+ turnId,
921
+ status: "working"
922
+ }));
923
+ const call = next.calls[callId];
924
+ if (call?.taskId === taskId) return next;
925
+ const linked = {
926
+ callId,
927
+ name: call?.name ?? name,
928
+ stepIndex: call?.stepIndex ?? 0,
929
+ taskId,
930
+ turnId: call?.turnId ?? turnId
931
+ };
932
+ if (call?.requestId !== void 0) linked.requestId = call.requestId;
933
+ return putCall(next, linked);
934
+ }
935
+ case "task.settled": {
936
+ const { callId, error, output, status, taskId } = typed.data;
937
+ return updateTask(state, taskId, (task) => {
938
+ const call = task.calls[callId];
939
+ if (call === void 0 || call.status !== "working") return task;
940
+ const settled = {
941
+ callId,
942
+ turnId: call.turnId,
943
+ status
944
+ };
945
+ return putTaskCall(task, status === "completed" && output !== void 0 ? {
946
+ ...settled,
947
+ output
948
+ } : status === "failed" && error !== void 0 ? {
949
+ ...settled,
950
+ error
951
+ } : settled);
952
+ });
953
+ }
954
+ case "input.requested": {
955
+ const inputs = { ...state.inputs };
956
+ let calls;
957
+ for (const request of typed.data.requests) {
958
+ if (inputs[request.requestId] !== void 0) continue;
959
+ const input = {
960
+ request,
961
+ sequence: typed.data.sequence,
962
+ turnId: typed.data.turnId,
963
+ stepIndex: typed.data.stepIndex,
964
+ status: "open"
965
+ };
966
+ if (typed.data.taskId !== void 0) input.taskId = typed.data.taskId;
967
+ if (typed.data.callId !== void 0) input.callId = typed.data.callId;
968
+ inputs[request.requestId] = input;
969
+ if (request.kind !== "tool-approval" || isRelayed(typed.data)) continue;
970
+ const { callId, toolName } = request.action;
971
+ calls ??= { ...state.calls };
972
+ const call = calls[callId];
973
+ if (call?.taskId !== void 0) continue;
974
+ if (call !== void 0 && isSettledCallStatus(call.status)) continue;
975
+ calls[callId] = {
976
+ ...call ?? {
977
+ callId,
978
+ name: toolName,
979
+ turnId: typed.data.turnId,
980
+ stepIndex: typed.data.stepIndex
981
+ },
982
+ requestId: request.requestId,
983
+ status: "awaiting-input"
984
+ };
985
+ }
986
+ return calls === void 0 ? {
987
+ ...state,
988
+ inputs
989
+ } : {
990
+ ...state,
991
+ calls,
992
+ inputs
993
+ };
994
+ }
995
+ case "approval.candidate": {
996
+ const { candidateId, outcome, requestId } = typed.data;
997
+ state = {
998
+ ...state,
999
+ candidates: {
1000
+ ...state.candidates,
1001
+ [candidateId]: {
1002
+ candidateId,
1003
+ outcome,
1004
+ requestId
1005
+ }
1006
+ }
1007
+ };
1008
+ const current = state.inputs[typed.data.requestId];
1009
+ if (current === void 0 || current.status === "settled") return state;
1010
+ if (typed.data.outcome === "pending" || current.status === "open") return state;
1011
+ const { response: _response, ...rest } = current;
1012
+ return {
1013
+ ...state,
1014
+ inputs: {
1015
+ ...state.inputs,
1016
+ [typed.data.requestId]: {
1017
+ ...rest,
1018
+ status: "open"
1019
+ }
1020
+ }
1021
+ };
1022
+ }
1023
+ case "approval.settled": {
1024
+ const current = state.inputs[typed.data.requestId];
1025
+ if (current === void 0 || current.status === "settled") return state;
1026
+ const outcome = typed.data.outcome === "approved" ? "approved" : "denied";
1027
+ return settleApprovalCall({
1028
+ ...state,
1029
+ inputs: {
1030
+ ...state.inputs,
1031
+ [typed.data.requestId]: {
1032
+ ...current,
1033
+ status: "settled",
1034
+ outcome
1035
+ }
1036
+ }
1037
+ }, current, outcome);
1038
+ }
1039
+ case "input.resolved": {
1040
+ let next = state;
1041
+ for (const resolution of typed.data.resolutions) {
1042
+ const current = next.inputs[resolution.requestId];
1043
+ if (current === void 0 || current.status === "settled") continue;
1044
+ const response = resolution.response ?? current.response;
1045
+ const settled = {
1046
+ ...current,
1047
+ status: "settled",
1048
+ outcome: resolution.outcome
1049
+ };
1050
+ if (response !== void 0) settled.response = response;
1051
+ next = {
1052
+ ...next,
1053
+ inputs: {
1054
+ ...next.inputs,
1055
+ [resolution.requestId]: settled
1056
+ }
1057
+ };
1058
+ next = settleApprovalCall(next, current, resolution.outcome);
1059
+ }
1060
+ return next;
1061
+ }
1062
+ case "authorization.required": {
1063
+ const attemptId = typed.data.attemptId ?? typed.data.name;
1064
+ const authorization = {
1065
+ attemptId,
1066
+ name: typed.data.name,
1067
+ sequence: typed.data.sequence,
1068
+ turnId: typed.data.turnId,
1069
+ stepIndex: typed.data.stepIndex,
1070
+ status: "required"
1071
+ };
1072
+ if (typed.data.taskId !== void 0) authorization.taskId = typed.data.taskId;
1073
+ if (typed.data.principalId !== void 0) authorization.principalId = typed.data.principalId;
1074
+ if (typed.data.candidateId !== void 0) authorization.candidateId = typed.data.candidateId;
1075
+ if (typed.data.webhookUrl !== void 0) authorization.awaitsCallback = true;
1076
+ return {
1077
+ ...state,
1078
+ authorizations: {
1079
+ ...state.authorizations,
1080
+ [attemptId]: authorization
1081
+ }
1082
+ };
1083
+ }
1084
+ case "authorization.completed": {
1085
+ const attemptId = typed.data.attemptId ?? typed.data.name;
1086
+ const completed = {
1087
+ ...state.authorizations[attemptId] ?? {
1088
+ attemptId,
1089
+ name: typed.data.name,
1090
+ sequence: typed.data.sequence,
1091
+ turnId: typed.data.turnId,
1092
+ stepIndex: typed.data.stepIndex
1093
+ },
1094
+ status: typed.data.outcome
1095
+ };
1096
+ return {
1097
+ ...state,
1098
+ authorizations: {
1099
+ ...state.authorizations,
1100
+ [attemptId]: completed
1101
+ }
1102
+ };
1103
+ }
1104
+ default: return state;
1105
+ }
1106
+ }
1107
+ function isRelayed(request) {
1108
+ return request.callId !== void 0 || request.taskId !== void 0;
1109
+ }
1110
+ function settleApprovalCall(state, input, outcome) {
1111
+ if (input.request.kind !== "tool-approval" || isRelayed(input)) return state;
1112
+ const status = callStatusAfterApproval(outcome);
1113
+ if (status === void 0) return state;
1114
+ return updateCall(state, input.request.action.callId, (call) => {
1115
+ if (call.status !== "awaiting-input" || call.requestId !== input.request.requestId) return call;
1116
+ return status === "running" ? {
1117
+ ...call,
1118
+ status
1119
+ } : settleCall(call, status);
1120
+ });
1121
+ }
1122
+ function openInputs(state) {
1123
+ return Object.values(state.inputs).filter((input) => input.status !== "settled");
1124
+ }
1125
+ function openSignIns(state) {
1126
+ return Object.values(state.authorizations).filter((attempt) => attempt.status === "required");
1127
+ }
1128
+ function callStatus(state, callId, options = {}) {
1129
+ const call = state.calls[callId];
1130
+ if (call === void 0) return void 0;
1131
+ const status = reportedCallStatus(state, call);
1132
+ if (status !== "running" || call.taskId !== void 0) return status;
1133
+ const turn = state.turns[call.turnId];
1134
+ if (options.streaming === false || turn !== void 0 && turn.status !== "active") return "interrupted";
1135
+ return status;
1136
+ }
1137
+ function reportedCallStatus(state, call) {
1138
+ if (call.taskId === void 0) return call.status;
1139
+ const status = state.tasks[call.taskId]?.calls[call.callId]?.status;
1140
+ return status === void 0 || status === "working" ? "running" : status;
1141
+ }
1142
+
685
1143
  //#endregion
686
1144
  //#region src/client/session-utils.ts
687
1145
  function summarizeTurnEvents(events) {
@@ -714,46 +1172,30 @@ function endsTurnSegment(event, open) {
714
1172
  return isCurrentTurnBoundaryEvent(event) && (event.type !== "session.waiting" || !open.callbacks);
715
1173
  }
716
1174
  var TurnSegment = class {
1175
+ #projection = initialSessionProjection();
717
1176
  #authorizations = /* @__PURE__ */ new Map();
718
1177
  #followCallbacks;
719
- #requests = /* @__PURE__ */ new Map();
720
1178
  constructor(options = {}) {
721
1179
  this.#followCallbacks = options.followCallbacks === true;
722
1180
  }
723
1181
  get inputRequests() {
724
- return [...this.#requests.values()];
1182
+ return openInputs(this.#projection).map((input) => input.request);
725
1183
  }
726
1184
  get pendingAuthorizations() {
727
- return [...this.#authorizations.values()];
1185
+ return openSignIns(this.#projection).flatMap((attempt) => this.#authorizations.get(attempt.attemptId) ?? []);
728
1186
  }
729
1187
  observe(event) {
730
- switch (event.type) {
731
- case "input.requested":
732
- for (const request of event.data.requests) this.#requests.set(request.requestId, request);
733
- break;
734
- case "approval.settled":
735
- this.#requests.delete(event.data.requestId);
736
- break;
737
- case "input.resolved":
738
- for (const resolution of event.data.resolutions) this.#requests.delete(resolution.requestId);
739
- break;
740
- case "authorization.required":
741
- this.#authorizations.set(authorizationKey(event.data), event.data);
742
- break;
743
- case "authorization.completed": this.#authorizations.delete(authorizationKey(event.data));
744
- }
1188
+ this.#projection = foldSession(this.#projection, event);
1189
+ if (event.type === "authorization.required") this.#authorizations.set(event.data.attemptId ?? event.data.name, event.data);
745
1190
  return endsTurnSegment(event, {
746
- callbacks: this.#followCallbacks && [...this.#authorizations.values()].some((authorization) => authorization.webhookUrl !== void 0),
747
- requests: this.#requests.size > 0
1191
+ callbacks: this.#followCallbacks && openSignIns(this.#projection).some((attempt) => attempt.awaitsCallback === true),
1192
+ requests: openInputs(this.#projection).length > 0
748
1193
  });
749
1194
  }
750
1195
  };
751
1196
  function isFinalMessageCompleted(event) {
752
1197
  return event.type === "message.completed" && event.data.finishReason !== "tool-calls";
753
1198
  }
754
- function authorizationKey(data) {
755
- return data.attemptId === void 0 ? `name:${data.name}` : `attempt:${data.attemptId}`;
756
- }
757
1199
 
758
1200
  //#endregion
759
1201
  //#region src/protocol/message-version.ts
@@ -1930,7 +2372,8 @@ var ClientSession = class ClientSession {
1930
2372
  const terminal = event.type === "session.failed" || event.type === "session.completed";
1931
2373
  if (!matches && terminal && (!started || event.type === "session.completed")) throw new Error("The session ended before the accepted message reached its turn boundary.");
1932
2374
  if (!started && !matches) continue;
1933
- if (!terminal && event.meta?.deliveryIds !== void 0 && !matches) continue;
2375
+ const attributed = event.meta?.deliveryIds !== void 0;
2376
+ if (!terminal && attributed && !matches) continue;
1934
2377
  started = true;
1935
2378
  }
1936
2379
  reachedBoundary = segment.observe(event);
@@ -2240,16 +2683,24 @@ var EveAgentProjection = class {
2240
2683
  }
2241
2684
  };
2242
2685
 
2686
+ //#endregion
2687
+ //#region src/client/conversation-projection.ts
2688
+ const projectionKey = Symbol("eve.conversationProjection");
2689
+ function conversationProjection(state) {
2690
+ return state[projectionKey] ?? initialSessionProjection();
2691
+ }
2692
+ function withConversationProjection(state, projection) {
2693
+ if (state[projectionKey] === projection) return state;
2694
+ return Object.defineProperty({ ...state }, projectionKey, { value: projection });
2695
+ }
2696
+
2243
2697
  //#endregion
2244
2698
  //#region src/client/conversation-state.ts
2245
2699
  function openConversationInputs(state) {
2246
2700
  return Object.values(state.inputs).filter((input) => input.status === "open");
2247
2701
  }
2248
- function conversationAuthorizations(state) {
2249
- return state.messages.flatMap((message) => message.role === "assistant" ? message.parts.filter((part) => part.type === "authorization") : []);
2250
- }
2251
2702
  function hasPendingAuthorizations(state) {
2252
- return conversationAuthorizations(state).some((part) => part.state === "required" && part.awaitsCallback === true);
2703
+ return openSignIns(conversationProjection(state)).some((attempt) => attempt.awaitsCallback === true);
2253
2704
  }
2254
2705
  function agentToolTask(state, agent) {
2255
2706
  const task = agent.taskId === void 0 ? void 0 : state.tasks[agent.taskId];
@@ -2656,15 +3107,6 @@ function mergeToolMetadata(current, next) {
2656
3107
  name
2657
3108
  } };
2658
3109
  }
2659
- function approvedApproval(part) {
2660
- if (!part?.approval?.id) return;
2661
- return {
2662
- approved: true,
2663
- id: part.approval.id,
2664
- isAutomatic: part.approval.isAutomatic,
2665
- reason: part.approval.reason
2666
- };
2667
- }
2668
3110
  function normalizeActionRequest(action) {
2669
3111
  const name = actionRequestName(action);
2670
3112
  switch (action.kind) {
@@ -2803,33 +3245,104 @@ function transition(message, input) {
2803
3245
  const messageRun = { transition };
2804
3246
 
2805
3247
  //#endregion
2806
- //#region src/client/message-task-parts.ts
2807
- function createSettledTaskPart(existing, event) {
2808
- const settledPartBase = {
2809
- approval: approvedApproval(existing),
2810
- input: existing.input,
2811
- stepIndex: existing.stepIndex,
2812
- toolCallId: existing.toolCallId,
2813
- toolMetadata: existing.toolMetadata,
2814
- toolName: existing.toolName,
3248
+ //#region src/client/tool-part-state.ts
3249
+ function toolPartState(data, part) {
3250
+ const content = part;
3251
+ const projection = conversationProjection(data);
3252
+ const call = projection.calls[part.toolCallId];
3253
+ const requestId = content.approval?.id;
3254
+ const input = requestId === void 0 ? void 0 : projection.inputs[requestId];
3255
+ const base = {
3256
+ input: part.input,
3257
+ stepIndex: part.stepIndex,
3258
+ toolCallId: part.toolCallId,
3259
+ toolMetadata: part.toolMetadata,
3260
+ toolName: part.toolName,
2815
3261
  type: "dynamic-tool"
2816
3262
  };
2817
- switch (event.data.status) {
3263
+ const requested = requestId === void 0 ? void 0 : {
3264
+ id: requestId,
3265
+ ...content.approval?.isAutomatic !== void 0 && { isAutomatic: content.approval.isAutomatic }
3266
+ };
3267
+ const responded = (approved, reason) => ({
3268
+ ...base,
3269
+ approval: {
3270
+ ...requested,
3271
+ ...approved && { approved: true },
3272
+ ...reason !== void 0 && { reason }
3273
+ },
3274
+ state: "approval-responded"
3275
+ });
3276
+ const approvedTrue = requested === void 0 ? void 0 : {
3277
+ ...requested,
3278
+ approved: true
3279
+ };
3280
+ if (requested !== void 0 && input !== void 0 && input.status !== "settled" && (call === void 0 || !isSettledCallStatus(reportedCallStatus(projection, call)))) return {
3281
+ ...base,
3282
+ approval: requested,
3283
+ state: "approval-requested"
3284
+ };
3285
+ const task = call?.taskId === void 0 ? void 0 : projection.tasks[call.taskId]?.calls[part.toolCallId];
3286
+ if (call === void 0) {
3287
+ if (input === void 0) return part;
3288
+ return input.response === void 0 ? {
3289
+ ...base,
3290
+ output: { status: input.outcome },
3291
+ state: "output-available"
3292
+ } : responded(input.outcome === "approved", input.response.text);
3293
+ }
3294
+ switch (reportedCallStatus(projection, call)) {
3295
+ case "running":
3296
+ case "awaiting-input":
3297
+ if (content.partial === true) return {
3298
+ ...base,
3299
+ approval: approvedTrue,
3300
+ output: content.output,
3301
+ partial: true,
3302
+ state: "output-available"
3303
+ };
3304
+ if (input !== void 0 && (input.outcome === "approved" || input.response !== void 0)) return responded(input.outcome === "approved", input.response?.text);
3305
+ return {
3306
+ ...base,
3307
+ state: "input-available"
3308
+ };
2818
3309
  case "completed": return {
2819
- ...settledPartBase,
2820
- output: event.data.output,
3310
+ ...base,
3311
+ approval: approvedTrue,
3312
+ output: task?.output ?? content.output,
2821
3313
  state: "output-available"
2822
3314
  };
2823
3315
  case "failed": return {
2824
- ...settledPartBase,
2825
- errorText: event.data.error?.message ?? "Task failed.",
3316
+ ...base,
3317
+ approval: approvedTrue,
3318
+ errorText: task?.error?.message ?? content.errorText ?? call.error?.message ?? (call.taskId === void 0 ? "Action failed." : "Task failed."),
2826
3319
  state: "output-error"
2827
3320
  };
2828
- case "cancelled": return {
2829
- ...settledPartBase,
2830
- errorText: "Task was cancelled.",
2831
- state: "output-error"
3321
+ case "rejected": return {
3322
+ ...base,
3323
+ approval: {
3324
+ id: requestId ?? part.toolCallId,
3325
+ approved: false,
3326
+ reason: call.error?.message ?? content.errorText
3327
+ },
3328
+ state: "output-denied"
2832
3329
  };
3330
+ case "cancelled":
3331
+ if (requestId !== void 0 && input?.outcome === "cancelled") return {
3332
+ ...base,
3333
+ approval: {
3334
+ id: requestId,
3335
+ approved: false,
3336
+ reason: "Tool execution was cancelled."
3337
+ },
3338
+ state: "output-denied"
3339
+ };
3340
+ return {
3341
+ ...base,
3342
+ approval: approvedTrue,
3343
+ errorText: call.taskId === void 0 ? content.errorText ?? call.error?.message ?? "Action was cancelled." : "Task was cancelled.",
3344
+ state: "output-error"
3345
+ };
2833
3346
  }
2834
3347
  }
2835
3348
 
@@ -2841,7 +3354,7 @@ function receivedMessageEventId(event) {
2841
3354
  function defaultMessageReducer() {
2842
3355
  return {
2843
3356
  initial() {
2844
- return { messages: [] };
3357
+ return withConversationProjection({ messages: [] }, initialSessionProjection());
2845
3358
  },
2846
3359
  reduce(data, event) {
2847
3360
  return reduceMessageData(data, event);
@@ -2849,6 +3362,12 @@ function defaultMessageReducer() {
2849
3362
  };
2850
3363
  }
2851
3364
  function reduceMessageData(data, event) {
3365
+ const projection = foldSession(conversationProjection(data), event);
3366
+ const content = withConversationProjection(reduceContent(data, event), projection);
3367
+ const callIds = toolCallIds(content, event);
3368
+ return withConversationProjection(callIds.length === 0 ? content : withToolPartStates(content, callIds), projection);
3369
+ }
3370
+ function reduceContent(data, event) {
2852
3371
  switch (event.type) {
2853
3372
  case "client.message.submitted":
2854
3373
  case "client.message.failed": return upsertMessage(data, {
@@ -2863,11 +3382,6 @@ function reduceMessageData(data, event) {
2863
3382
  }],
2864
3383
  role: "user"
2865
3384
  }, event.data.turnId);
2866
- case "input.resolved": {
2867
- let next = data;
2868
- for (const resolution of event.data.resolutions) next = resolveInputRequest(next, resolution);
2869
- return next;
2870
- }
2871
3385
  case "message.received": return upsertMessage(data, {
2872
3386
  id: `${receivedMessageEventId(event)}:user`,
2873
3387
  metadata: {
@@ -2901,9 +3415,10 @@ function reduceMessageData(data, event) {
2901
3415
  case "action.input.appended": {
2902
3416
  const existing = findToolPart(data, event.data.callId);
2903
3417
  if (existing !== void 0 && existing.state !== "input-streaming") return data;
2904
- const nextPart = {
3418
+ const inputText = (existing?.state === "input-streaming" ? existing.inputText : "") + event.data.inputTextDelta;
3419
+ return upsertToolPart(data, event.data.turnId, event.data.stepIndex, {
2905
3420
  input: void 0,
2906
- inputText: (existing?.state === "input-streaming" ? existing.inputText : "") + event.data.inputTextDelta,
3421
+ inputText,
2907
3422
  state: "input-streaming",
2908
3423
  stepIndex: event.data.stepIndex,
2909
3424
  toolCallId: event.data.callId,
@@ -2913,8 +3428,7 @@ function reduceMessageData(data, event) {
2913
3428
  } },
2914
3429
  toolName: event.data.toolName,
2915
3430
  type: "dynamic-tool"
2916
- };
2917
- return upsertToolPart(data, event.data.turnId, event.data.stepIndex, nextPart);
3431
+ });
2918
3432
  }
2919
3433
  case "actions.requested": {
2920
3434
  let next = data;
@@ -2941,10 +3455,11 @@ function reduceMessageData(data, event) {
2941
3455
  if (existing?.approval?.id === request.requestId || existing !== void 0 && isSettledToolPart(existing)) continue;
2942
3456
  const descriptor = normalizeActionRequest(request.action);
2943
3457
  next = updateAssistantMessage(next, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), {
3458
+ ...existing,
2944
3459
  approval: { id: request.requestId },
2945
3460
  input: request.action.input,
2946
3461
  state: "approval-requested",
2947
- stepIndex: event.data.stepIndex,
3462
+ stepIndex: existing?.stepIndex ?? event.data.stepIndex,
2948
3463
  toolCallId: request.action.callId,
2949
3464
  toolMetadata: createToolMetadata(descriptor, { inputRequest: toMessageInputRequest(request) }),
2950
3465
  toolName: descriptor.toolName,
@@ -2953,97 +3468,75 @@ function reduceMessageData(data, event) {
2953
3468
  }
2954
3469
  return next;
2955
3470
  }
2956
- case "approval.candidate": return data;
2957
- case "approval.settled": {
2958
- const existing = findToolPartByApprovalId(data, event.data.requestId);
2959
- if (existing === void 0) return data;
2960
- if (event.data.outcome === "approved") {
2961
- const approval = {
2962
- approved: true,
2963
- id: event.data.requestId,
2964
- reason: void 0
2965
- };
2966
- return updateToolPart(data, existing.toolCallId, existing.state === "output-available" ? {
2967
- ...existing,
2968
- approval
2969
- } : {
2970
- ...toolPartIdentity(existing),
2971
- approval,
2972
- state: "approval-responded"
2973
- });
2974
- }
2975
- if (existing.state === "output-available") return data;
2976
- return updateToolPart(data, existing.toolCallId, {
2977
- ...toolPartIdentity(existing),
2978
- approval: {
2979
- approved: false,
2980
- id: event.data.requestId,
2981
- reason: "Tool execution was cancelled."
2982
- },
2983
- state: "output-denied"
2984
- });
2985
- }
2986
3471
  case "action.result": {
2987
- const descriptor = normalizeActionResult(event.data.result);
3472
+ if (conversationProjection(data).calls[event.data.result.callId]?.taskId !== void 0) return data;
2988
3473
  const existing = findToolPart(data, event.data.result.callId);
2989
- const denied = event.data.status === "rejected" || event.data.error?.code === "TOOL_EXECUTION_DENIED";
2990
- const failed = event.data.status === "failed" && !denied;
2991
- const approvalId = existing?.approval?.id ?? event.data.result.callId;
2992
- const toolMetadata = mergeToolMetadata(existing?.toolMetadata, createToolMetadata(descriptor));
2993
- const resultPartBase = {
3474
+ const descriptor = normalizeActionResult(event.data.result);
3475
+ const succeeded = event.data.status === void 0 || event.data.status === "completed" ? event.data.result.isError !== true && event.data.error === void 0 : false;
3476
+ const part = {
3477
+ ...existing,
2994
3478
  input: existing?.input,
2995
- stepIndex: event.data.stepIndex,
3479
+ stepIndex: existing?.stepIndex ?? event.data.stepIndex,
2996
3480
  toolCallId: event.data.result.callId,
2997
- toolMetadata,
3481
+ toolMetadata: mergeToolMetadata(existing?.toolMetadata, createToolMetadata(descriptor)),
2998
3482
  toolName: existing?.toolName ?? descriptor.toolName,
2999
3483
  type: "dynamic-tool"
3000
3484
  };
3001
- let nextPart;
3002
- if (denied) nextPart = {
3003
- ...resultPartBase,
3004
- approval: {
3005
- approved: false,
3006
- id: approvalId,
3007
- reason: event.data.error?.message
3008
- },
3009
- state: "output-denied"
3010
- };
3011
- else if (failed) nextPart = {
3012
- ...resultPartBase,
3013
- approval: approvedApproval(existing),
3485
+ const outcome = succeeded ? {
3486
+ errorText: void 0,
3487
+ output: event.data.result.output
3488
+ } : {
3014
3489
  errorText: event.data.error?.message ?? stringifyUnknown(event.data.result.output),
3015
- state: "output-error"
3490
+ output: void 0
3016
3491
  };
3017
- else nextPart = {
3018
- ...resultPartBase,
3019
- approval: approvedApproval(existing),
3020
- output: event.data.result.output,
3021
- state: "output-available"
3022
- };
3023
- return upsertToolPart(data, event.data.turnId, event.data.stepIndex, nextPart);
3492
+ return upsertToolPart(data, event.data.turnId, event.data.stepIndex, {
3493
+ ...part,
3494
+ ...outcome,
3495
+ partial: void 0
3496
+ });
3024
3497
  }
3025
3498
  case "action.partial": {
3026
3499
  const existing = findToolPart(data, event.data.result.callId);
3027
3500
  if (existing !== void 0 && isSettledToolPart(existing)) return data;
3028
3501
  const descriptor = normalizeActionResult(event.data.result);
3029
- const nextPart = {
3030
- approval: approvedApproval(existing),
3502
+ return upsertToolPart(data, event.data.turnId, event.data.stepIndex, {
3503
+ ...existing,
3031
3504
  input: existing?.input,
3032
3505
  output: event.data.result.output,
3033
3506
  partial: true,
3034
3507
  state: "output-available",
3035
- stepIndex: event.data.stepIndex,
3508
+ stepIndex: existing?.stepIndex ?? event.data.stepIndex,
3036
3509
  toolCallId: event.data.result.callId,
3037
3510
  toolMetadata: mergeToolMetadata(existing?.toolMetadata, createToolMetadata(descriptor)),
3038
3511
  toolName: existing?.toolName ?? descriptor.toolName,
3039
3512
  type: "dynamic-tool"
3040
- };
3041
- return upsertToolPart(data, event.data.turnId, event.data.stepIndex, nextPart);
3513
+ });
3514
+ }
3515
+ case "input.resolved": {
3516
+ let next = data;
3517
+ for (const { requestId, response } of event.data.resolutions) {
3518
+ const existing = response === void 0 ? void 0 : findToolPartByApprovalId(next, requestId);
3519
+ if (existing === void 0) continue;
3520
+ next = replaceToolPart(next, {
3521
+ ...existing,
3522
+ toolMetadata: mergeToolMetadata(existing.toolMetadata, { eve: {
3523
+ inputResponse: response,
3524
+ kind: existing.toolMetadata?.eve?.kind ?? "unknown",
3525
+ name: existing.toolMetadata?.eve?.name ?? existing.toolName
3526
+ } })
3527
+ });
3528
+ }
3529
+ return next;
3042
3530
  }
3043
3531
  case "task.settled": {
3044
3532
  const existing = findToolPart(data, event.data.callId);
3045
3533
  if (existing === void 0) return data;
3046
- return replaceToolPart(data, createSettledTaskPart(existing, event));
3534
+ const { error, output, status } = event.data;
3535
+ const outcome = status === "completed" ? { output } : { errorText: error?.message };
3536
+ return replaceToolPart(data, {
3537
+ ...existing,
3538
+ ...outcome
3539
+ });
3047
3540
  }
3048
3541
  case "authorization.required": return updateAssistantMessage(data, event.data.turnId, (message) => upsertPart(ensureStepStartPart(message, event.data.stepIndex), createAuthorizationRequiredPart(event)));
3049
3542
  case "authorization.completed": return completeAuthorization(data, event);
@@ -3068,24 +3561,10 @@ function reduceMessageData(data, event) {
3068
3561
  result: event.data.result
3069
3562
  }
3070
3563
  }));
3071
- case "turn.completed": return updateAssistantMessage(data, event.data.turnId, (message) => ({
3072
- ...message,
3073
- metadata: {
3074
- ...message.metadata,
3075
- status: "complete"
3076
- },
3077
- parts: removeStreamingToolParts(closeStreamingRuns(message.parts))
3078
- }));
3079
- case "turn.cancelled": return updateAssistantMessage(data, event.data.turnId, (message) => ({
3080
- ...message,
3081
- metadata: {
3082
- ...message.metadata,
3083
- status: "complete"
3084
- },
3085
- parts: removeStreamingToolParts(closeStreamingRuns(message.parts))
3086
- }));
3564
+ case "turn.completed":
3565
+ case "turn.cancelled":
3087
3566
  case "turn.failed":
3088
- if (data.messages.find((message) => message.role === "assistant" && message.metadata?.turnId === event.data.turnId) === void 0) return data;
3567
+ if (event.type === "turn.failed" && !data.messages.some((message) => message.role === "assistant" && message.metadata?.turnId === event.data.turnId)) return data;
3089
3568
  return updateAssistantMessage(data, event.data.turnId, (message) => ({
3090
3569
  ...message,
3091
3570
  metadata: {
@@ -3094,10 +3573,33 @@ function reduceMessageData(data, event) {
3094
3573
  },
3095
3574
  parts: removeStreamingToolParts(closeStreamingRuns(message.parts))
3096
3575
  }));
3097
- case "session.failed": return data;
3098
3576
  default: return data;
3099
3577
  }
3100
3578
  }
3579
+ function toolCallIds(data, event) {
3580
+ const byRequest = (requestId) => findToolPartByApprovalId(data, requestId)?.toolCallId ?? [];
3581
+ switch (event.type) {
3582
+ case "actions.requested": return event.data.actions.map((action) => action.callId);
3583
+ case "input.requested": return event.data.requests.map((request) => request.action.callId);
3584
+ case "action.result":
3585
+ case "action.partial": return [event.data.result.callId];
3586
+ case "task.started":
3587
+ case "task.settled": return [event.data.callId];
3588
+ case "input.resolved": return event.data.resolutions.flatMap((resolution) => byRequest(resolution.requestId));
3589
+ case "approval.settled": return [byRequest(event.data.requestId)].flat();
3590
+ default: return [];
3591
+ }
3592
+ }
3593
+ function withToolPartStates(data, callIds) {
3594
+ let next = data;
3595
+ for (const callId of new Set(callIds)) {
3596
+ const part = findToolPart(next, callId);
3597
+ if (part === void 0) continue;
3598
+ const derived = toolPartState(next, part);
3599
+ if (derived !== part) next = withConversationProjection(replaceToolPart(next, derived), conversationProjection(data));
3600
+ }
3601
+ return next;
3602
+ }
3101
3603
  function closeStreamingRuns(parts, stepIndex) {
3102
3604
  return parts.map((part) => (part.type === "text" || part.type === "reasoning") && part.state === "streaming" && (stepIndex === void 0 || part.stepIndex === stepIndex) ? {
3103
3605
  ...part,
@@ -3107,50 +3609,6 @@ function closeStreamingRuns(parts, stepIndex) {
3107
3609
  function removeStreamingToolParts(parts) {
3108
3610
  return parts.filter((part) => part.type !== "dynamic-tool" || part.state !== "input-streaming");
3109
3611
  }
3110
- function respondToInputRequest(data, response) {
3111
- const existing = findToolPartByApprovalId(data, response.requestId);
3112
- if (!existing) return data;
3113
- const approval = { id: response.requestId };
3114
- if (response.text !== void 0) approval.reason = response.text;
3115
- const toolMetadata = mergeToolMetadata(existing.toolMetadata, { eve: {
3116
- inputResponse: response,
3117
- kind: existing.toolMetadata?.eve?.kind ?? "unknown",
3118
- name: existing.toolMetadata?.eve?.name ?? existing.toolName
3119
- } });
3120
- return updateToolPart(data, existing.toolCallId, existing.state === "output-available" ? {
3121
- ...existing,
3122
- approval: {
3123
- ...approval,
3124
- approved: true
3125
- },
3126
- toolMetadata
3127
- } : {
3128
- ...toolPartIdentity(existing),
3129
- approval,
3130
- state: "approval-responded",
3131
- toolMetadata
3132
- });
3133
- }
3134
- function resolveInputRequest(data, resolution) {
3135
- if (resolution.response !== void 0) return findToolPartByApprovalId(data, resolution.requestId)?.approval?.approved === void 0 ? respondToInputRequest(data, resolution.response) : data;
3136
- const existing = findToolPartByApprovalId(data, resolution.requestId);
3137
- if (!existing) return data;
3138
- return updateToolPart(data, existing.toolCallId, {
3139
- ...toolPartIdentity(existing),
3140
- output: { status: resolution.outcome },
3141
- state: "output-available"
3142
- });
3143
- }
3144
- function toolPartIdentity(part) {
3145
- return {
3146
- input: part.input,
3147
- stepIndex: part.stepIndex,
3148
- toolCallId: part.toolCallId,
3149
- toolMetadata: part.toolMetadata,
3150
- toolName: part.toolName,
3151
- type: part.type
3152
- };
3153
- }
3154
3612
  function updateAssistantMessage(data, turnId, update) {
3155
3613
  const message = data.messages.find((message) => message.role === "assistant" && message.metadata?.turnId === turnId) ?? createAssistantMessage(turnId);
3156
3614
  return upsertMessage(data, update(message));
@@ -3236,37 +3694,13 @@ function findToolPartByApprovalId(data, approvalId) {
3236
3694
  //#endregion
3237
3695
  //#region src/client/conversation-reducer.ts
3238
3696
  function initialConversationState() {
3239
- return {
3240
- messages: [],
3697
+ return withConversationProjection({
3241
3698
  turns: {},
3242
3699
  inputs: {},
3243
3700
  tasks: {},
3701
+ messages: [],
3244
3702
  agents: {}
3245
- };
3246
- }
3247
- function updateTurn(state, turnId, update) {
3248
- const turn = state.turns[turnId];
3249
- if (turn === void 0) return state;
3250
- const next = update(turn);
3251
- return next === turn ? state : {
3252
- ...state,
3253
- turns: {
3254
- ...state.turns,
3255
- [turnId]: next
3256
- }
3257
- };
3258
- }
3259
- function updateTask(state, taskId, update) {
3260
- const task = state.tasks[taskId];
3261
- if (task === void 0) return state;
3262
- const next = update(task);
3263
- return next === task ? state : {
3264
- ...state,
3265
- tasks: {
3266
- ...state.tasks,
3267
- [taskId]: next
3268
- }
3269
- };
3703
+ }, initialSessionProjection());
3270
3704
  }
3271
3705
  function updateObservation(state, sessionId, update) {
3272
3706
  const agent = state.agents[sessionId];
@@ -3289,99 +3723,6 @@ function observedConversation(observation) {
3289
3723
  }
3290
3724
  function reduceConversationLifecycle(state, event) {
3291
3725
  switch (event.type) {
3292
- case "turn.started": return {
3293
- ...state,
3294
- activeTurnId: event.data.turnId,
3295
- turns: {
3296
- ...state.turns,
3297
- [event.data.turnId]: {
3298
- turnId: event.data.turnId,
3299
- status: "active"
3300
- }
3301
- }
3302
- };
3303
- case "turn.waiting": return updateTurn(state, event.data.turnId, (turn) => turn.status === "active" && !turn.waiting ? {
3304
- ...turn,
3305
- waiting: true
3306
- } : turn);
3307
- case "step.started": return updateTurn(state, event.data.turnId, (turn) => turn.waiting ? {
3308
- turnId: turn.turnId,
3309
- status: turn.status
3310
- } : turn);
3311
- case "turn.completed":
3312
- case "turn.cancelled":
3313
- case "turn.failed": {
3314
- const { turnId } = event.data;
3315
- return {
3316
- ...state,
3317
- activeTurnId: state.activeTurnId === turnId ? void 0 : state.activeTurnId,
3318
- turns: {
3319
- ...state.turns,
3320
- [turnId]: {
3321
- turnId,
3322
- status: event.type === "turn.completed" ? "completed" : event.type === "turn.failed" ? "failed" : "cancelled"
3323
- }
3324
- }
3325
- };
3326
- }
3327
- case "session.waiting":
3328
- case "session.completed":
3329
- case "session.failed": return state.activeTurnId === void 0 ? state : {
3330
- ...state,
3331
- activeTurnId: void 0
3332
- };
3333
- case "task.started": {
3334
- const { callId, kind, name, taskId, turnId } = event.data;
3335
- const task = state.tasks[taskId] ?? {
3336
- taskId,
3337
- name,
3338
- kind,
3339
- calls: {}
3340
- };
3341
- if (task.calls[callId] !== void 0) return state;
3342
- return {
3343
- ...state,
3344
- tasks: {
3345
- ...state.tasks,
3346
- [taskId]: {
3347
- ...task,
3348
- calls: {
3349
- ...task.calls,
3350
- [callId]: {
3351
- callId,
3352
- turnId,
3353
- status: "working"
3354
- }
3355
- }
3356
- }
3357
- }
3358
- };
3359
- }
3360
- case "task.settled": {
3361
- const { callId, error, output, status, taskId } = event.data;
3362
- return updateTask(state, taskId, (task) => {
3363
- const call = task.calls[callId];
3364
- if (call === void 0 || call.status !== "working") return task;
3365
- const settled = {
3366
- callId,
3367
- turnId: call.turnId,
3368
- status
3369
- };
3370
- return {
3371
- ...task,
3372
- calls: {
3373
- ...task.calls,
3374
- [callId]: status === "completed" && output !== void 0 ? {
3375
- ...settled,
3376
- output
3377
- } : status === "failed" && error !== void 0 ? {
3378
- ...settled,
3379
- error
3380
- } : settled
3381
- }
3382
- };
3383
- });
3384
- }
3385
3726
  case "agent.started": {
3386
3727
  const { callId, name, sessionId, taskId, turnId } = event.data;
3387
3728
  if (state.agents[sessionId] !== void 0) return state;
@@ -3393,31 +3734,13 @@ function reduceConversationLifecycle(state, event) {
3393
3734
  observation: { status: "not-followed" }
3394
3735
  };
3395
3736
  if (taskId !== void 0) agent.taskId = taskId;
3396
- return {
3737
+ return withConversationProjection({
3397
3738
  ...state,
3398
3739
  agents: {
3399
3740
  ...state.agents,
3400
3741
  [sessionId]: agent
3401
3742
  }
3402
- };
3403
- }
3404
- case "input.requested": {
3405
- const inputs = { ...state.inputs };
3406
- for (const request of event.data.requests) {
3407
- if (inputs[request.requestId] !== void 0) continue;
3408
- const input = {
3409
- request,
3410
- turnId: event.data.turnId,
3411
- stepIndex: event.data.stepIndex,
3412
- status: "open"
3413
- };
3414
- if (event.data.taskId !== void 0) input.taskId = event.data.taskId;
3415
- inputs[request.requestId] = input;
3416
- }
3417
- return {
3418
- ...state,
3419
- inputs
3420
- };
3743
+ }, conversationProjection(state));
3421
3744
  }
3422
3745
  case "client.input.responded": {
3423
3746
  const inputs = { ...state.inputs };
@@ -3430,64 +3753,33 @@ function reduceConversationLifecycle(state, event) {
3430
3753
  status: "responded"
3431
3754
  };
3432
3755
  }
3433
- return {
3434
- ...state,
3435
- inputs
3436
- };
3437
- }
3438
- case "approval.candidate": {
3439
- const current = state.inputs[event.data.requestId];
3440
- if (current === void 0 || current.status === "settled") return state;
3441
- if (event.data.outcome === "pending") return state;
3442
- return {
3443
- ...state,
3444
- inputs: {
3445
- ...state.inputs,
3446
- [event.data.requestId]: {
3447
- ...current,
3448
- status: "open",
3449
- response: void 0
3450
- }
3451
- }
3452
- };
3453
- }
3454
- case "approval.settled": {
3455
- const current = state.inputs[event.data.requestId];
3456
- if (current === void 0 || current.status === "settled") return state;
3457
- return {
3458
- ...state,
3459
- inputs: {
3460
- ...state.inputs,
3461
- [event.data.requestId]: {
3462
- ...current,
3463
- status: "settled",
3464
- outcome: event.data.outcome
3465
- }
3466
- }
3467
- };
3468
- }
3469
- case "input.resolved": {
3470
- const inputs = { ...state.inputs };
3471
- for (const resolution of event.data.resolutions) {
3472
- const current = inputs[resolution.requestId];
3473
- if (current === void 0 || current.status === "settled") continue;
3474
- inputs[resolution.requestId] = {
3756
+ const projection = conversationProjection(state);
3757
+ const projectedInputs = { ...projection.inputs };
3758
+ for (const response of event.data.responses) {
3759
+ const current = projectedInputs[response.requestId];
3760
+ if (current?.status === "open") projectedInputs[response.requestId] = {
3475
3761
  ...current,
3476
- status: "settled",
3477
- outcome: resolution.outcome,
3478
- response: resolution.response ?? current.response
3762
+ response,
3763
+ status: "responded"
3479
3764
  };
3480
3765
  }
3481
- return {
3766
+ return withConversationProjection({
3482
3767
  ...state,
3483
3768
  inputs
3484
- };
3769
+ }, {
3770
+ ...projection,
3771
+ inputs: projectedInputs
3772
+ });
3485
3773
  }
3486
3774
  default: return state;
3487
3775
  }
3488
3776
  }
3489
3777
  const messageReducer = defaultMessageReducer();
3490
3778
  function reduceConversation(state, event) {
3779
+ const next = reduceConversationEvent(state, event);
3780
+ return event.type.startsWith("client.agent.") ? withConversationProjection(next, conversationProjection(state)) : next;
3781
+ }
3782
+ function reduceConversationEvent(state, event) {
3491
3783
  switch (event.type) {
3492
3784
  case "client.agent.following": return updateObservation(state, event.data.sessionId, (observation) => observation.status === "following" ? observation : {
3493
3785
  status: "following",
@@ -3508,13 +3800,31 @@ function reduceConversation(state, event) {
3508
3800
  conversation
3509
3801
  };
3510
3802
  });
3511
- default: {
3512
- const projected = messageReducer.reduce(state, event);
3513
- return reduceConversationLifecycle({
3514
- ...state,
3515
- ...projected
3516
- }, event);
3517
- }
3803
+ default:
3804
+ const messages = messageReducer.reduce(state, event);
3805
+ const projection = conversationProjection(messages);
3806
+ const { activeTurnId: _activeTurnId, ...rest } = state;
3807
+ const { activeTurnId: _messageTurnId, ...messageData } = messages;
3808
+ const conversation = {
3809
+ ...rest,
3810
+ ...messageData,
3811
+ turns: Object.fromEntries(Object.entries(projection.turns).map(([id, turn]) => {
3812
+ const { turnId, status, waiting } = turn;
3813
+ const publicTurn = {
3814
+ turnId,
3815
+ status
3816
+ };
3817
+ if (waiting !== void 0) publicTurn.waiting = waiting;
3818
+ return [id, publicTurn];
3819
+ })),
3820
+ inputs: Object.fromEntries(Object.entries(projection.inputs).map(([id, input]) => {
3821
+ const { sequence: _sequence, callId: _callId, ...publicInput } = input;
3822
+ return [id, publicInput];
3823
+ })),
3824
+ tasks: projection.tasks
3825
+ };
3826
+ if (projection.activeTurnId !== void 0) conversation.activeTurnId = projection.activeTurnId;
3827
+ return reduceConversationLifecycle(withConversationProjection(conversation, projection), event);
3518
3828
  }
3519
3829
  }
3520
3830
  const canonicalConversationReducer = {
@@ -4411,4 +4721,4 @@ function useEveAgent(options = {}) {
4411
4721
  }
4412
4722
 
4413
4723
  //#endregion
4414
- export { openConversationInputs as i, conversationReducer as n, defaultMessageReducer as r, useEveAgent as t };
4724
+ export { conversationProjection as a, openConversationInputs as i, conversationReducer as n, callStatus as o, defaultMessageReducer as r, useEveAgent as t };