eve 0.69.0 → 0.70.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 (361) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/src/acp/adapter.js +1 -1
  3. package/dist/src/channel/task-card.d.ts +3 -3
  4. package/dist/src/channel/task-card.js +1 -1
  5. package/dist/src/channel/types.d.ts +18 -0
  6. package/dist/src/chunks/{use-eve-agent-Dab2MnT2.js → use-eve-agent-CJQeE7-t.js} +1873 -1236
  7. package/dist/src/chunks/{use-eve-agent-D_5129A9.js → use-eve-agent-DdemtY6C.js} +1874 -1234
  8. package/dist/src/cli/dev/command.js +1 -1
  9. package/dist/src/cli/dev/console-records-preload.d.ts +1 -0
  10. package/dist/src/cli/dev/console-records-preload.js +1 -0
  11. package/dist/src/cli/dev/console-records.d.ts +17 -0
  12. package/dist/src/cli/dev/console-records.js +3 -0
  13. package/dist/src/cli/dev/diagnostic-sink.d.ts +1 -0
  14. package/dist/src/cli/dev/local-server-process.js +1 -1
  15. package/dist/src/cli/dev/tui/blocks.d.ts +2 -1
  16. package/dist/src/cli/dev/tui/blocks.js +3 -3
  17. package/dist/src/cli/dev/tui/conversation-view.d.ts +54 -0
  18. package/dist/src/cli/dev/tui/conversation-view.js +1 -0
  19. package/dist/src/cli/dev/tui/flow-drawer.d.ts +5 -2
  20. package/dist/src/cli/dev/tui/flow-drawer.js +1 -1
  21. package/dist/src/cli/dev/tui/log-display-mode.d.ts +4 -10
  22. package/dist/src/cli/dev/tui/log-display-mode.js +1 -1
  23. package/dist/src/cli/dev/tui/message-queue.d.ts +7 -63
  24. package/dist/src/cli/dev/tui/message-queue.js +3 -1
  25. package/dist/src/cli/dev/tui/prompt-commands.d.ts +7 -7
  26. package/dist/src/cli/dev/tui/prompt-commands.js +1 -1
  27. package/dist/src/cli/dev/tui/question-panel.d.ts +3 -1
  28. package/dist/src/cli/dev/tui/question-panel.js +1 -1
  29. package/dist/src/cli/dev/tui/runner.d.ts +58 -195
  30. package/dist/src/cli/dev/tui/runner.js +3 -3
  31. package/dist/src/cli/dev/tui/task-activity.d.ts +11 -24
  32. package/dist/src/cli/dev/tui/task-activity.js +1 -1
  33. package/dist/src/cli/dev/tui/task-records.d.ts +17 -0
  34. package/dist/src/cli/dev/tui/task-records.js +1 -0
  35. package/dist/src/cli/dev/tui/terminal-renderer.d.ts +15 -37
  36. package/dist/src/cli/dev/tui/terminal-renderer.js +10 -13
  37. package/dist/src/cli/dev/tui/terminal-tool-part.d.ts +2 -0
  38. package/dist/src/cli/dev/tui/terminal-tool-part.js +1 -0
  39. package/dist/src/cli/dev/tui/test/fake-eve-server.d.ts +34 -0
  40. package/dist/src/cli/dev/tui/test/fake-eve-server.js +1 -0
  41. package/dist/src/cli/dev/tui/test/index.d.ts +1 -0
  42. package/dist/src/cli/dev/tui/test/index.js +1 -1
  43. package/dist/src/cli/dev/tui/tool-block-groups.js +1 -1
  44. package/dist/src/cli/dev/tui/tool-presentation.d.ts +1 -0
  45. package/dist/src/cli/dev/tui/tool-presentation.js +1 -1
  46. package/dist/src/cli/dev/tui/tool-rows.d.ts +1 -0
  47. package/dist/src/cli/dev/tui/tool-rows.js +2 -2
  48. package/dist/src/cli/dev/tui/transcript-parts.d.ts +81 -0
  49. package/dist/src/cli/dev/tui/transcript-parts.js +3 -0
  50. package/dist/src/cli/dev/tui/transcript.d.ts +47 -0
  51. package/dist/src/cli/dev/tui/transcript.js +1 -0
  52. package/dist/src/cli/dev/tui/tui.js +1 -1
  53. package/dist/src/cli/dev/tui/turn-clock.d.ts +11 -26
  54. package/dist/src/cli/dev/tui/turn-clock.js +1 -1
  55. package/dist/src/cli/dev/tui/types.d.ts +2 -4
  56. package/dist/src/cli/dev/ui-options.js +1 -1
  57. package/dist/src/client/agent-stream-follower.d.ts +26 -0
  58. package/dist/src/client/agent-stream-follower.js +1 -0
  59. package/dist/src/client/authorization-message-parts.js +1 -1
  60. package/dist/src/client/conversation-client.d.ts +40 -0
  61. package/dist/src/client/conversation-client.js +1 -0
  62. package/dist/src/client/conversation-reducer.d.ts +29 -0
  63. package/dist/src/client/conversation-reducer.js +1 -0
  64. package/dist/src/client/conversation-state.d.ts +110 -0
  65. package/dist/src/client/conversation-state.js +1 -0
  66. package/dist/src/client/eve-agent-projection.d.ts +24 -7
  67. package/dist/src/client/eve-agent-projection.js +1 -1
  68. package/dist/src/client/eve-agent-store-helpers.d.ts +21 -2
  69. package/dist/src/client/eve-agent-store-helpers.js +2 -2
  70. package/dist/src/client/eve-agent-store-state.d.ts +15 -3
  71. package/dist/src/client/eve-agent-store.d.ts +10 -1
  72. package/dist/src/client/eve-agent-store.js +1 -1
  73. package/dist/src/client/index.d.ts +4 -1
  74. package/dist/src/client/index.js +1 -1
  75. package/dist/src/client/message-reducer-primitives.d.ts +1 -2
  76. package/dist/src/client/message-reducer-primitives.js +1 -1
  77. package/dist/src/client/message-reducer-types.d.ts +9 -2
  78. package/dist/src/client/message-reducer.js +1 -1
  79. package/dist/src/client/message-response.js +1 -1
  80. package/dist/src/client/message-run-parts.d.ts +10 -6
  81. package/dist/src/client/message-run-parts.js +1 -1
  82. package/dist/src/client/optimistic-message-submissions.d.ts +6 -4
  83. package/dist/src/client/optimistic-message-submissions.js +1 -1
  84. package/dist/src/client/reducer.d.ts +5 -1
  85. package/dist/src/client/session-turn-dispatch.d.ts +15 -0
  86. package/dist/src/client/session-turn-dispatch.js +1 -0
  87. package/dist/src/client/session-utils.d.ts +27 -10
  88. package/dist/src/client/session-utils.js +1 -1
  89. package/dist/src/client/session.js +1 -1
  90. package/dist/src/client/types.d.ts +2 -1
  91. package/dist/src/compiled/.vendor-stamp.json +2 -2
  92. package/dist/src/compiled/{gray-matter → js-yaml}/LICENSE +2 -2
  93. package/dist/src/compiled/js-yaml/index.d.ts +12 -0
  94. package/dist/src/compiled/js-yaml/index.js +34 -0
  95. package/dist/src/compiler/extension-compatibility.d.ts +18 -18
  96. package/dist/src/compiler/extension-compatibility.js +1 -1
  97. package/dist/src/compiler/load-binding-namespace.js +1 -1
  98. package/dist/src/context/keys.d.ts +5 -2
  99. package/dist/src/context/keys.js +1 -1
  100. package/dist/src/context/provider.d.ts +5 -9
  101. package/dist/src/context/run-step.d.ts +4 -4
  102. package/dist/src/context/run-step.js +1 -1
  103. package/dist/src/context/serialize.d.ts +5 -1
  104. package/dist/src/context/serialize.js +1 -1
  105. package/dist/src/evals/loaders/yaml.js +1 -1
  106. package/dist/src/evals/runner/derive-run-facts.js +1 -1
  107. package/dist/src/evals/runner/execute-task.js +1 -1
  108. package/dist/src/evals/session.js +2 -2
  109. package/dist/src/evals/types.d.ts +16 -0
  110. package/dist/src/eve-channel/index.js +1 -1
  111. package/dist/src/execution/agent-sessions/context.d.ts +4 -2
  112. package/dist/src/execution/agent-sessions/context.js +1 -1
  113. package/dist/src/execution/agent-sessions/steps.js +1 -1
  114. package/dist/src/execution/cancelled-model-call-batch.js +1 -1
  115. package/dist/src/execution/coordination-dispatch-shared.d.ts +6 -4
  116. package/dist/src/execution/coordination-dispatch-shared.js +1 -1
  117. package/dist/src/execution/create-session-step.d.ts +4 -2
  118. package/dist/src/execution/create-session-step.js +1 -1
  119. package/dist/src/execution/durable-session-store.d.ts +10 -4
  120. package/dist/src/execution/durable-session-store.js +1 -1
  121. package/dist/src/execution/dynamic-workflow/tool.js +1 -1
  122. package/dist/src/execution/legacy-remote-agent/protocol.d.ts +8 -0
  123. package/dist/src/execution/legacy-remote-agent/protocol.js +1 -1
  124. package/dist/src/execution/legacy-session/completion-step.d.ts +2 -0
  125. package/dist/src/execution/legacy-session/completion-step.js +1 -1
  126. package/dist/src/execution/legacy-session/interrupt-step.js +1 -1
  127. package/dist/src/execution/legacy-session/prepare-step.d.ts +1 -0
  128. package/dist/src/execution/legacy-session/prepare-step.js +1 -1
  129. package/dist/src/execution/legacy-session/snapshot.d.ts +8 -4
  130. package/dist/src/execution/legacy-session/snapshot.js +1 -1
  131. package/dist/src/execution/legacy-session/turn-workflow.js +1 -1
  132. package/dist/src/execution/proxied-deliver-step.js +1 -1
  133. package/dist/src/execution/publish-session-events.d.ts +27 -7
  134. package/dist/src/execution/publish-session-events.js +1 -1
  135. package/dist/src/execution/reconcile-session-continuation-token.d.ts +2 -2
  136. package/dist/src/execution/runtime-context.js +1 -1
  137. package/dist/src/execution/session/active-turn.d.ts +97 -0
  138. package/dist/src/execution/session/active-turn.js +1 -0
  139. package/dist/src/execution/session/checkpoint-migrations.d.ts +23 -0
  140. package/dist/src/execution/session/checkpoint-migrations.js +1 -0
  141. package/dist/src/execution/session/entry.js +1 -1
  142. package/dist/src/execution/session/finalization.js +1 -1
  143. package/dist/src/execution/session/handoff-steps.d.ts +24 -5
  144. package/dist/src/execution/session/handoff-steps.js +1 -1
  145. package/dist/src/execution/session/handoff.d.ts +10 -6
  146. package/dist/src/execution/session/handoff.js +1 -1
  147. package/dist/src/execution/session/input-queue.d.ts +19 -13
  148. package/dist/src/execution/session/input-queue.js +1 -1
  149. package/dist/src/execution/session/next-input.d.ts +2 -10
  150. package/dist/src/execution/session/next-input.js +1 -1
  151. package/dist/src/execution/session/pending-turn-state.d.ts +2 -0
  152. package/dist/src/execution/session/pending-turn-state.js +1 -1
  153. package/dist/src/execution/session/program.d.ts +2 -0
  154. package/dist/src/execution/session/program.js +1 -1
  155. package/dist/src/execution/session/state-cursor.d.ts +22 -16
  156. package/dist/src/execution/session/state-cursor.js +1 -1
  157. package/dist/src/execution/session/state-delta.d.ts +8 -1
  158. package/dist/src/execution/session/state-delta.js +1 -1
  159. package/dist/src/execution/session/turn-event-handler.js +1 -1
  160. package/dist/src/execution/session/turn-step-result.js +1 -1
  161. package/dist/src/execution/session/turn-step-types.d.ts +20 -4
  162. package/dist/src/execution/session/turn-step.js +1 -1
  163. package/dist/src/execution/session/turn-waiting-step.js +1 -1
  164. package/dist/src/execution/session/turn.d.ts +22 -3
  165. package/dist/src/execution/session/turn.js +1 -1
  166. package/dist/src/execution/session.d.ts +5 -5
  167. package/dist/src/execution/session.js +2 -2
  168. package/dist/src/execution/settle-cancelled-turn-step.d.ts +5 -4
  169. package/dist/src/execution/settle-cancelled-turn-step.js +1 -1
  170. package/dist/src/execution/tasks/start.d.ts +2 -2
  171. package/dist/src/execution/tasks/task-id-input.d.ts +1 -1
  172. package/dist/src/execution/tasks/task-id-input.js +1 -1
  173. package/dist/src/execution/terminal-session-completion-step.d.ts +2 -0
  174. package/dist/src/execution/terminal-session-completion-step.js +1 -1
  175. package/dist/src/execution/terminal-session-failure-step.d.ts +2 -0
  176. package/dist/src/execution/terminal-session-failure-step.js +1 -1
  177. package/dist/src/execution/tools/agent-router-workflow.js +1 -1
  178. package/dist/src/execution/tools/connection-target.d.ts +5 -0
  179. package/dist/src/execution/tools/connection-target.js +1 -1
  180. package/dist/src/execution/tools/connection-tools.js +2 -2
  181. package/dist/src/execution/tools/workflow/start.d.ts +3 -3
  182. package/dist/src/harness/authorization.d.ts +15 -2
  183. package/dist/src/harness/authorization.js +1 -1
  184. package/dist/src/harness/cancelled-turn-emission.d.ts +2 -1
  185. package/dist/src/harness/cancelled-turn-emission.js +1 -1
  186. package/dist/src/harness/coordination.d.ts +5 -3
  187. package/dist/src/harness/emission.d.ts +5 -2
  188. package/dist/src/harness/emission.js +1 -1
  189. package/dist/src/harness/held-requests.d.ts +18 -0
  190. package/dist/src/harness/held-requests.js +1 -0
  191. package/dist/src/harness/hitl/approval-input-requests.d.ts +16 -0
  192. package/dist/src/harness/hitl/approval-input-requests.js +1 -1
  193. package/dist/src/harness/input-extraction.js +1 -1
  194. package/dist/src/harness/input-requests.d.ts +0 -4
  195. package/dist/src/harness/input-requests.js +1 -1
  196. package/dist/src/harness/model-call-error.js +1 -1
  197. package/dist/src/harness/proxy-input-requests.d.ts +4 -4
  198. package/dist/src/harness/session-limit-enforcement.js +1 -1
  199. package/dist/src/harness/stale-input-responses.js +1 -1
  200. package/dist/src/harness/tool-loop.js +2 -2
  201. package/dist/src/harness/turn-tag-state.d.ts +2 -0
  202. package/dist/src/harness/turn-tag-state.js +1 -1
  203. package/dist/src/harness/types.d.ts +23 -11
  204. package/dist/src/instrumentation/channel-delivery.d.ts +1 -0
  205. package/dist/src/instrumentation/channel-delivery.js +1 -1
  206. package/dist/src/instrumentation/lifecycle.d.ts +4 -0
  207. package/dist/src/instrumentation/memory.d.ts +2 -0
  208. package/dist/src/instrumentation/memory.js +1 -1
  209. package/dist/src/instrumentation/native-events.d.ts +1 -0
  210. package/dist/src/instrumentation/native-events.js +1 -1
  211. package/dist/src/instrumentation/runtime.d.ts +4 -3
  212. package/dist/src/instrumentation/runtime.js +1 -1
  213. package/dist/src/instrumentation/session-init.js +1 -1
  214. package/dist/src/internal/application/package.js +1 -1
  215. package/dist/src/internal/authored-module-loader.d.ts +14 -6
  216. package/dist/src/internal/authored-module-loader.js +1 -1
  217. package/dist/src/internal/authored-package-boundary.d.ts +1 -1
  218. package/dist/src/internal/authored-package-boundary.js +1 -1
  219. package/dist/src/internal/bundler/extension-mount-plugin.js +1 -1
  220. package/dist/src/internal/helpers/frontmatter.d.ts +24 -0
  221. package/dist/src/internal/helpers/frontmatter.js +1 -0
  222. package/dist/src/internal/helpers/markdown.js +1 -3
  223. package/dist/src/internal/nitro/host/create-application-nitro.js +1 -1
  224. package/dist/src/internal/nitro/host/nitro-bundler-config.js +1 -1
  225. package/dist/src/internal/node-esm-compat-banner.js +1 -1
  226. package/dist/src/internal/workflow-bundle/dynamic-remote-agent-transform.js +1 -1
  227. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.d.ts +27 -1
  228. package/dist/src/internal/workflow-bundle/dynamic-tool-ast-references.js +1 -1
  229. package/dist/src/internal/workflow-bundle/dynamic-tool-transform.js +2 -2
  230. package/dist/src/protocol/message.d.ts +41 -3
  231. package/dist/src/protocol/message.js +2 -2
  232. package/dist/src/public/channels/slack/action-status.d.ts +2 -2
  233. package/dist/src/public/channels/slack/action-status.js +1 -1
  234. package/dist/src/public/channels/slack/approval-cards.d.ts +15 -0
  235. package/dist/src/public/channels/slack/approval-cards.js +2 -0
  236. package/dist/src/public/channels/slack/auth.d.ts +2 -0
  237. package/dist/src/public/channels/slack/auth.js +1 -1
  238. package/dist/src/public/channels/slack/connections.d.ts +15 -11
  239. package/dist/src/public/channels/slack/connections.js +1 -1
  240. package/dist/src/public/channels/slack/defaults.d.ts +1 -15
  241. package/dist/src/public/channels/slack/defaults.js +3 -4
  242. package/dist/src/public/channels/slack/hitl.js +1 -1
  243. package/dist/src/public/channels/slack/inbound.d.ts +10 -2
  244. package/dist/src/public/channels/slack/inbound.js +1 -1
  245. package/dist/src/public/channels/slack/index.d.ts +2 -0
  246. package/dist/src/public/channels/slack/index.js +1 -1
  247. package/dist/src/public/channels/slack/input-response.js +1 -1
  248. package/dist/src/public/channels/slack/interaction-cards.js +1 -1
  249. package/dist/src/public/channels/slack/interactions.js +1 -1
  250. package/dist/src/public/channels/slack/limits.d.ts +5 -3
  251. package/dist/src/public/channels/slack/private-approval-delivery.js +1 -1
  252. package/dist/src/public/channels/slack/renderers.d.ts +1 -1
  253. package/dist/src/public/channels/slack/renderers.js +1 -1
  254. package/dist/src/public/channels/slack/reply-delivery.d.ts +72 -0
  255. package/dist/src/public/channels/slack/reply-delivery.js +1 -0
  256. package/dist/src/public/channels/slack/sign-in-cancel.d.ts +20 -0
  257. package/dist/src/public/channels/slack/sign-in-cancel.js +1 -0
  258. package/dist/src/public/channels/slack/slackChannel.d.ts +15 -0
  259. package/dist/src/public/channels/slack/slackChannel.js +1 -1
  260. package/dist/src/public/channels/slack/task-card.js +1 -1
  261. package/dist/src/public/channels/teams/defaults.d.ts +1 -1
  262. package/dist/src/public/channels/teams/defaults.js +2 -2
  263. package/dist/src/public/definitions/channel.d.ts +1 -0
  264. package/dist/src/public/definitions/channel.js +1 -1
  265. package/dist/src/public/definitions/state.d.ts +2 -0
  266. package/dist/src/public/definitions/state.js +1 -1
  267. package/dist/src/public/next/index.js +1 -1
  268. package/dist/src/public/next/server.d.ts +2 -0
  269. package/dist/src/public/next/server.js +1 -2
  270. package/dist/src/public/nuxt/module.d.ts +6 -0
  271. package/dist/src/public/nuxt/module.js +1 -1
  272. package/dist/src/react/index.d.ts +3 -0
  273. package/dist/src/react/index.js +1 -1
  274. package/dist/src/react/use-eve-agent.d.ts +7 -5
  275. package/dist/src/react/use-eve-agent.js +1 -1
  276. package/dist/src/runtime/connections/openapi-spec.d.ts +1 -4
  277. package/dist/src/runtime/connections/openapi-spec.js +1 -1
  278. package/dist/src/runtime/connections/scoped-authorization.d.ts +2 -0
  279. package/dist/src/runtime/connections/scoped-authorization.js +1 -1
  280. package/dist/src/setup/boxes/deploy-project.js +1 -1
  281. package/dist/src/setup/integrations/web/setup.js +6 -2
  282. package/dist/src/setup/scaffold/create/project.js +1 -1
  283. package/dist/src/setup/scaffold/create/web-template.d.ts +5 -5
  284. package/dist/src/setup/scaffold/create/web-template.js +61 -35
  285. package/dist/src/setup/vercel-project-framework.js +1 -1
  286. package/dist/src/shared/display-name.d.ts +15 -0
  287. package/dist/src/shared/display-name.js +1 -0
  288. package/dist/src/shared/framework-eve-server.d.ts +43 -0
  289. package/dist/src/shared/framework-eve-server.js +2 -0
  290. package/dist/src/shared/token-usage.d.ts +2 -0
  291. package/dist/src/shared/token-usage.js +1 -1
  292. package/dist/src/shared/trace-root.d.ts +8 -0
  293. package/dist/src/shared/trace-root.js +1 -0
  294. package/dist/src/subagents/callback-route.js +1 -1
  295. package/dist/src/subagents/hitl-proxy.d.ts +3 -3
  296. package/dist/src/subagents/hitl-proxy.js +1 -1
  297. package/dist/src/subagents/invocation.d.ts +3 -1
  298. package/dist/src/subagents/parent-notification.d.ts +7 -7
  299. package/dist/src/subagents/parent-notification.js +1 -1
  300. package/dist/src/subagents/tool.js +1 -1
  301. package/dist/src/svelte/index.d.ts +3 -0
  302. package/dist/src/svelte/index.js +2 -2
  303. package/dist/src/svelte/use-eve-agent.d.ts +7 -4
  304. package/dist/src/svelte/use-eve-agent.js +1 -1
  305. package/dist/src/tools/provided/ask-question-workflow.js +1 -1
  306. package/dist/src/tools/provided/load-skill.js +1 -1
  307. package/dist/src/tools/provided/sleep-workflow.js +1 -1
  308. package/dist/src/tracing/agent-action-instrumentation.js +1 -1
  309. package/dist/src/tracing/agent-approval-instrumentation.js +1 -1
  310. package/dist/src/tracing/agent-memory-instrumentation.js +1 -1
  311. package/dist/src/tracing/agent-otel-attributes.d.ts +6 -0
  312. package/dist/src/tracing/agent-otel-attributes.js +1 -1
  313. package/dist/src/tracing/agent-otel-provider.js +2 -2
  314. package/dist/src/tracing/agent-otel-runtime-context.d.ts +1 -1
  315. package/dist/src/tracing/agent-otel-runtime-context.js +1 -1
  316. package/dist/src/tracing/agent-otel-session-context.js +1 -1
  317. package/dist/src/tracing/agent-span-contract.js +1 -1
  318. package/dist/src/tracing/agent-tool-instrumentation.js +1 -1
  319. package/dist/src/tracing/agent-trace-context-codec.d.ts +4 -0
  320. package/dist/src/tracing/agent-trace-context-codec.js +1 -1
  321. package/dist/src/tracing/agent-trace-span-processor.js +1 -1
  322. package/dist/src/tracing/agent-trace-state.d.ts +3 -0
  323. package/dist/src/tracing/conversation-context.d.ts +10 -0
  324. package/dist/src/tracing/conversation-context.js +1 -1
  325. package/dist/src/tracing/otel-registration.js +1 -1
  326. package/dist/src/vue/index.d.ts +3 -0
  327. package/dist/src/vue/index.js +2 -2
  328. package/dist/src/vue/use-eve-agent.d.ts +7 -3
  329. package/dist/src/vue/use-eve-agent.js +1 -1
  330. package/docs/channels/slack.mdx +60 -13
  331. package/docs/concepts/built-in-tools.md +3 -2
  332. package/docs/concepts/execution-model-and-durability.mdx +3 -1
  333. package/docs/concepts/sessions-runs-and-streaming.md +4 -4
  334. package/docs/connections/overview.mdx +9 -3
  335. package/docs/evals/reporters.mdx +4 -0
  336. package/docs/extensions.md +15 -3
  337. package/docs/guides/client/streaming.mdx +7 -6
  338. package/docs/guides/deployment/vercel.mdx +2 -1
  339. package/docs/guides/dev-tui.md +17 -17
  340. package/docs/guides/dynamic-capabilities.md +1 -1
  341. package/docs/guides/frontend/nuxt.mdx +24 -4
  342. package/docs/guides/frontend/overview.mdx +44 -38
  343. package/docs/guides/frontend/use-eve-agent-svelte.mdx +4 -10
  344. package/docs/guides/frontend/use-eve-agent-vue.mdx +4 -10
  345. package/docs/guides/instrumentation/otel.mdx +24 -6
  346. package/docs/guides/remote-agents.md +26 -8
  347. package/docs/reference/cli.md +4 -4
  348. package/docs/tools/human-in-the-loop.md +4 -4
  349. package/docs/tools/overview.mdx +1 -1
  350. package/docs/tools/tasks.md +8 -8
  351. package/package.json +2 -2
  352. package/dist/src/cli/dev/tui/steering-stream.d.ts +0 -15
  353. package/dist/src/cli/dev/tui/steering-stream.js +0 -1
  354. package/dist/src/cli/dev/tui/subagent-pump.d.ts +0 -134
  355. package/dist/src/cli/dev/tui/subagent-pump.js +0 -1
  356. package/dist/src/compiled/gray-matter/index.d.ts +0 -62
  357. package/dist/src/compiled/gray-matter/index.js +0 -48
  358. package/dist/src/internal/helpers/gray-matter.d.ts +0 -25
  359. package/dist/src/internal/helpers/gray-matter.js +0 -1
  360. package/dist/src/public/nuxt/dev-server.d.ts +0 -25
  361. package/dist/src/public/nuxt/dev-server.js +0 -1
@@ -0,0 +1,81 @@
1
+ /** Pure pieces of the transcript projection: tool rows, task lines, and agent steps. */
2
+ import type { TaskEntry } from "./task-activity.js";
3
+ import type { ConversationState, ConversationTaskCall, ConversationTask } from "#client/conversation-state.js";
4
+ import type { EveAuthorizationPart, EveDynamicToolPart, EveMessage, EveMessagePart } from "#client/message-reducer-types.js";
5
+ import type { Block, ToolStatus } from "./blocks.js";
6
+ import { type ToolPresentationContext } from "./tool-presentation.js";
7
+ export type ToolState = {
8
+ readonly status: ToolStatus;
9
+ readonly output?: unknown;
10
+ readonly errorText?: string;
11
+ };
12
+ /**
13
+ * A task whose start line is written, named once and never renamed. Calls that reach the task
14
+ * while it works join this record rather than reading as tasks of their own.
15
+ */
16
+ export interface TaskRecord {
17
+ /** The call that started this stretch of the task. */
18
+ readonly callId: string;
19
+ readonly taskId: string;
20
+ /** Every call this record answers, the starting call first. */
21
+ readonly callIds: string[];
22
+ readonly kind: "agent" | "tool";
23
+ readonly name: string;
24
+ readonly toolName: string;
25
+ readonly input: unknown;
26
+ readonly label: string | undefined;
27
+ readonly purpose?: string;
28
+ readonly startedAtMs: number;
29
+ settledAtMs?: number;
30
+ ended: boolean;
31
+ }
32
+ export interface AgentActivity {
33
+ tools: Block[];
34
+ rows: Block[];
35
+ children?: TaskEntry[];
36
+ omittedTasks?: number;
37
+ omittedAttention?: boolean;
38
+ step?: string;
39
+ pending: boolean;
40
+ }
41
+ export declare function taskNeedsApproval(conversation: ConversationState, task: ConversationTask): boolean;
42
+ export declare function startLine(record: TaskRecord): Block;
43
+ /** A later call that reached a working task: a message to it, not a new delegation. */
44
+ export declare function followUpLine(record: TaskRecord, part: EveDynamicToolPart, label: string | undefined): Block;
45
+ export declare function nestedTaskRecord(callId: string, part: EveDynamicToolPart, task: ConversationTask, block: Block): TaskRecord;
46
+ export declare function toolState(part: EveDynamicToolPart, conversation: ConversationState, working: boolean, taskWorking: boolean): ToolState;
47
+ export declare function isActive(status: ToolStatus): boolean;
48
+ export declare function toolBlock(part: EveDynamicToolPart, state: ToolState, context: ToolPresentationContext | undefined): Omit<Block, "kind">;
49
+ /** A task's end line: how long it took and what it did, or why it failed, or that it stopped. */
50
+ export declare function endLine(record: TaskRecord, call: Pick<ConversationTaskCall, "status" | "output" | "error">, childTools: readonly Block[] | undefined,
51
+ /** The theme's `·`, which separates the line's facts. */
52
+ separator: string): Block;
53
+ export declare function labelContext(label: string | undefined): ToolPresentationContext | undefined;
54
+ /** The first line of an agent call's message: what the agent was asked to do. */
55
+ export declare function agentTaskSummary(input: unknown): string;
56
+ export declare function firstLine(text: string): string | undefined;
57
+ export type SubagentStep = {
58
+ readonly key: string;
59
+ /** Where the step ends among its messages' parts, to order it among the agent's tool calls. */
60
+ readonly order: number;
61
+ readonly reasoning: string;
62
+ readonly message: string;
63
+ readonly finalized: boolean;
64
+ };
65
+ /** Pairs each child reply with the reasoning that preceded it. */
66
+ export declare function subagentSteps(messages: readonly EveMessage[]): SubagentStep[];
67
+ export declare function childToolCallIds(conversation: ConversationState): Set<string>;
68
+ /** A tool call, including one whose input is still streaming and so has no kind yet. */
69
+ export declare function isToolCallRow(part: EveMessagePart): part is EveDynamicToolPart;
70
+ /** Every call that started or reached a task, by call ID. */
71
+ export declare function taskCallsById(conversation: ConversationState): Map<string, {
72
+ task: ConversationTask;
73
+ call: ConversationTaskCall;
74
+ }>;
75
+ /** Tools a step runs in parallel settle together, so a finished one waits for its siblings. */
76
+ export declare function activeToolSteps(states: ReadonlyMap<EveDynamicToolPart, ToolState>): Set<number | undefined>;
77
+ export declare function userText(message: EveMessage): string;
78
+ export declare function authorizationTerminalMessage(state: string): string | undefined;
79
+ export declare function formatAuthorization(part: EveAuthorizationPart, terminalMessage: string | undefined): string;
80
+ /** Reads the shared write-file result's `existed` flag, whatever the tool. */
81
+ export declare function writeExistedFlag(output: unknown): boolean | undefined;
@@ -0,0 +1,3 @@
1
+ import{agentDisplayName,agentTaskLabel,presentPreparingTool,presentTool}from"./tool-presentation.js";import{isTerminalToolCallPart}from"./terminal-tool-part.js";import{formatTurnDuration}from"./stream-format.js";import{summarizeChildTools}from"./tool-block-groups.js";import{stripTerminalControls}from"#cli/ui/terminal-text.js";import{agentToolSession}from"#client/conversation-state.js";function taskNeedsApproval(e,t){if(Object.values(e.inputs).some(e=>e.taskId===t.taskId&&e.status===`open`&&e.request.kind===`tool-approval`))return!0;let n=agentToolSession(e,t),r=n?.observation.status===`not-followed`?void 0:n?.observation.conversation;return r!==void 0&&Object.values(r.inputs).some(e=>e.status===`open`&&e.request.kind===`tool-approval`)}function startLine(e){let t=presentTool(e.toolName,e.input,{...labelContext(e.label),isSubagent:e.kind===`agent`});return{kind:`task`,taskKind:e.kind,title:e.kind===`agent`?`Delegate ${agentTaskLabel(e.name)}`:e.name,subtitle:stripTerminalControls(t.subtitle),live:!1}}function followUpLine(e,t,n){if(e.kind===`agent`)return{kind:`task`,taskKind:`agent`,title:`Message ${agentTaskLabel(e.name)}`,subtitle:agentTaskSummary(t.input),live:!1};let r=presentTool(t.toolName,t.input,labelContext(n));return{kind:`task`,taskKind:`tool`,title:stripTerminalControls(r.title),subtitle:stripTerminalControls(r.subtitle),live:!1}}function nestedTaskRecord(e,t,n,r){return{callId:e,taskId:n.taskId,callIds:[t.toolCallId],kind:n.kind,name:n.kind===`agent`?agentDisplayName(stripTerminalControls(t.toolName)):stripTerminalControls(t.toolName),toolName:t.toolName,input:t.input,label:void 0,purpose:n.kind===`agent`?agentTaskSummary(t.input):r.subtitle||(r.title===t.toolName?void 0:r.title),startedAtMs:Date.now(),ended:!1}}function toolState(e,t,n,r){if(r)return{status:`running`};let i=settledToolState(e,t);return i.status===`running`&&!n?{status:`error`,errorText:`interrupted`}:i}function settledToolState(e,t){switch(e.state){case`approval-requested`:{let n=t.inputs[e.approval.id];return n?.status===`responded`?n.response?.optionId===`approve`?{status:`running`}:{status:`denied`,errorText:`Denied by user.`}:{status:`approval`}}case`approval-responded`:return e.approval.approved===!1?{status:`denied`,errorText:e.approval.reason??`Denied by user.`}:{status:`running`};case`output-available`:return e.partial===!0?{status:`running`}:{status:`done`,output:e.output};case`output-error`:return{status:`error`,errorText:e.errorText};case`output-denied`:return{status:`denied`,errorText:e.approval.reason??`Tool execution was cancelled.`};default:return{status:`running`}}}function isActive(e){return e===`running`||e===`approval`}function toolBlock(e,t,n){let{toolName:r,input:i}=e,a=e.state===`input-streaming`?presentPreparingTool(r,n):presentTool(r,i,n),o={title:stripTerminalControls(a.title),subtitle:stripTerminalControls(a.subtitle),status:t.status,toolInput:i,toolName:r,toolGroup:a.group};return a.doneTitle!==void 0&&(o.doneTitle=stripTerminalControls(a.doneTitle)),a.detail!==void 0&&(o.detailLines=a.detail,o.keepDetailWhenDone=a.keepDetailWhenDone===!0),t.output===void 0?t.errorText!==void 0&&(o.result=stripTerminalControls(t.errorText)):(o.result=a.summarizeResult(t.output),o.toolOutput=t.output),o}function endLine(e,t,n,r){let i=` ${r} `,a={id:`task:${e.callId}:end`,kind:`task`,taskKind:e.kind,title:e.kind===`agent`?agentTaskLabel(e.name):e.name,live:!1};switch(t.status){case`completed`:{let r=`finished in ${formatTurnDuration((e.settledAtMs??Date.now())-e.startedAtMs)}`,o=e.kind===`agent`?summarizeChildTools(n??[]):presentTool(e.toolName,e.input,labelContext(e.label)).summarizeResult(t.output);a.status=`done`,a.body=o===void 0||o.length===0?r:`${r}${i}${o}`;break}case`failed`:{let e=firstLine(stripTerminalControls(t.error?.message??``));a.status=`error`,a.body=e===void 0?`failed`:`failed${i}${e}`;break}default:a.status=`denied`,a.body=`stopped`}return a}function labelContext(e){return e===void 0?void 0:{label:e}}function agentTaskSummary(e){if(typeof e!=`object`||!e)return``;let t=Reflect.get(e,`message`);return typeof t==`string`?firstLine(stripTerminalControls(t))??``:``}function firstLine(e){return e.split(/\r?\n/u).find(e=>e.trim().length>0)?.trim()}function subagentSteps(e){let t=[],n=0;for(let r of e){let e=``;for(let[i,a]of r.parts.entries())n+=1,a.type===`reasoning`&&(e+=a.text),a.type===`text`&&(t.push({key:a.id??`${r.id}:${i}`,order:n,reasoning:e,message:a.text,finalized:a.state===`done`}),e=``),a.type===`dynamic-tool`&&e&&(t.push({key:`${r.id}:${i}:reasoning`,order:n-.5,reasoning:e,message:``,finalized:!0}),e=``);e&&t.push({key:`${r.id}:reasoning:${r.parts.length}`,order:n,reasoning:e,message:``,finalized:r.metadata?.status===`complete`})}return t.map(e=>({...e,reasoning:stripTerminalControls(e.reasoning).trim(),message:stripTerminalControls(e.message).trim()})).filter(e=>e.reasoning.length>0||e.message.length>0)}function childToolCallIds(e){let t=new Set;for(let n of Object.values(e.agents))if(n.observation.status!==`not-followed`)for(let e of n.observation.conversation?.messages??[])for(let n of e.parts)n.type===`dynamic-tool`&&t.add(n.toolCallId);return t}function isToolCallRow(e){return e.type===`dynamic-tool`&&(e.state===`input-streaming`||isTerminalToolCallPart(e))}function taskCallsById(e){let t=new Map;for(let n of Object.values(e.tasks))for(let e of Object.values(n.calls))t.set(e.callId,{task:n,call:e});return t}function activeToolSteps(e){let t=new Set;for(let[n,r]of e)isActive(r.status)&&t.add(n.stepIndex);return t}function userText(e){return e.parts.map(e=>e.type===`text`?e.text:e.type===`file`?`[file${e.filename===void 0?``:`: ${e.filename}`}]`:``).filter(e=>e.length>0).join(`
2
+ `)}function authorizationTerminalMessage(e){switch(e){case`authorized`:return`Authorization complete`;case`declined`:return`Authorization declined`;case`failed`:return`Authorization failed`;case`timed-out`:return`Authorization timed out`;default:return}}function formatAuthorization(e,t){let n=[];if(t!==void 0)n.push(t);else{let t=stripTerminalControls(e.description);t.length>0&&n.push(t);let r=e.authorization;r?.url&&n.push(`URL: ${stripTerminalControls(r.url)}`),r?.userCode&&n.push(`Code: ${stripTerminalControls(r.userCode)}`),r?.expiresAt&&n.push(`Expires: ${stripTerminalControls(r.expiresAt)}`),r?.instructions&&n.push(stripTerminalControls(r.instructions))}if(e.state===`completed`&&e.reason!==void 0){let t=stripTerminalControls(e.reason);t.length>0&&n.push(`Reason: ${t}`)}return n.join(`
3
+ `)}function writeExistedFlag(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e.existed;return typeof t==`boolean`?t:void 0}export{activeToolSteps,agentTaskSummary,authorizationTerminalMessage,childToolCallIds,endLine,firstLine,followUpLine,formatAuthorization,isActive,isToolCallRow,labelContext,nestedTaskRecord,startLine,subagentSteps,taskCallsById,taskNeedsApproval,toolBlock,toolState,userText,writeExistedFlag};
@@ -0,0 +1,47 @@
1
+ import { type ConversationState } from "#client/conversation-state.js";
2
+ import type { Block } from "./blocks.js";
3
+ import type { AgentTUIConversationView } from "./conversation-view.js";
4
+ import { type TaskEntry } from "./task-activity.js";
5
+ import type { SubagentDisplayMode, TerminalPartDisplayMode } from "./types.js";
6
+ export interface TranscriptOptions {
7
+ readonly tools: TerminalPartDisplayMode;
8
+ readonly reasoning: TerminalPartDisplayMode;
9
+ readonly subagents: SubagentDisplayMode;
10
+ readonly connectionAuth: TerminalPartDisplayMode;
11
+ /** Names of the agent's local subagents, whose tools read as delegations. */
12
+ readonly subagentNames?: readonly string[];
13
+ /** Where full failure detail is recorded, shown instead of the raw dump. */
14
+ readonly diagnosticsPath?: string;
15
+ /** Separates a task end line's facts; the theme's `·`. */
16
+ readonly dot?: string;
17
+ }
18
+ /** How long a settled agent task waits for its own last events before writing its end line. */
19
+ export declare const TASK_END_GRACE_MS = 2000;
20
+ /**
21
+ * Projects one session's conversation into transcript blocks. Each block's
22
+ * `live` flag says whether its part can still change; the renderer commits a
23
+ * settled prefix to scrollback. Built blocks are reused while their inputs are
24
+ * unchanged, so file-diff bases observe each tool call once, in order.
25
+ *
26
+ * A task writes one line when it starts, at its call, and one when it ends, where the transcript
27
+ * had reached by then; what it does in between is {@link ConversationTranscript.tasks}, which the
28
+ * renderer shows in the task panel above the prompt.
29
+ */
30
+ export declare class ConversationTranscript {
31
+ #private;
32
+ reset(): void;
33
+ /** The tasks between their start and end lines as of the last projection, in start order. */
34
+ get tasks(): readonly TaskEntry[];
35
+ /** Whether a settled agent task is waiting for its own last events. */
36
+ get finishing(): boolean;
37
+ /** How input requests name the task that asked: as its task lines do. */
38
+ taskLabel(conversation: ConversationState, taskId: string): string | undefined;
39
+ /** End lines for the tasks still working when their session ends; they read as stopped. */
40
+ stopWorking(options: TranscriptOptions): Block[];
41
+ project(view: AgentTUIConversationView, options: TranscriptOptions): Block[];
42
+ }
43
+ /**
44
+ * Running tools and the live turn's model activity, for the turn bar. A session parked on a
45
+ * sign-in names its connections, and a turn parked on its tasks names them.
46
+ */
47
+ export declare function turnActivity(view: AgentTUIConversationView, tasks: readonly TaskEntry[]): string;
@@ -0,0 +1 @@
1
+ import{FileContentCache}from"./file-content-cache.js";import{agentDisplayName,agentTaskLabel,isPanelRoutedTool,readWriteFileInput,toolBaseName}from"./tool-presentation.js";import{isTerminalToolCallPart}from"./terminal-tool-part.js";import{activeToolSteps,authorizationTerminalMessage,childToolCallIds,endLine,firstLine,followUpLine,formatAuthorization,isActive,isToolCallRow,nestedTaskRecord,startLine,subagentSteps,taskCallsById,taskNeedsApproval,toolBlock,toolState,userText,writeExistedFlag}from"./transcript-parts.js";import{signInLabel,waitingLabel}from"./task-activity.js";import{TaskRecords}from"./task-records.js";import{isTaskControlTool}from"#protocol/task-tools.js";import{stripTerminalControls}from"#cli/ui/terminal-text.js";import{agentCallTurns,agentToolSession,conversationAuthorizations,isAgentCallContentPending}from"#client/conversation-state.js";import{authorizationKey}from"#client/session-utils.js";const TASK_END_GRACE_MS=2e3;var ConversationTranscript=class{#e=new Map;#t=new FileContentCache;#n=new Map;#r=new Map;#i=new Set;#a=new TaskRecords;#o=new Map;#s=[];#c=new Set;#l=[];reset(){this.#e=new Map,this.#t.clear(),this.#n.clear(),this.#r=new Map,this.#i.clear(),this.#a.clear(),this.#o.clear(),this.#s=[],this.#c.clear(),this.#l=[]}get tasks(){return this.#l}get finishing(){return this.#l.some(e=>e.finishing===!0)}taskLabel(e,t){let n=e.tasks[t];if(n===void 0)return;let r=Object.values(n.calls),i=r.findLast(e=>e.status===`working`)??r.at(-1),a=i===void 0?void 0:this.#a.get(i.callId);return a===void 0?n.kind===`agent`?agentTaskLabel(agentDisplayName(stripTerminalControls(n.name))):stripTerminalControls(n.name):a.kind===`agent`?agentTaskLabel(a.name):a.name}stopWorking(e){let t=[];for(let n of this.#a.values())n.ended||(n.ended=!0,t.push(endLine(n,{status:`cancelled`},void 0,e.dot??`·`)));return this.#l=[],t}project(e,t){let{conversation:n,working:r}=e,i=Date.now(),a=[];this.#h(n.messages);let o=childToolCallIds(n),s=taskCallsById(n),c=new Set(e.data.withdrawnCallIds),l=e.data.toolLabels;for(let e of n.messages){if(e.role===`user`){let t=this.#g(e);t!==void 0&&a.push(t);continue}let u=e.parts.filter(e=>isToolCallRow(e)&&(e.state!==`input-streaming`||r)&&!isTaskControlTool(e.toolName)&&!c.has(e.toolCallId)&&e.toolMetadata?.eve?.inputRequest?.kind!==`session-limit`&&!s.has(e.toolCallId)&&!o.has(e.toolCallId)&&!isPanelRoutedTool(e.toolName)),d=new Map(u.map(e=>[e,toolState(e,n,r,!1)])),f=activeToolSteps(d);for(let[n,o]of e.parts.entries())if(o.type===`text`||o.type===`reasoning`){let i=this.#_(e,n,t,r);i!==void 0&&a.push(i)}else if(o.type===`authorization`)t.connectionAuth!==`hidden`&&a.push(this.#v(o));else if(o.type===`dynamic-tool`){let e=s.get(o.toolCallId);if(e!==void 0){let n=this.#d(o,e.task,l,t,i);n!==void 0&&a.push(n);continue}let n=d.get(o);if(n===void 0||t.tools===`hidden`)continue;let r=l[o.toolCallId];a.push(this.#y(o,n,f.has(o.stepIndex),r,t))}let p=e.metadata?.turnId;p!==void 0&&n.turns[p]?.status===`cancelled`&&a.push(this.#m(`cancelled:${p}`,[],()=>({kind:`notice`,body:`Cancelled.`,live:!1})))}for(let[n,r]of e.failures.entries())a.push(this.#b(n,r,t));let u=this.#u(a),d=this.#f(e,s,t,i);for(let e of d){let t=u.slice(-8).map(e=>e.id);this.#s.push({block:e,after:t}),this.#c.add(e.id),u.push(e)}return u}#u(e){let t=[...e];for(let{block:e,after:n}of this.#s){let r=t.length;for(let e=n.length-1;e>=0;--e){let i=t.findIndex(t=>t.id===n[e]);if(i!==-1){r=i+1;break}}t.splice(r,0,e)}return t}#d(e,t,n,r,i){if(!(t.kind===`agent`?r.subagents!==`hidden`:r.tools!==`hidden`))return;let a=n[e.toolCallId]?.start,o=this.#a.record(e,t,a,i);return o.callId===e.toolCallId?this.#m(`task:${o.callId}:start`,[o],()=>startLine(o)):this.#m(`task:${e.toolCallId}:message`,[o],()=>followUpLine(o,e,a))}#f(e,t,n,r){let{conversation:i,working:a}=e,o=Object.values(i.turns).at(-1),s=!a&&(e.data.sessionFailed||o?.status===`cancelled`||o?.status===`failed`),c=[],l=[],u={remaining:128};for(let e of this.#a.values()){if(e.ended)continue;let o=t.get(e.callId)?.task;if(o===void 0)continue;let d=e.callIds.flatMap(e=>{let n=t.get(e)?.call;return n===void 0?[]:[n]}),f=d.at(-1),p=this.#p(e,o,d,i,n,u);if(n.subagents===`full`)for(let e of p.rows)this.#c.has(e.id)||c.push(e);let m=d.every(e=>e.status!==`working`);m&&(e.settledAtMs??=r);let h=m&&p.pending&&a&&r-(e.settledAtMs??r)<2e3;if(m&&!h||!m&&s){e.ended=!0,c.push(endLine(e,m?f:{status:`cancelled`},p.tools,n.dot??`·`));continue}let g={callId:e.callId,kind:e.kind,name:e.name,toolName:e.toolName,input:e.input,label:e.label,purpose:e.purpose,children:p.children,omittedTasks:p.omittedTasks,omittedAttention:p.omittedAttention,startedAtMs:e.startedAtMs,childTools:new Map(p.tools.map(e=>[e.id,e]))};p.step!==void 0&&(g.step=p.step),h&&(g.finishing=!0),l.push(g)}return this.#l=l,c}#p(e,t,n,r,i,a,o=0){let s=t.kind===`agent`?agentToolSession(r,t):void 0,c=s===void 0||s.observation.status===`not-followed`?void 0:s.observation.conversation;if(s===void 0||c===void 0)return{tools:[],rows:[],pending:!1};let l=s.observation.status===`following`&&n.some(e=>isAgentCallContentPending(t,e,c)),u=agentCallTurns(t,c),d=new Set(n.flatMap(e=>u.get(e.callId)??[])),f=c.messages.filter(e=>e.role===`assistant`&&e.metadata?.turnId!==void 0&&d.has(e.metadata.turnId)),p=n.some(e=>e.status===`working`)||l,m=taskCallsById(c),h=[],g=[],_=[],v=new Set,y=0,b=!1,x=0;for(let t of f)for(let n of t.parts){if(x+=1,!isToolCallRow(n)||isTaskControlTool(n.toolName))continue;let t=m.get(n.toolCallId),r=toolState(n,c,p,t?.call.status===`working`),s=`subagent:${e.callId}:tool:${n.toolCallId}`,l=this.#m(s,[n,r.status,e.name],()=>{let a=this.#x(n.toolCallId,n,r,i,{isSubagent:t?.task.kind===`agent`});return{...toolBlock(n,r,a),kind:`subagent-tool`,subagentCallId:e.callId,agentName:e.name,depth:1,live:!1}}),u=t?.task.kind===`agent`?i.subagents!==`hidden`:i.tools!==`hidden`;if(t?.call.status===`working`&&u){if(v.has(t.task.taskId))continue;if(v.add(t.task.taskId),o>=8||a.remaining<=0){y+=1,b||=r.status===`approval`||taskNeedsApproval(c,t.task);continue}--a.remaining;let s=`${e.callId}/${n.toolCallId}`,u=this.#o.get(s);u===void 0&&(u=nestedTaskRecord(s,n,t.task,l),this.#o.set(s,u));let d=this.#p(u,t.task,Object.values(t.task.calls).filter(e=>e.status===`working`),c,i,a,o+1);_.push({...u,step:d.step,children:d.children,omittedTasks:d.omittedTasks,omittedAttention:d.omittedAttention,childTools:new Map(d.tools.map(e=>[e.id,e]))})}else g.push(l);h.push({order:x,block:l,settled:!isActive(r.status)})}let S=subagentSteps(f);for(let t of S){if(!t.finalized)continue;let n=`subagent:${e.callId}:step:${t.key}`,r=this.#m(n,[t.reasoning,t.message,e.name],()=>{let n={kind:`subagent-step`,subagentCallId:e.callId,agentName:e.name,depth:1,body:t.message,live:!1};return t.reasoning.length>0&&(n.reasoning=t.reasoning),n});h.push({order:t.order,block:r,settled:!0})}let C=h.filter(e=>e.settled).sort((e,t)=>e.order-t.order).map(e=>e.block),w=S.at(-1),T={tools:g,rows:C,children:_,omittedTasks:y,omittedAttention:b,pending:l};return w!==void 0&&(T.step=firstLine(w.message)??`Thinking`),T}#m(e,t,n){let r=this.#e.get(e);if(r!==void 0&&sameKey(r.key,t))return r.block;let i={...n(),id:e};return this.#e.set(e,{key:t,block:i}),i}#h(e){let t=new Map;for(let n of e)n.role===`user`&&n.metadata?.optimistic===!0&&t.set(n.id,userText(n));let n=[...this.#r].filter(([e])=>!t.has(e)),r=new Set(t.values());for(let t of e){if(t.role!==`user`||t.metadata?.optimistic===!0||this.#i.has(t.id))continue;let e=userText(t),i=n.findIndex(([,t])=>t===e);i===-1&&r.has(e)||(this.#i.add(t.id),i!==-1&&(this.#n.set(t.id,n[i][0]),n.splice(i,1)))}this.#r=t}#g(e){if(e.metadata?.optimistic!==!0&&!this.#i.has(e.id))return;let t=stripTerminalControls(userText(e));if(t.trim().length===0)return;let n=`user:${this.#n.get(e.id)??e.id}`;return this.#m(n,[t],()=>({kind:`user`,body:t,live:!1}))}#_(e,t,n,r){let i=e.parts[t];if(i?.type!==`text`&&i?.type!==`reasoning`||i.type===`reasoning`&&n.reasoning!==`full`)return;let a=stripTerminalControls(i.text).trim();if(a.length===0)return;let o=i.state===`streaming`&&r,s=`${i.type}:${i.id??`${e.id}:${t}`}`;return this.#m(s,[a,o],()=>i.type===`text`?{kind:`assistant`,body:a,live:o}:{kind:`reasoning`,body:a,collapsed:!1,live:o})}#v(e){return this.#m(`connection-auth:${authorizationKey(e)}`,[e],()=>{let t=e.state===`completed`?e.outcome:e.state,n=authorizationTerminalMessage(t);return{kind:`connection-auth`,title:`${stripTerminalControls(e.name)} · authorization · ${t}`,body:formatAuthorization(e,n),preformatted:!0,live:n===void 0}})}#y(e,t,n,r,i){let a=n||isActive(t.status);return this.#m(`tool:${e.toolCallId}`,[e,t.status,a,i.tools,i.subagentNames,r],()=>{let n=this.#x(e.toolCallId,e,t,i,{label:r?.start,completeLabel:r?.complete});return{...toolBlock(e,t,n),kind:`tool`,live:a,expanded:i.tools===`full`}})}#b(e,t,n){let{message:r,hint:i,detail:a}=t;return this.#m(`failure:${e}`,[r,i,a],()=>{let e={kind:`error`,title:`Error`,body:stripTerminalControls(r),live:!1};return i!==void 0&&(e.hint=stripTerminalControls(i)),a!==void 0&&(e.detail=n.diagnosticsPath===void 0?stripTerminalControls(a):`details: ${n.diagnosticsPath}`),e})}#x(e,t,n,r,i={}){n.output!==void 0&&this.#t.observeRead(n.output);let a={};(i.isSubagent===!0||r.subagentNames?.includes(toolBaseName(t.toolName))===!0)&&(a.isSubagent=!0),i.label!==void 0&&(a.label=i.label),i.completeLabel!==void 0&&(a.completeLabel=i.completeLabel);let o=readWriteFileInput(t.toolName,t.input);if(o!==void 0){let t=this.#t.observeWrite({...o,callId:e});t!==void 0&&(a.previousContent=t);let r=writeExistedFlag(n.output);r!==void 0&&(a.existed=r)}return Object.keys(a).length>0?a:void 0}};function turnActivity(e,t){let{conversation:n}=e,r=n.activeTurnId===void 0?void 0:n.turns[n.activeTurnId],i=e.conversation.messages.findLast(e=>e.role===`assistant`),a=taskCallsById(n);if(i?.parts.some(e=>isTerminalToolCallPart(e)&&!isTaskControlTool(e.toolName)&&!a.has(e.toolCallId)&&(e.state===`input-available`||e.state===`approval-responded`))===!0)return`Running`;if(r===void 0||r.waiting===!0){let e=conversationAuthorizations(n).filter(e=>e.state===`required`&&e.awaitsCallback===!0);if(e.length>0)return signInLabel(e.map(e=>e.displayName))}if(r?.waiting===!0&&t.length>0)return waitingLabel(t);if(i===void 0)return`Thinking`;let o=i.parts.findLast(e=>e.type!==`step-start`);return o?.type===`text`&&o.state===`streaming`||o?.type===`dynamic-tool`&&o.state===`input-streaming`?`Generating`:`Thinking`}function sameKey(e,t){return e.length===t.length&&e.every((e,n)=>e===t[n])}export{ConversationTranscript,TASK_END_GRACE_MS,turnActivity};
@@ -1 +1 @@
1
- import{remoteHost}from"./target.js";import{createDevDiagnostics}from"../diagnostics.js";import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{LOGIN_CONNECTION_COMMAND_OPTIONS}from"#setup/flows/model-login-options.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function inlineArgumentSuggestions(e){return async t=>{if(t===`loglevel`)return[{value:`all`,label:`all`,hint:`Show all captured logs`},{value:`stderr`,label:`stderr`,hint:`Show stderr logs only`},{value:`sandbox`,label:`sandbox`,hint:`Show sandbox logs only`},{value:`none`,label:`none`,hint:`Hide captured logs`}];if(t===`login`)return LOGIN_CONNECTION_COMMAND_OPTIONS.map(e=>({value:e.command,label:e.label}));if(t===`model`){let{gatewayModelCapabilities:e}=await import(`#setup/boxes/model-capabilities.js`),{fetchGatewayCatalog:t,modelOptionsFromCatalog:n}=await import(`#setup/boxes/select-model.js`),r=await t().catch(()=>void 0);return n(r).map(t=>{let n=e(r,t.value);return{value:t.value,label:t.value,hint:t.hint,...n?.reasoning?{next:[{value:`default`,label:`default`},...n.reasoningLevels.map(e=>({value:e,label:e}))]}:{}}})}let{browseRegistryCatalog:n}=await import(`#cli/commands/registry.js`);return(await n(e)).items.map(e=>({value:e.address,label:e.name,hint:e.description??e.address}))}}async function startDevelopmentTuiStartup(e){let t=await createDevDiagnostics(e.appRoot).catch(()=>void 0),n=new TerminalRenderer({...e,diagnostics:t,argumentSuggestions:inlineArgumentSuggestions(e.appRoot),onExitRequest:e.onExitRequest});return n.beginStartupDraft({initialDraft:e.initialInput,title:e.name??`eve`}),{diagnostics:t,renderer:n,finish:()=>n.finishStartupDraft(),async shutdown(){n.shutdown(),await t?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(e){let{target:t,headers:n,initialInput:r,onboard:i,onOnboardingStep:a,onOnboardingTerminal:o,onBootProgress:s,lifecycle:c,startup:l,withExclusiveTerminal:u,...d}=e,f=prepareDevelopmentTarget(t),{serverUrl:p}=t,m={headers:withTuiUserAgent(n)},h=new Client(f.kind===`local`?resolveLocalDevelopmentClientOptions({...m,interactiveClient:!0,serverUrl:p,token:()=>resolveLinkedDevelopmentOidcToken(f.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...m,serverUrl:p,credentials:f.remote.credentials})),g={...d,client:h,serverUrl:p,promptCommandHandler:createPromptCommandHandler({target:t}),availablePromptCommands:promptCommandsFor(t.kind),...t.kind===`local`?{argumentSuggestions:inlineArgumentSuggestions(t.workspaceRoot)}:{},formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(p):toErrorMessage(e)};f.kind===`local`?(g.appRoot=f.target.workspaceRoot,g.probeMcpConnection=probeMcpConnection):g.remote=f.remote,r!==void 0&&(g.initialInput=r),l!==void 0&&(g.renderer=l.renderer,g.startup=l),i!==void 0&&(g.onboard=i),a!==void 0&&(g.onOnboardingStep=a),o!==void 0&&(g.onOnboardingTerminal=o),s!==void 0&&(g.onBootProgress=s),c!==void 0&&(g.lifecycle=c),u!==void 0&&(g.withExclusiveTerminal=u);let _=l?.diagnostics??(f.kind===`local`?await createDevDiagnostics(f.target.workspaceRoot).catch(()=>void 0):void 0);_!==void 0&&(g.diagnostics=_);try{await new EveTUIRunner(g).run()}finally{await _?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
1
+ import{remoteHost}from"./target.js";import{createDevDiagnostics}from"../diagnostics.js";import{promptCommandsFor}from"./prompt-commands.js";import{probeMcpConnection}from"./mcp-connection-status.js";import{createPromptCommandHandler}from"./prompt-command-handler.js";import{formatRemoteAuthChallengeMessage}from"./remote-auth-result.js";import{TerminalRenderer}from"./terminal-renderer.js";import{EveTUIRunner}from"./runner.js";import{Client}from"#client/index.js";import{resolveInstalledPackageInfo}from"#internal/application/package.js";import{LOGIN_CONNECTION_COMMAND_OPTIONS}from"#setup/flows/model-login-options.js";import{toErrorMessage}from"#shared/errors.js";import{resolveDevelopmentOidcToken,resolveLinkedDevelopmentOidcToken}from"#services/dev-client/request-headers.js";import{isVercelAuthChallenge}from"#services/dev-client/vercel-auth-error.js";import{resolveVercelDeployment}from"#setup/vercel-deployment.js";import{appendUserAgentProduct}from"#internal/user-agent.js";import{resolveLocalDevelopmentClientOptions,resolveRemoteDevelopmentClientOptions}from"#services/dev-client/client-options.js";import{createDevelopmentCredentialGate}from"#services/dev-client/credential-gate.js";function inlineArgumentSuggestions(e){return async t=>{if(t===`loglevel`)return[{value:`none`,label:`none`,hint:`Hide logs`},{value:`error`,label:`error`,hint:`Errors only (default)`},{value:`warn`,label:`warn`,hint:`Warnings and errors`},{value:`debug`,label:`debug`,hint:`All severity-tagged logs`},{value:`all`,label:`all`,hint:`Include raw stdout and sandbox output`}];if(t===`login`)return LOGIN_CONNECTION_COMMAND_OPTIONS.map(e=>({value:e.command,label:e.label}));if(t===`model`){let{gatewayModelCapabilities:e}=await import(`#setup/boxes/model-capabilities.js`),{fetchGatewayCatalog:t,modelOptionsFromCatalog:n}=await import(`#setup/boxes/select-model.js`),r=await t().catch(()=>void 0);return n(r).map(t=>{let n=e(r,t.value);return{value:t.value,label:t.value,hint:t.hint,...n?.reasoning?{next:[{value:`default`,label:`default`},...n.reasoningLevels.map(e=>({value:e,label:e}))]}:{}}})}let{browseRegistryCatalog:n}=await import(`#cli/commands/registry.js`);return(await n(e)).items.map(e=>({value:e.address,label:e.name,hint:e.description??e.address}))}}async function startDevelopmentTuiStartup(e){let t=await createDevDiagnostics(e.appRoot).catch(()=>void 0),n=new TerminalRenderer({...e,diagnostics:t,argumentSuggestions:inlineArgumentSuggestions(e.appRoot),onExitRequest:e.onExitRequest});return n.beginStartupDraft({initialDraft:e.initialInput,title:e.name??`eve`}),{diagnostics:t,renderer:n,finish:()=>n.finishStartupDraft(),async shutdown(){n.shutdown(),await t?.close()}}}function prepareRemoteTarget(e){return{target:e,credentials:createDevelopmentCredentialGate(e.serverUrl),resolveOidcToken:resolveDevelopmentOidcToken,resolveDeployment:t=>resolveVercelDeployment({workspaceRoot:e.workspaceRoot,host:remoteHost(e),signal:t})}}function prepareDevelopmentTarget(e){return e.kind===`local`?{kind:`local`,target:e}:{kind:`remote`,target:e,remote:prepareRemoteTarget(e)}}function withTuiUserAgent(e){let t=new Headers(e);return appendUserAgentProduct(t,`eve-tui/${resolveInstalledPackageInfo().version}`),Object.fromEntries(t.entries())}async function runDevelopmentTui(e){let{target:t,headers:n,initialInput:r,onboard:i,onOnboardingStep:a,onOnboardingTerminal:o,onBootProgress:s,lifecycle:c,startup:l,withExclusiveTerminal:u,...d}=e,f=prepareDevelopmentTarget(t),{serverUrl:p}=t,m={headers:withTuiUserAgent(n)},h=new Client(f.kind===`local`?resolveLocalDevelopmentClientOptions({...m,interactiveClient:!0,serverUrl:p,token:()=>resolveLinkedDevelopmentOidcToken(f.target.workspaceRoot)}):resolveRemoteDevelopmentClientOptions({...m,serverUrl:p,credentials:f.remote.credentials})),g={...d,client:h,serverUrl:p,promptCommandHandler:createPromptCommandHandler({target:t}),availablePromptCommands:promptCommandsFor(t.kind),...t.kind===`local`?{argumentSuggestions:inlineArgumentSuggestions(t.workspaceRoot)}:{},formatTransportError:e=>isVercelAuthChallenge(e)?formatRemoteAuthChallengeMessage(p):toErrorMessage(e)};f.kind===`local`?(g.appRoot=f.target.workspaceRoot,g.probeMcpConnection=probeMcpConnection):g.remote=f.remote,r!==void 0&&(g.initialInput=r),l!==void 0&&(g.renderer=l.renderer,g.startup=l),i!==void 0&&(g.onboard=i),a!==void 0&&(g.onOnboardingStep=a),o!==void 0&&(g.onOnboardingTerminal=o),s!==void 0&&(g.onBootProgress=s),c!==void 0&&(g.lifecycle=c),u!==void 0&&(g.withExclusiveTerminal=u);let _=l?.diagnostics??(f.kind===`local`?await createDevDiagnostics(f.target.workspaceRoot).catch(()=>void 0):void 0);_!==void 0&&(g.diagnostics=_);try{await new EveTUIRunner(g).run()}finally{await _?.close()}}export{runDevelopmentTui,startDevelopmentTuiStartup};
@@ -1,36 +1,21 @@
1
+ import type { TokenUsage } from "./conversation-view.js";
1
2
  /**
2
- * One turn's wall clock and summed token flow. "When did this turn start"
3
- * is a single fact; this object is its single representation — armed once
4
- * per turn (a prompt submit, or an `--input` turn arming itself), fed by
5
- * step usage reports, and consumed exactly once by the end-of-turn coda.
6
- * Multi-pass turns (question answers, connection authorizations) re-stream
7
- * without re-arming, so one turn gets one coda.
3
+ * One turn's wall clock and token flow, measured against the session's summed
4
+ * step usage when work started. Armed when work starts and consumed once by
5
+ * the end-of-turn coda, so answering an approval or question mid-turn does
6
+ * not split the turn.
8
7
  */
9
8
  export declare class TurnClock {
10
9
  #private;
11
- /** Starts the turn: resets the summed flow and stamps the clock. */
12
- arm(): void;
10
+ arm(usage: TokenUsage): void;
13
11
  get armed(): boolean;
14
12
  get startedAtMs(): number | undefined;
15
- get usage(): {
16
- readonly inputTokens: number;
17
- readonly outputTokens: number;
18
- };
19
- addUsage(usage: {
20
- inputTokens?: number;
21
- outputTokens?: number;
22
- }): void;
23
- /**
24
- * Consumes the armed clock, returning the turn's elapsed time and summed
25
- * flow — or `undefined` when no turn was armed (the coda's "already
26
- * settled" signal). The flow survives the settle so a repaint between the
27
- * coda and the next arm still reads the last turn's numbers.
28
- */
29
- settle(): {
13
+ /** Token flow since the clock was armed. */
14
+ usage(current: TokenUsage): TokenUsage;
15
+ /** Consumes the armed clock, or returns `undefined` when no turn was armed. */
16
+ settle(current: TokenUsage): ({
30
17
  elapsedMs: number;
31
- inputTokens: number;
32
- outputTokens: number;
33
- } | undefined;
18
+ } & TokenUsage) | undefined;
34
19
  /** Drops the clock without a coda (conversation boundaries). */
35
20
  reset(): void;
36
21
  }
@@ -1 +1 @@
1
- var TurnClock=class{#e;#t={inputTokens:0,outputTokens:0};arm(){this.#e=Date.now(),this.#t={inputTokens:0,outputTokens:0}}get armed(){return this.#e!==void 0}get startedAtMs(){return this.#e}get usage(){return this.#t}addUsage(e){this.#t.inputTokens+=e.inputTokens??0,this.#t.outputTokens+=e.outputTokens??0}settle(){let e=this.#e;if(e!==void 0)return this.#e=void 0,{elapsedMs:Date.now()-e,...this.#t}}reset(){this.#e=void 0,this.#t={inputTokens:0,outputTokens:0}}};export{TurnClock};
1
+ var TurnClock=class{#e;#t={inputTokens:0,outputTokens:0};arm(e){this.#e=Date.now(),this.#t=e}get armed(){return this.#e!==void 0}get startedAtMs(){return this.#e}usage(e){return{inputTokens:Math.max(0,e.inputTokens-this.#t.inputTokens),outputTokens:Math.max(0,e.outputTokens-this.#t.outputTokens)}}settle(e){let t=this.#e;if(t!==void 0)return this.#e=void 0,{elapsedMs:Date.now()-t,...this.usage(e)}}reset(){this.#e=void 0,this.#t={inputTokens:0,outputTokens:0}}};export{TurnClock};
@@ -61,12 +61,10 @@ export type TuiDisplayOptions = {
61
61
  */
62
62
  contextSize?: number;
63
63
  /**
64
- * Which captured output (stdout, stderr, sandbox lifecycle lines) to
65
- * surface as inline regions. Output is always captured and buffered so it
64
+ * Minimum log severity to surface as inline regions. Output is always captured and buffered so it
66
65
  * cannot corrupt the frame; this only controls what is rendered. The
67
66
  * `/loglevel` command switches the mode at runtime, retroactively hiding or
68
- * restoring buffered lines. `TerminalRenderer` defaults to `none`; the
69
- * `eve dev` CLI defaults to `stderr`.
67
+ * restoring buffered lines. Defaults to `error`. Only `all` includes unclassified raw output.
70
68
  */
71
69
  logs?: LogDisplayMode;
72
70
  };
@@ -1 +1 @@
1
- function resolveDevUiMode(e){return e.options.ui===!1||!e.interactive?`headless`:`tui`}function resolveTuiDisplayOptions(e){let t={logs:e.logs??`stderr`,reasoning:e.reasoning??`auto-collapsed`,tools:e.tools??`auto-collapsed`};return e.subagents!==void 0&&(t.subagents=e.subagents),e.connectionAuth!==void 0&&(t.connectionAuth=e.connectionAuth),e.assistantResponseStats!==void 0&&(t.assistantResponseStats=e.assistantResponseStats),e.contextSize!==void 0&&(t.contextSize=e.contextSize),t}export{resolveDevUiMode,resolveTuiDisplayOptions};
1
+ function resolveDevUiMode(e){return e.options.ui===!1||!e.interactive?`headless`:`tui`}function resolveTuiDisplayOptions(e){let t={logs:e.logs??`error`,reasoning:e.reasoning??`auto-collapsed`,tools:e.tools??`auto-collapsed`};return e.subagents!==void 0&&(t.subagents=e.subagents),e.connectionAuth!==void 0&&(t.connectionAuth=e.connectionAuth),e.assistantResponseStats!==void 0&&(t.assistantResponseStats=e.assistantResponseStats),e.contextSize!==void 0&&(t.contextSize=e.contextSize),t}export{resolveDevUiMode,resolveTuiDisplayOptions};
@@ -0,0 +1,26 @@
1
+ import { type ConversationState } from "#client/conversation-state.js";
2
+ import type { ClientSession } from "#client/session.js";
3
+ import type { MessageStreamEvent } from "#protocol/message.js";
4
+ export interface AgentStreamFollowerOptions {
5
+ /** The session whose stream announced the agents; reads use its host and credentials. */
6
+ readonly session: ClientSession;
7
+ readonly getState: () => ConversationState;
8
+ readonly onFollowing: (sessionId: string) => void;
9
+ readonly onEvent: (sessionId: string, event: MessageStreamEvent) => void;
10
+ readonly onIdle: (sessionId: string) => void;
11
+ readonly onUnavailable: (sessionId: string) => void;
12
+ /** Retained by the transport owner across detach and reattach. */
13
+ readonly cursors: Map<string, number>;
14
+ }
15
+ /**
16
+ * Follows each agent tool's session while its task has content the conversation has not shown.
17
+ * The conversation decides when a session is caught up; this class only owns transport.
18
+ */
19
+ export declare class AgentStreamFollower {
20
+ #private;
21
+ constructor(options: AgentStreamFollowerOptions);
22
+ acceptParentEvent(event: MessageStreamEvent): void;
23
+ /** Starts, resumes, or pauses subscriptions to match the conversation. */
24
+ reconcile(): void;
25
+ abortAll(): void;
26
+ }
@@ -0,0 +1 @@
1
+ import{agentToolTask,isAgentSessionCaughtUp}from"#client/conversation-state.js";const agentStreamReconnectPolicy={streamIdleReconnectPolicy:{maxAttempts:1/0},streamOpenReconnectPolicy:{maxAttempts:1/0}};var AgentStreamFollower=class{#e;#t=new Map;#n=new Map;#r=new Set;#i=!1;constructor(e){this.#e=e}acceptParentEvent(e){e.type===`agent.started`&&this.#t.set(e.data.sessionId,e)}reconcile(){if(this.#i)return;let e=this.#e.getState();for(let t of Object.values(e.agents)){if(agentToolTask(e,t)===void 0)continue;let n=this.#n.get(t.sessionId),r=isAgentSessionCaughtUp(e,t);n!==void 0&&r?(this.#n.delete(t.sessionId),n.abort(),this.#e.onIdle(t.sessionId)):n===void 0&&!r&&!this.#r.has(t.sessionId)&&this.#a(t.sessionId)}}abortAll(){this.#i=!0;for(let e of this.#n.values())e.abort();this.#n.clear()}#a(e){let t=this.#t.get(e);if(t===void 0)return;let n=new AbortController;this.#n.set(e,n),this.#e.onFollowing(e);let{cursors:r}=this.#e;(async()=>{let i=r.get(e)??0;try{for await(let a of this.#e.session.agent(t).stream({signal:n.signal,startIndex:i,streamReconnectPolicy:agentStreamReconnectPolicy})){if(n.signal.aborted)return;r.set(e,++i),this.#e.onEvent(e,a),this.reconcile()}}catch{}n.signal.aborted||this.#n.get(e)!==n||(this.#n.delete(e),this.#r.add(e),this.#e.onUnavailable(e))})()}};export{AgentStreamFollower};
@@ -1 +1 @@
1
- function createAuthorizationRequiredPart(e){let t=e.data.authorization?.displayName??formatAuthorizationDisplayName(e.data.name);return{authorization:e.data.authorization,description:normalizeAuthorizationDescription(e.data.description,e.data.name,t),displayName:t,name:e.data.name,state:`required`,stepIndex:e.data.stepIndex,turnId:e.data.turnId,type:`authorization`}}function createAuthorizationCompletedPart(e,t){let n=e.data.authorization?.displayName??t?.displayName??formatAuthorizationDisplayName(e.data.name);return{authorization:t?.authorization||e.data.authorization?{...t?.authorization,...e.data.authorization}:void 0,description:t?.description??buildCompletedAuthorizationDescription(n,e.data.outcome,e.data.reason),displayName:n,name:e.data.name,outcome:e.data.outcome,reason:e.data.reason,state:`completed`,stepIndex:t?.stepIndex??e.data.stepIndex,turnId:t?.turnId??e.data.turnId,type:`authorization`}}function buildCompletedAuthorizationDescription(e,t,n){return t===`authorized`?`${e} connected.`:`${e} authorization ${t}${n===void 0?``:` (${n})`}.`}function normalizeAuthorizationDescription(e,t,n){return e===`Authorization required for ${t}`?`Authorization required for ${n}`:e}function formatAuthorizationDisplayName(e){return e.length===0?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`}export{createAuthorizationCompletedPart,createAuthorizationRequiredPart};
1
+ function createAuthorizationRequiredPart(e){let t=e.data.authorization?.displayName??formatAuthorizationDisplayName(e.data.name),n={authorization:e.data.authorization,description:normalizeAuthorizationDescription(e.data.description,e.data.name,t),displayName:t,name:e.data.name,state:`required`,stepIndex:e.data.stepIndex,turnId:e.data.turnId,type:`authorization`};return e.data.attemptId!==void 0&&(n.attemptId=e.data.attemptId),e.data.webhookUrl!==void 0&&(n.awaitsCallback=!0),n}function createAuthorizationCompletedPart(e,t){let n=e.data.authorization?.displayName??t?.displayName??formatAuthorizationDisplayName(e.data.name),r={authorization:t?.authorization||e.data.authorization?{...t?.authorization,...e.data.authorization}:void 0,description:t?.description??buildCompletedAuthorizationDescription(n,e.data.outcome,e.data.reason),displayName:n,name:e.data.name,outcome:e.data.outcome,state:`completed`,stepIndex:t?.stepIndex??e.data.stepIndex,turnId:t?.turnId??e.data.turnId,type:`authorization`},i=e.data.attemptId??t?.attemptId;return i!==void 0&&(r.attemptId=i),t?.awaitsCallback&&(r.awaitsCallback=!0),e.data.reason!==void 0&&(r.reason=e.data.reason),r}function buildCompletedAuthorizationDescription(e,t,n){return t===`authorized`?`${e} connected.`:`${e} authorization ${t}${n===void 0?``:` (${n})`}.`}function normalizeAuthorizationDescription(e,t,n){return e===`Authorization required for ${t}`?`Authorization required for ${n}`:e}function formatAuthorizationDisplayName(e){return e.length===0?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`}export{createAuthorizationCompletedPart,createAuthorizationRequiredPart};
@@ -0,0 +1,40 @@
1
+ import type { ConversationState } from "#client/conversation-state.js";
2
+ import { EveAgentProjection, type EveAgentEventLog } from "#client/eve-agent-projection.js";
3
+ import type { SendTurnPayload } from "#client/types.js";
4
+ import type { EveAgentReducerEvent } from "#client/reducer.js";
5
+ import type { MessageStreamEvent } from "#protocol/message.js";
6
+ import type { InputResponse } from "#shared/input.js";
7
+ import { SessionEventStream, type SessionEventStreamOptions } from "#client/session-event-stream.js";
8
+ import type { ClientSession } from "#client/session.js";
9
+ /** Owns the canonical conversation and its root and agent-session transports for one client session. */
10
+ export declare class ConversationClient<TData = ConversationState> {
11
+ #private;
12
+ readonly projection: EveAgentProjection<TData>;
13
+ constructor(projection: EveAgentProjection<TData>, onChange: (data: TData, previous: TData) => void, onConversationChange?: (state: ConversationState, previous: ConversationState) => void);
14
+ get data(): TData;
15
+ get conversation(): ConversationState;
16
+ get projections(): readonly EveAgentEventLog[];
17
+ get following(): boolean;
18
+ append(event: EveAgentReducerEvent): void;
19
+ /** Projects submitted answers; the returned callback withdraws them if the server never accepts. */
20
+ projectResponses(responses: readonly InputResponse[] | undefined): (() => void) | undefined;
21
+ /** Swaps projected answers for a prepared payload's, which must still be answerable. */
22
+ replaceResponses(retract: (() => void) | undefined, input: SendTurnPayload): (() => void) | undefined;
23
+ /** Admit and project a root event before the agent sessions it announces are followed. */
24
+ observe(event: MessageStreamEvent, options?: {
25
+ /** The store reconciles optimistic messages instead of directly appending the event. */
26
+ project?: (event: MessageStreamEvent) => void;
27
+ /** Record the accepted event before projection or child notifications. */
28
+ onAccepted?: (event: MessageStreamEvent) => void;
29
+ /** The store publishes after updating its event log and status. */
30
+ notify?: boolean;
31
+ }): boolean;
32
+ /** Admit and project a hydrated root event without notifying subscribers. */
33
+ hydrate(event: MessageStreamEvent): boolean;
34
+ /** Start following the agent sessions the root stream has announced so far. */
35
+ follow(session: ClientSession, events?: readonly MessageStreamEvent[]): void;
36
+ /** Follows the root session continuously; operation readers subscribe to this one stream. */
37
+ stream(session: ClientSession, options: SessionEventStreamOptions): SessionEventStream;
38
+ stop(): void;
39
+ reset(): void;
40
+ }
@@ -0,0 +1 @@
1
+ import{assertAnswerable}from"#client/eve-agent-store-helpers.js";import{AgentStreamFollower}from"#client/agent-stream-follower.js";import{canonicalConversationReducer,conversationReducer}from"#client/conversation-reducer.js";import{EveAgentProjection}from"#client/eve-agent-projection.js";import{createEventDeduper}from"#protocol/event-dedupe.js";import{SessionEventStream}from"#client/session-event-stream.js";var ConversationClient=class{projection;#e;#t=new Map;#n=createEventDeduper();#r;#i;#a;#o;constructor(e,t,n){this.projection=e,this.#e=e.reducer===conversationReducer?e:new EveAgentProjection(canonicalConversationReducer,[]),this.#a=t,this.#o=n}get data(){return this.projection.data}get conversation(){return this.#e.data}get projections(){return this.#e===this.projection?[this.projection]:[this.#e,this.projection]}get following(){return this.#r!==void 0}append(e){let t=this.data,n=this.conversation;this.#c(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}projectResponses(e){if(!e?.length)return;let t={data:{createdAt:Date.now(),responses:e},type:`client.input.responded`};return this.append(t),()=>this.#s(t)}replaceResponses(e,t){return e?.(),assertAnswerable(t,this.conversation),this.projectResponses(t.inputResponses)}#s(e){let t=this.data,n=this.conversation;for(let t of this.projections)t.remove(t=>t===e);t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}observe(e,t={}){if(!this.#n.admit(e))return!1;t.onAccepted?.(e);let n=this.data,r=this.conversation;return t.project?t.project(e):this.#c(e),t.notify!==!1&&(n===this.data?r!==this.conversation&&this.#o?.(this.conversation,r):this.#a(this.data,n)),this.#r?.acceptParentEvent(e),this.#r?.reconcile(),!0}hydrate(e){return this.#n.admit(e)?(this.#c(e),!0):!1}follow(e,t=[]){this.#r?.abortAll();let n=new AgentStreamFollower({session:e,cursors:this.#t,getState:()=>this.conversation,onFollowing:e=>this.#l({type:`client.agent.following`,data:{sessionId:e}}),onEvent:(e,t)=>this.#l({type:`client.agent.observed`,data:{sessionId:e,event:t}}),onIdle:e=>this.#l({type:`client.agent.idle`,data:{sessionId:e}}),onUnavailable:e=>this.#l({type:`client.agent.unavailable`,data:{sessionId:e}})});this.#r=n;for(let e of t)n.acceptParentEvent(e);n.reconcile()}#c(e){for(let t of this.projections)t.append(e)}#l(e){let t=this.data,n=this.conversation;this.#e.append(e),t===this.data?n!==this.conversation&&this.#o?.(this.conversation,n):this.#a(this.data,t)}stream(e,t){return this.#i!==void 0&&!this.#i.ended?(this.#i.setOptions(t),this.#i):(this.#i=new SessionEventStream(e,t),this.#i)}stop(){this.#r?.abortAll(),this.#r=void 0,this.#i?.close(),this.#i=void 0}reset(){this.stop(),this.#t.clear(),this.#n=createEventDeduper();for(let e of this.projections)e.reset()}};export{ConversationClient};
@@ -0,0 +1,29 @@
1
+ import type { ConversationState } from "#client/conversation-state.js";
2
+ import type { EveAgentReducer, EveAgentReducerEvent } from "#client/reducer.js";
3
+ import type { MessageStreamEvent } from "#protocol/message.js";
4
+ /**
5
+ * Transport facts about followed agent sessions. Only the canonical conversation receives them;
6
+ * custom reducers see their results in `conversation.agents`.
7
+ */
8
+ export type ClientAgentEvent = {
9
+ readonly data: {
10
+ readonly sessionId: string;
11
+ };
12
+ readonly type: "client.agent.following" | "client.agent.idle" | "client.agent.unavailable";
13
+ } | {
14
+ readonly data: {
15
+ readonly event: MessageStreamEvent;
16
+ readonly sessionId: string;
17
+ };
18
+ readonly type: "client.agent.observed";
19
+ };
20
+ export type ConversationEvent = EveAgentReducerEvent | ClientAgentEvent;
21
+ export declare function initialConversationState(): ConversationState;
22
+ /** Pure reduction of accepted root and agent-session observations; followers own transport. */
23
+ export declare function reduceConversation(state: ConversationState, event: ConversationEvent): ConversationState;
24
+ /** The canonical conversation's reducer, which also folds in followed agent sessions. */
25
+ export declare const canonicalConversationReducer: {
26
+ initial: typeof initialConversationState;
27
+ reduce: typeof reduceConversation;
28
+ };
29
+ export declare const conversationReducer: EveAgentReducer<ConversationState>;
@@ -0,0 +1 @@
1
+ import{defaultMessageReducer}from"#client/message-reducer.js";function initialConversationState(){return{messages:[],turns:{},inputs:{},tasks:{},agents:{}}}function updateTurn(e,t,n){let r=e.turns[t];if(r===void 0)return e;let i=n(r);return i===r?e:{...e,turns:{...e.turns,[t]:i}}}function updateTask(e,t,n){let r=e.tasks[t];if(r===void 0)return e;let i=n(r);return i===r?e:{...e,tasks:{...e.tasks,[t]:i}}}function updateObservation(e,t,n){let r=e.agents[t];if(r===void 0)return e;let i=n(r.observation);return i===r.observation?e:{...e,agents:{...e.agents,[t]:{...r,observation:i}}}}function observedConversation(e){return e.status===`not-followed`?void 0:e.conversation}function reduceConversationLifecycle(e,t){switch(t.type){case`turn.started`:return{...e,activeTurnId:t.data.turnId,turns:{...e.turns,[t.data.turnId]:{turnId:t.data.turnId,status:`active`}}};case`turn.waiting`:return updateTurn(e,t.data.turnId,e=>e.status===`active`&&!e.waiting?{...e,waiting:!0}:e);case`step.started`:return updateTurn(e,t.data.turnId,e=>e.waiting?{turnId:e.turnId,status:e.status}:e);case`turn.completed`:case`turn.cancelled`:case`turn.failed`:{let{turnId:n}=t.data;return{...e,activeTurnId:e.activeTurnId===n?void 0:e.activeTurnId,turns:{...e.turns,[n]:{turnId:n,status:t.type===`turn.completed`?`completed`:t.type===`turn.failed`?`failed`:`cancelled`}}}}case`session.waiting`:case`session.completed`:case`session.failed`:return e.activeTurnId===void 0?e:{...e,activeTurnId:void 0};case`task.started`:{let{callId:n,kind:r,name:i,taskId:a,turnId:o}=t.data,s=e.tasks[a]??{taskId:a,name:i,kind:r,calls:{}};return s.calls[n]===void 0?{...e,tasks:{...e.tasks,[a]:{...s,calls:{...s.calls,[n]:{callId:n,turnId:o,status:`working`}}}}}:e}case`task.settled`:{let{callId:n,error:r,output:i,status:a,taskId:o}=t.data;return updateTask(e,o,e=>{let t=e.calls[n];if(t===void 0||t.status!==`working`)return e;let o={callId:n,turnId:t.turnId,status:a};return{...e,calls:{...e.calls,[n]:a===`completed`&&i!==void 0?{...o,output:i}:a===`failed`&&r!==void 0?{...o,error:r}:o}}})}case`agent.started`:{let{callId:n,name:r,sessionId:i,taskId:a,turnId:o}=t.data;if(e.agents[i]!==void 0)return e;let s={sessionId:i,name:r,callId:n,turnId:o,observation:{status:`not-followed`}};return a!==void 0&&(s.taskId=a),{...e,agents:{...e.agents,[i]:s}}}case`input.requested`:{let n={...e.inputs};for(let e of t.data.requests){if(n[e.requestId]!==void 0)continue;let r={request:e,turnId:t.data.turnId,stepIndex:t.data.stepIndex,status:`open`};t.data.taskId!==void 0&&(r.taskId=t.data.taskId),n[e.requestId]=r}return{...e,inputs:n}}case`client.input.responded`:{let n={...e.inputs};for(let e of t.data.responses){let t=n[e.requestId];t?.status===`open`&&(n[e.requestId]={...t,response:e,status:`responded`})}return{...e,inputs:n}}case`approval.candidate`:{let n=e.inputs[t.data.requestId];return n===void 0||n.status===`settled`||t.data.outcome===`pending`?e:{...e,inputs:{...e.inputs,[t.data.requestId]:{...n,status:`open`,response:void 0}}}}case`approval.settled`:{let n=e.inputs[t.data.requestId];return n===void 0||n.status===`settled`?e:{...e,inputs:{...e.inputs,[t.data.requestId]:{...n,status:`settled`,outcome:t.data.outcome}}}}case`input.resolved`:{let n={...e.inputs};for(let e of t.data.resolutions){let t=n[e.requestId];t!==void 0&&t.status!==`settled`&&(n[e.requestId]={...t,status:`settled`,outcome:e.outcome,response:e.response??t.response})}return{...e,inputs:n}}default:return e}}const messageReducer=defaultMessageReducer();function reduceConversation(e,t){switch(t.type){case`client.agent.following`:return updateObservation(e,t.data.sessionId,e=>e.status===`following`?e:{status:`following`,conversation:observedConversation(e)??initialConversationState()});case`client.agent.observed`:return updateObservation(e,t.data.sessionId,e=>e.status===`following`?{status:`following`,conversation:reduceConversation(e.conversation,t.data.event)}:e);case`client.agent.idle`:return updateObservation(e,t.data.sessionId,e=>e.status===`following`?{status:`idle`,conversation:e.conversation}:e);case`client.agent.unavailable`:return updateObservation(e,t.data.sessionId,e=>{let t=observedConversation(e);return t===void 0?{status:`unavailable`}:{status:`unavailable`,conversation:t}});default:{let n=messageReducer.reduce(e,t);return reduceConversationLifecycle({...e,...n},t)}}}const canonicalConversationReducer={initial:initialConversationState,reduce:reduceConversation},conversationReducer=canonicalConversationReducer;export{canonicalConversationReducer,conversationReducer,initialConversationState,reduceConversation};
@@ -0,0 +1,110 @@
1
+ import type { EveAuthorizationPart, EveMessageData } from "#client/message-reducer-types.js";
2
+ import type { InputRequest, InputResponse } from "#shared/input.js";
3
+ import type { JsonValue } from "#shared/json.js";
4
+ export interface ConversationTurn {
5
+ readonly turnId: string;
6
+ readonly status: "active" | "completed" | "cancelled" | "failed";
7
+ /** The open turn is parked, holding on its tasks or on a question one of its calls asked. */
8
+ readonly waiting?: boolean;
9
+ }
10
+ export interface ConversationInput {
11
+ readonly request: InputRequest;
12
+ readonly turnId: string;
13
+ readonly stepIndex: number;
14
+ /** The task whose run asks, when a task asks. */
15
+ readonly taskId?: string;
16
+ readonly status: "open" | "responded" | "settled";
17
+ readonly response?: InputResponse;
18
+ readonly outcome?: string;
19
+ }
20
+ /** One call that started or reached a task, settled by its `task.settled`. */
21
+ export interface ConversationTaskCall {
22
+ readonly callId: string;
23
+ readonly turnId: string;
24
+ readonly status: "working" | "completed" | "failed" | "cancelled";
25
+ /** The call's result; present only when `status` is `"completed"`. */
26
+ readonly output?: JsonValue;
27
+ /** Why the call failed; present only when `status` is `"failed"`. */
28
+ readonly error?: {
29
+ readonly message: string;
30
+ };
31
+ }
32
+ export interface ConversationTask {
33
+ readonly taskId: string;
34
+ /** The tool whose call started the task. */
35
+ readonly name: string;
36
+ /**
37
+ * `"agent"` when a subagent's tool, local or remote, started the task; `"tool"` for an authored
38
+ * tool, including one that opens sessions with `ctx.agent`.
39
+ */
40
+ readonly kind: "agent" | "tool";
41
+ /** Calls in the order they started or reached the task. */
42
+ readonly calls: Readonly<Record<string, ConversationTaskCall>>;
43
+ }
44
+ export type AgentObservation = {
45
+ readonly status: "not-followed";
46
+ } | {
47
+ readonly status: "following";
48
+ readonly conversation: ConversationState;
49
+ }
50
+ /** Every call so far has shown its content; a later call to the task resumes following. */
51
+ | {
52
+ readonly status: "idle";
53
+ readonly conversation: ConversationState;
54
+ } | {
55
+ /** The stream failed; this does not mean the agent failed. */
56
+ readonly status: "unavailable";
57
+ readonly conversation?: ConversationState;
58
+ };
59
+ /** A session a run opened with `ctx.agent`, as its `agent.started` announced it. */
60
+ export interface ConversationAgentSession {
61
+ readonly sessionId: string;
62
+ readonly name: string;
63
+ /** The call whose invocation opened the session. */
64
+ readonly callId: string;
65
+ readonly turnId: string;
66
+ /** The task whose run opened the session; absent when an `execute` call opened it. */
67
+ readonly taskId?: string;
68
+ readonly observation: AgentObservation;
69
+ }
70
+ /** Renderable conversation state. Root and agent-session input IDs occupy separate scopes. */
71
+ export interface ConversationState extends EveMessageData {
72
+ readonly activeTurnId?: string;
73
+ readonly turns: Readonly<Record<string, ConversationTurn>>;
74
+ readonly inputs: Readonly<Record<string, ConversationInput>>;
75
+ readonly tasks: Readonly<Record<string, ConversationTask>>;
76
+ /** Sessions opened by this session's runs, by session ID. */
77
+ readonly agents: Readonly<Record<string, ConversationAgentSession>>;
78
+ }
79
+ /** Inputs awaiting an answer, including requests introduced in earlier turns. */
80
+ export declare function openConversationInputs(state: ConversationState): readonly ConversationInput[];
81
+ /** Authorization attempts remain visible across turns, including parked callbacks. */
82
+ export declare function conversationAuthorizations(state: ConversationState): readonly EveAuthorizationPart[];
83
+ /** A sign-in the session still waits on, which resumes its work when the callback arrives. */
84
+ export declare function hasPendingAuthorizations(state: ConversationState): boolean;
85
+ /**
86
+ * The agent task whose calls a session receives, when the session is that agent's own. eve's agent
87
+ * tools send each call as one message, in call order, which is what lets a client attribute the
88
+ * session's turns to calls. A session an authored tool opens with `ctx.agent` has no such task.
89
+ */
90
+ export declare function agentToolTask(state: ConversationState, agent: ConversationAgentSession): ConversationTask | undefined;
91
+ /** The session an agent tool forwards its task's calls to. */
92
+ export declare function agentToolSession(state: ConversationState, task: ConversationTask): ConversationAgentSession | undefined;
93
+ /**
94
+ * Whether a followed agent tool session has shown everything its task's calls produced so far:
95
+ * no call is working, the session has no open turn, question, or sign-in, and every completed call's
96
+ * message has arrived. The last check covers a child stream that lags the root stream.
97
+ */
98
+ export declare function isAgentSessionCaughtUp(state: ConversationState, agent: ConversationAgentSession): boolean;
99
+ /**
100
+ * Attributes an agent tool session's turns to the calls that produced them. The k-th message the
101
+ * session received came from the task's k-th call; a turn without a message of its own, such as
102
+ * one resumed after an approval, continues the previous call. A call whose message joined a
103
+ * running turn owns no turn.
104
+ */
105
+ export declare function agentCallTurns(task: ConversationTask, conversation: ConversationState): ReadonlyMap<string, readonly string[]>;
106
+ /**
107
+ * Whether a call's content may still arrive on its agent tool session: one of the call's turns is
108
+ * still open there, or the call completed before its message reached the session.
109
+ */
110
+ export declare function isAgentCallContentPending(task: ConversationTask, call: ConversationTaskCall, conversation: ConversationState): boolean;
@@ -0,0 +1 @@
1
+ function openConversationInputs(e){return Object.values(e.inputs).filter(e=>e.status===`open`)}function conversationAuthorizations(e){return e.messages.flatMap(e=>e.role===`assistant`?e.parts.filter(e=>e.type===`authorization`):[])}function hasPendingAuthorizations(e){return conversationAuthorizations(e).some(e=>e.state===`required`&&e.awaitsCallback===!0)}function agentToolTask(e,t){let n=t.taskId===void 0?void 0:e.tasks[t.taskId];return n?.kind===`agent`?n:void 0}function agentToolSession(e,t){return Object.values(e.agents).find(n=>agentToolTask(e,n)?.taskId===t.taskId)}function isAgentSessionCaughtUp(e,t){if(t.observation.status!==`following`&&t.observation.status!==`idle`)return!1;let n=agentToolTask(e,t);if(n===void 0)return!1;let r=Object.values(n.calls);if(r.some(e=>e.status===`working`))return!1;let i=t.observation.conversation;return i.activeTurnId!==void 0||Object.values(i.inputs).some(e=>e.status!==`settled`)||hasPendingAuthorizations(i)?!1:i.messages.filter(e=>e.role===`user`).length>=r.filter(e=>e.status===`completed`).length}function agentCallTurns(e,t){let n=Object.keys(e.calls),r=new Map,i=0;for(let e of t.messages){if(e.role!==`user`)continue;let t=n[i++],a=e.metadata?.turnId;t!==void 0&&a!==void 0&&!r.has(a)&&r.set(a,t)}let a=new Map(n.map(e=>[e,[]])),o;for(let e of Object.keys(t.turns))o=r.get(e)??o,o!==void 0&&a.get(o)?.push(e);return a}function isAgentCallContentPending(e,t,n){let r=agentCallTurns(e,n).get(t.callId)??[],{activeTurnId:i}=n;return i!==void 0&&r.includes(i)?!0:t.status===`completed`&&n.messages.filter(e=>e.role===`user`).length<=Object.keys(e.calls).indexOf(t.callId)}export{agentCallTurns,agentToolSession,agentToolTask,conversationAuthorizations,hasPendingAuthorizations,isAgentCallContentPending,isAgentSessionCaughtUp,openConversationInputs};
@@ -1,11 +1,28 @@
1
- import type { EveAgentReducer, EveAgentReducerEvent } from "#client/reducer.js";
2
- /** Owns reducer replay when optimistic events are replaced by server events. */
3
- export declare class EveAgentProjection<TData> {
1
+ import type { ConversationEvent } from "#client/conversation-reducer.js";
2
+ import type { EveAgentReducerEvent } from "#client/reducer.js";
3
+ interface ProjectionReducer<TData, TEvent> {
4
+ initial(): TData;
5
+ reduce(data: TData, event: TEvent): TData;
6
+ }
7
+ /**
8
+ * The part of a projection that root-stream bookkeeping writes. Its entries can include the
9
+ * canonical conversation's agent-session events, so predicates see the wider event type.
10
+ */
11
+ export interface EveAgentEventLog {
12
+ append(event: EveAgentReducerEvent): void;
13
+ remove(predicate: (event: ConversationEvent) => boolean): void;
14
+ replace(predicate: (event: ConversationEvent) => boolean, replacement: EveAgentReducerEvent): void;
15
+ reset(): void;
16
+ }
17
+ /** Owns chronological reducer replay when optimistic events are replaced by server events. */
18
+ export declare class EveAgentProjection<TData, TEvent = EveAgentReducerEvent> {
4
19
  #private;
5
- constructor(reducer: EveAgentReducer<TData>, events: readonly EveAgentReducerEvent[]);
20
+ constructor(reducer: ProjectionReducer<TData, TEvent>, events: readonly TEvent[]);
6
21
  get data(): TData;
22
+ get reducer(): ProjectionReducer<TData, TEvent>;
7
23
  reset(): void;
8
- append(event: EveAgentReducerEvent): void;
9
- remove(predicate: (event: EveAgentReducerEvent) => boolean): void;
10
- replace(predicate: (event: EveAgentReducerEvent) => boolean, replacement: EveAgentReducerEvent): void;
24
+ append(event: TEvent): void;
25
+ remove(predicate: (event: TEvent) => boolean): void;
26
+ replace(predicate: (event: TEvent) => boolean, replacement: TEvent): void;
11
27
  }
28
+ export {};
@@ -1 +1 @@
1
- var EveAgentProjection=class{#e;#t;#n;constructor(e,t){this.#e=e,this.#t=t,this.#n=this.#r()}get data(){return this.#n}reset(){this.#t=[],this.#n=this.#e.initial()}append(e){this.#t=[...this.#t,e],this.#n=this.#e.reduce(this.#n,e)}remove(e){this.#t=this.#t.filter(t=>!e(t)),this.#n=this.#r()}replace(e,t){let n=this.#t.findIndex(e);this.#t=n===-1?[...this.#t,t]:this.#t.map((e,r)=>r===n?t:e),this.#n=this.#r()}#r(){let e=this.#e.initial();for(let t of this.#t)e=this.#e.reduce(e,t);return e}};export{EveAgentProjection};
1
+ var EveAgentProjection=class{#e;#t;#n;constructor(e,t){this.#e=e,this.#t=[...t],this.#n=this.#r()}get data(){return this.#n}get reducer(){return this.#e}reset(){this.#t=[],this.#n=this.#e.initial()}append(e){this.#t.push(e),this.#n=this.#e.reduce(this.#n,e)}remove(e){this.#t=this.#t.filter(t=>!e(t)),this.#n=this.#r()}replace(e,t){let n=this.#t.findIndex(e);n===-1?this.#t.push(t):this.#t[n]=t,this.#n=this.#r()}#r(){let e=this.#e.initial();for(let t of this.#t)e=this.#e.reduce(e,t);return e}};export{EveAgentProjection};
@@ -1,8 +1,21 @@
1
+ import { type ConversationState } from "#client/conversation-state.js";
1
2
  import type { ActiveTurn } from "#client/eve-agent-store-state.js";
2
3
  import type { CancelSessionResult, SendTurnPayload } from "#client/types.js";
3
- import type { MessageStreamEvent } from "#protocol/message.js";
4
+ import { type MessageStreamEvent } from "#protocol/message.js";
4
5
  import type { UserContent } from "ai";
5
- export declare function isSettledSessionTail(events: readonly MessageStreamEvent[]): boolean;
6
+ export declare function activeTurnForOptimisticFollowUp(events: readonly MessageStreamEvent[]): string | undefined;
7
+ /**
8
+ * Where catch-up stops following and when an idle session counts as settled. These reads have no
9
+ * response to scope them, so the {@link endsTurnSegment} rule reads the whole conversation.
10
+ */
11
+ export declare function isResponseBoundary(event: MessageStreamEvent, conversation: ConversationState): boolean;
12
+ /** A turn parked on a question stays open, so its session is still streaming. */
13
+ export declare function settledStatus(error: Error | undefined, conversation: ConversationState): "error" | "ready" | "streaming";
14
+ export declare function isSettledSessionTail(events: readonly MessageStreamEvent[], conversation: ConversationState): boolean;
15
+ /** A server ignores answers to requests it already settled, so the store never sends them. */
16
+ export declare function assertAnswerable(input: SendTurnPayload, conversation: ConversationState): void;
17
+ export declare function assertInFlightFollowUp(input: SendTurnPayload): void;
18
+ export declare function validateFollowUp<T extends SendTurnPayload>(input: T): T;
6
19
  export declare function assertExclusiveTurnInput(input: SendTurnPayload): void;
7
20
  export declare function createSubmissionId(): string;
8
21
  export declare function createAbortSignal(first: AbortSignal | undefined, second: AbortSignal): AbortSignal;
@@ -10,6 +23,12 @@ export declare function summarizeUserContent(message: string | UserContent): str
10
23
  export declare function isAbortError(error: unknown): boolean;
11
24
  export declare function toTerminalStreamFailureError(event: MessageStreamEvent): Error | undefined;
12
25
  export declare function createActiveTurn(cancel: (turn: ActiveTurn) => Promise<CancelSessionResult>): ActiveTurn;
26
+ /** Counts confirmed steered messages toward the active turn's accepted follow-ups. */
27
+ export declare function countFollowUpDeliveries(turn: ActiveTurn, reconciliation: {
28
+ readonly alreadyProjected: boolean;
29
+ readonly event: MessageStreamEvent;
30
+ readonly ids: readonly string[];
31
+ }): void;
13
32
  export declare function followSteeredTurns(turn: ActiveTurn, events: AsyncIterable<MessageStreamEvent>, isActive: () => boolean): Promise<void>;
14
33
  /** Aborts a caller's wait without cancelling shared work owned by the store. */
15
34
  export declare function waitWithSignal<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T>;